Points ledger
Every points event across the network, oldest row never touched. This is the source of truth for every balance in the system.
Points earned
420
$42.00 issued
Points redeemed
0
$0.00 discounted
Outstanding
420
$42.00 of liability
Ledger rows
1
Append-only — nothing is ever edited
1 event
Running balance is the customer's balance immediately after that row.
| Timestamp | Customer | Store | Points | Type | Reason | Reference | Running balance |
|---|---|---|---|---|---|---|---|
| Aug 26, 2026, 1:59 PM | +12025587356 janesmith | — | +420 $42.00 | ONLINE_EARN | — | ORD-9898189371 | 420 |
Reading this table
There is no balance column anywhere in the database. The Running balance figure is derived — the engine computes it with SUM(points_change) OVER (PARTITION BY customer_id ORDER BY id) — so it is the customer’s balance immediately after that event, not a total of the rows you happen to be looking at. Filtering by store or type changes which rows appear; it never changes a running balance.
Corrections are new rows. A refund inserts a negative REFUND entry rather than deleting the original earn, and an admin adjustment inserts an ADJUSTMENT row with a mandatory reason. Database triggers reject any UPDATE or DELETE against this table.