The tool that grades its own homework
Every ad platform in your stack shares one convenient habit: it reports the conversions it thinks it caused, and it is generous with itself. GA4, Meta, and TikTok will each raise a hand for the same Lumen order. Individually the numbers look great. Added up, they describe a business selling more than it actually sold. Your job as the builder is not to trust any single platform's self-attribution - it is to pull them into one warehouse, reconcile them against ground truth, and hand your leaders a de-duplicated number they can defend. GA4 DDA is a useful input to that. It is not the answer.
What GA4 DDA actually does 6 min live
Google removed the rules-based models from GA4 reporting; Data-Driven Attribution is now the default. Under the hood it is close to what you have already built. DDA trains a model that predicts conversion probability from the journey, then runs the Shapley algorithm - feeding every combination of touchpoints (present or absent) through the trained probabilistic model to measure each touch's marginal effect - and layers in a time-decay element so more recent interactions carry more weight. Its defaults: the last 50 interactions per journey, a 90-day lookback. So far, so familiar. The catch is everything Google does not hand you.
LiveThree limits that decide how you use DDA3 min▶
DDA's engine is sound. Its blind spots are structural, and each one changes how much you can lean on it:
- It is a black box. Google does not expose the model or the per-channel weights. You get the output credit, never the machinery. You cannot reproduce it, unit-test it, or explain a swing to a stakeholder from first principles - which is exactly why you also keep your own warehouse model.
- It only sees what Google can see. Consented, web/app, Google-observable touches. A journey that ran through Meta, TikTok, CTV, an influencer link, or an offline touch is - to DDA - simply not there. It attributes the credit it can see to the channels it can see.
- Its defaults are choices. Last 50 interactions, 90-day lookback. Fine for most, wrong for a long-consideration purchase. Know the window before you compare its numbers to anything.
A brand saw GA4 hand 55% of credit to organic and direct and concluded paid social "didn't work". What actually happened: the paid-social touches lived on Meta, which GA4 could not observe, so the credit collapsed onto the Google-visible tail of each journey. The black box wasn't lying - it was answering honestly about a journey it could only half see.
Self-studyWhy the DDA weights aren't in the export2 min read▶
Builders reach for the GA4 BigQuery export expecting to find the per-channel DDA weights sitting in a column. They are not there. The export gives you the raw events - traffic source, session, conversion value, timestamps - which is everything you need to build your own attribution. It does not give you Google's model output per touch, because the model is proprietary. That is not an oversight; it is the black box, made concrete. The practical consequence: from the export you reconstruct credit yourself, and you use the DDA numbers you see in the GA4 UI as a cross-check, not as a source of truth you can decompose.
The double-counting problem 5 min live
Here is the failure that quietly inflates half the marketing reports in the world. GA4, Meta, and TikTok each run their own attribution and each self-report conversions. When a single Lumen customer sees a TikTok ad, clicks a Meta ad, and converts after a Google search, all three platforms claim that one $92 order. Add their conversion counts together and you get three sales from one. Divide spend by that inflated total and your blended ROAS looks heroic. It is arithmetic fiction. View-through versus click-through conventions and direct or branded-search inflation make it worse.
LiveWhy platform numbers are a ceiling, not a truth3 min▶
Every self-attributing platform is optimizing to justify its own spend. That is not villainy; it is incentive. But it means their conversion counts share three inflation habits you have to strip out:
- Overlapping claims. The same order appears in multiple platforms' totals. Summed, they overstate. The fix is de-duplication against a single order key from your warehouse.
- View-through generosity. Some platforms count a conversion when the user merely saw an ad (view-through), not clicked. Compare view-through and click-through numbers separately - they are not the same currency.
- Direct and branded-search inflation. A user who already decided to buy types "lumen serum" - branded search or direct traffic grabs a last-click it did not earn. Ground truth is your order table, not the platform tag.
The reconciliation workflow 4 min live
Reconciliation is a pipeline, not an opinion. You pull each source into the warehouse, key everything to a real order, de-duplicate the overlapping claims, and compute ROAS against actual revenue. GA4 DDA becomes one input in that pipeline - valuable for the Google-observable slice, but reconciled against your own touchpoint model and the raw platform exports rather than trusted on its own.
Land everything in one place. GA4 DDA from the BigQuery export, Meta and TikTok conversion exports, and your own warehouse touchpoint model (B1-B5) - all into the warehouse, all keyed to order_id.
De-duplicate against ground truth. Your order table is the single source of what actually sold. Every platform claim gets matched to a real order; unmatched claims are flagged, not summed.
Treat self-attribution as a ceiling. Where platforms overlap on one order, keep the order once. The platform totals become upper bounds you reconcile down from, never numbers you add together.
Report one de-duplicated ROAS. Total spend over de-duplicated real revenue - a blended number that ties back to the P&L. Then, and only then, break it down by your own attribution model for channel-level decisions.
Pull GA4 DDA credit from the BigQuery export ★ 11 min · everyone
GA4 exports one row per event to BigQuery. We pull Lumen's purchase conversions with each session's channel and order value. Remember: the DDA per-channel weights are not in the export - so we pull the raw events and reconstruct, using the GA4 UI's DDA numbers only as a cross-check.
UNNEST the event params. GA4 stores conversion value and transaction id inside a repeated event_params field. The correlated sub-selects pull each key out into a flat column.
Key on transaction_id. That is your join to the warehouse order table - the anchor for the whole reconciliation. Without a shared order key you cannot de-duplicate.
Accept the limit up front. This gives you Google-observable, consented touches only. It is the Google slice of the truth, not the truth - which is exactly why Build-along 2 exists.
Teams burn a day looking for a "dda_credit" column in the export before someone points out it does not exist. The export is raw events by design. Read the DDA output in the GA4 UI, pull the raw events here, and reconcile the two - that is the whole workflow, and knowing it saves the wasted day.
Reconcile GA4 vs your warehouse model ★ 11 min · everyone
Now we join GA4's conversions to our own warehouse touchpoint model on order_id and find the overlap: the orders both systems claim. An outer join with an indicator makes the three buckets - both, GA4-only, warehouse-only - fall out cleanly.
The indicator=True column is the whole trick. It labels every row both, left_only, or right_only, so de-duplication becomes a filter instead of a guess.
Warehouse-only orders are the signal. These are conversions GA4 could not see - Meta, TikTok, CTV, offline. Their count is a direct measure of how much of Lumen's journey lives outside Google's view.
"Both" gets counted once. That is the de-duplication in action: an order GA4 and your model both claim is still one order. Never add the two systems' totals.
Build a de-duplicated cross-platform ROAS view ★ 8 min · everyone
Finally we fold GA4, Meta, and TikTok claims into one truthful row per order and compute a blended ROAS against actual revenue - the number that ties back to the P&L instead of triple-counting the same sale.
UNION ALL then GROUP BY collapses the claims. Three platforms claiming one order become three rows, then GROUP BY order_id collapses them to one. The double-count is gone.
ROAS uses de-duplicated revenue. Sum the real per-order value, divide by real spend. Compare this honest blended number to the sum of the three platform dashboards and watch the gap - that gap was the fiction.
Blend first, attribute second. This de-duplicated total is the trustworthy top-line. Only after it is locked do you split channel credit with your own model - never with the platforms' self-attribution.
One team's three platform dashboards summed to a 6.2x ROAS; the de-duplicated warehouse view came in at 3.4x. Nothing was broken - the platforms were each honestly claiming shared conversions. The de-duplicated number was the one the CFO could act on, and presenting both side by side is what finally ended the "which dashboard is right?" argument.
This week ◐ 45 min total
- Quantify the overlap. Run the reconciliation join on Lumen and report three numbers: orders both GA4 and your model claim, GA4-only, and warehouse-only. What share of conversions is invisible to GA4?
- Measure the inflation. Sum the three platform conversion counts, then compare to the de-duplicated total. Express the double-count as a percentage - that is the number your leaders most need to see.
- Document the DDA window. Note GA4's defaults (last 50 interactions, 90-day lookback) and decide whether they fit Lumen's 7-21 day consideration cycle. Write one line on what you would change and why.
- Optional: split blended ROAS into view-through and click-through and see how much of the "conversions" were view-through - a preview of why incrementality (B9) exists.
Three questions before you go 🎯 ◐ 90 seconds
1 · GA4 Data-Driven Attribution is best described as...
DDA is Shapley with a time-decay element, trained on conversion probability. Google does not expose the model or per-channel weights, and it only observes Google-visible, consented web/app touches - so it is a partial view inside a black box.
2 · Why does summing GA4, Meta, and TikTok conversions overstate performance?
One customer, one order, three platforms all raising a hand. Add their counts and one sale becomes three; divide spend by that inflated total and blended ROAS beats reality. De-duplicate to one row per order.
3 · How should you treat a platform's self-reported conversions?
Self-attribution is incentive-driven and overlaps across tools. Treat each platform's count as an upper bound, key everything to real orders, de-duplicate, and report one blended number tied to actual revenue.
What this session covers
This session turns the GA4 attribution documentation and the Analytics certification material into a builder's reconciliation workflow - DDA's engine and limits, the cross-platform double-counting problem, and the de-duplication that fixes it. Vendor certificates stay official.