Cashback Expiration Automation: A Promise the Database Never Actually Knew About

A promised expiration date needs a place to actually live
Telling a customer their cashback carries a validity period is a real, meaningful commercial commitment — and honoring it requires the underlying system to be able to answer, precisely and consistently, exactly how much of a given balance is set to expire, and on what date. A system with no column recording an expiration date, no process that ever checks one, and no distinct event type representing an expiration when it happens cannot honor that commitment even if every other part of the product intends to — the promise exists in commercial material and nowhere in the data model built to fulfill it.
How the underlying problem shows up before you fix it
A product feature described in commercial or customer-facing material (here, a cashback validity period) has no corresponding column, scheduled process, or distinct record type anywhere in the underlying database — the promise exists only in the product's own external description.
A balance made up of credits earned at different times, under different rules, has no deterministic order in which those individual credits are considered "used up" as debits are applied — without an explicit order, "how much of what I have left is about to expire" has no single correct answer.
A deadline computed from a fixed number of days can silently depend on WHICH TIME ZONE the calculation happens to run in — a value with no explicit, stored time zone can shift by hours depending on the connection or session that computed it, meaning the identical credit could appear to expire at different real-world instants depending on who or what checked it.
A running balance kept as a single stored total, updated incrementally by every transaction, has no independent check confirming that stored total still matches what the FULL transaction history would derive on its own — the two values can silently drift apart with nothing surfacing the difference.
A financial invariant that should always hold (here: the sum of every credit batch's own remaining value should exactly equal the customer's available balance) is not encoded anywhere as an explicit, checkable rule — it exists only as an assumption nobody is actively verifying.
Why a promise can outrun the data model built to keep it
A commercial commitment like "your cashback expires after a set period" is often written and communicated well before the underlying system is built out to actually track and enforce it — the promise is simple to state, while implementing it correctly requires deciding, and encoding, a genuinely non-trivial set of rules: which specific credits are consumed first when a customer redeems, how a deadline is computed consistently regardless of time zone, and how to keep a fast, incrementally-updated balance provably consistent with the full transaction history behind it. Without deliberately building each of those pieces, a validity-period promise can persist in customer-facing material for a long time with nothing behind it actually capable of expiring anything.
How Centriu Loop built an expiration mechanism the database can actually enforce
Centriu Loop's own cashback ledger previously had no expiration mechanism of any kind. The fix introduces two new ledger movement types — one representing an expiration event, one representing a chargeback/reversal — and a full batch ("lot") model built specifically to make expiration deterministic.
Every transaction that creates usable credit becomes its own batch: a purchase-earned credit, a positive manual adjustment, or a positive chargeback correction. Each batch that originates from an ordinary purchase reward carries its own expiration timestamp, computed from a validity period configured per organization (zero days means no expiration at all, preserving today's behavior exactly for any organization that has not opted into the feature). That computation deliberately stores each organization's own configured time zone rather than relying on whichever database session happens to compute it — a credit's deadline is now a fixed, specific instant regardless of who or what checks it, closing a gap the fix's own testing caught specifically at the edge of a calendar day, where the date matched but the exact instant did not.
Consumption — a redemption, an expiration event, or a negative adjustment or chargeback — is applied against those batches strictly in order of expiration date, soonest first, with creation date and the batch's own identifier as tie-breakers. That ordering is deliberately the one that favors the customer: whatever credit is closest to being lost is always drawn down before credit with more time remaining, so a customer with a mix of expiring and non-expiring balance never loses value earlier than the actual deadline requires. A dedicated database view computes exactly how much of each individual batch remains, by combining that same ordering with the customer's own total consumption to date — turning "how much is about to expire, and when" into a single deterministic calculation rather than an estimate.
A second view independently re-derives a customer's ENTIRE balance directly from the full transaction history — recalculating from scratch, rather than trusting any running total — and a third, dedicated reconciliation view compares that freshly-derived balance against the separate, incrementally-updated total actually stored for fast lookups, on every customer, continuously. Any divergence between the two — which should mathematically never happen if every part of the ledger is working correctly — surfaces immediately as a non-zero difference, rather than silently accumulating as an unnoticed accounting drift. A dedicated regression suite proves the underlying invariant directly: the sum of every batch's own remaining value, minus total FIFO consumption, always equals the customer's own available balance.
What is actually built today
Centriu Loop's ledger now supports a genuine expiration mechanism: every credit-creating transaction becomes its own dated batch, with an expiration timestamp computed from a per-organization validity period and a per-organization time zone stored explicitly, not inferred from whichever session runs the calculation.
Consumption is applied strictly first-in-first-out by expiration date — the batch expiring soonest is always drawn down first, the ordering that favors the customer over one based purely on creation order.
A dedicated database view computes exactly how much of any individual batch remains unconsumed at any moment, making a customer's own upcoming expirations a precise, calculable figure.
A separate reconciliation view continuously re-derives a customer's entire balance directly from the full transaction history and compares it against the running total actually stored, surfacing any divergence between the two immediately.
An organization with a validity period of zero days experiences no behavior change at all — the entire mechanism is opt-in per organization, preserving prior behavior exactly for anyone not using it.
Cashback with a due date the ledger could never actually see (illustrative framing of the actual confirmed mechanism)
Before the fix, a customer told their cashback would expire after a set period had no corresponding record anywhere confirming when, or even whether, that would actually happen — the database had no column for it and no process that would ever act on one. After the fix, every credit the customer earns is its own dated batch with a specific, time-zone-correct expiration instant, and a redemption always draws down the batch closest to expiring first — the exact behavior a stated validity period is supposed to guarantee, now genuinely enforced rather than only promised.
What changes operationally
Centriu Loop's cashback ledger now enforces a genuine, deterministic expiration mechanism — FIFO consumption by expiration date, a time-zone-correct deadline per credit, and a continuous reconciliation check between the ledger's own derived and stored balances — closing a gap where a validity-period promise made in commercial material had no corresponding enforcement anywhere in the database.
When this is not the right fit
This automation covers specifically Centriu Loop's own cashback expiration and balance-reconciliation mechanism. It is a distinct mechanism from this pillar's separate page on the ledger's own append-only write protection, which concerns whether a ledger entry can be altered or deleted after the fact — a different, foundational guarantee this expiration mechanism is built on top of, covered on its own page.
A stated policy vs. a database-enforced, self-checking mechanism
Describing a validity period in commercial material is the simplest way to communicate a policy, and it costs nothing to write. It delivers nothing on its own unless the underlying system can actually compute, per credit, exactly when it expires, and consume balance in the order that honors that deadline. Building an explicit batch model with a deterministic consumption order, plus a continuous, automatic check that the ledger's own two ways of computing a balance always agree, is the only version of the two that turns a stated policy into something the database itself can be trusted to enforce and verify, rather than something a team has to hope is true.
Related systems
Main system: Centriu Loop.
What it does NOT do
- Does not change how much cashback a purchase earns, or any other economic rule governing credit — the fix builds only the expiration and reconciliation mechanism on top of the ledger's own existing movement types.
- Does not force expiration onto any organization — a validity period of zero days (the default) preserves today's no-expiration behavior exactly, and the entire mechanism only activates for an organization that configures a real validity period.
- Does not overlap with this pillar's separate page on the ledger's own append-only write protection — that page concerns whether an entry can be altered or deleted; this page concerns how expiration and balance reconciliation work once the ledger is already protected.
- Does not retroactively assign an expiration date to credit recorded before this fix shipped — the mechanism applies going forward, to credit created after the batch model exists.
- Does not extend this same batch/FIFO-expiration model to any other module in Centriu's other systems — this fix is specific to Loop's own cashback ledger.
Security and governance
Centriu Loop's cashback ledger now enforces a deterministic, per-organization expiration mechanism with a time-zone-correct deadline per credit, plus a continuous reconciliation check between its own derived and stored balances — surfacing any accounting divergence immediately rather than letting it accumulate silently. Any personal or financial data referenced in ledger records remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on data handling lives at /governanca and /iso.
Pricing and contracting
Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
Does this change how much cashback a customer earns per purchase?
No — the fix adds an expiration and reconciliation mechanism on top of the ledger's existing movement types; the economic rule determining how much cashback a purchase earns is unchanged.
What happens to an organization that has not configured a validity period?
Nothing changes for them — a validity period of zero days is the default and preserves the exact prior no-expiration behavior; the entire mechanism is opt-in per organization.
Why is expiration consumed first-in-first-out by EXPIRATION date rather than by when the credit was earned?
Because that is the order that favors the customer — it always draws down whichever credit is closest to being lost before touching credit with more time remaining, rather than an arbitrary order that could cause a customer to lose value earlier than necessary.
How is a silent balance discrepancy actually caught?
A dedicated view independently re-derives a customer's entire balance directly from the full transaction history and continuously compares it against the separate, incrementally-updated total actually stored — any difference between the two surfaces immediately as a non-zero value.
Is this the same finding as the ledger append-only page on this site?
No — that page concerns whether a ledger entry can be altered or deleted after being recorded. This page concerns how expiration and balance reconciliation work once the ledger is already protected that way. Different, complementary mechanisms.
What does Centriu Loop cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Loop makes cashback expiration real, not just a promise
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.
