At a glance
Revenue Meta attributes to its ads, summed across every campaign in the ad account. The Insights field ispurchase_roas[].value × spendresolved asaction_values[type='purchase'], returning revenue tagged to ad-attributed purchases within the configured attribution window.
| What it counts | SUM(action_values[action_type='purchase']) from the Meta Marketing API Insights endpoint, account-level. Sums purchase value reported by Pixel events, Conversions API events, and modeled conversions Meta auto-fills. |
| Insights API level | Account-level, summing across campaigns / adsets / ads. Per-campaign totals reconcile back to this card. |
| Currency | Account currency. Same caveats as Total Spend: ad accounts are single-currency, multi-currency advertisers run separate accounts. |
| Attribution model | 7-day click + 1-day view, the post-iOS-14.5 default. Older accounts may still be on 28-day click + 1-day view if they were grandfathered. The window is configurable per ad account, this card uses whatever you’ve set. |
| iOS 14.5+ ATT impact | Major. Without Conversions API, expect 15, 25% under-reporting on iOS-heavy audiences (consumer DTC, fashion, beauty). With CAPI live, the gap typically narrows to 5, 12%. Android and desktop are largely unaffected. |
| CAPI vs Pixel-only | Pixel-only: browser-side fires only, blocked by ATT, ad blockers, ITP, and consent rejection. CAPI live: server-side events sent independently of browser; partially backfills the gap. Best practice: dual-implementation (Pixel + CAPI with deduplication via event_id), Meta dedupes and uses whichever fires. |
| Conversions vs all-conversions | This card uses action_values for purchase event type only. Meta’s “all conversions” view (visible in Ads Manager column-builder as “Website Purchases (All Conversions)”) includes view-through and across-domain conversions. This card is the conservative, click-attributed view. |
| Modeled conversions | Included. Meta auto-fills attribution gaps with modeled values, currently 8, 18% of total action_values for typical Pixel-only DTC accounts. You cannot opt out (this is by design since iOS 14.5). The model can over- or under-state on a given period; trust the rolling 30-day, not the daily. |
| Frequency cap relevance | Indirect. High frequency suppresses the conversion-per-impression rate, so revenue per impression falls. The card itself is not frequency-capped, the spend that drove the revenue might be. |
| Time window | T/7D/30D vsP (default 30D vs prior 30D). |
| Alert trigger | drop >20% vsP. A 20%+ drop in attributed revenue versus the prior period fires the card. |
| Roles | owner, marketing, finance |
Calculation
Calculated automatically from your Meta Ads (Facebook) data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A UK beauty DTC merchant. iOS skews high in this category. The 30-day window is 02 Apr 26 to 01 May 26. Spend was £18,400, Pixel-only on web (no CAPI yet).| Source | Attributed revenue (£) | Notes |
|---|---|---|
| Pixel-confirmed conversions | 38,200 | Direct Pixel fires, post-consent |
| Modeled conversions (Meta auto-fill) | 9,800 | Statistical fill for ATT-blocked iOS |
| View-through conversions | (excluded) | Not in this card; visible in “All Conversions” |
Total (this card, action_values[purchase]) | £48,000 | Reads as “Meta-attributed revenue” |
- The Meta number is 2.2× the Shopify UTM number. Without CAPI, this is the structural pattern for iOS-heavy DTC. The “true” Meta-driven revenue sits between the two: probably £28, 35k. iOS users who clicked through Meta land on Shopify without UTMs (ATT strips them or they’re blocked at the link click), so Shopify counts them as Direct or Organic. Meta uses modeling to claim them; the modeling is partly real, partly inflation.
- Modeled conversions auto-fill ~20% of the Meta-reported revenue here. You can’t switch them off. The advice: track a rolling 30-day average and look at the trend, not the daily reading. Modeled values are noisier on the daily, smoother on the rolling.
- Advantage+ campaigns dominate but are opaque. £14,200 of the £18,400 spend (77%) sat in Advantage+ Shopping. The breakdown by audience or creative is not exposed; you see the headline ROAS, you don’t see why. Same pattern as Google PMax.
- Reported ROAS on this card: 48,000 ÷ 18,400 = 2.61×. Reported ROAS using Shopify-side UTM truth: 21,600 ÷ 18,400 = 1.17×. The CFO will ask which one to believe. Neither. The honest read is “directionally we’re break-even to slightly profitable on Meta, before COGS and overhead”. Don’t quote the Meta 2.61× as fact.
- Creative refresh due in ~2 weeks. Meta’s reporting shows frequency at 4.6 in a 7-day rolling window for the Advantage+ Shopping audience. CTR has dropped from 1.4% to 0.9% over the same span; that’s the creative-fatigue cycle. Plan a new ad batch for week 5, 6 of the flight.
Sibling cards merchants should reference together
Total Revenue is the numerator of ROAS. Look at it with these to know if the headline is real:| Card | Why pair it with Total Revenue | What the combination tells you |
|---|---|---|
| Total Spend | The denominator of ROAS. Revenue without spend is meaningless. | Revenue × Spend together produce the ROAS gauge. |
| ROAS | The efficiency reading. | Whether Meta thinks you made money on the spend. |
| Conversions Trend | Daily series of conversion count. Revenue can rise on fewer high-AOV conversions or many low-AOV ones, the trend exposes which. | Diverging count and value lines = AOV shifted. Same direction = volume play. |
| All Conversions | Includes view-through conversions and cross-domain. The “more generous” attribution view. | If the “all” number is meaningfully higher (say 30%+), view-through is doing real work. |
| Conversion Rate Trend | Click-to-purchase rate. | If revenue drops while CR also drops, the post-click experience changed (landing page, stockouts, pricing). |
| GA4 Revenue by Channel | Independent attribution check. GA4 last-non-direct vs Meta last-click. | Meta usually reports 30, 80% higher than GA4 for the same period; that’s the iOS attribution gap, not double-counting. |
| Shopify Total Revenue | The truth side. Real Meta-driven revenue is a subset of Shopify total revenue. | If Meta-attributed revenue exceeds 70% of total Shopify revenue, attribution is over-claiming. Reset the model. |
| Klaviyo Email Revenue | Cross-channel sanity check. | Email and Meta both claim revenue from the same purchase if attribution is naive last-click. |
Reconciling against the vendor’s own dashboard
Where to look in Meta Ads Manager: Meta Ads Manager → Campaigns → Columns → Performance and Clicks → “Purchases Conversion Value”. Make sure the date range matches this card’s window. The footer total should match this card to within sub-percent rounding. Other Ads Manager views that look similar but aren’t the same:- Website Purchases (All Conversions): includes view-through and cross-domain. This card uses the click-attributed
purchaseaction only. - Mobile App Purchases: a separate event for app conversions (SDK-tracked). This card is web-purchase only.
- Offline Conversions: server-uploaded conversions. Reported separately unless explicitly merged via Conversions API.
| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days off | Meta uses ad-account time zone (set at account creation, immutable). This card uses UTC. For “today” or “yesterday” reads on US Pacific accounts, expect 3, 8 hour boundary effects. |
| Attribution window changes | Direction depends | Default reset from 28-day click + 1-day view to 7-day click + 1-day view after iOS 14.5. If your account was created post-Sep-2021 it’s already on 7-day-click; older accounts may still be 28-day if grandfathered. A window change re-baselines retroactively in Meta’s UI; Vortex IQ matches whatever you’ve configured. |
| Modeled conversions inclusion | Ours matches Meta UI | Meta’s action_values includes modeled conversions and we read the same field. Both inflate by the same amount. |
| Ingest lag | Lower for “today” / “this hour” | Insights ingestion is 1, 4 hours typical. Modeled conversions can take longer (up to 72h to converge). Yesterday and earlier are stable. |
| Advantage+ opacity | None on the headline | Advantage+ Shopping aggregates audience and placement breakdowns internally; the headline action_values reconciles fully. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_analytics.ga_revenue_by_channel | Meta action_values should be 30, 80% higher than GA4 Paid Social-attributed revenue for the same period. | Meta reports last-click within its 7d/1d window with modeling; GA4 uses last-non-direct click. Meta typically wins the click in cases where the user also visited via direct or organic. The gap is structural, not an error. |
shopify.total_revenue | Meta action_values is a subset of Shopify total revenue, but iOS gap means UTM-tagged Meta revenue is much smaller than Meta claims. Expected pattern: Meta claims 1.5, 2.5× the UTM-truth Shopify number. | The “true” answer sits between the Meta claim and the Shopify UTM truth. Use a probabilistic attribution model (or just average them) for the CFO read. |
google_ads.gads_conversions_value | Independent paid channel. Sum to total paid-attributed revenue. | Different channels, no overlap. Don’t compare directly. |
Known limitations / merchant FAQs
Why does Meta say I made £150k and Shopify says only £30k from Meta? The single most common question. Three reasons stack up:- iOS 14.5 ATT. Roughly 60, 70% of UK iOS users decline tracking. Pixel can’t fire fully; CAPI catches some but not all. The clicks that converted to purchase still happened, but Meta’s UTM tags get stripped or rejected, so when the user lands on Shopify, the UTM is absent. Shopify counts the order as Direct or Organic. Meta uses statistical modeling to claim it; that modeling can be optimistic.
- Last-click vs last-non-direct attribution. Meta credits a 7-day-click window. If a user clicked Meta on Monday, browsed away, came back via Google search on Friday, and bought, Meta claims the sale. GA4 (and most Shopify UTM-based logic) credits the Google search as the last-non-direct touch. Same purchase, different platform claims it.
- View-through and cross-domain conversions. Meta sometimes leaks view-through into the headline if your account is misconfigured. Check the column-builder, you should be reading “Purchases” (click-only), not “Website Purchases (All Conversions)”. This card pins to click-only.
event_id for deduplication, 1, 2 weeks dev time. In all cases, deduplicate via event_id so Meta doesn’t double-count Pixel + CAPI.
How do I interpret modeled conversions?
Meta blends them into action_values invisibly. Two patterns to watch:
- Modeled lift after iOS 14.5: typical 8, 18% of total revenue. Reasonable.
- Modeled lift after a CAPI rollout: should decrease (CAPI catches conversions Meta no longer needs to model). If modeling stays high after CAPI, you have a CAPI implementation issue.
event_id and matching event timestamps; Meta dedupes server-side. Without dedup, you do double-count, this is the #1 CAPI mis-implementation. Test it: the Meta Events Manager → Test Events tab shows whether dedup is working. If both events fire with the same event_id, dedup is on.
My today value looks much lower than yesterday at the same hour, normal?
Yes. Today’s attributed revenue is built from incomplete data: Pixel/CAPI events are still ingesting (1, 4h lag), modeled conversions take up to 72h to converge, and view-through windows accumulate over multiple days. Read the rolling 7-day or 30-day average, not the today value. Don’t make decisions on a single day’s reading.
Should I trust this number for budget decisions?
For directional (“Meta is in profitable / unprofitable territory”) yes. For exact ROI (“Meta drove £X of profit”) no, blend it with Shopify UTM-truth and your own MMM (media mix model) if you have one. Rule of thumb: if Meta’s claimed ROAS is over 4×, you’re directionally profitable on Meta even after the iOS gap. If it’s under 2×, you’re directionally unprofitable. Between 2, 4× it’s measurement-method-sensitive.
Why is my Meta revenue different from Google Ads revenue for the same period?
Different ecosystems, different attribution. Meta sees Pixel + CAPI events; Google Ads sees Google Tag Manager + Enhanced Conversions. Both use last-click within their own window. Both will independently claim the same purchase if the user touched both channels. Sum of “Meta-claimed + Google-claimed” almost always exceeds total Shopify revenue because of double-claim across channels. This is a known structural artefact. Use commerce-platform truth (Shopify) as the denominator, not the sum of platform claims.