Contract integrity for loyalty programmes
You know what your contract says. You have never seen what it did.
Your points engine implements the agreement. Nothing checks it against the agreement. We turn the contract into rules, run them against every transaction, and price every clause.
The problem
The rules live in a document. The math lives in code.
Nobody compares the two, line by line. Commercial signs the contract. A vendor builds the rules. Finance pays the invoice. One setup mistake then repeats on every transaction until somebody notices.
The annual audit checks a few hundred. We check all of them.
A misimplemented rule is not an error — it is a consistent difference applied to every transaction it touches. Sampling cannot find it.
Where the complexity lives
The difficulty is not the arithmetic. It is the count.
Every rate, cap, tier and exclusion below is contractually defined — and implemented by hand, once, years ago.
Card issuers
One agreement, deep clause structure. Caps, tier multipliers, promotional overlays, funding rates.
1 partner × 60+ clausesAirline and hotel
One currency sold to many partners at many prices, with liability carried on your balance sheet.
1 currency × 20+ rate cardsCoalition
Every partner both issues and redeems. Obligations run in both directions and net against each other.
12 partners × 132 positionsProgramme platforms
Operators running the same infrastructure across many bank programmes, each configured from its own documents.
1 platform × 20+ programsBuilt for any programme that awards a currency under written terms — issuers, airlines, hotels, coalitions, retail — and the platforms that operate them. Wherever a contract sets the rate and a system does the issuing, the two can diverge.
What it is worth
A miscoded rule is a recurring cost that runs until someone finds it.
Every point issued beyond what the governing document requires is a direct cost — an overpayment on a partner invoice, or an over-award against your own published terms. The exposure is a function of portfolio size and the size of the error, and it accrues every month until it is corrected.
Arithmetic, not a claim. The relevant question is which column a programme is in, and no one currently measures it.
The other side of the ledger
Breakage is not in the contract. It is management’s estimate of the points that will never be redeemed — revised every period, with revisions running through current-period revenue. It is produced by a model rather than derived from the redemption population it describes, which means an error is not a one-off misstatement. It corrects into earnings.
Movement in the liability for a 1, 3 or 5 percentage point error in the assumed redemption rate, at an assumed 80% redemption. Arithmetic again — but the assumption is the programme’s own, and the population that would settle it is already in the ledger.
What we build
One engagement. Your contract, made executable.
Conformance and drift
Your contract becomes executable. Then every transaction can be checked against it, every clause priced, and any change tested before it ships.
- Full population — no sampling
- Every variance traced to its clause
- Monthly files. No integration
Who does this
Built by a controls practitioner, not a loyalty vendor.
The system that issues the points cannot be the one that checks them. Thirty years in risk and control at global banks — counterparty credit, regulatory capital, algorithmic trading controls. The discipline is the same one applied here: a published obligation, a system that implements it, and evidence that the two agree.
- Independent of
- Every loyalty platform
- Method
- Full population, no sampling
- Findings validated
- With your team, before issue
The first engagement
One document. Four to six weeks.
Send one live agreement, or one programme’s published terms, with the records for the period it governs. You get the rederivation and the divergence read.
- You provide
- One contract, under NDA
- And
- Transaction files
- Duration
- Four to six weeks
- Integration
- None
- Live access
- None
- Your engineering time
- None