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


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.
05 — Screenshots

Dashboard of searches and processed profiles 
Qualification prompt editor with variables
06 — Architecture
- LinkedIn searchApify · personas
- AI qualificationOpenAI · prompt
- EnrichmentFullenrich · Pappers
- 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