LTV and Cohorts: How to Read and Use
Why LTV Analysis is Needed
LTV (Lifetime Value) — the total income from a user over the entire period of their activity. In the context of gambling/betting, this is the initial deposit + subsequent deposits (redeposits).
Why LTV is critically important for an arbitrageur:
Imagine: two traffic sources.
Source A: 100 FTD, LTV per FTD = $45 → total income $4,500
Source B: 80 FTD, LTV per FTD = $120 → total income $9,600
If you look only at FTD — Source A is "better" (100 vs 80). But in terms of actual income, Source B brings in twice as much. Without LTV, you scale the wrong source.
When LTV is more important than ROI in the short term:
When launching a new GEO — the first few days ROI may be negative, but if LTV is growing — the traffic is quality
When comparing two offers from the same affiliate — one gives many FTDs with low LTV, the other fewer FTDs but "long-term" users
When assessing traffic payback after 30-90 days — D0 shows only the first day, while the main profit comes later
Feature for iGaming: In gambling/betting, the main income comes not from the first deposit, but from redeposits (CPA_REDEP). A user may deposit $20, and in the next month — another $200. LTV D0 will show only $20, while LTV D31-90 may show $220.
How Cohorts are Structured
Cohort — a group of users united by the date of their first action.
In Adset.Pro there are two types of cohorts (through different group keys):
FTD Cohorts (by first deposit date)
Group Key | Description |
|---|---|
| Cohort by FTD day |
| Cohort by FTD week |
| Cohort by FTD month |
| Number of days from FTD to last redeposit |
When to use: Monetization analysis of paying users. You answer the question: "How much do I earn from a user who deposited in January?"
Reg Cohorts (by registration date)
Group Key | Description |
|---|---|
| Cohort by registration day (CPA_HOLD) |
| Cohort by registration week |
| Cohort by registration month |
| Number of days from registration to last action |
When to use: Analysis of conversion from registration to deposit and behavior of all registered users (not just those who deposited). You answer the question: "What % of registrants reach a deposit and how much do they bring?"
Practical Example of the Difference
Case 1: "I want to know how much I earn from a user who deposited in January" → FTD cohort (
cohort_month) +ltv_per_ftdCase 2: "I want to know what % of registrants reach a deposit" → Reg cohort (
reg_cohort_month) +reg_to_ftd_rateCase 3: "I want to see income from registration, including FTD and all redeposits" → Reg cohort +
ltv_per_reg
LTV Windows (Time Periods)
FTD-based LTV
Each user is tracked over 4 time horizons after the first deposit (CPA_ACCEPT):
Metric | Period | What it measures |
|---|---|---|
| Day 0 (FTD day) | Initial deposit + redeposits on the same day (CPA_ACCEPT + CPA_REDEP) |
| Days 1–7 after FTD | Early redeposits (first week, only CPA_REDEP) |
| Days 8–30 after FTD | Medium-term retention (2-4 week, only CPA_REDEP) |
| Days 31–90 after FTD | Long-term retention (2-3 month, only CPA_REDEP) |
Total metrics:
ltv_total=ltv_d0 + ltv_d1_7 + ltv_d8_30 + ltv_d31_90ltv_per_ftd=ltv_total / cpa_accept(average LTV per FTD)
Reg-based LTV
Similar structure, but counting from registration date (CPA_HOLD):
Metric | Period | What it measures |
|---|---|---|
| Day 0 (registration day) | CPA_ACCEPT + CPA_REDEP on registration day |
| Days 1–7 after registration | CPA_REDEP for the first week |
| Days 8–30 after registration | CPA_REDEP for 2-4 week |
| Days 31–90 after registration | CPA_REDEP for 2-3 month |
Total:
ltv_reg_total= sum of all periodsltv_per_reg=ltv_reg_total / registrations(average LTV per registration)
Important Notes on Windows
D0 is not the entire LTV, but only the beginning. Usually, D0 accounts for 30-50% of the total LTV D0-D90
D31-90 should only be viewed if 3+ months have passed since the FTD date. Otherwise, the window is still "open" and the data is incomplete
Incomplete window: If the cohort was created 2 weeks ago, then
ltv_d8_30will be incomplete (only 14 days have passed out of 30), andltv_d31_90— emptyCurrency conversion: All LTV metrics are automatically converted to USD via
event_fx_to_usdif the postback currency differs
Lifetime Days
Lifetime Days (lifetime_days) — the number of days from FTD to the last active action (redeposit).
Formula: dateDiff('day', ftd_time, event_time) — an integer number of days.
How to read the distribution of lifetime days:
Value | What it means |
|---|---|
| The user deposited and never returned (FTD without redeposits) |
| Short-term activity (returned 1-2 times in the first week) |
| Average retention (active for 2-4 weeks) |
| Loyal user (active for months) |
Practical application:
If 70%+ of the cohort has
lifetime_days = 0— it means there are almost no redeposits, the problem lies in traffic quality or the offerBreakdown by
lifetime_days+cpa_redep— shows a heatmap: on which days users make redepositsCompare
lifetime_daysbetween campaigns/sources — which gives "long-term" users
Analogue for reg cohorts: lifetime_days_from_reg — days from registration (CPA_HOLD) to the last action.
Additional Metrics
Metric | Formula | Application |
|---|---|---|
|
| What % of FTDs made at least one redeposit |
|
| What % of registrations reached a deposit |
|
| Ratio of redeposits to deposits |
|
| Total number of deposits |
|
| Total revenue from all deposits |
How to Filter in LTV Analysis
Available filters in LTV reports are limited to attribution fields:
Filter | What it does |
|---|---|
| Filter by campaign |
| Filter by traffic source |
| Filter by offer |
| Filter by CPA network |
| Filter by user country |
Why is there no filter by device/browser? LTV analysis works with user cohorts through the
events_ltvtable. A single user may have multiple sessions on different devices. Filtering by device would lead to duplication and incorrect data.
How to use a combination of filters:
"Compare LTV of two offers from the same affiliate" → filter:
cmp_cpa = X, breakdown:cmp_offer"LTV of traffic from Ukraine for the last 3 months" → filter:
user_country = UA, group:cohort_month"Traffic quality by sources" → filter: none, breakdown:
cmp_source, metric:ltv_per_ftd
Breakdowns
In LTV analysis, you can add breakdowns for cohort comparison:
Breakdown (Group Key) | Application |
|---|---|
| Compare traffic quality between campaigns |
| Which source gives more "heavy" users |
| Compare two offers from the same affiliate by LTV |
| Compare different affiliates by monetization |
| LTV by GEO (usually Tier-1 > Tier-3) |
| Cohort period — for tracking trends |
| Heatmap of activity by days |
Typical Cases
"Which offer from 1win gives the best LTV for UA traffic?"
Filter:
user_country = UA,cmp_cpa = 1winBreakdown:
cmp_offerMetric:
ltv_per_ftd
"How has traffic quality changed over the months?"
Breakdown:
cohort_monthMetrics:
ltv_d0,ltv_d1_7,ltv_d8_30,cpa_accept
"Which source gives users with redeposits?"
Breakdown:
cmp_sourceMetric:
ftd_to_redep_rate
Recommendations for Query Setup
Data period ≥ 90 days — to capture complete LTV windows (D0, D1-7, D8-30, D31-90)
LTV metrics only work with
events_ltvtable — it is automatically selected when using cohort groups or LTV metricsCohort groups activate LTV calculations —
cohort_day/cohort_week/cohort_monthtrigger JOIN withftd_timesCTEReg cohort groups —
reg_cohort_day/reg_cohort_week/reg_cohort_monthtrigger JOIN withreg_timesCTE
Typical Metrics and Interpretation
Metric | Good Value | Bad Value | What to Do |
|---|---|---|---|
| Close to the average deposit of the affiliate | Significantly lower → junk leads or small deposits | Check status mapping, offer quality |
| > 30-40% (active redeposits in the first week) | < 10% → users deposited and left | Check offer UX, affiliate bonus program |
| > 20-30% | < 10% → almost no one redeposits | Problem with traffic quality or the offer |
| > 30-40% (for gambling) | < 15% → there are registrations, but they don't deposit | Problem with affiliate onboarding or bonuses |
| 5-15 days (active first 1-2 weeks) | 0-1 day (deposited-and-gone) | Typical for Tier-3 GEO or fraud |
Frequently Asked Questions
Q: Why does LTV in Adset.Pro not match the data in the affiliate's cabinet?
Reasons for discrepancies:
Postback delays — the affiliate may send redeposits with a delay (from hours to days)
Timezone — the cohort date is determined by the timezone specified in the request. Different timezones = different dates
Deduplication — Adset.Pro discards duplicate conversions (if
acceptDuplicatesis not included)Currency conversion — Adset.Pro converts via
event_fx_to_usd, the affiliate may show in a different currency
Q: The cohort was created a week ago — why is D8-30 empty?
This is normal. The D8-30 window means "days 8-30 after FTD". If the cohort is only 7 days old, data for D8-30 has not yet arrived. Wait another 3-4 weeks — data will start to appear.
Q: How to compare LTV of two campaigns that were launched in different months?
Seasonality issue: the January cohort may have been more active due to New Year promotions, while the February cohort — less so. Solutions:
Use
cohort_month+ltv_per_ftd— compare metrics within the cohort, not absolute numbersLook at
ftd_to_redep_rate— it is less sensitive to seasonalityCompare LTV for the same period after FTD (for example, only D0+D1-7 for both cohorts)
Q: Why are reg cohorts needed if there are FTD cohorts?
FTD cohorts include only users who deposited. Reg cohorts include all registered and allow you to see:
Conversion from reg → FTD (
reg_to_ftd_rate)LTV per registration (
ltv_per_reg) — takes into account that not all registrants depositA more complete picture of the funnel: how many people came vs how many actually brought money
