Optimize Facebook Ads for HubSpot MQLs, Not Raw Leads
High-ticket deals close on a call, too rarely for Meta to learn from. Send HubSpot MQLs to Meta and optimize for intent, not for every form.
IN THIS PLAYBOOK · 12 SECTIONS
Where Your Data Breaks
Your offer costs $6,000, and it closes on a sales call. Meta never hears that call. It sees form submissions, so it optimizes for the people most likely to fill in a form. Your reps then spend the week calling leads who never pick up.
Leadis the wrong target. Optimize for it, and Meta finds more people who fill in forms. Most of them never get on a call.- SQLs are too rare to learn from. If 1 lead in 10 qualifies, Meta gets a handful of results a week. Its learning phase needs about 50 per ad set.
- Rejected leads stay in your audiences. Meta doesn’t know which leads your team turned down, so your retargeting keeps paying to reach them.
The signal you need sits between the form and the call. A lead who comes back twice and reads your pricing page has shown intent, even before your rep gets them on the phone. HubSpot has a stage for that: Marketing Qualified Lead (MQL).
Here’s the play. A HubSpot workflow sets the MQL stage, and AnyTrack sends it to Meta as a custom event, with the ad click attached. Prospecting optimizes for MQL. Sales Qualified Lead (SQL), Unqualified, and won deals follow the same path, so you can move up to SQL later and exclude the leads your team rejects. Setup takes about an hour, most of it in HubSpot and Meta.
From HubSpot Form to Qualified Signal
Follow one lead from the Facebook ad through each HubSpot stage. Every stage reaches Meta as its own event, tied to the ad click, and fills the audiences your campaigns use.
Steps marked with the AnyTrack node run automatically. No extra code, no manual tagging.
Example Scenario
You sell a $6,000 coaching program. Your Facebook ads send people to a HubSpot landing page with an application form. Your reps call every applicant, and most deals close on the second call. You get about 30 leads a day.
Run the numbers. 210 leads a week, and 1 in 10 becomes an SQL: 21 SQLs a week, far below the 50 Meta wants per ad set.
Now say 30% of leads come back for a second session or read your pricing page. That’s 63 MQLs a week, enough for Meta to learn. If 1 in 3 MQLs becomes an SQL and 1 in 4 SQLs buys, you close about 5 deals a week.
Four things need to happen:
- An MQL rule in HubSpot that marks intent before the first call.
- Every stage as its own event: MQL, SQL, Unqualified, and won deals, sent to Meta with the ad click attached.
- A prospecting campaign that optimizes for MQL, then moves to SQL once SQLs reach about 50 a week.
- An exclusion audience of unqualified leads, so no campaign pays to reach them again.
- An AnyTrack account on Starter or above, which the Conversion API requires
- A HubSpot Professional or Enterprise subscription, for the workflow that sets the MQL stage
- Leads collected on HubSpot forms, with the HubSpot tracking code on your pages (HubSpot needs it to count sessions and page views)
- A sales team that sets the lifecycle stage, the lead status, and the deal stage in HubSpot after each call
- Access to your Meta ad account and Events Manager
Step 1: Install the Tag and Connect HubSpot
The Tracking Tag opens the session when the ad click lands and collects the fbclid and UTMs. When a visitor submits your HubSpot form, the Tag saves the AnyTrack Click ID on the new contact. Every later stage of that contact traces back to the ad.
- In AnyTrack, create a property for your website’s domain.
- Copy the Tracking Tag from Property Settings > Tracking Script.
- Paste the Tag in the
headof every page with your form. On HubSpot pages, go to Settings > Tools > Content > Pages and paste it in the header section. - In the AnyTrack Integration Catalog, search for HubSpot and click Install Integration.
- Select your property, click Next, then click Connect HubSpot.
- Choose your HubSpot account, click Connect App, then click Save.
AnyTrack adds the AnyTrack Click ID field to forms built in HubSpot’s legacy form editor. For forms built in the updated form editor, add it yourself: open the form, add the AnyTrack Click ID property, and set it as a Hidden field. The HubSpot integration guide shows each screen. Leads from an external form, such as Typeform, need one more step: pass the Click ID into HubSpot.
HubSpot lists both properties under Conversion information. Add AnyTrack Click ID to your forms. AnyTrack fills in AnyTrack Server Set ID itself.
Step 2: Build the MQL Workflow in HubSpot
Your MQL rule decides what Meta learns to find, so build it from intent. Look at your last SQLs and pick two or three signals most of them share before the first call. Common ones: two or more sessions, a visit to your pricing or case study page, or five or more page views.
The workflow has one job:
- Type: a contact-based workflow.
- Enrollment: lifecycle stage is Lead, and the contact matches your intent rule, for example Number of Sessions is 2 or more, or the contact viewed your pricing page.
- Action: Set property value, with Lifecycle stage set to Marketing Qualified Lead.
- Status: turn the workflow on.
HubSpot moves the lifecycle stage forward only, so the workflow never pulls an SQL back to MQL. Your reps keep doing what they do after each call: set Sales Qualified Lead, set the lead status to Unqualified, or move the deal to Won.
Click Breeze Assistant in HubSpot’s top navigation and paste the prompt below. Breeze creates the workflow turned off, so review it before you turn it on.
Create a contact-based
workflow. Enroll contacts
whose lifecycle stage is Lead
and who have 2 or more
sessions, or who viewed a page
whose URL contains /pricing.
Set their lifecycle stage to
Marketing Qualified Lead.
Step 3: Map Your HubSpot Stages to Custom Events
AnyTrack tracks each HubSpot stage you select and names it with the event you enter. Three stages become custom events, and won deals become Purchase.
- In AnyTrack, open your HubSpot integration and go to the Integration tab.
- In HubSpot Integration Events, open Contacts: lifecycle stage.
- Select Marketing Qualified Lead and enter
MQLas the event name. - Select Sales Qualified Lead and enter
SQL. - Open Contacts: lead status, select Unqualified, and enter
Unqualified. - Open Deals (standards) and map Deal stage: Won to
Purchase. - Click Save.
Leave Contact created on Lead and Meeting booked on Schedule, the defaults. If a stage is missing from the list, click Sync with HubSpot.
Deal events carry the HubSpot deal amount as their value, so each won deal reaches Meta as a Purchase at its full price. Lifecycle stages and lead statuses carry no deal, so MQL and SQL arrive without a value. You set one in Step 5.
Step 4: Connect Facebook Ads and Map the Custom Events
First, retire any other sender. If HubSpot’s ad conversion events already send lifecycle stages or form submissions to Meta, disable them in HubSpot under Marketing > Ads, on the Events tab. Remove any Meta Pixel or Lead script from your pages: the Tag loads the Meta Pixel for you.
Then connect Meta in AnyTrack:
- Go to Tracking Pixels, add a new pixel, and click Connect Facebook Pixel.
- Follow the prompts to connect your Business Manager, the Meta Pixel your campaigns use, and your ad account.
- Turn on Server-to-Server Tracking, then save.
Lead, Schedule, and Purchase are standard events and map to Meta automatically. Custom events need a manual mapping, in the same Facebook Pixel settings:
- Scroll to Conversion Event Mapping.
- Select
MQLin the left column and typeMQLas the conversion name on the right. - Click Save, then click Setup Conversions.
- Select your ad account and Lead as the Event Type, then click Setup. Meta uses the Event Type to optimize a custom conversion.
- Repeat steps 5 to 7 for
SQL. - Map
Unqualifiedthe same way. It only feeds an audience, so it needs no conversion value.
From here, the Tag loads your Meta Pixel and sends only PageView from the browser. Every stage reaches Meta through the Facebook Conversion API, with the ad click and first-party data attached. The custom conversions guide covers the mapping screen.
MQL, SQL, and Unqualified show in AnyTrack reports as soon as HubSpot sends them. Meta gets them only after you map them here.
Step 5: Give MQL and SQL a Value in Meta
A value tells Meta what each result is worth, and Meta reports your return on ad spend from it. An MQL is not a sale, but it has a price: your average deal multiplied by the share of MQLs that buy. In the example, 1 SQL in 4 buys a $6,000 program, so an SQL is worth $1,500. 1 MQL in 3 becomes an SQL, so an MQL is worth $500.
- In Meta Events Manager, click Custom conversions in the menu.
- Select your
MQLcustom conversion and click Manage. - Enter the conversion value as a whole number, for example
500, and save the changes. - Repeat for
SQL, for example1500.
Step 6: Build Your Two Meta Audiences
Both audiences come from the events AnyTrack now sends. Build them before launch so every ad set can use them from day one.
The exclusion audience holds every lead your sales team turned down:
- In Meta Ads Manager, go to Audiences.
- Click Create audience, then Custom audience.
- Choose Website and click Next.
- Select your pixel and the
Unqualifiedevent. - Set the retention to 180 days.
- Name it “Unqualified leads” and click Create audience.
The retargeting audience holds MQLs who haven’t qualified yet. Create a second website custom audience the same way: include MQL, exclude people who triggered SQL or Unqualified, and set the retention to 30 days. Name it “MQLs without a call”.
A lead joins and leaves these audiences as their HubSpot stage changes. Nobody uploads a list.
Step 7: Test the Chain
Prove every stage reaches Meta before you spend on it.
- In Meta Events Manager, open your pixel’s Test Events tab and copy the test event code.
- In AnyTrack, open Tracking Pixels > your Facebook Pixel and paste the code into Test Event Code, in the Facebook Conversion API section.
- Open your landing page in a private window and submit the form.
- In HubSpot, open the new contact and set the lifecycle stage to Marketing Qualified Lead, then Sales Qualified Lead.
- In AnyTrack, open the HubSpot integration’s Events Log tab and click Refresh. You see
Lead,MQL, andSQL. - In Meta’s Test Events tab, find the same events from Server, usually within 30 seconds.
- Delete the test event code in AnyTrack, and delete the test contact in HubSpot.
While the code stays in place, Meta treats your events as test events. Delete it as soon as the test passes.
The Meta CAPI Test Mode guide covers the test tools in detail.
Step 8: Launch the Campaign Stack
Launch day. Two campaigns run on these signals: one finds new MQLs, and one turns MQLs into booked calls. Both carry the UTM Tracking Template, so the Campaign Report ties every stage to the ad that started it.
- In AnyTrack, open Tracking Pixels > your Facebook Pixel > Ads Integrations and copy the UTM Tracking Template.
- In Ads Manager, paste it into the URL parameters at the campaign level of both campaigns.
- Back in Ads Integrations, click Verify Ads Settings. A green mark next to each campaign means the template is in place.
Prospecting: optimize for MQL
Your main engine. It buys the leads most likely to show intent before the first call.
- Destination: your HubSpot landing page with the application form, with the UTM Tracking Template at the campaign level and a green mark in Verify Ads Settings.
- Budget: your current lead budget, in one campaign with one ad set. 63 MQLs a week clear Meta’s learning threshold in one ad set. Split across three, they fall back to 21 each. Hold the budget steady for the first week, then scale in steps of about 20% while your cost per SQL holds.
- Audience: Advantage+ audience. Under Show more controls, exclude “Unqualified leads” and a website custom audience of
Purchase, 180-day window, so you stop paying to reach rejects and clients. - Event tracking: generates the
LeadandMQLevents that fill the retargeting audience, and theUnqualifiedevents that grow the exclusion. - Conversion objective: Leads, conversion location Website, optimized for your
MQLcustom conversion. WhenSQLreaches about 50 a week in this ad set, switch to theSQLcustom conversion.
Retargeting: MQLs without a call
The warmest leads in your account: they showed intent, and nobody has qualified them yet. Some missed the call, and some never booked one.
- Destination: the page on your website where leads book a call, with the same UTM Tracking Template.
- Budget: 10 to 15% of prospecting. The audience is small by design, so its size sets the ceiling, not the budget.
- Audience: “MQLs without a call”, added under Further limit the reach of your ads with Use as a suggestion unchecked, so delivery stays inside it. Exclude “Unqualified leads” and
Purchase. - Event tracking: fed by the
MQLevents from your workflow; generates theScheduleandSQLevents that move each lead out of this audience. - Conversion objective: Leads, conversion location Website, optimized for
Schedule. The audience is already qualified by intent, so it needs no ladder.
Any new ad set you add later needs the “Unqualified leads” exclusion too. Without it, that ad set pays to reach leads your team already turned down.
The Optimization Loop
Follow one lead through a week. On Monday they fill in your form, and Meta gets a Lead. On Tuesday they come back and read your pricing page. Your workflow marks them MQL, and Meta gets an MQL worth $500, tied to the ad that brought them. Prospecting has one more example of intent to look for, and the lead joins your retargeting audience.
On Thursday your rep calls. A good fit becomes an SQL and leaves retargeting. A bad fit becomes Unqualified and joins the exclusion, so no ad set pays for them again. Weeks later, the deal closes, and a Purchase arrives at $6,000.
Your part is a weekly pass with three tasks:
- Measure. In the Campaign Report, compare MQLs, SQLs, and revenue for each campaign. Then, in HubSpot, check how many MQLs became SQLs. That share is the number behind your MQL value.
- Improve. Tune the MQL rule and keep the values honest:
- If fewer MQLs qualify than your value assumes, tighten the rule: add a page, or raise the session count. Then lower the MQL value in Events Manager.
- If MQLs drop below about 50 a week, loosen the rule. Change one thing at a time, because each change shifts what Meta learns.
- When SQLs reach about 50 a week in the ad set, switch prospecting from
MQLtoSQL. Expect the ad set to re-enter learning.
- Expand. Every stage you track is an audience seed:
- Lookalike of SQLs. Once 100 or more people trigger
SQL, seed a 1% Lookalike Audience from a website custom audience ofSQL, 180-day window, in a new prospecting campaign. Meta recommends 1,000 to 5,000 people for the best source. - Leads your reps can’t reach. Map the Attempted to Contact lead status to a custom event, and retarget those leads with an ad that asks them to book a time.
- Lookalike of clients. At about 5 deals a week, your
Purchaseaudience passes 100 people in about five months. Then seed a lookalike from your clients.
- Lookalike of SQLs. Once 100 or more people trigger
Each pass sharpens the next. Your reps’ calls decide who Meta looks for, and the leads it finds give your reps better calls.
Frequently Asked Questions
Why not optimize for SQLs or won deals from day one?
Volume. Meta exits the learning phase after about 50 results in a week for each ad set. If 1 lead in 10 becomes an SQL, you need 500 leads a week in one ad set before SQL works as a target. MQLs come in faster, so Meta can learn from them now. Move to SQL when its volume catches up.
Why custom events? Meta already has a Lead event.
Because each stage means something different. Lead already counts every new contact. MQL, SQL, and Unqualified keep the stages apart, so you can optimize for one, retarget another, and exclude the third. AnyTrack sends custom events to Meta like any other event, and Meta optimizes for them as custom conversions.
What value should an MQL carry?
What the stage is worth to you: your average deal multiplied by the share of MQLs that buy. HubSpot sends no value with lifecycle stages and lead statuses, so you set the value on the custom conversion in Meta Events Manager. Won deals need nothing extra: they carry the deal amount.
Can Breeze Assistant build the MQL workflow for me?
Yes, on HubSpot Professional and Enterprise. Click Breeze Assistant in HubSpot's top navigation and describe the workflow, or use the prompt in Step 2. Breeze creates the workflow turned off. Review the enrollment rule and the action, then turn it on.
HubSpot already syncs lifecycle stages to Meta. Do I keep that on?
Keep one sender for each stage. If HubSpot's ad conversion events send the same stages or form submissions to Meta, Meta gets two signals for one lead. Disable them in HubSpot under Marketing > Ads, on the Events tab, and let AnyTrack send every stage with the ad click attached.
Does sending unqualified leads to Meta hurt my campaigns?
No. Meta optimizes each ad set for the conversion event you select. Unqualified is not that event: it only fills the exclusion audience, so your ads stop reaching people your sales team already turned down.
My leads come from Typeform or another external form. Does this still work?
Yes, with one extra step. Pass the AnyTrack Click ID from the form into the contact's AnyTrack Click ID property in HubSpot. The external form guide linked in Step 1 lists the parameter for each form tool.
Wrapping Up
Here’s what you shipped:
- A HubSpot workflow that marks intent as MQL before the first call.
MQL,SQL, andUnqualifiedsent to Meta as custom events, with values set on MQL and SQL, and won deals sent asPurchaseat the deal amount.- An exclusion audience of rejected leads, and a retargeting audience of MQLs without a call.
- A prospecting campaign that optimizes for MQL today and moves to SQL when the volume is there.
A form submission says someone was curious. A second visit says they’re serious. Now Meta knows the difference.
Explore Related Playbooks
Feed Offline Lead Status to Google Ads
The close happens in your CRM days after the click. Webhook every stage change back to the click so Google Smart Bidding optimizes on closed deals.
Taboola Advertorial + ClickFunnels 2.0 Tracking
Taboola readers cross two domains before they buy. Stitch ad, advertorial, and ClickFunnels 2.0 into one tracked journey and send the full order value.
Make Your SamCart Funnel Pay for Its Facebook Ads
A $27 front end rarely pays for the ad that sold it. Your bumps and upsells can, once Meta sees every SamCart order at full value and finds them more buyers.

