Customer Performance Analytics · built for Upbound Group
Inside the funnel: Acima customer economics
The inside-out companion to the market briefing. A working analytics product for the Senior Director, Customer Performance Analytics (Growth) role — modelling Acima’s unit economics, LTV, conversion funnel, and experimentation the way the role would: as live tools that drive decisions, not a static deck.
Integrity note. Everything here is modelled from Upbound’s public SEC filings and earnings calls — no Upbound-internal or confidential data is used. Figures the company doesn’t disclose (average ticket, EPO rate, approval rate, customer count) are modelled from public aggregates and tagged A so you can see — and change — every assumption.
1 · The unit-economics & LTV model
Drag any lever. Everything recomputes live.
Derived: $2.01B GMV ÷ 1.3M customers interacted with (FY2025 call). Acima does not disclose an average ticket dollar value.
Calculated: $2.51B revenue ÷ $2.01B GMV. Revenue exceeds GMV because total lease payments include rental margin on top of the cash price.
Disclosed: Acima gross margin 30.4% of revenue (FY2025 10-K MD&A).
Disclosed: ~9.5% of revenue (FY2025). The 2023 Investor Day target was 6–8% — the single biggest margin lever in the model.
Assumption, anchored to returning customers being 45% of GMV (up from mid-30s). Acima does not disclose a lifetime-leases or retention figure.
Revenue / lease
$1,933
Gross profit / lease
$587
Operating profit / lease
$226
Lost to charge-offs / lease
−$184
Customer lifetime value (operating profit)
$407
$226 operating profit × 1.8 lifetime leases
At Acima’s scale ($2.51B revenue), operating profit
$294M+$0M vs filed
Cut charge-offs toward the 2023 Investor-Day 6–8% target and watch this move — it’s the cleanest path to the “low-to-mid teens” margin Upbound set as its goal.
Which lever moves LTV most?
Marginal change in LTV from one realistic improvement per lever, at the current settings.
Anchors: FY2025 10-K · Q4/FY2025 release · earnings call · 2023 Investor Day
2 · Where the funnel leaks
Acquisition through retention — and the dollar cost of each stage.
Drag the approve→activate lever — the exact step the Android experiment (next section) targets. It’s where the Voice-of-Customer signal said the friction lives.
At the 67.3% baseline. Drag to size the prize.
After first payment, each performing lease resolves on one of three paths to ownership:
- 90-day early payoff — The first early-purchase-option window — disclosed in the 10-K at "90 or 120 days."
- Second early-payoff window — A later discounted buyout that captures customers who miss the first window.
- Full-term to ownership — Continuous renewal to ownership over the lease term (7–30 months by product type).
F Charge-off rate ~9.5% of revenue (FY2025). Through the lease, Acima markets the next one into its app, where the customer carries a proactive pre-approval spendable at partner locations — eligibility opens after ~90 days of positive payments. That app is the re-lease funnel: F 45.0% of GMV is now returning customers, the compounding the LTV model rewards. Downstream, collections recovers a meaningful share but runs largely manual — a named efficiency lever, not a solved problem.
Not every category is equal GMV shares company-disclosed · May 2026
The funnel above is one average. The real portfolio is a mix of merchandise categories with very different volume-and-risk profiles — which is why blanket approval tightening is a blunt instrument. The GMV shares below became public in May 2026, when Acima’s SVP & Head of Revenue put them on the record in a Citybiz Q&A; the risk reads remain illustrative LTO dynamics.
Furniture
~40% of GMV
Volume: HighRisk: Moderate
The strategic core — now confirmed: “nearly 40% of Acima’s gross merchandise value comes from furniture transactions.” Acima sits inside Rent-A-Center, which lives and breathes furniture — a vertical-integration edge the pure-play rivals (Progressive, Katapult) structurally can’t match.
Electronics
Next after the big three
Volume: HighRisk: Higher
A volume driver, but fast-depreciating goods carry the heaviest loss exposure in lease-to-own — the category that most rewards tighter, smarter decisioning.
Jewelry
~20%+ of GMV
Volume: SolidRisk: Volatile
Bigger than the industry stereotype suggests — “contributing a similar amount” to tires, per the Head of Revenue. High margin when it lands, lumpy when it doesn’t: manage by exposure and underwriting, not chase by volume.
Wheel & tire
~22% of GMV
Volume: SteadyRisk: Lower
The quiet workhorse: need-based, reliable repayment, low drama — and nearly a quarter of the book. Routinely underweighted in growth conversations that chase headline volume.
3 · Experimentation & incrementality
A test-and-learn readout, with the stats that make it causal.
Sourced from the Voice-of-Customer signal: Acima rates 4.8★ on Apple but 3.6★ on Google Play. Hypothesis: the Android approve→activate step is leaking conversion.
Android onboarding redesign
- Lift
- +3.1% (+4.3% rel.)
- 95% CI
- +1.8% to +4.4%
- p-value
- < 0.01
- Sample / arm
- 18,400
Guardrail: 30-day lease charge-off rate: +0.1 pt (within noise) — no degradation in credit quality
Estimated annualized incrementality: +21,000 activations ≈ +$32M GMV illustrative
Sample-size calculator
Two-proportion test, 80% power, α = 0.05. How big does the next test need to be?
3,600
needed per arm
4 · Cohort retention & cumulative LTV
Retention decay drives the LTV the model pays out — they’re the same story.
The cumulative-LTV line is tied to the model above: change the assumptions and the curve re-scales toward the new lifetime value of $407. Retention shape is illustrative; the point is the method — cohort decomposition, not a single average.
Retention (left) · Cumulative LTV (right)
5 · Executive growth scorecard
Insight, not just metrics — the JD’s explicit ask.
GMV growth
$2.01B
+8.6% YoY
The number leadership leads with — real, but tracking below the 10–12% Investor Day target. The returning-customer engine is carrying it.
Lease charge-off rate
9.5%
+10 bps; 2026 guide ~9.5%
The biggest lever on the page. Closing to the 2023 6–8% target adds ~$60M+ of operating profit at current scale — and it concentrates by category.
Returning customers (% of GMV)
45%
up from mid-30s
The best growth story Acima has. The app’s proactive pre-approval is the re-lease engine — retention compounds LTV faster than acquisition, so fund it.
Approval rate
↓ 120 bps
absolute not disclosed
Tightening protects losses but throttles the top of the funnel. The risk/growth trade-off needs an explicit, measured frontier — by category, not blanket.
Operating margin
11.7%
+40 bps YoY
Below the "low-to-mid teens" Adj. EBITDA target. Loss reduction is the cleanest path to closing the gap.
DTC marketplace mix
~10% of GMV
more than doubled in 2025
The highest-growth channel and the most measurable. Own its experimentation roadmap before it scales blind.
6 · How it’s built
SQL · warehouse · governance — the technical layer under the charts.
The role asks for SQL, Python, and modern cloud warehouses (Snowflake / Databricks). Here’s the warehouse-side SQL that would produce two of the views above — written the way I’d ship it: CTE-structured, channel-aware, with the charge-off guardrail built in.
Monthly cohort retention & cumulative LTV
-- Cohort the customer base by first-lease month, then track
-- active share and cumulative contribution out to month 12.
with first_lease as (
select customer_id,
date_trunc('month', min(origination_ts)) as cohort_month
from acima.leases
group by 1
),
activity as (
select f.cohort_month,
datediff('month', f.cohort_month,
date_trunc('month', l.origination_ts)) as month_index,
count(distinct l.customer_id) as active_customers,
sum(l.contribution_after_losses) as contribution
from first_lease f
join acima.leases l using (customer_id)
group by 1, 2
)
select cohort_month,
month_index,
active_customers,
sum(contribution) over (
partition by cohort_month order by month_index
) as cumulative_ltv
from activity
order by cohort_month, month_index;Approve → activate funnel by channel (DTC vs merchant)
-- Funnel decomposition with a charge-off guardrail, the metric
-- the Android-onboarding experiment moves.
select a.channel,
count(*) as applications,
sum(a.is_approved::int) as approved,
sum(a.is_activated::int) as activated,
round(sum(a.is_activated::int)
/ nullif(sum(a.is_approved::int), 0), 4) as approve_to_activate,
round(sum(l.charged_off::int)
/ nullif(count(l.lease_id), 0), 4) as charge_off_rate
from acima.applications a
left join acima.leases l using (application_id)
where a.applied_ts >= dateadd('day', -90, current_date)
group by 1
order by applications desc;Same logic as a dbt model — defined once, tested, governed
-- models/marts/fct_cohort_ltv.sql
-- The cohort-LTV query above, productionized: sourced from staging
-- refs (not raw tables), so the metric is defined once and reused
-- everywhere downstream. config + tags drive how dbt builds it.
{{ config(materialized='incremental', unique_key=['cohort_month','month_index']) }}
with first_lease as (
select customer_id,
date_trunc('month', min(origination_ts)) as cohort_month
from {{ ref('stg_acima__leases') }}
group by 1
),
activity as (
select f.cohort_month,
datediff('month', f.cohort_month,
date_trunc('month', l.origination_ts)) as month_index,
count(distinct l.customer_id) as active_customers,
sum(l.contribution_after_losses) as contribution
from first_lease f
join {{ ref('stg_acima__leases') }} l using (customer_id)
group by 1, 2
)
select cohort_month,
month_index,
active_customers,
sum(contribution) over (
partition by cohort_month order by month_index
) as cumulative_ltv
from activity
-- models/marts/fct_cohort_ltv.yml (the governance layer)
-- These tests run on every build. A nullable cohort_month or a
-- negative LTV fails CI before it ever reaches a dashboard.
models:
- name: fct_cohort_ltv
description: Cohort-level retention and cumulative contribution. One source of truth for LTV.
columns:
- name: cohort_month
tests: [not_null]
- name: month_index
tests:
- not_null
- dbt_utils.accepted_range: { min_value: 0, max_value: 12 }
- name: cumulative_ltv
tests:
- dbt_utils.accepted_range: { min_value: 0 }The charge-off guardrail as a dbt test — the funnel, governed
-- models/marts/fct_funnel_by_channel.sql
-- The funnel query, productionized. The guardrail that lives in a
-- WHERE clause above becomes a test that runs in CI: if any channel's
-- charge-off rate breaches tolerance, the build fails and the bad
-- number never reaches a dashboard.
{{ config(materialized='table') }}
with applications as (
select * from {{ ref('stg_acima__applications') }}
where applied_ts >= dateadd('day', -90, current_date)
),
leases as (
select * from {{ ref('stg_acima__leases') }}
)
select a.channel,
count(*) as applications,
sum(a.is_approved::int) as approved,
sum(a.is_activated::int) as activated,
round(sum(a.is_activated::int)
/ nullif(sum(a.is_approved::int), 0), 4) as approve_to_activate,
round(sum(l.charged_off::int)
/ nullif(count(l.lease_id), 0), 4) as charge_off_rate
from applications a
left join leases l using (application_id)
group by 1
order by applications desc
-- models/marts/fct_funnel_by_channel.yml (the guardrail, as a test)
models:
- name: fct_funnel_by_channel
description: Approve-to-activate funnel by channel, with the charge-off guardrail enforced in CI.
columns:
- name: channel
tests:
- not_null
- accepted_values: { values: ['dtc', 'merchant'] }
- name: approve_to_activate
tests:
- dbt_utils.accepted_range: { min_value: 0, max_value: 1 }
- name: charge_off_rate
# The guardrail: growth that lifts activation but breaches this
# band fails the build. Loss is managed by category, not ignored.
tests:
- dbt_utils.accepted_range: { min_value: 0, max_value: 0.15 }Stack I’d run this on: dbt models in Snowflake/Databricks — staged sources, the metric layer for shared definitions, tests in CI — with Python (pandas / statsmodels) for the experiment stats and forecasting, surfaced through Sigma or Tableau. Every metric defined once, tested, and governed — one source of truth, not twelve spreadsheets.
If I had the role · first 90 days
What I’d build first
- Ship the two dashboards Acima should already have. First, per-customer time-to-break-even — when each customer’s payments clear the funded merchandise cost, so the funnel is judged on speed-to-profit, not just GMV. Second, a most-profitable-next-recommendation engine: next-best-action that blends each customer’s payment history with category risk/return to drive the re-lease offer. These are the views the team feels the absence of every day.
- Make the LTV / unit-economics model the shared source of truth — the one above, wired to live warehouse data, so every product trade-off is argued in dollars of lifetime contribution, not opinions.
- Manage losses by category, not by blanket tightening. Charge-off is the biggest lever on profit, and it concentrates (electronics vs. wheel-and-tire). A measured, category-aware risk/growth frontier beats across-the-board approval cuts that quietly throttle the good business with the bad.
- Instrument the app as the re-lease engine. The proactive pre-approval is the mechanism behind 45%-and-climbing returning GMV. Measure its funnel end-to-end, then run the Android-onboarding experiment for real — the VoC signal already located that leak.
Built by Paul Brown from Upbound’s public filings — no internal data, every assumption labeled and adjustable. The model ties out to the filed numbers because the method is sound. That’s the job.