# Paid media measurement incident response runbook

Use this runbook when conversions stop, spike, duplicate, carry the wrong value/currency, lose attribution or fail to reach a reporting/advertising system. Customer journey failures take priority over measurement failures.

## Incident record

- Incident ID:
- Date/time detected and timezone:
- Detected by alert/person:
- Incident commander:
- Technical owner:
- Business/media owner:
- Priority: P0 / P1 / P2 / P3
- Suspected start time:
- Confirmed impact window:
- Affected site/app/domain:
- Affected markets/devices/browsers:
- Affected events:
- Affected destinations:
- Active campaigns dependent on this data:
- Current customer/revenue impact:
- Current optimisation/reporting impact:
- Link to change log / releases:
- Communication channel:

## Priority definitions

| Priority | Definition | Examples | Initial response |
|---|---|---|---|
| P0 | Customer journey or real revenue is blocked | Checkout, form, booking or payment cannot complete | Escalate immediately; protect customers and revenue first |
| P1 | Primary optimisation data is materially corrupt | Purchases doubled, primary event stopped, values 100× wrong | Contain quickly; suspend affected automated decisions if needed |
| P2 | Reporting or a secondary path is degraded | Dashboard stale, one market missing, offline upload delayed | Use source reports; repair in agreed service window |
| P3 | Cosmetic or documentation fault | Chart label, description or non-decision event incorrect | Schedule normal maintenance |

## First 15 minutes: confirm and contain

1. **Confirm business reality.** Check whether completed orders, accepted leads or bookings still reach the backend. If not, treat it as a customer journey incident (P0), not merely analytics.
2. **Check whether spend is active.** Record accounts, campaigns and daily spend relying on the affected event.
3. **Define the visible symptom.** Zero, spike, duplicate, wrong value, wrong currency, wrong source, delay or stale connector.
4. **Compare with backend truth.** Note backend outcome count/value for the same time window, timezone, market and currency.
5. **Check recent changes.** Website/theme release, app/plugin update, GTM publish, consent change, domain/checkout migration, CRM field/stage edit, connector credential or platform setting.
6. **Contain the smallest safe component.** Roll back a known bad release, switch to a proven event source or pause automated changes based on corrupted data. Do not disable broad tracking or campaigns without understanding the effect.
7. **Preserve evidence.** Do not overwrite the faulty GTM/container version, logs, payload examples or settings before capturing them.

## Scope worksheet

| Dimension | Affected | Not affected | Unknown / test required |
|---|---|---|---|
| Backend orders/leads |  |  |  |
| Website/browser event |  |  |  |
| Server/CAPI event |  |  |  |
| GA4 |  |  |  |
| Meta |  |  |  |
| Google Ads |  |  |  |
| CRM/offline upload |  |  |  |
| Dashboard/warehouse |  |  |  |
| Mobile/desktop |  |  |  |
| Accept/reject consent |  |  |  |
| Main domain/cross-domain path |  |  |  |
| AUD/other currency |  |  |  |
| New/existing customer flag |  |  |  |

## Reproduce with one labelled journey

Create a unique test case and write every ID below.

- Test timestamp and timezone:
- Test URL with safe UTMs:
- Consent state:
- Device/browser:
- Transaction/subscription/lead ID:
- Browser/server event ID:
- GA client/session identifier if approved for debugging:
- Platform click ID if available:
- Expected value and currency:
- Expected customer/lead status:

Trace it in this order:

1. **Backend:** Did one real outcome exist? Are product/service, value, currency and customer status correct?
2. **Data layer/server:** Was the correct event created once, after success, with stable IDs?
3. **Tag delivery:** Did GTM/integration send the payload under the expected consent state? Inspect network responses.
4. **GA4:** Does DebugView/realtime receive the event and parameters? Check processed reporting after the normal delay.
5. **Meta:** Do test events/diagnostics show browser and server copies? Are shared events deduplicated with the same event name and ID?
6. **Google Ads:** Did the intended conversion action receive the event/import? Is it the correct primary/secondary action?
7. **CRM/offline:** Are campaign fields and click IDs present? Does the stage change create an eligible upload?
8. **Dashboard:** Does the connector load the event once and transform timezone, currency, campaign and customer status correctly?

## Symptom-specific checks

