The starting point
Meta shows clicks and form fills, and the CRM shows candidates. Neither showed both. Some campaigns looked cheap in Ads Manager but brought no candidates recruiters could use, and nobody knew how much of the budget disappeared that way.
What I built
- A Meta ads dashboard. Campaigns, ad sets and ads with spend, impressions, clicks and a preview of every ad, built on an open source template.
- CRM integration. Leads and deals from the CRM sync into a separate database through the API.
- UTM on everything. Every ad and landing page got fixed UTM tags, so every lead ties back to its campaign, ad set and ad.
- Cost per qualified lead. Cost per lead and cost per qualified lead (CPQL) are recalculated every 30 minutes.
- Blind spots. Alerts when a campaign spends without leads and when an ad has run so long the audience is tired of it.
- Safe access. The Meta access token lives on the server behind a proxy, not in the page code.
The result
From 2 September to 1 October 2026 the dashboard showed 18,171 zł in ad spend and 1,982 leads in the CRM. The share of spend matched to a campaign rose from 59.6% to 84.3%, with zero UTM errors. Most important: 6,861 of 16,512 zł went to eight campaigns without a single CRM lead. Those campaigns were paused or fixed, and the budget moved to campaigns with qualified candidates.
The next step was Eva, an AI marketing agent that uses the same numbers to manage the ads every day.
Tools and tech stack
- Meta Marketing API
- CRM API
- PostgreSQL
- Node.js
- Python
- ApexCharts
- UTM sporing
- nginx
The client is anonymised. The numbers come from the project's own reports and measurements.
Want this for your business? See Meta ads specialist or Google Ads consultant.







