Engagement & cadence

New resellers become regulars; this page asks whether the regulars are staying regular. It reads the active base on two dimensions, not one — not just how many are active, but how often they order and how much they spend. A base can grow in headcount while quietly hollowing out underneath: resellers ordering less often, or downgrading to smaller orders, without ever churning. That silent contraction is invisible to a headcount view and is exactly what this page is built to catch.

Big Value
error
Big Value
error
Big Value
error
Big Value
error

Fact · Cause · Action

AI-generated — stub. The active base is growing in headcount but hollowing out. Regulars order less often (2.0 vs 2.4/month) and spend less each (£440 vs £520), contraction now outpaces expansion (NRR 94%), and it's worst among the longest-tenured, highest-value resellers. Depth, not headcount, is the problem — and headcount growth is hiding it.

SectionFactCauseProposed action
Headcount vs depthActive headcount grew 42 → 54 over the quarter, but revenue per active reseller fell £520 → £440 (−15%). The base is wider and shallower.Existing regulars are downgrading to smaller orders — a value contraction that headcount growth masks entirely.Track the base on depth, not just count; set a revenue-per-active floor and alert when the trend breaks it.
Order cadenceOrders per active reseller slipped from 2.4 to 2.0 a month, under the 2.2 target.Nothing prompts a reorder once the subsidy tapers off; regulars drift or split spend to competing suppliers.Reorder nudges at each reseller's usual cadence; review range and pricing against the competitors they're drifting to.
Order frequency (buckets)The average hides a migration: the 1×/month bucket has ballooned 10 → 27 (now half the base) while the 3×/month band cliffed 12 → 6. The 4+/month core holds.Resellers aren't churning, they're de-frequenting — sliding down the buckets toward once-a-month, the step before dormancy. The core is loyal; the middle is hollowing.Target save/reorder plays at the 3× → 1× slide specifically, where the mass is actually moving — not at the average, which shows none of this.
Frequency levers (subsidy)Low absorbs 85% of its orders as subsidised (£1,150/mo, ~£43/reseller) plus the most contact, yet costs ~£288 per promotion up a band vs Medium's £75 — nearly 4× less efficient.Cash doesn't convert the least-engaged; at the bottom the barrier is intent, not price, so the discount is spent holding Low in place rather than lifting it.Push Medium → High where spend converts; on Low, switch to a non-cash play (range, onboarding) or accept it as a served floor rather than a growth target.
Base movementLow's net growth is entirely resellers demoted down from Medium (1–2/wk); new acquisition (~3/wk) is offset by churn and promotions. Upward promotions (Low→Med→High) run at just ~1/wk, and High bleeds to Medium faster than it refills — NRR sits at 94%.The washing machine spins downward — more resellers slide down a band each week than climb one, so the base drifts toward once-a-month even as acquisition holds up.Prioritise upward plays (Medium→High, Low→Medium) and stem the High→Medium demotion; acquisition isn't the lever here, holding frequency is.
Engagement by tenureThe 6+ month cohort is the deepest (2.4 orders, £505) but has the highest contracting share (34%) — the best accounts are slipping fastest.Maturity plateau or unmet range/price expectations; likely competitor encroachment on the most valuable resellers.Account-manage the top-tenure cohort directly — they are the most expensive to replace and the clearest current risk.

Active base — headcount vs depth

This week. The two dimensions have split apart. Headcount keeps climbing (42 → 54) while revenue per reseller keeps falling (£520 → £440). We're adding resellers faster than we're losing value per head, so the top line holds — but the base is getting wider and shallower, and the shallowness is the risk. · AI stub

Bar Chart
Catalog Error: Table with name base_engagement_kpi does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 11: from demo.base_engagement_kpi order by week_start
              ^

Order cadence

This week. Regulars are ordering less often — cadence has eased from 2.4 to 2.0 orders a month, now under the 2.2 target. No one has churned; they're just coming back less. · AI stub

Line Chart
Catalog Error: Table with name base_engagement_kpi does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 11: from demo.base_engagement_kpi order by week_start
              ^

Order frequency — where the average hides the drift

This week. The flat 2.0 average is hiding a migration. The once-a-month band has ballooned from 10 to 27 resellers — half the base now orders just once a month — while the 3×/month band has cliffed, halving from 12 to 6. The 4+/month core holds steady at 9, so the loyal top is intact; it's the middle that's hollowing out. · AI stub

Bar Chart
Catalog Error: Table with name base_engagement_frequency does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 2: ... (select week_start::date as week_start, bucket, count from demo.base_engagement_frequency order by bucket_order, week_...
                                                                       ^

Base movement — the washing machine by band

This week. The machine is spinning the wrong way. Low is growing from decay, not acquisition — new sign-ups (~3/wk, blue) are offset by churn and the odd promotion, and the net growth is entirely resellers demoted down from Medium (red). Meanwhile upward promotions — Low → Medium → High (green) — run at just ~1/week, and High is bleeding to Medium faster than Medium refills it. More resellers slide down a band each week than climb one; that downward churn, not headcount, is the story. · AI stub

Bar Chart
Catalog Error: Table with name base_engagement_flow does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 2: ... FROM (select week_start::date as week_start, flow, value from demo.base_engagement_flow where bucket = 'High' order by...
                                                                          ^
Bar Chart
Catalog Error: Table with name base_engagement_flow does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 2: ... FROM (select week_start::date as week_start, flow, value from demo.base_engagement_flow where bucket = 'Medium' order...
                                                                          ^
Bar Chart
Catalog Error: Table with name base_engagement_flow does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 2: ... FROM (select week_start::date as week_start, flow, value from demo.base_engagement_flow where bucket = 'Low' order by...
                                                                          ^

Driving frequency — the subsidy lever

This month. The discount is concentrated at the bottom: 85% of Low's orders are subsidised — £1,150, ~£43 a reseller — against just 8% of High's. We're paying hardest to keep the least-engaged band ordering at all. · AI stub

Data Table
Catalog Error: Table with name base_engagement_subsidy does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 6: from demo.base_engagement_subsidy order by band_order
             ^

Is the subsidy working?

This month. The spend converts worst exactly where it's heaviest. Low costs ~£288 per promotion up a band; Medium just £75 — nearly 4× more efficient — despite Medium getting a quarter of the cash and half the contact. · AI stub

Data Table
Catalog Error: Table with name base_engagement_subsidy does not exist!
Did you mean "pg_catalog.pg_prepared_statements"?

LINE 5: from demo.base_engagement_subsidy order by band_order
             ^

Engagement by tenure

This week. Maturity deepens engagement as it should — 6+ month resellers order more (2.4) and spend more (£505) than newcomers. But that same cohort has the highest contracting share (34%): our best accounts are slipping fastest. The risk isn't at the new end of the base, it's at the valuable end. · AI stub

Data Table
Catalog Error: Table with name base_engagement_tenure does not exist!
Did you mean "main.sqlite_master"?

LINE 3: from demo.base_engagement_tenure order by tenure_order
             ^

← New & activating  ·  Churn & dormancy →