Power Law Performance Subscribe

ResourcesImplementing Signals and Attribution for Power Law Businesses

Tell the platforms

Two events and one bidding goal on Meta and Google, which later results go back, and the shortcuts earlier setups took that now cost more than they save.

Chapter 6 of 7 · 8 min read · A guide by Broad Eye Solutions · Version 1.0 · Updated November 3, 2026

Get the whole guide as a PDF

Chapter 6 of 7All chapters
  1. 1 Where the thread breaks
  2. 2 One ID and the funnel
  3. 3 Capture every lead
  4. 4 Reports run on PRO, never on raw data
  5. 5 One question that sorts
  6. 6 Tell the platforms
  7. 7 Close the loop
  8. Sources
The guide’s overview

Two events and one bidding goal

Once the lead is saved, the page sends two events to the tag manager, and both carry the lead ID as their event ID.

EventFires whenSent to the platforms asBid on
lead_submittedEvery saved leadA custom Inquiry event on Meta, never optimized for. An observe-only conversion on GoogleNever
qualified_conversionThe server says the answers cleared the lineThe lead conversion, from the browser and from the server, with one event IDYes, the only bidding goal at a time

That’s starving the algorithm, or qualified-conversion bidding: the bid strategy doesn’t change, only which conversions the platforms are told about. Every lead is still kept, worked and reported, and the only conversion the platforms bid on is the qualified one. The event behind it, qualified_conversion, is an advertising event, not a funnel stage. It fires only on the website, and only when the answers clear the line, so a lead from a call or a referral never fires it, though that lead can still become an MQL. Neither event carries the answers or their codes, and for a visitor who opted out of tracking, neither goes to the platforms.

A flow from one box, the lead is saved on your server, splitting into two. Left, every lead, the lead_submitted event: your reports and analytics, Meta a custom Inquiry event never optimized for, and Google Ads secondary and observation only. It ends in a dashed box, never bid on. Right, qualified conversions only, the qualified_conversion event: Meta's Lead event from the browser and the server with one ID, Google Ads primary and counted once per click. It ends in a solid box, the only conversion bid on.
Platform settings checked October 28, 2026.

On Meta, the standard Lead event fires on qualified_conversion only, with its event ID set to the lead ID, and the ad sets optimize for it. A server-side copy of the same event goes through the Conversions API, with the same event name and event ID, hashed email and phone, the visitor’s IP and browser, and Meta’s own browser cookies. Meta counts the pair once, as long as the two arrive within 48 hours of each other. Every lead, qualified or not, also goes to Meta as a custom event named Inquiry, so Meta’s own reports count every lead beside the qualified ones and the two counts can be tied out. It’s sent as a custom event, not a standard one such as Lead, and no ad set optimizes for it. The Conversions API carries only the qualified conversion, never every lead.

On Google Ads, set the qualified conversion as a Primary conversion action in the goal the campaigns bid toward, and every other lead as Secondary, which Google reports and never bids on. Count both as One per click, because a lead action set to Every counts a repeat submission twice, and the bidding learns from the duplicate. Set the conversion tag’s transaction ID to the lead ID, so a reload can’t count the same lead again, and turn on enhanced conversions so the tag sends the lead’s email and phone, which Google hashes before they leave the browser.

Two setups to avoid on Google. Don’t keep an imported analytics “form submit” as a primary conversion beside the qualified conversion, because the bidding will optimize toward the bigger number. And never fire one conversion action with a value of zero for leads that don’t qualify. Under bidding that counts conversions, a zero-value conversion still counts as one.

Keep the event names, the values and the rules identical everywhere once they’re live. Renaming an event or changing its value changes the signal the campaigns learned on, and puts them back into learning.

Later results go back, only the valuable ones

The best signal is the result itself: how far a lead gets, and what its account turns out to be worth. Those arrive weeks after the click, so for the leads that cleared the line on the form, they go back to the platforms as later conversions, matched to the click by the IDs and the hashed details captured on the form. Send each one as it’s reached, not in a monthly batch: Meta’s Conversions API turns away an event more than 7 days after it happened.

