Skip to content
Alex ALAVO.

Case study 03 · Automation · AI · CRM

LinkedIn Data Flow

A B2B prospecting pipeline: LinkedIn search, AI qualification, enrichment and HubSpot sync.

Role
n8n prototype, then design and development of the Laravel application
Category
Automation · AI · CRM
Stack
Laravel 12 · Vue 3 · TypeScript
New prospect search form
Search history and results

01 — Context

For a B2B sales team, building a usable prospect base meant finding the right profiles, checking their relevance, finding contact details and checking whether they were already in the CRM. A first version was built in n8n, then the orchestration was rewritten natively in Laravel.

02 — Problem

Search, qualify, enrich and deduplicate: five tools and a lot of copy-pasting for every prospect.

03 — Solution

The user defines a target, adjusts the criteria and starts a search. The app collects profiles via Apify, qualifies them with OpenAI using a configurable prompt, checks existing HubSpot contacts, enriches contact and company data (Fullenrich, Pappers), then creates or updates contacts and companies in HubSpot. Everything runs in the background with a search history.

04 — Features

  • Reusable personas

    Job titles, industries, seniority and company sizes, linked to AI instructions.

  • Multi-criteria search

    Location, experience, companies, education and exclusions.

  • AI qualification

    Customisable prompt with variables and a preview on sample data.

  • Enrichment

    Emails and phone numbers in batches, company legal and financial data.

  • HubSpot sync

    Existing-contact checks, create or update and associations.

  • Contact freshness

    Scheduled refresh and an alert when someone changes job.

06 — Architecture

  1. LinkedIn searchApify · personas
  2. AI qualificationOpenAI · prompt
  3. EnrichmentFullenrich · Pappers
  4. HubSpot up to datecontacts · companies

Inertia connects Vue pages to the Laravel backend; domain services prepare requests and jobs handle the long-running steps.

Apify and Fullenrich webhooks signal when external processing ends so the pipeline can continue, and the database keeps each profile's state.

07 — Technical challenges

  • Challenge

    Coordinate services that answer at different times.

    Solution

    Background jobs, webhooks, stored states and batch tracking before completion.

  • Challenge

    Reduce repeated calls and respect API limits.

    Solution

    Batched operations, company caches, spaced calls and retries on HTTP 429.

  • Challenge

    Avoid CRM duplicates.

    Solution

    Uniqueness per search and LinkedIn URL, prior HubSpot lookup and 409 conflict handling.

08 — My contribution

  • Prototype as n8n workflows
  • Domain architecture and data model
  • Laravel backend and Vue / TypeScript interfaces
  • Apify, OpenAI, Fullenrich, Pappers and HubSpot integration
  • Jobs, webhooks, notifications and refreshes
  • Backend tests and Railway deployment with a dedicated worker

09 — Stack

Backend
PHP, Laravel 12, Queues, Scheduler, webhooks
Frontend
Vue 3, TypeScript, Inertia.js 2, Tailwind CSS, shadcn-vue
Integrations
Apify, OpenAI, Fullenrich, Pappers, HubSpot
Quality
Pest, PHPUnit, Mockery, PHPStan, Pint
Deployment
Railway, Nixpacks, web + worker

10 — Results

  • 5

    external services orchestrated in one pipeline

  • v2

    n8n prototype rewritten as a maintainable Laravel app

Next case studyInstaBotA multi-account dashboard to collect, filter and contact Instagram profiles, with real-time monitoring.