TL;DR: Meta Lead Ads hand you the lead. They do not reliably hand you which ad set and which creative produced it, in a form that HubSpot's native ads reporting can join against spend. So teams optimise creative — the decision they make weekly — using campaign-level cost per lead. The gap is narrow, unglamorous, and sits between two platforms that both consider it the other one's problem.
The evidence
PainHunt's marketing automation, CRM and marketing analytics categories hold 2,234 high-scoring signals (10+/15), average score 11.4, average pain intensity 7.4/10 across 10,244 extracted pain points. The signal comes disproportionately from places where practitioners talk to each other rather than to vendors: Discourse community forums (569), BlueSky (409), Medium (314), app store reviews (293) and Reddit (276).
The attribution cluster inside it repeats a specific shape:
- The lead arrives; the creative doesn't. Ad set name, ad name, ad set ID and ad ID do not land as usable properties from Instant Form submissions.
- Dynamic macros don't resolve. The documented way to pass this — macro substitution in tracking parameters — does not work on the Instant Form surface, so native capture is closed off.
- Middleware moves the data into the wrong shape. Values relayed through an integration tool land beside the reporting object rather than inside it, and cannot be joined to spend, impressions or cost per lead.
- The manual workaround doesn't scale. Adding form-level ad set and creative fields by hand is fine for ten combinations and unworkable at a hundred.
- The reporting question stays unanswered. Practitioners describe running multi-six-figure monthly budgets across Search, Performance Max, Display and YouTube with no unified attribution view.
The personas are consistent: growth marketers running paid budgets, small agency owners handling five to ten client accounts, and B2B marketing leaders who have to defend spend upward. All three make creative-level decisions on a weekly cadence with campaign-level data.
Why now
Creative became the main lever. With targeting increasingly delegated to the platform's own optimisation, the input a marketer still controls is the creative. Measuring at campaign level while operating at creative level was tolerable when targeting was the variable; it isn't now.
Lead forms moved on-platform. Instant Forms convert better than a landing page precisely because they never leave Meta — which is also the reason the tracking that works on your own site isn't in the path. The thing that improved conversion broke measurement, and the two teams affected are usually the same team.
The proof burden went up. Marketing budgets defended with "cost per lead was $40" are increasingly asked which creative produced the $18 leads and which produced the $95 ones. That is a question the current stack answers with a spreadsheet, if at all.
The wedge
The buildable thing is narrow: make ad-level identifiers arrive as first-class reporting dimensions, not as contact properties.
- Capture at the source, per submission. Pull ad set name, ad name, ad set ID and ad ID from the Lead Ads API at retrieval time rather than trying to smuggle them through the form. The identifiers exist on Meta's side; the problem is purely that nothing carries them across in the right shape.
- Write into the reporting object, not next to it. The whole value is being joinable to spend and impressions inside the native report. A tool that writes another contact property has solved the transport problem and left the reporting problem untouched — which is precisely what teams say the current workaround does.
- Cost per creative as the headline output. Not another dashboard: one number per creative, joined across CRM outcome and platform spend, refreshed daily. That is the report people are currently building by hand and mostly not building.
- Agency-shaped from day one. Five to ten client accounts under one login, per-account billing, and no per-seat pricing that punishes the agency model. This buyer is underserved and has an unusually short evaluation cycle, because they can test on one client account this week.
Start with Meta plus one CRM. Breadth is a trap here — the value is depth of the join, and every additional platform pair multiplies the surface without multiplying the willingness to pay.
Risks and honest caveats
Both platforms can close this. Meta could resolve macros on Instant Forms; the CRM could add ad-level dimensions natively. Either would remove most of the reason to buy. This is a real risk and it argues for building something that spans platform pairs rather than perfecting one — the cross-platform join is the part neither vendor is incentivised to build.
API access is the dependency and the ceiling. Lead Ads retrieval requires permissions that are reviewed, and review outcomes change. A business whose entire value sits behind one platform's app review has a single point of failure it does not control.
Attribution is a crowded, cynical market. Buyers have been sold attribution before and have been disappointed. Framing this as a modelling product invites comparison with tools ten times the price. Framing it as plumbing — "your ad set names show up in your reports" — is both more honest and easier to verify in a trial.
It may be a feature, not a company. Realistically this is a $50–200/month line item per account. It works as an agency tool or as a wedge into broader paid-social reporting — see the related signal on per-client pricing for agencies — rather than as a standalone platform.
Where this came from
This is one cluster inside PainHunt's marketing automation and CRM categories. The Pain Point Browser shows the underlying signals with their intensity and commercial scoring, and the Idea Validator will score a specific version of this idea against the same dataset. Two adjacent clusters are worth reading alongside it: conditional logic gaps in marketing automation workflows, which describes the same platform hitting its ceiling from the automation side, and privacy-safe identity resolution, which covers what happens to attribution once the identifier itself is gone.