Send them back with care. Meta’s guidance for its CRM integration is to send every stage as it’s reached, the raw lead included, and let the bidding put more and more weight on closed won. The blueprint holds back on purpose, because closed won isn’t the goal. Left to itself, with volume bias pulling the other way, the bidding optimizes for the small closed-won accounts, because there will always be more of them. So the platforms hear about the later stages only for the leads that cleared the line when they came in, as far into the funnel as each one gets, whether or not it goes on to the next stage. A lead that didn’t qualify on the form sends nothing later, even when it advances. The deepest result is the value line, read early enough to land inside the platforms’ windows. Google takes a click ID up to 90 days old and hashed details up to 63 days after the click, so a line read on a full first quarter arrives too late to teach the bidding anything. The first full month of revenue above the median lands in time. Tiering and reporting keep the full quarter. Never every closed won.

  • Google: enhanced conversions for leads matches a later result to the click from the hashed email captured on the form, alongside the click ID. From June 15, 2026, those uploads go through Google’s Data Manager API, so check the current method before building it. A CRM import works the same way: each stage’s first timestamp is set the moment a qualified lead reaches it, and the import picks up every qualified record where it’s set.
  • Meta: send each later stage, and the value-line result, through the Conversions API with the same hashed details and the lead’s event ID, each in its own event, for the qualified leads only. The blueprint sets out what that send needs. It doesn’t include the sender.
  • Which one to bid on: the one that happens soon enough, and often enough, for the bidding to learn from. Keep the later stages as secondary conversions, sent only for the qualified leads, then move the bidding goal later in the funnel as the volume allows. The stage timestamps make that switch a setting, not a rebuild.

Show the platforms who your best customers are

It’s tempting to point existing customers at the qualified thank-you page, through a survey email or a newsletter, so the platforms see more of the people you already know are worth having. Don’t. Every visit fires a conversion that didn’t happen. The platform’s lead count and value rise, the cost per lead looks better than it is, an ad a customer happened to see gets credit for a lead that doesn’t exist, and the bidding learns from people you’ve already won, so some of the spend goes to showing them ads again. With the conversion fired on the server’s answer, a visit with no saved lead fires nothing anyway.

Three ways give the platforms the same picture without inventing a conversion:

  • Send back the qualified leads’ later stages and value-line result. The later conversions above tell the platform how far its qualified leads got and which turned out valuable, matched to the click that brought them in.
  • Give customer visits their own event. A survey page or a customer area fires a custom event of its own, such as customer_survey_completed, never the Lead. The platform still matches those people, you can build an audience from them, and the event the bidding learns from stays clean.
  • Upload the customer list and the leads you already have. Use it to keep existing customers and every existing lead out of prospecting campaigns, whatever each lead answered, and, outside the Special Ad Categories, the customers as a seed for the platform’s audience suggestions. Never upload only the leads below the line. A list of the people who didn’t qualify tells the platform the answer, and the answer never leaves your systems.

In a Special Ad Category, lookalike audiences are gone for a reason: a model built on existing customers can reproduce traits the law protects. Seeding the bidding with your customers is the same model by another route, so it’s a question for counsel before it’s a tactic.

Why the setup changed

None of this arrived in its final form. The first versions of this setup worked, and several of their shortcuts are now out, because the platforms tightened their rules or because the shortcut broke something quietly. If your current setup does any of these, it’s worth changing:

What earlier setups didWhat it costWhat replaced it
Passed the answers in the thank-you page’s address (?rev=50000&biz=3yr) so the tag manager could read themEvery tag on the page reads the address, so the answers went to every platform, analytics tool and widget on every loadThe server scores the answers. The address carries nothing
Passed the code instead (/thank-you/?code=1100), with a custom conversion on “address contains code=11”The same leak, smaller. A custom conversion built on an answer reads like a targeting instruction, and Meta now flags ones that suggest financial statusEvents after the save
Fired the qualified conversion on the qualified thank-you page’s addressOn financial-services pixels, Meta’s Core Setup can strip everything after the domain, so a rule on the address can miss every conversion on Meta’s sideThe Lead event, fired on the server’s answer. The two thank-you pages stay, with neutral addresses, for the visitor
Asked for a personal credit band as one of the qualifying answersPersonal financial status, which the platforms don’t allow as a signalQuestions about the business only
Fired one conversion with a value for qualified conversions and $0 for the restUnder bidding that counts conversions, a zero-value conversion still counts, so the bidding learned from every leadA primary action for the qualified conversion, a secondary one for the rest
Wrote the qualifying rule into the landing page’s own scriptEvery new page copied it, and the copies driftedOne rules file, read by the server
Carried the qualification, or the visitor’s details, from step one to step two in a cookie or the addressLost on some browsers, and personal details ended up in logsThe lead ID only. The server holds the rest
Counted every load of the thank-you pageReloads and back buttons counted twiceOnce per event ID

The direction is the same every time. Less leaves your systems, the decision is made in one place, and the conversion the platforms bid on carries one plain fact: a qualified conversion happened.

In your own data

See it in your own book.

ABPRO_ resolves every lead's PRO fields from all of its raw capture through your own map files and runs every report on them. It joins each lead to the account it became and reads every source, form, cohort and answer by the share of above-average accounts it produces and the revenue they return.

Get the whole guide as a PDF

Every chapter, version 1.0, in one file, sent to your inbox. The newsletter follows with the articles that build on it.

One email a week after the PDF.