# Failure modes and how to detect each

Each entry is a defect seen in production attribution work, with the evidence that shows it. Warehouse touch checks have query-level detail in `mta-contract.md` under "Touchpoint source checks" and "Invariants with example SQL".

## Contents

- Platform settings and reports
- Outcome and maturity
- Warehouse touchpoints
- B2B
- Mobile

## Platform settings and reports

- Model switched to make reports match. Detect: Google Ads Change history shows a model change on a biddable action with no decision record.
- Expecting Traffic acquisition to move after a GA4 model change. Detect: session reports unchanged, key event reports changed.
- Reading a GA4 attribution report as the property's reporting model. Detect: the Key event attribution models or attribution paths report is quoted without naming the model chosen in its drop-down.
- Trends across Meta's March 2026 click change. Detect: click-through conversions fall and engage-through appears with flat spend, around the account's own switch date.
- Dashboards still requesting `7d_view` or `28d_view`. Detect: values missing, or the request failing, for any request made on or after 12 January 2026, whatever the date range. A backfill of older dates run today loses them too.
- Connector Meta numbers differ from Ads Manager. Since 10 June 2025 the Insights API ignores `use_unified_attribution_setting` and `action_report_time`, so neither explains a gap and toggling them is not a test. Detect: pull one ad set for one week with no `action_attribution_windows` and compare with Ads Manager for the same ad set, dates and columns; then compare each window the dashboard requests. If the first pull already differs, check time zone, dates and the connector's transforms.
- Meta date basis recorded from the connector. Detect: the inventory says impression or conversion time for Meta. The API reports mixed: on-Meta actions at impression time, off-Meta conversions at conversion time.
- LinkedIn per-ad-set credit summed. Detect: ad set conversions exceed the conversion rule's total.
- Platform claims added together. Detect: Google Ads plus Meta plus LinkedIn conversions exceed ledger outcomes.
- Platform view presented as covering a long cycle. Detect: the p90 lag exceeds the platform's window and the view has no "truncated by design" label.

## Outcome and maturity

- Immature values reported as final. Detect: the latest outcome date plus the refund cutoff (plus 12 days for GA4 attributed data, 41 days for iOS postback values) falls after the read date, and the numbers carry no provisional label.
- Outcome table not reconciled with the ledger. Built from GA4 purchase events, or an inner join to sessions drops outcomes with no touch. Every other invariant passes and coverage looks high. Detect: the ledger reconciliation query returns a difference in count or value.
- Unattributed outcomes dropped. Detect: credited value below the ledger with no unattributed row.
- Lookback shorter than the cycle. Detect: lag distribution piles up at the window edge.

## Warehouse touchpoints

- GA4 export touches built from `traffic_source` (first user acquisition). Detect: among users with two or more sessions from different sources, 5% or more have every touch equal to their first-acquisition source.
- Payment or own-domain referrals as last touch. Detect: they appear in the top ten referral domains on last touches before outcomes.
- Internal UTMs on own-site banners or links. Detect: touches whose `utm_source` is the site's own domain, or whose campaign changes mid-session right after a page on the same site.
- Paid clicks classed as direct. Detect: touches with a click ID (gclid, wbraid, gbraid, fbclid, li_fat_id, msclkid, ttclid, plus any platform in `stack.md`) classed as direct or organic.
- Email scanner clicks. Detect: email clicks within 60 seconds of send, or several links in one email clicked by one recipient within the same second.
- Native lead forms. Detect: contacts created by a lead form integration (LinkedIn Lead Gen Forms, Meta Instant Forms) with no session, sitting in unattributed or offline sources instead of their own channel line.
- In-app browsers. Detect: a high share of paid social landing sessions in in-app browsers beside a much lower paid social share of first observed touches on converters.
- Ties broken differently on each run. Detect: tied first or last touches carry over 5% of value and the contract has no tie rule; rerunning with the alternate order moves credit.
- "First touch" after an identity reset. Detect: first observed touch later than the CRM create date.

## B2B

- Deal value copied per contact. Detect: credited pipeline exceeds distinct opportunity amounts.
- MQL or SQL dated by current lifecycle stage. Detect: the count for a closed month changes between two reads.
- Weighted pipeline shown as revenue. Detect: a ROI or ROAS whose numerator is amount times win probability.
- Influenced view with no anchor. Detect: the view title names neither create nor close date, or a pipeline-created view credits touches after opportunity creation.
- LinkedIn stage backfills. Detect: Conversions API events rejected because `conversionHappenedAt` is more than 90 days in the past.
- Personal data in the brief. Detect: contact names, emails or raw self-reported answers quoted instead of pseudonymous counts and codes.

## Mobile

- iOS reads treated as mature too early. Detect: second or third postback metrics, or value-based ROAS, read within 41 days of the cohort's last first launch.
- iOS windows assumed to be Apple's defaults. Detect: the app's `AdAttributionKitConfigurations` were not read, yet iOS counts are compared with an MMP or a network.
