LTV by Channel
Cohort LTV by acquisition channel for ecommerce teams: which channels bring customers who come back, what each one can afford to pay per customer, and when it pays back, on mature cohorts only.
Most LTV numbers compare channels that aren't comparable: last month's customers against last year's, brand search against prospecting, and a lifetime-to-date figure that grows with cohort age. This skill fixes the method before it answers. It reads your orders through Polar, keeps only cohorts old enough for the window you ask for, computes a fixed 90-day (or 180 / 365-day) LTV per first-order channel, splits search into brand and non-brand, and puts it against CAC to give you LTV:CAC, the maximum CAC each channel can afford and the month it pays back. Every number goes through QA before you see it.
What It Does
- Computes fixed-window LTV (90, 180 or 365 days) per first-order channel, on mature cohorts only.
- Splits Paid Search into brand and non-brand, because brand buyers already knew you.
- Puts LTV against CAC: LTV:CAC, max affordable CAC at your target ratio, and payback month.
- Draws cohort curves month by month and marks the thin months you shouldn't trust.
- Runs QA before answering: totals within range, plausible repeat rates, customers that add up.
- Follows a promo code: who used it, what they bought next, and their LTV versus full-price buyers.
Use Cases
- Set a CAC ceiling per channel before the next budget planning.
- Check whether Paid Social customers ever pay back, and when.
- Stop justifying non-brand search with brand search's LTV.
- Find out if the Black Friday code brought customers or one-off bargain hunters.
Example Session
/polar-ltv-cohorts 90-day LTV by acquisition channel, and the max CAC I can afford per channel.
LTV by channel · 90-day LTV · mature cohorts only
Cohorts: first orders from 15 to 3 months ago · Revenue-based LTV · Target LTV:CAC 3x · QA: 5/5 checks passed
• Organic Search brings the best customers: €208 in 90 days, with no media cost.
• Paid Social costs more than it returns: a €171 CAC for €142 of 90-day LTV (0.83x).
• Blended Paid Search reads 1.9x, but that's brand. Non-brand alone sits at 1.1x.
- Channel | New cust. | LTV 90d | CAC | LTV:CAC | Max CAC 3x | Payback
- Paid Search · brand | 1,540 | €196 | €61 | 3.2x | €65 | Month 0
- Paid Search · non-brand | 480 | €147 | €134 | 1.1x | €49 | Month 5
- Paid Social | 1,130 | €142 | €171 | 0.83x | €47 | Month 4
- Organic Search | 1,210 | €208 | n/a | n/a | n/a | n/a
- Email / SMS | 870 | €199 | n/a | n/a | n/a | n/a
Brand search pays back on the first order because those buyers were already looking for you: it can't justify more search budget. The real test is non-brand at 1.1x, below your 3x target and paying back in month 5.
⚠ QA: the channel repeat-rate metric counts orders, not customers (6x more repeats than new customers on Direct), so it was left out instead of shown.
Assumptions: LTV = revenue within 90 days of first order · channel = first-order channel grouping · marketplace orders excluded · read-only.
Install It
- Copy the command.
One line in your terminal. Free, no account needed. - Run it.
npx skills add pulls the skill from Polar's GitHub and installs it for the agents you pick: Claude Code, Cursor, Codex and more. - Connect Polar and ask.
Connect the Polar connector, then ask for your LTV by channel. The skill does the rest.
skills folder
Copy
npx skills add \
https://github.com/polar-analytics/claude-skills \
--skill polar-ltv-cohortsFrequently asked questions
How is this different from the LTV in my Shopify dashboard?
Most dashboards show lifetime-to-date LTV, which grows with cohort age and makes older channels look better. This skill uses a fixed 90, 180 or 365-day window on cohorts old enough to have lived it, so every channel is compared on the same footing.
Why are recent customers left out?
A customer who ordered last month hasn't had 90 days to come back yet. Counting them would drag every channel's LTV down. The skill keeps only mature cohorts and states the exact date range it used.
Is LTV based on revenue or margin?
Revenue by default. If COGS are set up in Polar, ask for a margin-based LTV and the payback month becomes a profit payback. The report always says which one it used.
Why split brand and non-brand search?
Brand-search buyers already knew you, so they come back more and cost less. Mixing them with non-brand makes search look profitable enough to scale when the prospecting part may not be.
What happens when a number looks wrong?
The skill runs QA before answering: totals within range, customers that add up, plausible repeat rates. A metric that fails is left out and explained instead of shown.
Does it include Amazon customers?
No. Marketplace orders usually carry no customer id, so they can't be followed from one order to the next. The skill excludes them from cohort maths and says so.
An LTV is worth what your order history is worth.
Polar unifies Shopify orders, ad spend and first-order attribution in one model, so the skill reads every customer's history instead of a CSV export.
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "How is this different from the LTV in my Shopify dashboard?", "acceptedAnswer": {"@type": "Answer", "text": "Most dashboards show lifetime-to-date LTV, which grows with cohort age and makes older channels look better. This skill uses a fixed 90, 180 or 365-day window on cohorts old enough to have lived it, so every channel is compared on the same footing."}}, {"@type": "Question", "name": "Why are recent customers left out?", "acceptedAnswer": {"@type": "Answer", "text": "A customer who ordered last month hasn't had 90 days to come back yet. Counting them would drag every channel's LTV down. The skill keeps only mature cohorts and states the exact date range it used."}}, {"@type": "Question", "name": "Is LTV based on revenue or margin?", "acceptedAnswer": {"@type": "Answer", "text": "Revenue by default. If COGS are set up in Polar, ask for a margin-based LTV and the payback month becomes a profit payback. The report always says which one it used."}}, {"@type": "Question", "name": "Why split brand and non-brand search?", "acceptedAnswer": {"@type": "Answer", "text": "Brand-search buyers already knew you, so they come back more and cost less. Mixing them with non-brand makes search look profitable enough to scale when the prospecting part may not be."}}, {"@type": "Question", "name": "What happens when a number looks wrong?", "acceptedAnswer": {"@type": "Answer", "text": "The skill runs QA before answering: totals within range, customers that add up, plausible repeat rates. A metric that fails is left out and explained instead of shown."}}, {"@type": "Question", "name": "Does it include Amazon customers?", "acceptedAnswer": {"@type": "Answer", "text": "No. Marketplace orders usually carry no customer id, so they can't be followed from one order to the next. The skill excludes them from cohort maths and says so."}}]}</script>
