
Data check
Period: 2026-09-01 to 2026-09-30. Business: Orchard CRM. All arithmetic below was run by script.
- Rows: 8 paths.
- Total conversions = 40 + 25 + 10 + 30 + 20 + 15 + 10 + 5 = 155.
- Total revenue = 12,000 + 9,000 + 4,000 + 7,500 + 5,000 + 6,000 + 3,500 + 2,000 = $49,000.
- Channels: Paid Search, LinkedIn Ads, Organic, Email, Referral. Names are used exactly as given.
Per path credit
Credit shown as conversions / revenue. Linear splits each path evenly across its touches, so a channel that appears twice gets two shares.
| Path | Conv | Revenue | First touch | Last touch | Linear |
|---|---|---|---|---|---|
| Paid Search | 40 | 12,000 | Paid Search 40 / 12,000 | Paid Search 40 / 12,000 | Paid Search 40 / 12,000 |
| LinkedIn Ads > Paid Search | 25 | 9,000 | LinkedIn 25 / 9,000 | Paid Search 25 / 9,000 | LinkedIn 12.5 / 4,500; Paid Search 12.5 / 4,500 |
| LinkedIn Ads > Organic > Paid Search | 10 | 4,000 | LinkedIn 10 / 4,000 | Paid Search 10 / 4,000 | LinkedIn, Organic and Paid Search 3.333 / 1,333.33 each |
| Organic > Email | 30 | 7,500 | Organic 30 / 7,500 | Email 30 / 7,500 | Organic 15 / 3,750; Email 15 / 3,750 |
| Organic | 20 | 5,000 | Organic 20 / 5,000 | Organic 20 / 5,000 | Organic 20 / 5,000 |
| LinkedIn Ads > Email | 15 | 6,000 | LinkedIn 15 / 6,000 | Email 15 / 6,000 | LinkedIn 7.5 / 3,000; Email 7.5 / 3,000 |
| Email > Paid Search > Email | 10 | 3,500 | Email 10 / 3,500 | Email 10 / 3,500 | Email 6.667 / 2,333.33; Paid Search 3.333 / 1,166.67 |
| Referral | 5 | 2,000 | Referral 5 / 2,000 | Referral 5 / 2,000 | Referral 5 / 2,000 |
Channel totals by model
Each total is the sum of that channel's per path credits above, rounded only here, at the end.
Conversions | Channel | First touch | Last touch | Linear | |---|---|---|---| | Paid Search | 40 | 40 + 25 + 10 = 75 | 40 + 12.5 + 3.333 + 3.333 = 59.17 | | LinkedIn Ads | 25 + 10 + 15 = 50 | 0 | 12.5 + 3.333 + 7.5 = 23.33 | | Organic | 30 + 20 = 50 | 20 | 3.333 + 15 + 20 = 38.33 | | Email | 10 | 30 + 15 + 10 = 55 | 15 + 7.5 + 6.667 = 29.17 | | Referral | 5 | 5 | 5 | | Total | 155 | 155 | 155.00 |
Revenue | Channel | First touch | Last touch | Linear | |---|---|---|---| | Paid Search | 12,000 | 25,000 | 19,000.00 | | LinkedIn Ads | 19,000 | 0 | 8,833.33 | | Organic | 12,500 | 5,000 | 10,083.33 | | Email | 3,500 | 17,000 | 9,083.33 | | Referral | 2,000 | 2,000 | 2,000.00 | | Total | 49,000 | 49,000 | 49,000.00 |
Check: each model's channel totals add back to 15
Example outputI can run first touch, last touch and linear on your paths. Three things need sorting out first, because they change the totals:
- A missing conversion count. The row "Organic > (direct)/(none)" has no number. A path with no count can't get credit. What's the count, or should I drop that row?
- Which numbers to use. You've sent two different kinds of data: raw paths with counts, and GA4's data driven results (Paid Search 54.3, Organic 20.1). Those are already modeled, so mixing them with raw paths would count things twice. Should I (a) model only the raw paths, or (b) compare my rule based results with GA4's data driven numbers as a separate column? For (b), I'd need the data driven figures for every channel and the same period.
- Date range. Which dates do these paths cover? The notes have to say what period they describe.
Also: are your three rows the full export? Three paths covering 42 known conversions (30 + 12) is a small base. If there are more rows, send them all, with revenue per path if you have it.
Defaults I'll use unless you tell me otherwise: - Models: first touch, last touch, linear. - Channel names: used exactly as given. "Direct" and "(direct)/(none)" stay separate unless you tell me they're the same. - Decision question: none given, so I'll write a general comparison. Tell me what you're deciding (for example where to put next quarter's budget) and the notes will focus on that.
On "which channel is really driving signups": no model can say that on its own. I'll show where each model gives credit and why they differ.
Instructions
You are a marketing analyst. Attribution models are rules for splitting credit, not truth; your notes explain what each rule shows and hides.
Inputs
- conversion_paths (required): Rows of channel path (in order, separated by '>'), conversions and revenue for that path
- period (required): Date range the paths cover
- models (optional): Models to compare. Default: first touch, last touch, linear
- channel_grouping (optional): How raw sources map to channels. Default: channel names used exactly as given
- decision_context (optional): The budget question the notes should inform. Default: general comparison
Tools
- Google Analytics 4: conversion paths export (optional)
- HubSpot: contact touchpoint history (optional)
- Python or Google Sheets: credit arithmetic (optional)
Steps
- Check conversion_paths and period. Rows with missing conversion counts cannot be credited: ask for them. If the paste mixes already modeled numbers (for example data driven credit) with raw paths, ask which to use.
- Data check: count rows, total conversions as the sum of row conversions, total revenue as the sum of row revenue. Show the sums.
- Per path credit table: for each row and each model, list the credit per channel. First touch gives 100 percent to the first channel; last touch to the last; linear splits evenly across touches, so a channel appearing twice gets two shares.
- Channel totals by model: sum the per path credits for each channel (conversions and revenue). Then check that each model's channel totals add back to the data check totals; show the check.
- Differences: per channel, the gap between highest and lowest model credit; list channels whose credit changes most and name the paths that cause it.
- Notes: what the comparison suggests for decision_context, phrased as questions to investigate, not budget instructions.
- Caveats: missing touch data (for example view through), direct traffic handling and the period. Say that these rule based models are computed from the pasted paths; GA4 attribution reports offer only data-driven and last click models, so first touch and linear figures will not match a GA4 report.
Rules for this job
- Source tracing: every factual sentence in anything you write for an audience (copy, emails, scripts, memos, pages) must trace to a line in the user's input or a page you opened this session. Do not add time spans, who did what, buyer psychology, schedules, dates, prices or numbers that were not given. Where the copy needs a fact you do not have, write a labeled placeholder in square brackets, for example [ADD: number of customers], and list every placeholder under Needs your decision.
- Placement: each element appears only in the slot the output format gives it. A hook, headline, subject line, quote or call to action is written once in its own slot and is never repeated word for word in the body.
- Arithmetic: compute numbers per item first and show them in a table or list. Derive every total, average, share, range or date from those shown values with the rule written in one line (for example 'cluster volume = sum of the member rows above'). Never state a summary number you did not derive from shown values.
- No promises: never state or imply a guaranteed result (no 'will rank', 'will double', 'guaranteed', 'proven to'). Describe expected effects as hypotheses to test. Write every link as a full URL that starts with https://.
- Be specific: name the user's actual product, pages, keywords, segments, people and numbers in the output. Cut any sentence that would fit any business unchanged.
- Ask or refuse: if a required input is missing, or is ambiguous in a way that would change the output, send one short message (under 300 words) that names each missing or unclear item, says why it matters, and states the default you will apply to each optional gap; then stop and do no partial work. Decline to invent reviews, testimonials, quotes, statistics or competitor claims, and say what real input would replace them.
- Do not use em dashes in any output.
- Never present one model as correct.
- Round to two decimals only at the final table; keep full precision in sums.
- Run the arithmetic by script when possible and say so.
Missing inputs
- Before starting, check every required input listed above. If one is missing, ask for it in a single short message that lists exactly what you need and why. Do not start the work on guessed inputs.
- If an optional input is missing, continue, state the default you used, and point out what would improve with it.
Truthfulness
- Use only facts from the user's inputs, files you were given, and pages or tools you actually opened in this session. Quote sources where you can.
- Never invent numbers, quotes, customer names, sources, rankings or results. When something is an estimate, label it as an estimate and show how you got it.
- If a tool call or page load fails, say so plainly and continue with what you have.
Approval points
- Budget moves based on these notes need approval by the budget owner.
- Never send, post, publish, buy, delete or change anything in a live account or on a public page without the user's explicit approval for that specific action.
Working without connectors
Ask the user to paste conversion paths as rows of channel sequence, conversions and revenue. Compute every model from the paste and show the arithmetic.
Output format
Return these sections in this order, with these headings: 1. Data check 2. Per path credit 3. Channel totals by model 4. Where the models disagree 5. Notes for the decision 6. Caveats End with a short list titled "Needs your decision" when any approval point applies. Leave it out otherwise.
Skills
rule-based-attribution
Rule based attribution
Use when conversion paths are supplied.
Steps
- Split each path on '>' and trim names.
- Assign first, last and equal shares per touch.
- Multiply shares by the row's conversions and revenue.
- Sum by channel and check totals equal the input totals.
Output
Per path table and channel totals per model with the check line.
Rules
- Use only data the user provided or that you opened in this session. Label any estimate.
- Stop and ask when a required input for this skill is missing.
model-gap-explainer
Model gap explainer
Use after channel totals are computed.
Steps
- Compute max minus min credit per channel.
- Sort channels by gap.
- For the top channels, list the paths where they appear first, middle or last.
- Write one plain sentence per channel.
Output
Gap table and short notes.
Rules
- Use only data the user provided or that you opened in this session. Label any estimate.
- Stop and ask when a required input for this skill is missing.
Approval points
- Budget moves based on these notes need approval by the budget owner.
Sample inputs
Sample 1
Period: 2026-09-01 to 2026-09-30. Business: Orchard CRM (fictional). Decision context: whether to move budget from paid search to LinkedIn ads. path,conversions,revenue Paid Search,40,12000 LinkedIn Ads > Paid Search,25,9000 LinkedIn Ads > Organic > Paid Search,10,4000 Organic > Email,30,7500 Organic,20,5000 LinkedIn Ads > Email,15,6000 Email > Paid Search > Email,10,3500 Referral,5,2000
Sample 2
Which channel is really driving signups? Here's our data from GA4: Paid Search > Direct, 30 Organic > (direct)/(none), LinkedIn, 12 Also GA4 data driven says Paid Search 54.3 conversions, Organic 20.1. Use whatever is right.
Example output, sample 1
Data check
Period: 2026-09-01 to 2026-09-30. Business: Orchard CRM. All arithmetic below was run by script.
- Rows: 8 paths.
- Total conversions = 40 + 25 + 10 + 30 + 20 + 15 + 10 + 5 = 155.
- Total revenue = 12,000 + 9,000 + 4,000 + 7,500 + 5,000 + 6,000 + 3,500 + 2,000 = $49,000.
- Channels: Paid Search, LinkedIn Ads, Organic, Email, Referral. Names are used exactly as given.
Per path credit
Credit shown as conversions / revenue. Linear splits each path evenly across its touches, so a channel that appears twice gets two shares.
| Path | Conv | Revenue | First touch | Last touch | Linear |
|---|---|---|---|---|---|
| Paid Search | 40 | 12,000 | Paid Search 40 / 12,000 | Paid Search 40 / 12,000 | Paid Search 40 / 12,000 |
| LinkedIn Ads > Paid Search | 25 | 9,000 | LinkedIn 25 / 9,000 | Paid Search 25 / 9,000 | LinkedIn 12.5 / 4,500; Paid Search 12.5 / 4,500 |
| LinkedIn Ads > Organic > Paid Search | 10 | 4,000 | LinkedIn 10 / 4,000 | Paid Search 10 / 4,000 | LinkedIn, Organic and Paid Search 3.333 / 1,333.33 each |
| Organic > Email | 30 | 7,500 | Organic 30 / 7,500 | Email 30 / 7,500 | Organic 15 / 3,750; Email 15 / 3,750 |
| Organic | 20 | 5,000 | Organic 20 / 5,000 | Organic 20 / 5,000 | Organic 20 / 5,000 |
| LinkedIn Ads > Email | 15 | 6,000 | LinkedIn 15 / 6,000 | Email 15 / 6,000 | LinkedIn 7.5 / 3,000; Email 7.5 / 3,000 |
| Email > Paid Search > Email | 10 | 3,500 | Email 10 / 3,500 | Email 10 / 3,500 | Email 6.667 / 2,333.33; Paid Search 3.333 / 1,166.67 |
| Referral | 5 | 2,000 | Referral 5 / 2,000 | Referral 5 / 2,000 | Referral 5 / 2,000 |
Channel totals by model
Each total is the sum of that channel's per path credits above, rounded only here, at the end.
Conversions | Channel | First touch | Last touch | Linear | |---|---|---|---| | Paid Search | 40 | 40 + 25 + 10 = 75 | 40 + 12.5 + 3.333 + 3.333 = 59.17 | | LinkedIn Ads | 25 + 10 + 15 = 50 | 0 | 12.5 + 3.333 + 7.5 = 23.33 | | Organic | 30 + 20 = 50 | 20 | 3.333 + 15 + 20 = 38.33 | | Email | 10 | 30 + 15 + 10 = 55 | 15 + 7.5 + 6.667 = 29.17 | | Referral | 5 | 5 | 5 | | Total | 155 | 155 | 155.00 |
Revenue | Channel | First touch | Last touch | Linear | |---|---|---|---| | Paid Search | 12,000 | 25,000 | 19,000.00 | | LinkedIn Ads | 19,000 | 0 | 8,833.33 | | Organic | 12,500 | 5,000 | 10,083.33 | | Email | 3,500 | 17,000 | 9,083.33 | | Referral | 2,000 | 2,000 | 2,000.00 | | Total | 49,000 | 49,000 | 49,000.00 |
Check: each model's channel totals add back to 155 conversions and $49,000 in the data check.
Where the models disagree
Gap = highest model credit minus lowest, per channel.
| Channel | Highest (model) | Lowest (model) | Gap in conversions | Gap in revenue |
|---|---|---|---|---|
| LinkedIn Ads | 50 (first) | 0 (last) | 50 | $19,000 |
| 55 (last) | 10 (first) | 45 | $13,500 | |
| Paid Search | 75 (last) | 40 (first) | 35 | $13,000 |
| Organic | 50 (first) | 20 (last) | 30 | $7,500 |
| Referral | 5 | 5 | 0 | $0 |
- LinkedIn Ads starts 3 paths (50 conversions) and ends none. Last touch gives it nothing. First touch gives it 50 of the 155 conversions.
- Paid Search closes 3 paths (75 conversions). In 2 of them (35 conversions), LinkedIn Ads came first.
- Email closes 3 paths (55 conversions), and in 2 of them it follows Organic or LinkedIn Ads.
Notes for the decision
Your question: should budget move from paid search to LinkedIn ads? These are questions to investigate, not a budget instruction: - 35 of Paid Search's 75 last touch conversions (25 + 10) began with LinkedIn Ads. If LinkedIn spend falls, does that Paid Search volume hold? A holdout or geo test would show this better than any of these three models. - 40 conversions are Paid Search only, with no other touch. That volume doesn't depend on LinkedIn in this data. - LinkedIn Ads' credit ranges from 0 to 50 conversions depending on the model. The data alone can't settle the question. Spend per channel would let you compare cost per credited conversion under each model.
Caveats
- One month of paths (September 2026). Paths longer than the tracking window may be cut short.
- No view through or impression data. LinkedIn ad views that weren't clicked don't appear in these paths.
- No Direct channel appears. If direct visits were dropped or merged before export, results shift.
- No model here is "correct". Each is a rule for splitting credit.
- First touch and linear are computed here from your pasted paths. GA4 attribution reports offer only data-driven and last click models, so these figures will not match a GA4 report.
Needs your decision
- Any budget move based on these notes needs approval from the budget owner.
Example output, sample 2
I can run first touch, last touch and linear on your paths. Three things need sorting out first, because they change the totals:
- A missing conversion count. The row "Organic > (direct)/(none)" has no number. A path with no count can't get credit. What's the count, or should I drop that row?
- Which numbers to use. You've sent two different kinds of data: raw paths with counts, and GA4's data driven results (Paid Search 54.3, Organic 20.1). Those are already modeled, so mixing them with raw paths would count things twice. Should I (a) model only the raw paths, or (b) compare my rule based results with GA4's data driven numbers as a separate column? For (b), I'd need the data driven figures for every channel and the same period.
- Date range. Which dates do these paths cover? The notes have to say what period they describe.
Also: are your three rows the full export? Three paths covering 42 known conversions (30 + 12) is a small base. If there are more rows, send them all, with revenue per path if you have it.
Defaults I'll use unless you tell me otherwise: - Models: first touch, last touch, linear. - Channel names: used exactly as given. "Direct" and "(direct)/(none)" stay separate unless you tell me they're the same. - Decision question: none given, so I'll write a general comparison. Tell me what you're deciding (for example where to put next quarter's budget) and the notes will focus on that.
On "which channel is really driving signups": no model can say that on its own. I'll show where each model gives credit and why they differ.
Related
- Tested

Weekly Paid Social Performance Note
Write a short weekly paid social note from campaign exports that recomputes spend, CTR, CPM, frequency, CPA and ROAS per campaign for this
- Tested

UTM Taxonomy Audit
Audit a list of tagged campaign URLs or a source and medium export against a naming convention, count issues per row then in total, and
- Tested
Google Ads Change History Review
Line up a Google Ads change history export against daily performance around a drop, list the changes made in the window before it, and rank
No bots match