Interactive demo · synthetic dataEvery record on this page is fabricated.

Loyalty Program Cost Analysis

A cohort where redeeming provably does nothing, the dashboard’s claim appearing in it anyway, and the design that removes it.

The production code behind this demo is my own work — analysis and recommendation, reproduced the vendor's figures from raw data, built the daily sync, wrote the vendor letter setting the study terms.

Read about the system

A cohort with no program effect in it

Generated in your browser from a fixed seed. Each member gets a hidden value level; that level drives how much they bought before, how many points they hold, how likely they are to redeem, and how much they spend afterwards. Redeeming itself is wired to nothing. Whatever advantage the redeemers appear to have on this page is confounding, because there is no other kind of advantage available to them.

MEMBERS

26,500

HOLD NO POINTS

14,390

54.3%

CAN REDEEM

4,391

16.6%

REDEEMED

1,382

5.2%

WHERE THE REDEEMERS ARE, BY PRE-PERIOD SPEND
PRE-PERIOD SPENDMEMBERSREDEEMEDMEAN POST-PERIOD REVENUE
$0 — never bought14,3900$51
Under $2506,8920$55
$250 – $9994,251833$162
$1,000 or more967549$464

The claim, and what survives a control group

Every row below is computed by the same function. The only thing that changes is which members are treated as comparable to which.

TRUE EFFECT BUILT INTO THE DATA

This is the honesty check. Raise it and the generator really does make redeemers spend more afterwards. The matched estimates should then track the true value — 1.00× as set — while the headline barely notices the difference.

1Redeemers against everyone else

4.30×

One group against the other. No control for anything.

95% INTERVAL
4.07× – 4.53×
REDEEMERS COMPARED
1,382
CONTROLS
25,118
COMPARISON CELLS
1

The interval misses the true value of 1.00×, high — confounding this comparison did not remove.

What the program costs, against what it is billed at

The licence arrives as an invoice, so it is the number everybody knows. The discount arrives as revenue that never showed up, so it is the number nobody sees. Both are money. Only one of them is on a renewal form.

PLATFORM LICENCE — INVOICED
$7,800 14.4% of the true cost
DISCOUNT HANDED BACK — OFF MARGIN
$46,335 3,089 redemptions × $15
REWARD FLOOR — POINTS PER REWARD

EARNING RULE

Annual run rate $54,135 — the program as configured.

“Only a few percent redeem”

A participation rate is a division, and the argument is always about the bottom half of it. 14,390 of these members hold zero points. They cannot redeem — not rarely, not reluctantly; there is no mechanism by which they could. Counting them answers a question nobody asked.

5.2%

1,382 ÷ 26,500 ENROLLED MEMBERS

Neither number is wrong. They answer different questions, and only one of them is the question “is anybody using this”. A program whose problem is that half its members never bought anything has an acquisition problem, and no change to the rewards will touch it.

The four terms, sent before any of this was run

The vendor offered to run a before-and-after study. These four terms went back first, in writing, while nobody had seen a result. This panel has no controls and that is deliberate: a study design a visitor can adjust after seeing the outcome is the exact failure the terms exist to prevent.

  1. TERM 1

    Match the control group on pre-period order count and spend — not redeemer against non-redeemer.

    Redeeming requires points, and points require prior spending. Comparing redeemers with everyone else compares heavy buyers with light ones and calls the difference a program effect.

  2. TERM 2

    Equal window lengths either side of each member's first redemption.

    Unequal windows let the measured period be chosen after the fact. Anchoring on each member's own first redemption also stops a calendar quarter's seasonality from being read as an effect.

  3. TERM 3

    Report revenue per customer, not order counts.

    A reward is a discount, and a discount reliably splits baskets. Order counts can rise while revenue per customer falls, and only one of those two numbers is the business question.

  4. TERM 4

    Publish the cohort definitions and the group sizes.

    Every claim above depends on who ended up in which group. A result whose denominators are not stated cannot be checked by anybody, including the person who produced it.

The daily sync that produced the data

Five stages, no third-party dependencies, one cron entry. Open a stage for what it does and whether it could honestly be shown here.

  1. Customers, orders and points activity, each walked page by page with retry and backoff on 429, 500, 502, 503 and 504, and a deliberate pause between pages so a background job never becomes the reason a storefront's API budget runs out. Standard library only — no HTTP client, no dataframe, nothing to keep patched.

    Not runnable here, and not mocked here. It is an authenticated call to a third party's production API.

What is established, what runs here, and what nobody knows

The three are not interchangeable, and a page that ran a convincing simulation without saying so would be inviting you to read the third as the first.

  • ESTABLISHED

    The vendor's own headline figures were reproducible from raw data.

    In the real project, independently pulled records reproduced the vendor's redemption counts, discount total and redeeming-customer count closely enough that the data was never in dispute. Only the interpretation was. Those figures are not shown here.

  • ESTABLISHED

    A redeemer-versus-non-redeemer comparison is confounded by prior spend.

    This is a property of the comparison, not of any one program: eligibility to redeem is caused by prior spending. It holds wherever points are earned by buying.

  • RUNS HERE

    Matching on pre-period behaviour collapses the advantage on THIS page's data.

    Computed live, in your browser, on a cohort generated with no treatment effect at all. It demonstrates that the method works. It is not evidence about the real program.

  • RUNS HERE

    The licence is a small fraction of what a loyalty program costs.

    The arithmetic on this page is live and the structure is the real one — an invoiced licence plus discount handed back off margin. The dollar amounts are invented.

  • ESTABLISHED

    Participation rates quoted over all members are computed over a base that cannot participate.

    Members holding zero points cannot redeem under any circumstances. Whether they belong in the denominator is a question with an answer, and it is no.

  • NOT KNOWN

    The real program does or does not cause incremental revenue.

    Nothing observational settles this, including everything above. That is why the recommendation was a 90-day holdout — withhold the program from a random tenth of members and measure. Until that runs, the honest answer is that nobody knows.

  • DESCRIBED ONLY

    The daily sync, the platform API and the generated dashboard.

    Described, not executed. Every stage of it is an authenticated call to a third party or a write to a disk, and neither exists on this page.

Why the real program is not simulated here

A page that replayed the actual program’s members, redemptions and revenue would be the most persuasive version of this and the least honest. Those figures, together, describe one retailer’s unit economics and one vendor’s commercial terms; publishing them re-synthesised would be a guess dressed as a record, and publishing them unchanged would be someone else’s confidential data on a portfolio.

There is a stronger reason. The finding was that an observational comparison cannot answer this question — so a demo that showed the real numbers being compared observationally would be reproducing the error the project exists to correct. A cohort built with a known answer can be checked against that answer. Real data cannot, which is the entire argument for running the holdout.

What is real, and what is simulated

Runs in your browser

  • The seeded cohort generator — 26,500 fictional members, built so that redeeming has no causal effect on later spending at all
  • The matched-cohort estimator, stratified and weighted onto the redeemers, with a 95% interval on every ratio
  • The cost decomposition: an invoiced licence against discount handed back off margin
  • The denominator recomputation once members who hold no points, and so cannot redeem, are removed from the base

This ports no production code, because the deliverable was a decision rather than a service. What is reproduced is the method — and it is checkable: put a real effect into the generator with the control below, and the same estimator recovers it. 32 tests assert both directions.

Simulated

  • The loyalty platform's API, the daily sync, the Shopify cross-check and the generated dashboard — described stage by stage, never mocked
  • Every figure. The real program's member count, licence, redemption totals, addressable base and revenue claims appear nowhere on this page, in any form