Skip to content

AnyTrack

PLAYBOOK

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.

Facebook Ads
Ad click lands on your HubSpot form
arrow-down.svg ui
HubSpot
Lead, MQL, SQL, Unqualified, Won
arrow-down.svg ui
logo-alt.svg ui
AnyTrack
Stages become custom events
arrow-down.svg ui
Facebook Conversion API
Custom conversions & audiences
↺ Meta learns who qualifies, not just who fills in a form
Playbooks / Optimize Facebook Ads for HubSpot MQLs, Not Raw Leads
IN THIS PLAYBOOK · 12 SECTIONS
arrow-down.svg ui
The problem

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.

  • Lead is 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.

Outcomes What This Playbook Unlocks
roas-tracking.svg features
Leads worth a call
Meta optimizes for MQLs, the leads who came back and read your pricing page, not for every form submission.
party-data.svg features
No spend on rejects
Leads your sales team marks Unqualified join an exclusion audience, so no campaign pays to reach them again.
data-orchestration.svg features
A ladder to SQL
Start on MQL volume. Move to SQL when it reaches about 50 a week, with won deals sent at their full value.
How it works

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.

Ad Click
Campaign UTMs on the landing URL
Meta click ID (fbclid) on the click
logo-alt.svg ui
Session Started
Tracking Pixels loaded (Meta Pixel)
fbclid & UTMs collected
AnyTrack Click ID generated & first-party data collected
Links & forms AutoTagged with the Click ID
Lead
Contact created by your HubSpot form
Click ID saved on the contact record

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.

Plug in your own numbers

These are example numbers, not benchmarks. Use your own lead count, MQL share, and close rates for every figure in this playbook.

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.
Prerequisites Before You Begin
  • 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.

  1. In AnyTrack, create a property for your website’s domain.
  2. Copy the Tracking Tag from Property Settings > Tracking Script.
  3. Paste the Tag in the head of every page with your form. On HubSpot pages, go to Settings > Tools > Content > Pages and paste it in the header section.
  4. In the AnyTrack Integration Catalog, search for HubSpot and click Install Integration.
  5. Select your property, click Next, then click Connect HubSpot.
  6. 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.

Pick AnyTrack Click ID, not Server Set ID

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:

  1. Type: a contact-based workflow.
  2. 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.
  3. Action: Set property value, with Lifecycle stage set to Marketing Qualified Lead.
  4. 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.

Let Breeze Assistant build it

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.

  1. In AnyTrack, open your HubSpot integration and go to the Integration tab.
  2. In HubSpot Integration Events, open Contacts: lifecycle stage.
  3. Select Marketing Qualified Lead and enter MQL as the event name.
  4. Select Sales Qualified Lead and enter SQL.
  5. Open Contacts: lead status, select Unqualified, and enter Unqualified.
  6. Open Deals (standards) and map Deal stage: Won to Purchase.
  7. 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.

Track a deal with its contact

AnyTrack tracks a deal only when the deal has an associated contact. Make sure your reps create deals from the contact record.

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:

  1. Go to Tracking Pixels, add a new pixel, and click Connect Facebook Pixel.
  2. Follow the prompts to connect your Business Manager, the Meta Pixel your campaigns use, and your ad account.
  3. 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:

  1. Scroll to Conversion Event Mapping.
  2. Select MQL in the left column and type MQL as the conversion name on the right.
  3. Click Save, then click Setup Conversions.
  4. Select your ad account and Lead as the Event Type, then click Setup. Meta uses the Event Type to optimize a custom conversion.
  5. Repeat steps 5 to 7 for SQL.
  6. Map Unqualified the 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.

Unmapped custom events never reach Meta

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.

  1. In Meta Events Manager, click Custom conversions in the menu.
  2. Select your MQL custom conversion and click Manage.
  3. Enter the conversion value as a whole number, for example 500, and save the changes.
  4. Repeat for SQL, for example 1500.
Values live in Meta, not HubSpot

Meta tells you to use this field only when your events carry no value of their own. MQL and SQL qualify. Won deals don’t: they carry the deal amount.

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:

  1. In Meta Ads Manager, go to Audiences.
  2. Click Create audience, then Custom audience.
  3. Choose Website and click Next.
  4. Select your pixel and the Unqualified event.
  5. Set the retention to 180 days.
  6. 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”.

The audiences update themselves

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.

  1. In Meta Events Manager, open your pixel’s Test Events tab and copy the test event code.
  2. In AnyTrack, open Tracking Pixels > your Facebook Pixel and paste the code into Test Event Code, in the Facebook Conversion API section.
  3. Open your landing page in a private window and submit the form.
  4. In HubSpot, open the new contact and set the lifecycle stage to Marketing Qualified Lead, then Sales Qualified Lead.
  5. In AnyTrack, open the HubSpot integration’s Events Log tab and click Refresh. You see Lead, MQL, and SQL.
  6. In Meta’s Test Events tab, find the same events from Server, usually within 30 seconds.
  7. Delete the test event code in AnyTrack, and delete the test contact in HubSpot.
Remove the test event code

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.

  1. In AnyTrack, open Tracking Pixels > your Facebook Pixel > Ads Integrations and copy the UTM Tracking Template.
  2. In Ads Manager, paste it into the URL parameters at the campaign level of both campaigns.
  3. 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 Lead and MQL events that fill the retargeting audience, and the Unqualified events that grow the exclusion.
  • Conversion objective: Leads, conversion location Website, optimized for your MQL custom conversion. When SQL reaches about 50 a week in this ad set, switch to the SQL custom 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 MQL events from your workflow; generates the Schedule and SQL events 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.
Exclude rejects in every ad set

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.

Read the trend by the week

Meta folds these events into delivery on its own schedule, not the second they arrive. Judge each change after a full week.

Your part is a weekly pass with three tasks:

  1. 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.
  2. 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 MQL to SQL. Expect the ad set to re-enter learning.
  3. 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 of SQL, 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 Purchase audience passes 100 people in about five months. Then seed a lookalike from your clients.

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, and Unqualified sent to Meta as custom events, with values set on MQL and SQL, and won deals sent as Purchase at 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.

Ready to Feed Your Ad Platforms Better Data?

One Tracking Tag. Every conversion signal, sent server-side to every platform you run. Set up this playbook in under an hour.

No credit card required