Platform
Managing Customers
The Customers section of the admin portal lets you manage the people enrolled in your loyalty program: their profiles, identifiers, point balances, and redemption history.
Customers list
Navigate to Customers in the sidebar to see all your customers.
Search and filters
- Search: finds a customer by first name, last name, email or phone, or by part of a card code
from 4 characters, and the list follows as soon as you pause your typing.
- A small typo in a name is fine, and accents, apostrophes, dashes and spaces do not matter: "Pieters" finds Peeters, "Cedric" finds Cédric and "Desmet" finds De Smet.
- A card code ignores capitals, spaces, dashes and dots, so "abcd 1234" finds ABCD1234. One wrong character finds nothing.
- A phone number ignores spaces and signs, and part of the number is enough. Type 8 digits or more and only the last 8 count, so "0470 12 34 56" also finds +32 470 12 34 56.
- Type a full name and every word has to match. "Jan Peeters" finds Jan Peeters, not Jan Janssens. A word under 3 characters counts only when no word is longer, so "Jan P" finds every Jan.
- While you search, the best match comes first: the customer whose whole card code you typed, then a whole name, email or phone number, then the customers whose name, email, phone or card code holds what you typed, and last the names that only look alike. Click a column header to sort by that column instead. A search with no word of 3 characters has nothing to rank, so the newest customers come first.
- The search box in the top bar finds the same customers, in the same order.
- Status filter: show Active, Deactivated or All statuses
Table columns
The list displays name, email, phone, primary identifier (with type badge), status, and creation date. Click Name, Email or Created to sort; click again to reverse.
Names sort like a phone book. The last name comes first, and capitals and accents do not move a name, so "de Smet" stands among the D's and "Émile" among the E's. A customer without a last name, or without an email when you sort by email, goes to the bottom in both directions.
Creating a customer
Click Create to open the registration form.
Profile fields
| Field | Required | Description |
|---|---|---|
| First Name | No | Customer's first name |
| Last Name | No | Customer's last name |
| No | Must be unique within your vendor | |
| Phone | No | Phone number |
| Date of Birth | No | Used for birthday promotions |
| Locale | No | Preferred language (Nederlands or English) |
Loyalty card
The form has a single Loyalty card section. You have two options:
- Leave it blank: Puntjes issues a new card code when you save. Use this when the customer is not being handed a physical card.
- Pick an unassigned card: choose from the cards you have already generated, or scan the code on the physical card you are giving the customer.
There is no identifier type to choose and no primary flag to set: the card you assign here
automatically becomes the one the customer scans. Their wallet pass, the QR in the pass email
and the API's loyalty_card_code all follow it, and if they already saved the pass on their
phone it is updated to show the new code. Any card they held before stays active and keeps
working when scanned. Assigning a replacement never bricks the old one.
If a scanned code is rejected, the message tells you which of the two things went wrong: the code does not match any unassigned card of yours (rescan, or leave the field blank), or the card was already given to another customer.
The email identifier is created for you
You do not add an email identifier by hand. Fill in the Email profile field and Puntjes creates the matching identifier, then keeps it in step with every later change to the address.
Customer page
Click a customer's name in the list to open their page. An admin can do everything described below. A viewer reads the whole page, downloads the customer's data, prints a card and gets the wallet pass for Apple Wallet or Google Wallet, but sees none of the buttons that change the customer.
A platform operator opens a customer page only from inside the shop, after View as vendor. Outside a shop, every customer page answers "not found".
Header
The top of the page shows the customer's name and a status badge: Active, Deactivated or Anonymized. The line under the name says since when they are a customer, and the date of their last purchase, with the branch when the till sent one.
The buttons on the right:
- Add or remove points: type a positive Amount to add points or a negative one to remove them, and a Reason. The reason is required and stays in the point history.
- Give a reward: see Give a reward.
- Actions: a menu with Download this customer's data, Merge customer, Deactivate customer and Anonymize. See Customer actions.
On a narrow screen, Add or remove points and Give a reward move into the Actions menu. The menu shows only what applies: no Deactivate customer for a customer who is already deactivated. For an anonymized customer, the menu keeps only Download this customer's data. See Anonymize for what else that page leaves out.
Balance
The Balance card shows the points the customer has now. Under the number, up to three lines:
- Can redeem now: the rewards the balance already pays for. The card names two and counts the rest as "and 3 more".
- The cheapest reward the balance does not reach yet, with the points still missing.
- The points that expire first, and the day they expire. This line is missing when none of the points has an end date.
Vouchers
Valid vouchers counts the vouchers this customer can still use today, and lists up to three of them: the gift, the code and the end date, the voucher that ends first on top. A voucher that ends within 7 days says so: "Expires today", "Expires tomorrow" or "5 days left".
Show all 12 vouchers opens a panel with every voucher of this customer. Show filters it on Valid, Used, Expired or All, each with its count. The panel loads 50 vouchers at a time; Show more loads the next 50.
Use voucher, in the card and in the panel, spends a voucher. Type the code the customer shows you and confirm. There is no separate preview step, so open the dialog when you are ready to hand the gift over.
A voucher from a campaign limited to branches needs one of those branches named, and the picker offers only the ones that voucher allows. If the code turns out to be limited after you submit (a voucher issued while this page was already open, for instance), the dialog says so and asks for a branch. The voucher is not spent in that case. See Managing Campaigns for how the limit is set.
Visits and favourite items
Three cards show how this customer buys from you. A customer with no purchase yet gets one card, No visits yet, instead.
- Visits per month has 12 bars, the oldest month on the left. They cover this month so far and the 11 months before it. Every purchase counts as a visit, so two purchases on one day count twice. Point at a bar, or tap it, to read its number.
- How often this customer comes looks at the days the customer bought something, and at how long they usually wait between two of those days. It says On the usual rhythm., Later than usual. once the wait is more than one and a half times as long as usual, or Not back for a long time. once the wait is more than three times as long as usual. It needs purchases on 3 different days; before that it says Not enough visits yet. One long holiday does not change what "usual" means, because the card takes the middle value of the last waits, not the average. Under it: how much the customer spent since their first purchase, and how much a visit on average. Those two figures count every purchase, not only the last 12 months.
- Bought most, last 12 months names the three items the customer bought most, by quantity, over the same 12 months as the bars. Only purchases for which your till sent the items count. Items with the same product code count together, and so do items with the same name and no code.
Loyalty cards of this customer
Loyalty cards lists the customer's cards, with the card number, Active or Switched off, and the day the card was added. Main card marks the card the customer scans, which their wallet pass shows. The line at the top says how many cards are active, out of 5.
- Add loyalty card links one of your unassigned cards to the customer. Leave the field empty and Puntjes makes a new card number instead. The new card becomes the main card. The button is off once the customer has 5 active cards.
- Print card downloads a CSV file with that one card, for your print shop. Only an active card has it. Read Printing loyalty cards before you reprint a card.
- Card lost switches that card off after you confirm, so the till refuses its code. If it was the main card, the newest active card becomes the main card. Puntjes refuses when the card is the only way the till finds this customer: add a new card first. Card lost here gives the customer no new card. Use Add loyalty card for that, or Card lost on the Loyalty cards page, which does both in one step.
Email and phone the till can also use opens the customer's other identifiers. The email row is Managed automatically: it follows the email address in the profile, so change that address with Edit on the Profile card. A phone number has a Deactivate button.
History
History has four tabs, each with its count: Transactions, Point history, Redemptions and Received gifts. On a narrow screen a Show list replaces the tabs.
- Transactions: every purchase, 20 a page, with the date, the total, the branch, the items and the points. Show details adds the description, the external reference, the idempotency key and the earn rules that gave the points.
- Point history: every point change (earned, adjustments, redeemed and expired), 20 a page.
- Redemptions: every reward the customer took, 10 a page, with its status (Valid, Used, Expired, Cancelled).
- Received gifts: what campaigns gave this customer.
Cancel reward, in the ... menu of a redemption row, undoes a redemption that is valid or used. The customer gets back the points the redemption took, the reward goes back into your stock, and the code stops working at every till. Use it when you take a reward back, or when you gave it by mistake. You cannot undo a cancel, and you cannot cancel an expired code. A viewer gets no row menu.
Give a reward
Give a reward opens a dialog. Pick a reward and click Redeem Reward to redeem it for the customer. The portal checks that the balance and the stock are enough first.
A reward you give here counts as handed over at once: its status is Used, and no till can verify its code a second time. Give the customer the reward when you redeem it.
The dialog also asks which branch the redemption happened at. For a reward restricted to branches the answer is required, and only that reward's own branches are offered; otherwise it is optional and defaults to none. Vendors with no branches see no such question. See Managing Rewards for how the restriction is set.
Profile
Profile shows the first name, last name, email, phone, date of birth and language. An empty field reads Not given. Under it, the consent line says whether the customer agreed to emails about gifts and offers, and who wrote that down. More details shows the external id and the dates the record was created and last changed.
Edit at the top of the card opens Edit profile: the name, email, phone, date of birth, Customer since and language. Save closes it and the card shows the new values. On a phone, Edit is a pencil icon. Change beside the consent line opens Marketing consent, with the sentence to read out and the switch. Save there changes only the consent; when the switch is where it was, Save changes nothing. A viewer sees neither button, and neither does the page of an anonymized customer or a merged account.
When Puntjes stopped sending email to the customer, a label under the email address says why:
- Email is not arriving: mail to the address came back. Was the mailbox full, or the mail server down, and does it work again? Click Send email again, then Start sending again. If the address itself is wrong, change it with Edit on the Profile card instead: a corrected address needs nothing switched on.
- Marked as spam: the customer marked your email as spam. Switch it back on only when they ask you to. Send email again then asks you to tick that the customer asked for it, and the activity log records that you did it.
A viewer sees the label but not the button.
Wallet pass
Wallet pass shows where the customer's wallet pass is, for Apple Wallet and for Google Wallet:
| State | What it means |
|---|---|
| Not added | The card is not in that wallet, or the customer removed it |
| Card made | Google Wallet only: the card exists, but Google did not report it saved yet |
| In the wallet | Google Wallet: the customer saved the card |
| On 2 devices | Apple Wallet: the card is on that many of the customer's devices |
| Expired | The card no longer works |
Download Apple Wallet Pass downloads the card for Apple Wallet, and Get Google Wallet link opens the link that adds it to Google Wallet. Email pass to customer sends the card to the customer's email address. A viewer does not get that last button.
Merged accounts
When other accounts of this person were merged into this customer, Merged accounts lists them as "Customer #7" with the merge date. Each one links to its closed page. The card shows three; Show all 5 shows the rest.
Marketing consent
Campaign email (a birthday gift, an anniversary reward, a win-back offer) goes only to customers who said yes, and the law asks you to prove they did: GDPR Art. 7(1) puts the burden on you, and Art. XII.13 §4 of the Belgian Code of Economic Law says the sender proves the advertising was asked for. Puntjes records the proof with every yes: the moment, the surface, who wrote it down, and the exact wording the customer heard or saw.
A customer who did not say yes, or who has no email address on file, gets no birthday, anniversary or win-back gift at all, not only no email. A gift for a first purchase or for every nth purchase still reaches them: the points, the free product or the discount are there, with no email about it. Birthday, anniversary and win-back points are mailed only to a customer who does not have the loyalty card in Apple Wallet or Google Wallet, because that card already shows the new points. A free product or a discount is mailed only after a yes. If Puntjes has turned on messages on the loyalty card for your shop, a customer with the card in Apple Wallet or Google Wallet also gets no email about a free product or a discount. Their phone shows a short message about the new voucher instead, and the till shows the voucher when they come in.
What to say at the till or in the webshop
Read out, or show, the sentence in Marketing consent before you switch consent on. On the customer page that is Change beside the consent line; on Create customer it is the Emails card. Today it reads, with your own business name filled in:
May [your business] email you now and then about gifts and offers? You can unsubscribe with the link at the bottom of every email.
The wording version shows under it, and the customer page then reads "Recorded by Anna, wording 2026-09-04". A webshop or till that records consent through the API shows its own sentence and sends its version along, so the record says what that customer saw. Consent must be free, specific and informed: no pre-ticked box, no bundling with something else, nothing hidden.
Existing customers you may email without asking
The Royal Decree of 4 April 2003 lets you email a customer without prior consent when all three hold: you got the address directly from them when they bought something from you, you only email them about similar products or services you sell yourself, and you gave them a free and easy way to object when you collected the address. The Belgian data protection authority reads "similar" narrowly: someone who bought coffee beans does not expect email about your cooking classes. When in doubt, ask for consent. Every campaign email carries an unsubscribe link, which is the opt-out per message the same rules require.
Children
A customer under 13 cannot give this consent alone (Act of 30 July 2018, Art. 7). Puntjes refuses to record consent when the date of birth says the customer is younger than 13, in the portal and through the API, and sends no birthday email to a child even when consent was recorded before this rule existed. The birthday points are still credited.
Importing customers
An import never sets consent by itself. A Piggy export marks each customer as subscribed or
unsubscribed to email about gifts and offers, and the preview counts how many of the customers the import adds
are marked as subscribed. Tick the box on the import page ("Customers marked as subscribed in Piggy
agreed to receive email from ...") only when you can show that with their record in Piggy. The
import then gives consent to those customers only, with the source "an import", your name and
piggy-import-attestation: plus the date of the run where a wording version would go. A customer
marked as unsubscribed, one with no yes or no in the file, and one whose birth date puts them under
13 get no consent whatever the box says. Leave the box unticked and every imported customer stays
unsubscribed until they say yes themselves. The first campaign email an
imported customer receives tells them their details came from your customer list and how to reach
you, as GDPR Art. 14 asks.
The loyalty card email carries the same sentence for every imported customer.
The ITReflex import reads the customer export your till saves in its Export folder (Klanten >
Exporteer naar excel). Every active customer with an email address or a card arrives with their till
number, so the till finds them again, their barcode and card number as loyalty cards, and the
PUNTEN count as their opening balance. A customer marked inactive in the till is left out. A
customer Puntjes already has, with the same till number, email address or card, is skipped, so
uploading the same export twice adds nobody twice. When two customers share an email address, the
first one keeps it; a later one with a card comes in without it, and the preview names the address
it kept.
Consent works the same way, with the till's mailing list in place of Piggy's mark. Puntjes reads
the MAILINGS column, which lists only the addresses that may receive mailings, and gives consent
to a customer only when the address Puntjes stores for them is on that list and you ticked the box
("Customers whose address is on the mailing list in the ITReflex till agreed to receive email from
..."). The grant records itreflex-import-attestation: plus the date of the run. The other email
columns of the export also hold addresses that said no, so Puntjes never reads consent from them.
An export made before the till wrote MAILINGS is refused: update the till and make the export
again.
An import sends no email at all, not even the loyalty card, whatever the setting for new customers says. Ask Puntjes support to send the card: every customer with an email address who does not have it on their phone yet gets one email, imported or not. Anyone who already got the card by email in the last 30 days is skipped.
Unsubscribing
The unsubscribe link in every campaign email, the one-click button mail apps show, and the switch in Marketing consent on the customer page all withdraw consent at once. When the customer is the one who asked, through the link or the button, Puntjes sends them one plain email in your name saying the request is registered, as the Royal Decree asks. Turning the switch off yourself sends nothing, because the customer asked for nothing. Either way the withdrawal is kept on record, so the proof of the stop is as good as the proof of the yes.
Loyalty cards
Navigate to Loyalty cards in the sidebar. This page is where you create the stock of codes that gets printed on physical cards, so you can hand a customer a card before they are registered.
You do not need this page to run a loyalty program. If you never pre-print cards, Puntjes issues a code for every customer automatically and this list simply fills up on its own.
Generating a batch
Click Generate cards, enter how many you need, and confirm. Codes are created immediately and grouped into a batch so you can find them again later.
- Between 1 and 10,000 cards per batch. For a larger print run, generate several batches.
- Generated cards cannot be deleted: generate what the print run actually needs.
- New cards start as Unassigned. They become Assigned when a customer is registered with them.
What each status means
| Status | The card | Works at the till | Can be printed |
|---|---|---|---|
| Unassigned | is in your stock and has no customer yet | can be linked to a new customer | yes |
| Assigned | belongs to a customer | yes | yes, as a reprint |
| Switched off | belonged to a customer and no longer works: lost, deactivated on the customer's page, or the customer was anonymized | no | never again |
| Blocked | has no customer, and you blocked it because it went missing | no, nobody can link it to a customer | no, until you unblock it |
A switched-off card cannot be switched on again. A blocked card can be unblocked.
Downloading the CSV
After you generate a batch, or filter the list on one, a panel offers Download CSV for that batch. The panel says how many cards the file holds: the cards of that batch without a customer. When every card of the batch already has a customer, the panel says so and offers no file. Blocked cards are never in the file, and the panel says so when every card without a customer is blocked.
Export CSV opens a dialog that asks which cards you want to print: One batch, picked from a list, or All cards without a customer. The list shows each batch by date, with the number of its cards that have no customer yet, and the download button says how many cards the file holds. For a batch, the file leaves out the cards a customer already has. To add them, tick Also the N cards that already have a customer, but read Printing loyalty cards first.
The file has two columns, one card per row: code, and customer_name with the full name of the
customer who has the card. For a card without a customer that cell is empty, so every file has the
same two columns and your print shop sets up its template once. The file name says what it holds:
a batch, all cards without a customer, or one card. For a batch, the name
carries the same six characters as the batch label in the list.
You can download ten files a minute. Above that, the page asks you to wait and gives no file.
Print specification
Codes are 8 characters, drawn from uppercase letters and digits only (A-Z, 0-9). There is no lowercase to preserve, so every common symbology works: QR or Data Matrix (the payload is simply the code itself), Code 128, or Code 39 if your printer or scanner requires the older uppercase-only standard.
Ask your print shop for a font that distinguishes 0/O and 1/I, so a code that has to be typed in by hand is not ambiguous.
Printing loyalty cards
Which file you print depends on why you need the card.
- A new batch. Download the file from the panel, or choose the batch under Export CSV. The file holds the cards of that batch that no customer has yet.
- A damaged card the customer hands in. Find the card by its code or by the customer's name, and click the printer icon on its row. The file holds that one card. The customer keeps the same code and the same points. To reprint every card of a batch that customers already have, for example after a misprint, tick the box in the Export CSV dialog, but only when each of those customers hands in the old card.
- A lost card. Do not print its code again. Open the menu next to the card and choose Card lost. In one step this switches the card off, so the till refuses its code, and gives the customer a new card: one from your stock, or a new number Puntjes makes. When you take a card from your stock, the list is already open: scan the new card and it is chosen. You can also choose to give no new card for now, but only when the customer has another card or an email address the till can find them by. The points stay with the customer, and their wallet pass switches to the new card. A switched-off card is never printed again, and no export holds it.
Blocking cards that went missing
Blank cards can go missing before you hand them out: lost in the post, taken from the counter, or a print run that never arrived. Block them, so nobody can start collecting points with them.
- A few cards. Tick the box next to each card in the list, then click Block in the bar above the list. Only cards without a customer have a box.
- A whole batch. Filter the list on the batch, and click Block the cards without a customer in the panel. Cards of the batch that a customer already has stay as they are.
A blocked card leaves the card picker and every export, and the till and the admin portal refuse to link it to a customer. Found the cards again? Tick them and click Unblock, or use the unblock button in the batch panel. Puntjes keeps a record of who blocked or unblocked which cards, and Puntjes support can look it up for you. Need new cards instead? Generate a new batch and send it to your print shop.
Finding a card
Filter the list by status (All statuses, Unassigned, Assigned, Switched off, Blocked) or by batch. The search box finds a card by its code, or by the first name, last name, email or phone of the customer who holds it. Part of a code is enough, and capitals, spaces, dashes and dots in it do not matter. As in the customers list, a small typo in a name is fine, accents do not matter, and neither do spaces and signs in a phone number. For a full name such as "Jan Peeters", every word has to match. You also find the cards of a deactivated customer.
Click a column header to sort by that column, and click it again to reverse the order. Status sorts assigned cards first, then switched-off, unassigned and blocked cards. Customer sorts like a phone book, by last name and then first name. Cards without a customer stay at the bottom in both directions. On a phone the Batch and Created columns are hidden, so you cannot sort by them there.
The Customer column shows the customer's name, or their email or phone when there is no name, or "Customer without a name" when there is none of the three. An anonymized customer shows as "Anonymized customer", with no link to the customer page.
Generate stock before your POS starts scanning
A scanned code can only be accepted if it matches a card you have already generated. If tills start scanning pre-printed cards before the matching batch exists in Puntjes, every scan is correctly rejected as unknown stock.
Customer actions
These are in the Actions menu of the customer page.
When a customer asks what you hold
A customer may ask you which data you keep about them, and may ask for a copy to take elsewhere. The law gives you one month to answer, counted from the day the request arrives, and the answer costs the customer nothing. If the request is complicated, or several arrive at once, you may take two months more, as long as you say so inside the first month.
Download this customer's data gives you the answer in one file: the profile and the identifiers, the consent record with the wording and who noted it, the balance and every movement of points, the purchases with their lines, the redemptions, the campaign gifts and vouchers, the wallet passes, and the history of what changed on this customer and when. It is JSON, the machine-readable format the portability right asks for. Send it as it stands. Reading it is the job of whoever receives it.
Three things worth knowing. That history says what changed, never who was at the keyboard: the people who work for you are people too, and their names belong to them rather than to the customer. Every download is recorded with your name against it, but that record is not one you can open yourself, so mail us if you ever have to show that you answered. And a customer who asks you to erase them is answered by Anonymize below, not by this file.
Merge customer
One person sometimes ends up with two accounts, for example a card from the counter and an account from the webshop. Merge customer puts them together. Search for the other account by name, email or loyalty card, then check the overview: the account that Stays, the account that Disappears, and what moves. Where the two hold a different first name, last name, email, phone, date of birth or language, Choose what stays asks which value the account that stays keeps; it starts on the value of that account. The other details are listed under Taken care of, and a card shows the customer as the merge leaves them. Swap turns the two around and starts the picks over. Add the 120 points of the other account is ticked, so its points move along. Untick it and those points are lost. Merge finishes it, and you cannot undo it.
Merge customer shows only for an active customer, and only when merging is switched on for your shop. If you need it and do not see it, ask your platform operator.
The account that disappears stays readable as a closed account. A banner on its page says which account it was merged into, with a button to open that account. Nothing on it can change any more, so it has no Actions menu and no Wallet pass card. The page of the account that stays lists it under Merged accounts.
Deactivate customer
Deactivating a customer prevents them from earning or spending points at the till. Puntjes asks you to confirm first. The customer can still be found in lists.
Anonymize
Anonymizing a customer permanently removes their personal data, for a customer who asks to be erased. In the confirmation dialog, type the customer's full name (or "Customer #7" for a customer without a name), then click Permanently Anonymize. The page then shows "Anonymized customer" as the name, and Puntjes refuses every change to it. So the page leaves out every control that changes the customer: Add or remove points, Give a reward, Add loyalty card, Card lost, Deactivate, Use voucher, Cancel reward and Send email again. The Actions menu keeps only Download this customer's data. The Wallet pass card goes too, because anonymizing takes the customer's wallet pass back.
Anonymization is permanent
This action cannot be undone. All personal data is irreversibly deleted. The wallet and the point history remain but are no longer linked to identifiable information.