### Zero or sharp drop

- Backend outcomes also dropped: inspect traffic, site outage, stock, offer, checkout/payment, form provider, booking availability and sales operations.
- Browser event missing: inspect data-layer event, trigger, consent, JavaScript errors and recent DOM/app changes.
- Server event missing: inspect integration credentials, queue/webhook, API response, dataset/property ID and outage status.
- One destination missing: inspect tag status, permissions, account links, schema rejection and destination diagnostics.
- Dashboard only missing: inspect connector freshness, date filters, timezone, field rename and transformation errors.

### Duplicate or spike

- Check backend for true duplicate transactions/leads first.
- Look for theme/app/plugin plus GTM duplication.
- Refresh the confirmation page and confirm the outcome stays idempotent.
- Compare browser/server `event_id`; shared events must match for deduplication.
- Check GA4 import plus native Google Ads action; confirm only the intended action is primary.
- Inspect history-change/single-page-app triggers and form success plus thank-you page overlaps.

### Wrong value or currency

- Confirm source amount: major units (99.00) versus minor units (9900).
- Confirm discount, tax, shipping and refund rules.
- Confirm three-letter currency comes from the transaction, not a site default.
- Confirm formatted strings/commas are not parsed as numbers.
- For reporting conversion, preserve original value/currency and inspect exchange-rate source/date.

### Attribution or cross-domain break

- Test arrival with safe UTMs and an available click ID.
- Confirm allowlisted parameters are captured before redirect/handoff.
- Inspect cross-domain linker configuration only for approved domains.
- Check unwanted referrals for payment/booking providers.
- Confirm cookie/consent behaviour on each domain and browser.
- Inspect CRM fields for first/latest touch overwrite.
- Check that a domain, subdomain or URL structure changed in the incident window.

### Offline conversion rejection

- Check click ID type and capture timestamp.
- Check conversion timestamp, timezone and platform lookback limits.
- Check action name/ID, account permissions and upload destination.
- Check value/currency formatting and required fields.
- Check whether the same conversion identifier was already uploaded.
- Record accepted, rejected and unmatched counts; retain row-level error output securely.

## Repair and verification

- Root cause:
- Chosen repair:
- Change owner:
- Change/version ID:
- Rollback method:
- Staging/preview test result:
- Production test transaction/lead ID:
- Accept-consent result:
- Reject-consent result:
- Mobile/desktop result:
- Browser/server deduplication result:
- Value/currency result:
- Cross-domain/UTM result:
- Destination acceptance result:
- Dashboard/reconciliation result:
- Business/media owner approval:
- Incident resolved date/time:

Do not close the incident immediately after the first successful test. Monitor through the normal processing delay and at least one representative trading window.

## Backfill decision

Backfill only when you have genuine backend outcomes, stable IDs, eligible attribution data, approved platform processes and a documented impact window.

- Eligible records identified from:
- Count and value by date/currency:
- Deduplication key:
- Records already present excluded:
- Consent/privacy approval:
- Upload destination/action:
- Upload result: accepted / rejected / unmatched
- Dashboard annotation added:

Never create estimated individual conversions to fill a gap. If a valid backfill is impossible, annotate the period and exclude it from automated conclusions.

## Communications template

**Detected:** We detected [symptom] affecting [event/system] from approximately [time]. [Customer journey is/is not] affected.  
**Impact:** [Campaigns/markets] may show [missing/duplicate/wrong] conversions. Backend outcomes currently show [summary].  
**Containment:** We have [rollback/paused decisioning/switched source] while we investigate.  
**Next update:** [time]. Owner: [name].

**Resolved:** The root cause was [cause]. We repaired [component] at [time] and verified [test IDs/paths]. The affected reporting window is [window]. [Backfill/annotation] is [status]. Prevention actions: [list].

## Post-incident review

1. What failed technically?
2. What process or ownership gap allowed it?
3. Why did the existing test or alert not catch it sooner?
4. Which decisions, campaigns and reports were affected?
5. Was any customer data handled incorrectly? Escalate according to the privacy plan.
6. What monitoring threshold, test case or release gate will prevent recurrence?
7. Who owns each prevention action and by when?

| Prevention action | Owner | Due date | Evidence of completion |
|---|---|---|---|
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |

