Kernconcepten

Wallets & Punten

Elke klant heeft één wallet: daarin staat het saldo aan loyaliteitspunten. Achter die wallet zit een append-only grootboek: elke puntbeweging komt erbij, en er verdwijnt nooit iets. Zo kun je van elk saldo nagaan waar het vandaan komt.


Walletoverzicht

VeldBeschrijving
idUniek wallet-ID
customer_idDe klant bij wie deze wallet hoort
balanceHuidig puntensaldo (integer)
expiring_soonPunten die binnenkort vervallen

Zodra je een klant registreert, maakt Puntjes de wallet aan. Elke klant heeft er precies één.


Grootboekregels

Het grootboek is een onveranderlijk, append-only register van elke puntbeweging. Elke grootboekregel bevat:

VeldBeschrijving
typeHet soort beweging: earn, adjust, redeem of expire
amountSigned integer: positief voor bijschrijvingen, negatief voor afschrijvingen
running_balanceHet walletsaldo na deze regel
reasonToelichting in gewone taal
causer_typeHet soort veroorzaker: een transactie, een admin-gebruiker of een API-client
causer_idHet ID van die veroorzaker
transaction_idDe gekoppelde transactie (bij earn-regels)
created_atTijdstempel van de regel

Soorten grootboekregels

TypeRichtingVeroorzaakt door
earnPositiefEr is een transactie ingediend. De punten volgen uit je verdienregels
adjustPositief of negatiefEen admin of de API past het saldo met de hand aan
redeemNegatiefDe klant wisselt een beloning in
expireNegatiefPunten vervallen volgens het vervalbeleid dat je instelt

Onveranderlijk grootboek

Een grootboekregel wordt nooit bijgewerkt of verwijderd. Het running_balance-veld op elke regel maakt de hele reeks controleerbaar. Corrigeer een fout dus met een nieuwe aanpassing in het grootboek, en niet door een bestaande regel te wijzigen.


Puntbatches en vervaltermijn

Elke keer dat een klant punten spaart of je met de hand punten bijtelt, komt er een batch bij. Staat het vervallen van punten aan en hoort het bij je plan, dan krijgt die batch een vervaldatum. Anders vervalt ze nooit. Zet je het vervallen uit, of ga je naar een plan zonder vervallen, dan geldt dat alleen voor nieuwe batches: een batch die al een vervaldatum heeft, houdt die en vervalt nog op die dag. Elke batch legt vast:

VeldBeschrijving
amountDe punten in deze batch
consumedWat er al uit deze batch is gebruikt
expires_atWanneer de rest van deze batch vervalt

Bij een inwisseling, en als je met de hand punten afhaalt, gaan de punten eerst uit de batch die het eerst vervalt, en een batch zonder vervaldatum komt als laatste aan de beurt. Dat is niet hetzelfde als de volgorde waarin je klant ze spaarde: je kunt expiration_months aanpassen of het vervallen uitzetten wanneer je wil, dus een batch van vroeger kan later vervallen dan een batch van daarna. Door eerst de punten te gebruiken die het snelst vervallen, verliest je klant geen punten die de inwisseling had kunnen opgebruiken. Vervalt een batch toch, dan gaan de punten die er nog in zitten van de wallet af, als een expire-regel in het grootboek.

Hoe punten vervallen

  1. Je zet het vervallen van punten aan en stelt expiration_months in (bv. 12 maanden); het vervallen moet bij je plan horen
  2. Elke keer dat een klant punten verdient of je er met de hand bijtelt terwijl het vervallen aanstaat en bij je plan hoort, komt er een batch bij met expires_at op die datum plus dat aantal maanden
  3. Wisselt een klant punten in of haal je met de hand punten af, dan gaat de batch die het eerst vervalt er als eerste af. Zo haalt het vervallen alleen punten weg die de klant nog heeft
  4. Een achtergrondtaak kijkt regelmatig welke batches vervallen zijn en boekt die af als expire

Handmatige aanpassingen

Een beheerder past een walletsaldo met de hand aan in het adminportaal of via de API. Zo'n aanpassing levert een nieuwe grootboekregel op met type adjust:

POST /api/v1/customers/{customer}/wallet/adjust
{
    "amount": 500,
    "reason": "Compensatie voor een serviceprobleem",
    "idempotency_key": "goodwill-2024-0042"
}

Een positief bedrag telt punten bij in een nieuwe batch, die net als gespaarde punten vervalt. Een negatief bedrag haalt ze eraf, uit de batch die het eerst vervalt. Dankzij de idempotency_key kun je de aanroep gerust opnieuw sturen: dezelfde sleutel voor dezelfde klant levert de oorspronkelijke grootboekregel op, en verplaatst het saldo geen tweede keer.

Zie Wallet-endpoints voor de volledige API-referentie.

Vorige
Klanten