InnovaNext Digital
Sample:Demo store, invented data
Tracking audit reportNorthwind Outdoor Co.
Signal quality
Needs work
- 4 High
- 3 Medium
- 1 Low
1. Summary
Sample:Demo store and invented data.
The store is fine. The numbers the ad platforms see are not.
Signal-quality score
38/ 100
Needs work
Share of our checks passed, weighted by severity.
Meta and Google Ads each count most sales about twice, and GA4 counts about one in ten twice. Every platform uses a different definition of revenue, and analytics and ad tags fire before visitors make a consent choice. The store’s own events and checkout tracking are in good shape, so the fixes are contained.
- High4 findings
- Medium3 findings
- Low1 finding
- BrokenPurchase counts. Meta and Google Ads count most sales twice
- BrokenPurchase values. Three definitions of revenue across platforms
- BrokenConsent behaviour. Tags fire before a choice is made
- CleanStore events. Product, cart and checkout events are complete
- CleanCross-domain checkout. Sessions survive the move to checkout
2. Scope and method
Sample:Demo store and invented data.
How we tested
Test orders
Three real orders through the live checkout (T-01 to T-03), with a discount code, a shipping charge and a page reload. Each one followed from the browser to every platform. Refunded afterwards.
Platform comparison
Read-only review of GTM, GA4, Google Ads and Meta Events Manager, then a week of purchase counts and values compared with the store’s orders.
Consent tests
Fresh browser sessions with consent refused, accepted and ignored, recording every cookie and tag request in each case.
In scope: GTM web container, GA4 property, Google Ads conversions, Meta pixel and Conversions API, consent banner and Consent Mode v2, store app integrations. Out of scope: email platform, offline sales, legal review of policy wording.
3. Findings
Sample:Demo store and invented data.
Findings, ranked by severity
High means the platforms optimize or report on wrong data today. Medium skews reports or bidding. Low is worth fixing while someone is in the container.
| # | Finding | Severity | Area | Owner | Effort |
|---|---|---|---|---|---|
| F1 | Meta Purchase sent by both the store app and a GTM tag | High | Meta | Developer | 2 hours |
| F2 | No shared event_id between Meta pixel and Conversions API | High | Meta | Developer | 3 hours |
| F3 | Consent Mode defaults to granted before the visitor chooses | High | Consent | Developer, legal adviser for banner wording | 4 hours |
| F4 | Google Ads counts each sale twice: tag and GA4 import both primary | High | Google Ads | Ads manager | 15 minutes |
| F5 | Purchase value includes tax and shipping in some platforms only | Medium | GA4, Meta, Google Ads | Developer | 2 hours |
| F6 | Enhanced conversions are off in Google Ads | Medium | Google Ads | Developer | 2 hours |
| F7 | Reloading the thank-you page fires another purchase | Medium | GA4 | Developer | 1 hour |
| F8 | Payment gateways show up as referral sources | Low | GA4 | Developer | 30 minutes |
- High
F1 Meta Purchase sent by both the store app and a GTM tag
- Evidence
- Test order T-02 produced two browser Purchase events in Meta Test Events, one from the store’s Meta sales channel app and one from a pixel tag in GTM, 0.8 seconds apart.
- Impact
- Meta counts most sales twice and optimizes towards buyers who look more valuable than they are.
- Fix
- Keep one browser source. Turn off the pixel tag in GTM and let the app send browser events, or the reverse, then pair it with the server events in F2.
- High
F2 No shared event_id between Meta pixel and Conversions API
- Evidence
- In Events Manager the browser Purchase has no event_id and the server Purchase uses the order number, so the two never match and both are counted.
- Impact
- Every order that reaches Meta from both paths is counted again on top of F1.
- Fix
- Generate one event_id per order (the order ID works) in the data layer and send the same value with the pixel and the server event.
- High
F3 Consent Mode defaults to granted before the visitor chooses
- Evidence
- On a fresh visit with no banner interaction, the first GA4 request carried consent state granted and set the _ga cookie. The Meta pixel loaded on the same page view.
- Impact
- Analytics and ad cookies are set without consent, which is a PIPEDA and Quebec Law 25 exposure, and modelled conversions are calculated on the wrong basis.
- Fix
- Set all four Consent Mode v2 signals to denied in a consent-initialization tag that runs before any other tag, and block the Meta pixel until marketing consent is given.
- High
F4 Google Ads counts each sale twice: tag and GA4 import both primary
- Evidence
- The Purchases goal contains “Purchase (Google Ads tag)” and “Purchase (GA4 import)”, both set to Primary and both included in the Conversions column.
- Impact
- Smart Bidding sees roughly double the real conversions and bids as if campaigns were more profitable than they are.
- Fix
- Keep the Google Ads tag as the primary purchase action and set the GA4 import to Secondary so it is still visible for reference.
- Medium
F5 Purchase value includes tax and shipping in some platforms only
- Evidence
- For test order T-01 the same purchase reached GA4 with tax and shipping included, Meta with shipping excluded and Google Ads with the subtotal only.
- Impact
- Revenue and ROAS cannot be compared across platforms, and value-based bidding learns from inconsistent numbers.
- Fix
- Agree one definition (we suggest subtotal after discounts, before tax and shipping), send it as value everywhere and pass tax and shipping as their own parameters.
- Medium
F6 Enhanced conversions are off in Google Ads
- Evidence
- The account-level setting is off and the purchase tag sends no user-provided data.
- Impact
- Google matches fewer purchases to ad clicks, especially on Safari and in-app browsers, so reported conversions run low.
- Fix
- Turn on enhanced conversions through GTM using the hashed email and phone from the order, sent only when ad_user_data consent is granted.
- Medium
F7 Reloading the thank-you page fires another purchase
- Evidence
- Refreshing the order status page for test order T-03 sent a second GA4 purchase with the same transaction_id.
- Impact
- GA4 orders and revenue run above the store, and returning customers who bookmark the page inflate it further.
- Fix
- Fire purchase from the checkout-completed customer event instead of a page-view trigger, so it runs once per order.
- Low
F8 Payment gateways show up as referral sources
- Evidence
- Sessions from the payment gateway domains appear as referrals in GA4 and are credited with purchases.
- Impact
- The ad or email that brought the buyer loses the credit, so channel reports undervalue paid media.
- Fix
- Add the payment gateway domains to the GA4 unwanted referrals list and confirm with a test order.
4. Event-parity check
Sample:Demo store and invented data.
One week of purchases, four answers
Purchase events each platform received in the sample week, by event date, compared with the store’s orders. Attribution differs between platforms, so this compares events received, not attributed conversions. We treat anything within 5% of the store as clean.
| Source | Purchases | Revenue (CAD) | vs store | Status | Caused by |
|---|---|---|---|---|---|
| Store orders | 212 | $31,480 | Baseline | Baseline | Source of truth |
| GA4 purchases | 236 | $36,210 | +11% | Broken | F5, F7 |
| Meta purchase events | 389 | $54,930 | +83% | Broken | F1, F2, F5 |
| Google Ads conversions | 401 | $55,870 | +89% | Broken | F4, F5 |
Target after fixes: GA4, Meta and Google Ads each within 5% of store orders, using the same revenue definition.
5. Consent tests
Sample:Demo store and invented data.
What fires when a visitor says no
| Scenario | Expected | Observed | Result |
|---|---|---|---|
| Refused | No analytics or ad cookies. GA4 and Google Ads send cookieless pings only. Meta pixel does not load. | The _ga cookie and the Meta pixel were already set on the first page view, before Refuse was clicked. | Fail |
| Accepted | All four consent signals update to granted. Tags fire with full data. | Consent update sent with all four signals granted. GA4, Google Ads and Meta fired as expected. | Pass |
| Ignored | Same as Refused until the visitor makes a choice. | Three pages browsed without a choice. Every tag fired as if consent had been granted. | Fail |
Consent findings are flagged for your legal adviser. We test behaviour; we do not give legal advice on PIPEDA or Quebec Law 25.
6. Fix plan
Sample:Demo store and invented data.
Fix plan in three phases
Phase 1 Days 1–3
Stop the double counting
- F1 Meta Purchase sent by both the store app and a GTM tag
- F2 No shared event_id between Meta pixel and Conversions API
- F4 Google Ads counts each sale twice: tag and GA4 import both primary
- F7 Reloading the thank-you page fires another purchase
Phase 2 Days 4–6
Fix consent and agree one revenue number
- F3 Consent Mode defaults to granted before the visitor chooses
- F5 Purchase value includes tax and shipping in some platforms only
Phase 3 Days 7–9
Improve matching and attribution
- F6 Enhanced conversions are off in Google Ads
- F8 Payment gateways show up as referral sources
Check Days 10–24
Repeat test orders, then 14 days of monitoring and a new parity check
Fixed implementation quote
Set per store, within our Tracking Implementation range of $2,000–2,500 CAD, before applicable tax.
The audit fee is credited against Implementation if you go ahead. You can also hand this report to your own developer.
7. What happens next
Sample:Demo store and invented data.
After you receive the report
Walkthrough call
About an hour with you and whoever will do the fixes. We go through every finding until the plan is clear.
You choose who fixes it
Your developer works from the report, or we build the fixes under the fixed quote. Either is fine.
Fixes and QA
Each fix is tested with new test orders and recorded in a QA log you keep.
Parity check
After 14 days of monitoring we repeat the event-parity check above and send you the result.