← Run 20260904-151257-1cd41651
Attribution-model sensitivity analysis with duplicate and refund
task attribution-sensitivitySep 4, 2026skill analytics

Answers & verdicts

Gemini 3.8 Flash high effort

Task passed
Task the exact prompt the model was given — assignment, source material, and skill guidance
Analyze the supplied order journeys for a marketing lead. Meta, Paid Search, and Email each had $600 of spend. Deduplicate exact duplicate order_id rows before calculating, retain negative net revenue from refunds, and do not assign a Direct-only order to a marketing channel. Define first-touch as the first non-Direct touch and last-touch as the last non-Direct touch. Deliver: (1) a reconciliation under each model showing unique-order net revenue, the paid-channel subtotal, Organic attributed revenue, and unattributed Direct-only revenue; (2) a table for Meta, Paid Search, and Email with attributed net revenue and ROAS under both first-touch and last-touch; (3) the winning paid channel under each model; (4) a budget recommendation that distinguishes conclusions robust to the attribution choice from conclusions that depend on it; and (5) explicit assumptions plus the one data limitation that would most change the decision and how resolving it could change the recommendation. Show the arithmetic needed to audit the result, and do not treat attribution as proof of causation. --- ## Supplied source: order-journeys.csv order_id,net_revenue_usd,touch_1,touch_2,touch_3 O-001,120,Meta,Email,Direct O-002,80,Meta,Paid Search, O-003,150,Paid Search,Email, O-004,100,Organic,Meta, O-005,200,Meta,Email, O-006,90,Paid Search,Direct, O-007,130,Email,Paid Search, O-008,110,Organic,Email, O-009,170,Meta,Paid Search,Email O-009,170,Meta,Paid Search,Email O-010,140,Paid Search,Meta, O-011,160,Email,Meta, O-012,100,Direct,, O-013,-120,Meta,Email, --- ## Skill guidance you should follow --- name: analytics description: "Set up or audit tracking — GA4, GTM, Mixpanel, Segment; tracking plans, event naming, UTM conventions, conversion and attribution debugging. Rate metrics divide matching closed windows — never full-period spend by partial-period results." metadata: version: 2.2.0 --- # Analytics Tracking You are an expert in analytics implementation and measurement. Your goal is to help set up tracking that provides actionable insights for marketing and product decisions. ## Initial Assessment **Check for product marketing context first:** If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task. **Apply the project's brand:** If `BRAND.md` exists, read it before asking questions and apply it to everything you produce — its voice, messaging, and audience for anything written, and its colors, typography, and logo for anything visual. Never ask for a brand fact it already answers. If it lacks something you need, name the missing fact instead of inventing one or quietly falling back to a generic default. Before implementing tracking, understand: 1. **Business Context** - What decisions will this data inform? What are key conversions? 2. **Current State** - What tracking exists? What tools are in use? 3. **Technical Context** - What's the tech stack? Any privacy/compliance requirements? --- ## Core Principles ### 1. Track for Decisions, Not Data - Every event should inform a decision - Avoid vanity metrics - Quality > quantity of events ### 2. Start with the Questions - What do you need to know? - What actions will you take based on this data? - Work backwards to what you need to track ### 3. Name Things Consistently - Naming conventions matter - Establish patterns before implementing - Document everything ### 4. Maintain Data Quality - Validate implementation - Monitor for issues - Clean data > more data ### 5. Compute, Don't Eyeball - Derive every total, rate, and delta from row-level data with a script or spreadsheet — never by scanning rows and summing mentally. One silently dropped row corrupts every figure downstream of it. - Cross-check each headline figure a second, independent way (a reconciliation total, a recomputation from a different grouping) before reporting it, and chase any mismatch to the exact row. - When a claim is about one segment — a single campaign, ad set, channel, or week — report that segment's own numbers. Never fold it into a neighboring group and let the group's total speak for it. ### 6. Match Observation Windows - A rate or efficiency metric divides a numerator and denominator that cover the same closed observation window. Never divide a full period's spend by a partial period's conversions or revenue — restate both over the weeks that actually have data, and say which weeks those are. - Cohort rates use only cohorts whose observation window has ended. A trial or signup still inside its window is pending, not failed — exclude it from the denominator and label it as pending rather than counting it against the rate. ### 7. Recommend Against the Stated Goal - Analysis ends in a recommendation, and the recommendation must be argued from the goal the brief states — the launch target, audience, revenue, or positioning objective — not only from what is operationally easiest. Name which stated goal each option serves and what it trades away. --- ## Tracking Plan Framework ### Structure ``` Event Name | Category | Properties | Trigger | Notes ---------- | -------- | ---------- | ------- | ----- ``` ### Event Types | Type | Examples | |------|----------| | Pageviews | Automatic, enhanced with metadata | | User Actions | Button clicks, form submissions, feature usage | | System Events | Signup completed, purchase, subscription changed | | Custom Conversions | Goal completions, funnel stages | **For comprehensive event lists**: See [references/event-library.md](references/event-library.md) --- ## Event Naming Conventions ### Recommended Format: Object-Action ``` signup_completed button_clicked form_submitted article_read checkout_payment_completed ``` ### Best Practices - Lowercase with underscores - Be specific: `cta_hero_clicked` vs. `button_clicked` - Include context in properties, not event name - Avoid spaces and special characters - Document decisions --- ## Essential Events ### Marketing Site | Event | Properties | |-------|------------| | cta_clicked | button_text, location | | form_submitted | form_type | | signup_completed | method, source | | demo_requested | - | ### Product/App | Event | Properties | |-------|------------| | onboarding_step_completed | step_number, step_name | | feature_used | feature_name | | purchase_completed | plan, value | | subscription_cancelled | reason | **For full event library by business type**: See [references/event-library.md](references/event-library.md) --- ## Event Properties ### Standard Properties | Category | Properties | |----------|------------| | Page | page_title, page_location, page_referrer | | User | user_id, user_type, account_id, plan_type | | Campaign | source, medium, campaign, content, term | | Product | product_id, product_name, category, price | ### Best Practices - Use consistent property names - Include relevant context - Don't duplicate automatic properties - Avoid PII in properties --- ## GA4 Implementation ### Quick Setup 1. Create GA4 property and data stream 2. Install gtag.js or GTM 3. Enable enhanced measurement 4. Configure custom events 5. Mark conversions in Admin ### Custom Event Example ```javascript gtag('event', 'signup_completed', { 'method': 'email', 'plan': 'free' }); ``` **For detailed GA4 implementation**: See [references/ga4-implementation.md](references/ga4-implementation.md) --- ## Google Tag Manager ### Container Structure | Component | Purpose | |-----------|---------| | Tags | Code that executes (GA4, pixels) | | Triggers | When tags fire (page view, click) | | Variables | Dynamic values (click text, data layer) | ### Data Layer Pattern ```javascript dataLayer.push({ 'event': 'form_submitted', 'form_name': 'contact', 'form_location': 'footer' }); ``` **For detailed GTM implementation**: See [references/gtm-implementation.md](references/gtm-implementation.md) --- ## UTM Parameter Strategy ### Standard Parameters | Parameter | Purpose | Example | |-----------|---------|---------| | utm_source | Traffic source | google, newsletter | | utm_medium | Marketing medium | cpc, email, social | | utm_campaign | Campaign name | spring_sale | | utm_content | Differentiate versions | hero_cta | | utm_term | Paid search keywords | running+shoes | ### Naming Conventions - Lowercase everything - Use underscores or hyphens consistently - Be specific but concise: `blog_footer_cta`, not `cta1` - Document all UTMs in a spreadsheet --- ## Debugging and Validation ### Testing Tools | Tool | Use For | |------|---------| | GA4 DebugView | Real-time event monitoring | | GTM Preview Mode | Test triggers before publish | | Browser Extensions | Tag Assistant, dataLayer Inspector | ### Validation Checklist - [ ] Events firing on correct triggers - [ ] Property values populating correctly - [ ] No duplicate events - [ ] Works across browsers and mobile - [ ] Conversions recorded correctly - [ ] No PII leaking ### Common Issues | Issue | Check | |-------|-------| | Events not firing | Trigger config, GTM loaded | | Wrong values | Variable path, data layer structure | | Duplicate events | Multiple containers, trigger firing twice | --- ## Privacy and Compliance ### Considerations - Cookie consent required in EU/UK/CA - No PII in analytics properties - Data retention settings - User deletion capabilities ### Implementation - Use consent mode (wait for consent) - IP anonymization - Only collect what you need - Integrate with consent management platform --- ## Output Format ### Tracking Plan Document ```markdown # [Site/Product] Tracking Plan ## Overview - Tools: GA4, GTM - Last updated: [Date] ## Events | Event Name | Description | Properties | Trigger | |------------|-------------|------------|---------| | signup_completed | User completes signup | method, plan | Success page | ## Custom Dimensions | Name | Scope | Parameter | |------|-------|-----------| | user_type | User | user_type | ## Conversions | Conversion | Event | Counting | |------------|-------|----------| | Signup | signup_completed | Once per session | ``` --- ## Task-Specific Questions 1. What tools are you using (GA4, Mixpanel, etc.)? 2. What key actions do you want to track? 3. What decisions will this data inform? 4. Who implements - dev team or marketing? 5. Are there privacy/consent requirements? 6. What's already tracked? --- ## Tool Integrations For implementation, see the [tools registry](../../tools/REGISTRY.md). Key analytics tools: | Tool | Best For | MCP | Guide | |------|----------|:---:|-------| | **GA4** | Web analytics, Google ecosystem | ✓ | [ga4.md](../../tools/integrations/ga4.md) | | **Mixpanel** | Product analytics, event tracking | - | [mixpanel.md](../../tools/integrations/mixpanel.md) | | **Amplitude** | Product analytics, cohort analysis | - | [amplitude.md](../../tools/integrations/amplitude.md) | | **PostHog** | Open-source analytics, session replay | - | [posthog.md](../../tools/integrations/posthog.md) | | **Segment** | Customer data platform, routing | - | [segment.md](../../tools/integrations/segment.md) | --- ## Related Skills - **ab-testing**: For experiment tracking - **seo-audit**: For organic traffic analysis - **cro**: For conversion optimization (uses this data) - **revops**: For pipeline metrics, CRM tracking, and revenue attribution
Answer the model's full response$0.062 · 98.3s · 16.0k tok
### Executive Summary To evaluate marketing performance across **Meta**, **Paid Search**, and **Email** ($600 spend each, $1,800 total paid spend), the supplied journey data was deduplicated, refunds were accounted for, and Direct touches were filtered out per the non-Direct attribution definitions. * **First-Touch Winner:** **Meta** ($450 net revenue, **0.75x ROAS**). * **Last-Touch Winner:** **Email** ($630 net revenue, **1.05x ROAS**). * **Core Takeaway:** Blended paid marketing is operating at an immediate net loss under both models (blended paid ROAS is **0.62x** under First-Touch and **0.74x** under Last-Touch). **Paid Search is structurally inefficient across both models** (0.63x FT / 0.50x LT). Budget decisions must not blindly favor Email based on Last-Touch ROAS, as Email relies on Meta and Organic discovery touches to populate its conversion pipeline. --- ### Data Audit & Row-by-Row Journey Traceability #### 1. Data Cleaning & Deduplication * **Row count in source:** 14 rows. * **Exact duplicate identified and removed:** Row 10 is an exact duplicate of Row 9 (`O-009,170,Meta,Paid Search,Email`). Dropping one instance leaves **13 unique orders**. * **Refund retained:** Order `O-013` (-$120) is retained and credited negatively to its assigned touchpoints. * **Direct-only rule:** Order `O-012` (`Direct`) contains no marketing touches and is classified as unattributed Direct revenue. #### 2. Journey Mapping Table * **First non-Direct touch:** The first marketing or organic touchpoint appearing in the sequence. * **Last non-Direct touch:** The final marketing or organic touchpoint appearing before checkout (ignoring subsequent `Direct` navigation). | Order ID | Net Revenue | Touch 1 | Touch 2 | Touch 3 | First Non-Direct Touch | Last Non-Direct Touch | Notes | | :--- | :---: | :--- | :--- | :--- | :--- | :--- | :--- | | **O-001** | $120 | Meta | Email | Direct | Meta | Email | Touch 3 (Direct) stripped for Last-Touch | | **O-002** | $80 | Meta | Paid Search | — | Meta | Paid Search | — | | **O-003** | $150 | Paid Search | Email | — | Paid Search | Email | — | | **O-004** | $100 | Organic | Meta | — | Organic | Meta | — | | **O-005** | $200 | Meta | Email | — | Meta | Email | — | | **O-006** | $90 | Paid Search | Direct | — | Paid Search | Paid Search | Touch 2 (Direct) stripped for Last-Touch | | **O-007** | $130 | Email | Paid Search | — | Email | Paid Search | — | | **O-008** | $110 | Organic | Email | — | Organic | Email | — | | **O-009** | $170 | Meta | Paid Search | Email | Meta | Email | Row deduplicated (counted once) | | **O-010** | $140 | Paid Search | Meta | — | Paid Search | Meta | — | | **O-011** | $160 | Email | Meta | — | Email | Meta | — | | **O-012** | $100 | Direct | — | — | *Unattributed (Direct)* | *Unattributed (Direct)* | Direct-only order | | **O-013** | -$120 | Meta | Email | — | Meta | Email | Refund retained | --- ### Deliverable 1: Attribution Reconciliation Every dollar of unique-order net revenue must reconcile across categories: $$\text{Unique-Order Net Revenue} = \sum \text{Paid Channels} + \text{Organic} + \text{Direct-Only}$$ $$\text{Total Unique Net Revenue} = 120 + 80 + 150 + 100 + 200 + 90 + 130 + 110 + 170 + 140 + 160 + 100 - 120 = \mathbf{\$1,430}$$ ``` ======================================================================================== FIRST-TOUCH RECONCILIATION ======================================================================================== Paid Channels: • Meta: $120 (O-001) + $80 (O-002) + $200 (O-005) + $170 (O-009) - $120 (O-013) = $450 • Paid Search: $150 (O-003) + $90 (O-006) + $140 (O-010) = $380 • Email: $130 (O-007) + $160 (O-011) = $290 -------------------------------------------------------------------------------------- Paid-Channel Subtotal: $1,120 + Organic Revenue: $100 (O-004) + $110 (O-008) $210 + Unattributed Direct: $100 (O-012) $100 ---------------------------------------------------------------------------------------- Total First-Touch Reconciled Net Revenue: $1,430 (Balanced) ======================================================================================== ======================================================================================== LAST-TOUCH RECONCILIATION ======================================================================================== Paid Channels: • Meta: $100 (O-004) + $140 (O-010) + $160 (O-011) = $400 • Paid Search: $80 (O-002) + $90 (O-006) + $130 (O-007) = $300 • Email: $120 (O-001) + $150 (O-003) + $200 (O-005) + $110 (O-008) + $170 (O-009) - $120 (O-013) = $630 -------------------------------------------------------------------------------------- Paid-Channel Subtotal: $1,330 + Organic Revenue: (No orders ended on Organic) $0 + Unattributed Direct: $100 (O-012) $100 ---------------------------------------------------------------------------------------- Total Last-Touch Reconciled Net Revenue: $1,430 (Balanced) ======================================================================================== ``` --- ### Deliverable 2: Paid Channel Performance & ROAS $$\text{ROAS} = \frac{\text{Attributed Net Revenue}}{\text{Channel Spend}}$$ | Paid Channel | Spend | First-Touch Net Rev | First-Touch ROAS | Last-Touch Net Rev | Last-Touch ROAS | ROAS Shift (LT vs. FT) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | **Meta** | $600 | **$450** | **0.75x** ($450 / $600) | **$400** | **0.67x** ($400 / $600) | -0.08x (-11.1%) | | **Paid Search** | $600 | **$380** | **0.63x** ($380 / $600) | **$300** | **0.50x** ($300 / $600) | -0.13x (-21.1%) | | **Email** | $600 | **$290** | **0.48x** ($290 / $600) | **$630** | **1.05x** ($630 / $600) | **+0.57x (+117.2%)** | | **Paid Subtotal** | **$1,800** | **$1,120** | **0.62x** ($1,120 / $1,800) | **$1,330** | **0.74x** ($1,330 / $1,800) | +0.12x (+18.8%) | *Note on rounding: Paid Search FT ROAS is exactly $380 / $600 = 0.6333...x; Email FT ROAS is $290 / $600 = 0.4833...x; Meta LT ROAS is $400 / $600 = 0.6667...x.* --- ### Deliverable 3: Winning Paid Channel Under Each Model 1. **First-Touch Winner: Meta** * **Net Revenue:** $450 | **ROAS:** 0.75x * Meta initiates the greatest share of paid customer acquisition (5 out of 10 paid acquisition journeys: O-001, O-002, O-005, O-009, O-013). 2. **Last-Touch Winner: Email** * **Net Revenue:** $630 | **ROAS:** 1.05x * Email closes 6 out of 12 multi-touch journeys (O-001, O-003, O-005, O-008, O-009, O-013) and is the **only channel in either model to exceed a 1.0x ROAS**. --- ### Deliverable 4: Strategic Budget Recommendations #### 1. Robust Conclusions (Independent of Attribution Model) * **Paid Search is structurally underperforming:** Across both models, Paid Search ranks poorly (0.63x FT, 0.50x LT) and fails to return its $600 spend, generating net losses of -$220 (FT) and -$300 (LT). * **The paid mix as a whole is unprofitable:** Whether viewed via first-touch (0.62x blended ROAS) or last-touch (0.74x blended ROAS), immediate revenues fail to cover the $1,800 media spend. * **Meta is a vital mid-to-top funnel anchor:** Meta delivers consistent volume across the journey ($450 FT vs. $400 LT). It is the primary acquisition driver for orders that Email later closes (O-001, O-005, O-009, O-013). #### 2. Model-Dependent Conclusions (Fragile / Highly Sensitive) * **Email viability:** Under First-Touch, Email appears disastrous (0.48x ROAS, -$310 net margin). Under Last-Touch, Email appears to be the only profitable channel (1.05x ROAS). * **Organic visibility:** First-Touch reveals that Organic search introduces $210 of revenue (14.7% of total business revenue). Last-Touch completely erases Organic ($0), crediting those conversions to downstream touches (Meta on O-004, Email on O-008). #### 3. Budget Recommendation & Trade-Offs ``` CURRENT BUDGET ($1,800) Meta: $600 | Paid Search: $600 | Email: $600 │ ┌────────────────────────┴────────────────────────┐ ▼ ▼ [Option A: Acquisition Focus] [Option B: Efficiency Focus] • Meta: $900 (+50%) • Meta: $600 (Hold) • Paid Search: $300 (-50%) • Paid Search: $200 (-67%) • Email: $600 (Hold) • Email: $400 (-33%) Total: $1,800 Total: $1,200 (-33% total spend) Trade-off: Prioritizes new top-of- Trade-off: Stems cash burn and eliminates funnel pipeline; tolerates short- unprofitable volume; risks slowing overall term net loss to fuel future orders. pipeline growth. ``` * **Action 1: Immediately reduce Paid Search spend by 50% to 67% (reallocate $300–$400).** Paid Search is losing money as both a first-touch introducer ($380) and a last-touch harvester ($300). Audit whether spend is leaking into broad match or low-intent search terms. * **Action 2: Do NOT scale Email budget based on its 1.05x Last-Touch ROAS.** Email's last-touch success is largely dependent on top-of-funnel feeding: 4 of Email’s 6 closing orders originated from Meta or Organic. Pumping media spend into Email when it operates primarily as an owned retention/closing mechanism will create diminishing returns. * **Action 3: Shift liberated budget into Meta prospecting and SEO/Organic content.** Meta is the only paid channel delivering top-of-funnel scale ($450 FT). Expanding top-of-funnel feeds both Organic and Email downstream. --- ### Deliverable 5: Explicit Assumptions & Data Limitations #### Explicit Analysis Assumptions 1. **Matched Time Observation Windows:** Assumed the $600 spend per channel corresponds to the exact closed window during which these 13 orders were generated (no cross-period spend lag or delayed maturation). 2. **True Direct Exclusions:** Assumed `O-012` had no prior marketing interactions outside the tracking window and represents true navigational traffic. 3. **Navigational Direct Stripping:** Assumed Direct touches occurring at the end of a journey (e.g., Touch 3 on `O-001`, Touch 2 on `O-006`) represent checkout navigation rather than an independent marketing event. 4. **Uniform Spend Application:** Assumed the $600 spend per channel was evenly distributed rather than bifurcated into separate sub-campaigns (e.g., prospecting vs. retargeting; brand search vs. non-brand search). 5. **Full Refund Allocation:** Assumed refund `O-013` (-$120) directly offsets the revenue of the touchpoints in its path rather than being treated as general operational overhead. #### The Primary Data Limitation That Would Change the Decision * **The Limitation: Absence of Incrementality / Causal Lift Measurement (Holdout Testing).** * **Why Attribution is Not Causation:** Both First-Touch and Last-Touch models are purely descriptive accounting rules that allocate credit based on chronological correlation. They do not prove that an ad *caused* a purchase that would not have occurred otherwise. * *Email Risk:* Email's 1.05x ROAS likely captures high-intent customers (e.g., automated cart-abandonment emails sent to users who were already going to buy). If an incrementality test reveals an incremental lift of only 20%, Email's true incremental ROAS (iROAS) collapses from 1.05x to **0.21x**. * *Paid Search Risk:* If Paid Search spend is concentrated on **branded keywords**, it is merely taxing users who already intended to buy, producing near-zero incremental revenue. Conversely, if it is pure non-brand search prospecting, its weak 0.50x ROAS might understate its true assisted value. * **How Resolving It Alters the Recommendation:** Executing a randomized conversion lift or geo-
Score the judge's verdict, criterion by criterion10/10 criteria passed
RequirementVerdictEvidence
deduped_total
The exact duplicate O-009 row is counted once: 13 unique orders have total net revenue of $1,430.
✓Response states '13 unique orders' with total reconciled net revenue of $1,430 after removing the duplicate O-009 row.
reconciliation
Both models reconcile to $1,330 assigned non-Direct net revenue plus $100 unattributed Direct-only revenue. First-touch splits the $1,330 into $1,120 paid and $210 Organic; last-touch splits it into $1,330 paid and $0 Organic.
✓FT reconciliation shows $1,120 paid + $210 Organic + $100 Direct = $1,430, and LT shows $1,330 paid + $0 Organic + $100 Direct = $1,430, matching the expected split.
first_touch_oracle
First-touch paid results are correct: Meta $450 / 0.75 ROAS, Paid Search $380 / about 0.63 ROAS, Email $290 / about 0.48 ROAS.
✓Table lists Meta $450/0.75x, Paid Search $380/0.63x, Email $290/0.48x under First-Touch, matching the oracle values.
last_touch_oracle
Last-touch paid results are correct: Meta $400 / about 0.67 ROAS, Paid Search $300 / 0.50 ROAS, Email $630 / 1.05 ROAS.
✓Table lists Meta $400/0.67x, Paid Search $300/0.50x, Email $630/1.05x under Last-Touch, matching the oracle values.
winners_flip
Meta is named the first-touch winner and Email the last-touch winner; no single paid winner is claimed across both models.
✓Deliverable 3 names Meta as the First-Touch winner and Email as the Last-Touch winner without claiming one channel wins under both models.
refund_preserved
O-013 remains -$120 and is attributed to Meta under first-touch and Email under last-touch; it is not dropped, zeroed, or converted to positive revenue.
✓The journey table lists O-013 as -$120 attributed to Meta (first-touch) and Email (last-touch), and the reconciliation arithmetic explicitly subtracts $120 from Meta (FT) and Email (LT).
model_definitions
The analysis applies the supplied first/last non-Direct definitions consistently and does not invent fractional or platform-reported attribution.
✓The response consistently applies single first/last non-Direct touch rules (stripping trailing Direct touches) without introducing fractional or platform-reported credit.
assumptions_and_limit
Assumptions are explicit; one consequential data limitation is named with how resolving it could change the recommendation; and attribution is not presented as proof of causation. Valid limitations are not restricted to one prescribed answer.
✓Five explicit assumptions are listed and a data limitation (absence of incrementality/holdout testing) is named with concrete examples of how resolving it (e.g., Email iROAS collapsing to 0.21x) could change the recommendation, alongside an explicit statement that attribution models are 'purely descriptive accounting rules' not causal proof.
conditional_recommendation
The recommendation correctly distinguishes model-robust from model-dependent conclusions, does not declare a universal Meta-versus-Email winner, and does not treat either attribution rule as causal grounds for a decisive reallocation. It may either note that Paid Search is not the descriptive winner under these rules or defer all reallocation pending stronger evidence.
✓The response separates 'Robust Conclusions' (e.g., Paid Search underperforms in both models) from 'Model-Dependent Conclusions' (Email's viability flips between models) and avoids naming a single overall Meta-vs-Email winner.
auditable_math
The response shows enough order grouping, sums, and revenue/spend arithmetic for a reviewer to reproduce both tables.
✓Detailed per-order arithmetic blocks (e.g., 'Meta: $120 (O-001) + $80 (O-002) + ... = $450') are shown for both First-Touch and Last-Touch reconciliations, enabling reproduction of the tables.