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.

Jun 21, 2026

1 · The unit-economics & LTV model

Drag any lever. Everything recomputes live.

Calibrated to reality. At its default inputs the model reproduces Acima’s FY2025 almost exactly — $2.51B revenue across ~1.3M customers at a 30.4% gross margin and $295M operating profit. The assumptions aren’t invented; they’re reverse-engineered from the filings until the math ties out.
$1,546D

Derived: $2.01B GMV ÷ 1.3M customers interacted with (FY2025 call). Acima does not disclose an average ticket dollar value.

1.25×D

Calculated: $2.51B revenue ÷ $2.01B GMV. Revenue exceeds GMV because total lease payments include rental margin on top of the cash price.

30.4%F

Disclosed: Acima gross margin 30.4% of revenue (FY2025 10-K MD&A).

9.5%F

Disclosed: ~9.5% of revenue (FY2025). The 2023 Investor Day target was 6–8% — the single biggest margin lever in the model.

1.80×A

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.

+0.3 leases / customer+$68
Charge-off rate −1.5 pt+$52
Avg GMV +10%+$41
Revenue mult +0.05+$16
Gross margin +1 pt+$0

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.

ApplicationsF100.0
ApprovedA36.0
Lease generated (agreement)A30.6
Funded (delivery verified)A26.9
First payment clearedA24.2

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 payoffThe first early-purchase-option window — disclosed in the 10-K at "90 or 120 days."
  • Second early-payoff windowA later discounted buyout that captures customers who miss the first window.
  • Full-term to ownershipContinuous renewal to ownership over the lease term (7–30 months by product type).
90.5% paid as agreed9.5% charged off

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

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

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

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

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

New Android applicants, 50/50 randomized · primary metric: Approved → activated conversion

Ship to 100% of Android
Control72.0%
Treatment75.1%
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

  1. 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.
  2. 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.
  3. 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.
  4. 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.