Klik op een rij voor het paneel met de ontvanger, de bedragen, de notitie
en het rekeningnummer; de ⋯-knop rechts geeft de twee statusknoppen.
Afhandelen verstuurt (nog) geen WhatsApp-bericht — dat is bewust; de kaarthouder
hoort dus niets automatisch. Het saldo is dat van de lopende kalendermaand, dezelfde regels als SALDO.
In het paneel staat bij Ontvanger een chip ⚠ geactiveerd vóór de uitgifte als de
badge in gebruik is genomen voordat 'ie verkocht of vrijgegeven was. Dat kan kloppen (een badge
die met de hand is uitgegeven nadat 'ie al actief was), maar controleer het vóór je overmaakt:
bij twijfel is een berichtje naar de kaarthouder genoeg. De chip blokkeert niets.
Een chip ↔ samen betekent dat die verzoeken uit één "Alle kaarten samen"-aanvraag
komen: zelfde account, zelfde moment, zelfde rekeningnummer. Eén overboeking van het
getoonde totaal dekt ze allemaal — maak niet per rij over. Handel de rijen daarna wél
stuk voor stuk af: het saldo wordt per kaart opgebouwd, en zo blijft de boekhouding kloppen. IBAN tonen staat in het paneel en nergens anders: elke klik erop komt als
IBAN_REVEALED in het audit-log en telt mee in de gezondheidsregel
van vijf inzages per dag. Het paneel openen doet dat niet.
Bestellingen
Laden…
Klik op een rij voor het paneel met de klant, de regels, de badges en de
verzending; de ⋯-knop rechts geeft de snelle acties (CSV, Verzonden). Wat de
statussen betekenen staat achter de ⓘ in het paneel.
Nieuwe batch
Een losse batch is voorraad en is nog niet te activeren. Een badge kan pas in gebruik
genomen worden als 'ie is uitgegeven: automatisch bij een batch voor een bestelling en
zodra een webshopbestelling betaald is, of met de hand via ⋯ → Uitgeven in de lijst
hieronder (of in het paneel van de kaart). Zo is onverkochte voorraad niet te claimen door wie de URL's kent.
De CSV heeft twee kolommen — id,url — en gaat naar de
chip-programmeur. Er zit geen geheim meer in: de activatiecode is vervallen.
1–500 per batch. De CSV blijft op dit scherm staan tot je de pagina verlaat;
hij is ook later te maken, want er staat niets geheims in. Account hangt de badges via cards.account_id aan dat account:
één IBAN, één WhatsApp-nummer en één portal-login voor de hele reeks.
Direct actief slaat de activatiepagina over — de kaarten staan meteen live. Dat kan
alleen bij een account met rekeningnummer: anders halen ze fooien op die nergens heen kunnen.
Naamreeks vult de kaartnamen (leeg = de kaarten volgen de standaardnaam en worden in het
portal hernoemd). Land bepaalt de betaalmethodes van de kaarten.
Kaarten
Laden…
Deze lijst bevat alleen badges die uit een batch komen. De kaarten van vóór de
zelfactivatie (001–005) staan hier niet in — die zijn per definitie actief.
Blokkeren werkt wél voor alle kaarten. Blokkeren is een pauze en omkeerbaar, en het is de verplichte eerste stap. Pas bij een
geblokkeerde kaart verschijnt de eindstap: Verwijderen — één knop, en de server bepaalt
wat dat hier betekent. Hangt er geen geld aan (een testrij), dan gaat de rij weg: weg is weg, en
het kaart-id zit in de chip. Is er wél geld langsgekomen, dan gaan alleen naam, nummer, IBAN,
foto en de teksten eruit; de kaart blijft als geblokkeerde rij bestaan en de betaalhistorie
blijft leesbaar. De bevestiging zegt vooraf welke van de twee het wordt. Die stappen staan achter de ⋯-knop van de rij en
in het paneel dat opent als je op de rij klikt; daar zit ook de koppeling aan een account en
aan een aanbrenger. In de kolom Account staat het e-mailadres onder de naam; het zoekveld
zoekt daar ook op. Uitgeven geeft één badge vrij voor activatie. Gebruik het voor pilots, cadeaus buiten de
shop om en de vervanging van een dode badge. Het moment wordt vastgelegd en is niet terug te
draaien: het is het ijkpunt van de waarschuwing bij een uitbetaling.
Klantaccounts
Laden…
Klik op een rij voor het paneel met alle gegevens, instellingen en acties; de
⋯-knop rechts geeft de snelle acties. Een account heeft vier toestanden: actief,
geblokkeerd, gesloten en verwijderd. Blokkeren is een pauze — alleen niet meer kunnen
inloggen; de kaarten blijven werken. Sluiten is een einde: het blokkeert het account én
al z'n kaarten in één keer en start de bewaartermijn van 90 dagen. Allebei omkeerbaar
(Deblokkeren, Heropenen). Pas bij een gesloten account verschijnt de eindstap:
Verwijderen — één knop, en de server bepaalt wat dat hier betekent. Hangen er geen
transacties, saldo of uitbetalingen aan (een testrij), dan gaat alles weg: account, tokens,
onbetaalde bestellingen én de geblokkeerde kaarten. Is er wél geld langsgekomen, dan gaan
alleen naam, e-mailadres, nummer, IBAN, adres en foto's eruit — ook van de kaarten; de kaarten
blijven geblokkeerd bestaan en betalingen, uitbetalingsverzoeken en de transactielog blijven
staan als financieel spoor, en het e-mailadres komt weer vrij. De bevestiging zegt vooraf welke
van de twee het wordt. Verwijderen is de AVG-route voor een klant die weg wil, en is niet terug
te draaien. E-mail wijzigen is er voor één geval: iemand heeft bij de activatie van een cadeaubadge
z'n adres verkeerd ingetikt en komt daardoor nooit in z'n account. Een klant kan dit zelf niet
— het adres is de sleutel van het account. Openstaande links naar het oude adres vervallen, het
account gaat terug naar "niet bevestigd", en het nieuwe adres krijgt een mail: "stel je wachtwoord
in" als er nog nooit is ingelogd, anders de gewone bevestigingsmail. Het oude adres krijgt een
waarschuwing dat het adres gewijzigd is — gemaskeerd en zonder link, zodat de eigenaar het kan
zien als dit niet de bedoeling was. Prijslijst bepaalt wat dit account in de webshop betaalt (migratie 011). "standaard"
is de gewone prijs; een eigen lijst geldt alleen voor de producten waarvoor daar een
afwijkende prijs in staat. De lijsten zelf maak je in het tabblad Producten.
Geldt voor elke bestelling in de winkel — een team rekent daar af als ieder ander. Bijdrage is het vinkje "ik dek de transactiekosten" op de betaalpagina van álle
kaarten van dit account (migratie 013). Dat geld komt bovenop de fooi en is
omzet van Todah: het komt nooit in het saldo, de uitbetaling of de
WhatsApp-melding van een kaarthouder terecht — die ziet uitsluitend het fooibedrag.
"standaard" betekent: geen eigen instelling, volg card-defaults.json
(en die staat op uit). ⚠️ De bijdrage is altijd vrijwillig en het bedrag staat
altijd zichtbaar naast het vinkje; een verplichte opslag zou een surcharge zijn (PSD2).
Eén kaart laten afwijken kan alleen met de hand in
data/cards/<id>.json — in het portal heeft de kaarthouder
hier bewust geen veld voor. Taal is de taal waarin de kaartpagina aan de gast getoond wordt: de
bedragknoppen, het bedank- en foutscherm en de regel over de transactiekosten
(migratie 015). De keuzes staan in het paneel, sectie Instellingen → Bewerken (de lijst
komt van de server, dus 'ie klopt altijd met wat de kaartpagina kan). Daarnaast is er auto:
dan leest de server de taal van de telefoon van de gast en valt 'ie bij een taal die we
niet spreken terug op de standaard. ⚠️ Dit raakt alleen de gastpagina: WhatsApp, het portal, dit dashboard
en de mails blijven Nederlands, en de naam, ondertitel en eigen bedanktekst van de
kaarthouder worden nooit vertaald. Anders dan de bijdrage is dit geen prijsbeleid maar
een kaarthouderinstelling: dit is de teamlaag, en een badge met een eigen taal in het
portal (Kaart bewerken → Taal van de kaartpagina) wint hiervan.
Producten
Laden…
Dit is de dagelijkse weg om producten en prijzen te beheren.
scripts/products.php blijft bestaan als noodluik voor als dit dashboard zelf niet
open te krijgen is; dezelfde regels, dezelfde controles. Prijzen gaan in centen — 1795 is € 17,95. Naast het veld staat meteen wat het wordt.
Een bestaande bestelling verandert niet mee: prijs en naam zijn daar bevroren op het
moment van afrekenen, zodat een factuur blijft kloppen met wat de klant op z'n scherm zag.
Klik op een rij voor het paneel met alle velden, de prijs per prijslijst en de foto;
de ⋯-knop rechts haalt een product uit de winkel of zet het terug.
Nieuw product opent datzelfde paneel leeg — de code kies je daar één keer, en de
foto zet je erbij zodra het product is opgeslagen. ⚠ bij badges per stuk = 0 betekent: hier komen geen chips uit.
Dat kán kloppen (een tafelstandaard of een sticker zonder chip), maar het is ook precies
hoe een vergeten waarde eruitziet. Een bestelling van alleen zulke producten levert geen
kaarten op en krijgt in het tabblad Bestellingen geen batchknop.
Prijslijsten
Een prijslijst bevat alleen afwijkingen. Wat er niet in staat volgt de gewone
prijs van het product. De lijst standaard ís die gewone prijs en heeft daarom geen
eigen regels — die kun je ook niet uitzetten.
Een account koppel je aan een lijst in het tabblad Accounts. Zolang niemand een
lijst heeft, verandert er niets aan de publieke bestelpagina.
Laden…
Een prijslijst gaat nooit weg — accounts wijzen ernaar. Niet meer nodig?
Zet 'm uit: bestaande koppelingen blijven staan en er kan niemand nieuw aan gehangen worden. De teamflow rekent nog nergens af, dus daar is een prijslijst voorlopig cosmetisch.
Bij een solo-checkout geldt 'ie wél, en de prijs wordt bij het afrekenen bevroren.
Ambassadeurs
Laden…
Gezondheid
Laden…
WhatsApp-templates
Berichten die Todah buiten het
24-uursvenster stuurt hebben een door Meta goedgekeurde template nodig. Staat er één op
PENDING of REJECTED, dan gaat dát
bericht niet uit — de rest werkt gewoon door. Antwoorden op een binnenkomend bericht
(INFO, STATS, NETWERK, de weigeringen) zijn vrije tekst en hebben geen goedkeuring
nodig; die staan hier dus niet bij.
⚠️ Kijk naast de status ook naar de categorie: UTILITY
is gratis binnen het venster, MARKETING kost geld per bericht.
Meta bepaalt die zelf op basis van de inhoud en kat een template soms om.
Deze knop bevraagt Meta live, dus hij laadt niet vanzelf mee.
Nog niet opgehaald.
Testmail
E-mail is het enige dat je niet kunt controleren
door naar de code te kijken: de mailserver kan een bericht aannemen en het daarna laten
vallen. Stuur hiermee een testbericht zonder dat je een account hoeft aan te maken.
Komt de versie mét HTML niet aan en die zonder wél, dan ligt het aan de opmaak — zet dan
MAIL_HTML=0 in .env.
Wat er gebeurd is
De laatste 50 gebeurtenissen die ertoe doen:
wie er inlogde, wie een rekeningnummer inzag, welke badge gedeblokkeerd werd. Alleen
lezen — er is geen knop om hier iets weg te halen, en dat is met opzet.
Apparaat is een merkteken van het IP, niet het adres zelf: genoeg om twee
bezoeken te vergelijken, niet genoeg om er een lijst uit te bouwen.
Dat was ik bij een inlog wist niets: het zet er een nieuwe regel naast die naar
die inlog verwijst, zodat de gezondheidsregel 'm niet meer meetelt.
Laden…
Vertrouwde apparaten
Een apparaat waarop je "onthoud dit apparaat"
hebt aangevinkt, slaat de code uit de mail over — dat is een bezitsfactor die in die
browser blijft liggen. Intrekken haalt ze allemaal weg, ook deze browser: elk
apparaat vraagt daarna bij de volgende inlog weer een code. Doe dit als je een telefoon
of laptop kwijt bent, of als je vermoedt dat iemand heeft meegekeken. Je wachtwoord
verandert er niet van.