Lista de eventos
Los nueve eventos que envían los webhooks de StampyWallet, cuándo salen y el contenido exacto de su campo donnees.
Cada evento tiene el mismo sobre (id, type, cree_le, commerce, ver Webhooks). Solo cambia donnees, que se muestra solo a continuación. Los eventos salen tanto del mostrador como de la API: una visita escaneada o puesta con POST /v1/passages produce el mismo passage.cree.
| Evento | Se envía cuando |
|---|---|
client.cree | Un cliente se une al programa (se crea su tarjeta) |
carte.ajoutee | El cliente guarda su tarjeta en Apple Wallet o Google Wallet |
passage.cree | Se pone una visita: uno o varios sellos, o puntos |
passage.annule | Se anula la última visita de un cliente |
recompense.atteinte | Una visita supera un nivel: se debe una recompensa (una por nivel superado) |
recompense.offerte | La recompensa se entrega al cliente |
recompense.annulee | Se anula la entrega de una recompensa: vuelve a estar pendiente |
carte_cadeau.vendue | Se vende una tarjeta regalo |
forfait.vendu | Se vende un bono prepagado |
Nota : carte.ajoutee vale para Apple Wallet y Google Wallet: donnees.carte.wallet es apple o google. En Apple, el evento sale con cada dispositivo nuevo (un iPhone y luego un reloj generan dos). Quitar la tarjeta no envía nada.
client.cree
{
"client": {
"id": "3374a06e-9608-4376-91cb-1a3fb6721b04",
"prenom": "Camille",
"cree_le": "2026-10-22T05:52:45.664Z"
}
}telephone y email solo aparecen si el cliente los ha dado. prenom puede ser null.
carte.ajoutee
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"carte": { "wallet": "apple" }
}passage.cree
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"passage": {
"id": "226fdea1-ba59-49fb-93e6-60a14a765134",
"quantite": 1,
"montant": null,
"devise": "EUR",
"reference": "caisse-1",
"source": "scan",
"piste": "normal",
"tampons": 1,
"objectif": 2
}
}quantite: lo que vale la visita (sellos, o puntos en modo puntos).montant: el importe del ticket en céntimos si se ha introducido; si no,null.reference: el identificador de operación enviado por quien llama (la referencia de la API o la del mostrador); si no,null.source:scan,manuel,api…piste:normal, opremiumpara el segundo contador.tampons(opointsen modo puntos) yobjectif: el contador después de la visita. Una visita que completa la tarjeta devuelve el de la tarjeta siguiente (a menudo0); la recompensa llega en unrecompense.atteinteaparte.
passage.annule
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"passage": {
"id": "d8f62d77-88a6-44ef-a0c3-2a7d5066b90a",
"quantite": 1,
"source": "scan",
"piste": "normal",
"tampons": 0,
"objectif": 2
},
"recompenses_retirees": 0,
"motif": "doble escaneo"
}passage.id es el del passage.cree original, y el contador el de después de la anulación. recompenses_retirees: las recompensas que esta visita había desbloqueado y que desaparecen con ella. motif: el motivo introducido en el mostrador, o null.
recompense.atteinte
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"recompense": {
"id": "504c8734-3bbd-4fe9-95f8-7a67c8239dab",
"libelle": "Un café gratis",
"palier": 2,
"piste": "normal",
"expire_le": null
},
"passage_id": "8bfbdd5e-eff4-4a3b-94fe-1557ec6edce6"
}Un evento por nivel superado. expire_le vale null si las recompensas del comercio no caducan.
recompense.offerte
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"recompense": {
"id": "504c8734-3bbd-4fe9-95f8-7a67c8239dab",
"libelle": "Un café gratis",
"piste": "normal",
"offerte_le": "2026-10-22T05:54:51.790Z"
}
}recompense.annulee
{
"client": { "id": "40de4b86-1d7a-4cc6-add3-b7a83fa43c04", "prenom": "Inès",
"telephone": "+33611223344", "email": "ines@example.com" },
"recompense": {
"id": "504c8734-3bbd-4fe9-95f8-7a67c8239dab",
"libelle": "Un café gratis",
"piste": "normal"
},
"motif": "tarjeta equivocada"
}carte_cadeau.vendue
{
"client": null,
"carte_cadeau": {
"id": "ac7e56a5-3c00-492f-971a-21ca7d675fd6",
"code": "EJ9Y-7FYN",
"sorte": "montant",
"produit": null,
"montant": 2500,
"devise": "EUR",
"pour": "Lucie",
"de": "Marc",
"canal": "comptoir",
"expire_le": "2027-04-22T05:54:51.879Z"
}
}sorte vale montant o produit (en ese caso produit lleva su nombre y montant su precio). Aquí, 2500 céntimos: 25 €.
Atención : code es el código de la tarjeta regalo, el que lleva su QR: basta para cobrarla en el mostrador. Trátalo como un secreto: no lo escribas en una hoja de cálculo compartida ni en registros.
forfait.vendu
{
"client": null,
"forfait": {
"id": "0ec29323-ed13-4e6b-9595-963601290eac",
"code": "XFF2-WTW9",
"nom": "10 cafés",
"unites": 10,
"prix": 3000,
"devise": "EUR",
"titulaire": "Paul",
"canal": "comptoir",
"expire_le": "2027-04-22T05:54:51.891Z"
}
}titulaire: el nombre escrito en la venta, o null. expire_le vale null para un bono sin vencimiento. Como en una tarjeta regalo, code debe mantenerse en secreto.
Nota : los datos personales se limitan a lo que el cliente dio al registrarse. Una vez recibidos, son responsabilidad tuya: consérvalos solo el tiempo necesario.
Actualizado el