StampyWallet loyalty cards in Apple Wallet and Google Wallet: customers, stamps, rewards, messages.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Rend le QR code d’inscription des clients (celui à poser au comptoir, que les clients scannent pour ajouter la carte à leur téléphone), le lien public, la carte, et les liens de téléchargement de l’affichette à imprimer (PDF A5 ou A6) et du QR seul (PNG, SVG) pour un menu, une vitrine ou Canva. À utiliser quand le commerçant veut imprimer son affichette, récupérer son QR code ou le lien à mettre dans sa bio. Les téléchargements s’ouvrent dans l’application, connecté. Pour recevoir les PDF par e-mail : envoyer_affichette. Lecture seule.
Format du PDF mis en avant : a5 (demi-feuille, affiche de comptoir) ou a6 (quart de feuille, chevalet ou porte-carte).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http stampywallet https://app.stampywallet.com/mcp
Rend le QR code d’inscription des clients (celui à poser au comptoir, que les clients scannent pour ajouter la carte à leur téléphone), le lien public, la carte, et les liens de téléchargement de l’affichette à imprimer (PDF A5 ou A6) et du QR seul (PNG, SVG) pour un menu, une vitrine ou Canva. À utiliser quand le commerçant veut imprimer son affichette, récupérer son QR code ou le lien à mettre dans sa bio. Les téléchargements s’ouvrent dans l’application, connecté. Pour recevoir les PDF par e-mail : envoyer_affichette. Lecture seule.
| Argument | Type | Description |
|---|---|---|
| format | string | Format du PDF mis en avant : a5 (demi-feuille, affiche de comptoir) ou a6 (quart de feuille, chevalet ou porte-carte). |
{
"type": "object",
"properties": {
"format": {
"enum": [
"a5",
"a6"
],
"type": "string",
"default": "a5",
"description": "Format du PDF mis en avant : a5 (demi-feuille, affiche de comptoir) ou a6 (quart de feuille, chevalet ou porte-carte)."
}
},
"additionalProperties": false
}Ajoute une période de fermeture (congés, jour férié), du premier au dernier jour inclus. Les jours fermés ne comptent pas dans l’absence d’un client : des congés bien déclarés évitent que des habitués passent pour « perdus de vue » et reçoivent une relance au retour. En option, prevenir_clients=true avec un texte prépare aussi une notification à tous les clients (mêmes règles qu’envoyer_message : un message par jour). confirmer=false (défaut) rend un aperçu ; confirmer=true enregistre (et envoie le message s’il est demandé), après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| au | string | Dernier jour fermé, inclus (AAAA-MM-JJ). Par défaut, le même jour que du. |
| du* | string | Premier jour fermé (AAAA-MM-JJ). |
| texte | string | Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true. |
| libelle | string | Nom de la période, pour s’y retrouver (« Congés d’été »). |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| prevenir_clients | boolean | true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour. |
{
"type": "object",
"required": [
"du"
],
"properties": {
"au": {
"type": "string",
"format": "date",
"description": "Dernier jour fermé, inclus (AAAA-MM-JJ). Par défaut, le même jour que du."
},
"du": {
"type": "string",
"format": "date",
"description": "Premier jour fermé (AAAA-MM-JJ)."
},
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true."
},
"libelle": {
"type": "string",
"maxLength": 80,
"description": "Nom de la période, pour s’y retrouver (« Congés d’été »)."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"prevenir_clients": {
"type": "boolean",
"default": false,
"description": "true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour."
}
},
"additionalProperties": false
}Annule une invitation pas encore utilisée : son lien ne marche plus. Réservé au propriétaire. confirmer=false (défaut) rend un aperçu ; confirmer=true agit, après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| invitation* | string | Le lien d’invitation ou son jeton, lus avec lister_equipe. |
{
"type": "object",
"required": [
"invitation"
],
"properties": {
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"invitation": {
"type": "string",
"maxLength": 300,
"description": "Le lien d’invitation ou son jeton, lus avec lister_equipe."
}
},
"additionalProperties": false
}Arrête et supprime un message récurrent ; ce qui est déjà parti reste dans l’historique. confirmer=false (défaut) rend un aperçu ; confirmer=true l’exécute, après l’accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| id* | integer | La règle visée, donnée par lister_messages_recurrents. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "La règle visée, donnée par lister_messages_recurrents."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
}
},
"additionalProperties": false
}Les avis Google du commerce. Chaque client reçoit la même demande d’avis (notification Wallet, SMS ou e-mail selon le canal réglé dans regler_automatismes, canal_avis), avec le lien direct vers la fiche Google : pas de note intermédiaire, pas de tri, aucune récompense contre un avis (règles de Google). Montre les chiffres sur 30 jours (demandes envoyées, clients allés sur Google) ; et règle la demande : lien de la fiche Google, demande active ou non, moment (première récompense ou après N passages), délai, texte. Sans changement : lecture seule. Avec changements : confirmer=false rend un aperçu avant → après, confirmer=true enregistre. Seuls les champs fournis changent.
| Argument | Type | Description |
|---|---|---|
| lien | string | Lien « écrire un avis » de la fiche Google (g.page/r/…/review, search.google.com/local/writereview?placeid=…). Sans lui, aucune demande ne part. |
| moment | string | Quand demander : recompense = à la première récompense ; passages = après N passages (voir passages). |
| effacer | array | Champs texte à vider. texte_demande revient au texte par défaut. |
| passages | integer | Nombre de passages avant la demande, si moment=passages. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| retirer_lien |
Passe un membre de l’équipe en employé ou en responsable. Réservé au propriétaire. confirmer=false (défaut) rend un aperçu ; confirmer=true agit, après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| role* | string | staff = employé, ne voit que le scanner ; manager = responsable, voit chiffres, clients, messages et règle la carte, sans toucher à l’équipe. |
| string | Ou l’e-mail du membre, à la place de membre_id. | |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| membre_id | string | Identifiant du membre, lu avec lister_equipe. |
{
"type": "object",
"required": [
"role"
],
"properties": {
"role": {
"enum": [
"staff",
"manager"
],
"type": "string",
"description": "staff = employé, ne voit que le scanner ; manager = responsable, voit chiffres, clients, messages et règle la carte, sans toucher à l’équipe."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Ou l’e-mail du membre, à la place de membre_id."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"membre_id": {
"type": "string",
"maxLength": 36,
"description": "Identifiant du membre, lu avec lister_equipe."
}
},
"additionalProperties": false
}Liste les clients du commerce selon un segment (habitués, perdus de vue, à un tampon de la récompense, récompense à offrir, nouveaux, inactifs, jamais revenus) croisé avec des filtres : prénom, tampons sur la carte, nombre de visites, date d’inscription, date de dernière visite, type de wallet ; triés et paginés. Rend pour chacun un identifiant, le prénom et l’initiale du nom, les visites, la dernière visite et l’état de la carte, jamais d’e-mail ni de téléphone. À utiliser pour « qui sont mes meilleurs clients ? », « qui n’est pas revenu ? », « qui est proche de sa récompense ? », ou pour retrouver l’identifiant d’un client avant fiche_client.
| Argument | Type | Description |
|---|---|---|
| tri | string | Ordre des résultats. Défaut derniere_visite (les plus récents d’abord). |
| ordre | string | auto (défaut) : décroissant, sauf prenom (A→Z). |
| limite | integer | Nombre maximum de résultats. |
| wallet | string | Où le client garde sa carte. aucun = page web, sans wallet. |
| segment | string | Groupe de départ, défini comme dans l’application. tous (défaut) ; habitues = au moins 4 passages sur les 60 derniers jours ; perdus = venus au moins 4 fois, et absents depuis plus d’une fois et demie leur rythme habituel (médiane des écarts entre leurs passages), ou, sans assez d’historique, depuis plus de le délai du commerce ; congés et jours de fermeture non comptés ; presque = il ne leur manque qu’un tampon pour la récompense ; recompense_prete = une récompense gagnée, pas encore offerte, pas expirée ; nouveaux = inscrits dans les 30 derniers jours ; inactifs = aucun passage depuis plus de le délai du commerce, en jours calendaires, quel que soit leur nombre de visites ; un_seul_passage = un passage au plus : inscrits mais jamais revenus. |
Dessine une carte de fidélité StampyWallet (Apple Wallet et Google Wallet) pour un commerce, sans compte et sans rien enregistrer. À utiliser quand quelqu’un veut une carte de fidélité, fidéliser ses clients, ou voir à quoi ressemblerait sa carte. Tous les paramètres sont facultatifs : sans eux, une carte adaptée au métier est proposée. Le logo (logo_url) et la photo de chaque récompense (paliers[].image_url) se donnent par leur adresse https ; ils sont montrés sur l’aperçu, sans être enregistrés. Rappeler l’outil avec les réglages rendus, modifiés, pour affiner. Quand la personne est satisfaite, proposer creer_commerce avec les mêmes réglages.
| Argument | Type | Description |
|---|---|---|
| nom | string | Nom du commerce, imprimé en haut de la carte. |
| mode | string | tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables). |
| encre | string | Couleur du texte de la carte, en hexadécimal (défaut : choisie pour rester lisible sur le fond). |
| forme | string | Le dessin de la carte, en un mot (remplace forme_points et forme_paliers). Modes points et paliers : medailles (une jauge et une grande médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S, chaque passage fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Modes tampons et paliers : la disposition des tampons, grille (défaut), libre (semés), objets (gros objets ombrés, idéal avec une photo), cercles. En paliers, une disposition garde les tampons et pose chaque récompense à la place du tampon de son seuil. Une des cinq formes sans mode donné passe la carte en mode paliers. |
Crée le commerce sur StampyWallet avec la carte conçue (mêmes paramètres que concevoir_carte), et rend un lien personnel pour en devenir propriétaire : la personne clique, se connecte avec son e-mail, et retrouve tout en place (carte, QR à imprimer, essai gratuit). Le logo (logo_url) et la photo de chaque récompense (paliers[].image_url), donnés par leur adresse https, sont posés sur la carte. Sans compte. Appeler d’abord avec confirmer=false pour montrer le récapitulatif, puis avec confirmer=true une fois que la personne a dit oui.
| Argument | Type | Description |
|---|---|---|
| nom* | string | Nom du commerce, imprimé en haut de la carte. |
| mode | string | tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables). |
| encre | string | Couleur du texte de la carte, en hexadécimal (défaut : choisie pour rester lisible sur le fond). |
| forme | string | Le dessin de la carte, en un mot (remplace forme_points et forme_paliers). Modes points et paliers : medailles (une jauge et une grande médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S, chaque passage fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Modes tampons et paliers : la disposition des tampons, grille (défaut), libre (semés), objets (gros objets ombrés, idéal avec une photo), cercles. En paliers, une disposition garde les tampons et pose chaque récompense à la place du tampon de son seuil. Une des cinq formes sans mode donné passe la carte en mode paliers. |
Envoie l’affichette de comptoir (PDF A5 et A6, avec le QR d’inscription des clients) à l’adresse e-mail du compte StampyWallet connecté, pour l’imprimer depuis un autre appareil ou chez un imprimeur. Seulement à cette adresse, jamais à une autre. Appeler avec confirmer=false (défaut) pour annoncer l’envoi, puis confirmer=true après accord.
| Argument | Type | Description |
|---|---|---|
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
{
"type": "object",
"properties": {
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
}
},
"additionalProperties": false
}Envoie une notification sur l’écran verrouillé des clients (via leur carte Apple Wallet ou Google Wallet). À utiliser pour annoncer une nouveauté, une offre, un événement, ou faire revenir des clients. L’audience est paramétrable (tous, habitués, perdus de vue, presque à la récompense, nouveaux, récompense à retirer, inactifs) et se combine avec des filtres (jours sans passage, tampons sur la carte, passages, date d’inscription). Texte de 180 caractères au plus, envoyé tel quel. Un seul message par jour et par commerce. AVEC client_id (rendu par chercher_clients) : un message à CE client seul, par exemple « votre commande est prête » (pressing, cordonnerie, traiteur, fleuriste) : un modèle prêt (modele = pret, retrait, recu, attente), ou texte + modele=libre ; en option aussi_sms et aussi_email. Il ne compte pas dans le message du jour à tous ; deux par client et par jour au plus. Appeler d’abord avec confirmer=false : l’aperçu donne le texte exact, le nombre de destinataires et combien peuvent vraiment le recevoir, sans rien envoyer. N’appeler avec confirmer=true qu’après l’accord explicite de la personne : un message parti ne se reprend pas. Pour les messages automatiques (relance, anniversaire, rappels), utiliser regler_automatismes.
| Argument | Type | Description |
|---|---|---|
| texte | string | Le texte exact de la notification, 180 caractères au plus. Il est précédé du nom du commerce sur le téléphone : inutile de le répéter. Obligatoire sans client_id ; avec client_id, seulement pour modele=libre. |
| langue | string | Avec client_id et un modèle : la langue du texte prêt. Par défaut, celle du commerce. |
| modele | string | Avec client_id : pret = « Votre commande est prête… », retrait = « Votre article est prêt à être retiré… », recu = « Nous avons bien reçu votre commande… », attente = « Votre commande vous attend toujours… », libre = le texte donné. Par défaut : libre si texte est donné. |
L’historique d’UN client : date d’inscription, wallet utilisé, nombre de passages et rythme de visite, passages mois par mois, carte en cours, récompenses gagnées, offertes et à offrir, derniers passages datés. Le retrouver par son identifiant (donné par chercher_clients) ou par son prénom, éventuellement suivi de l’initiale du nom (« Maëlle P. ») ; si plusieurs clients correspondent, la liste des candidats est rendue pour choisir. À utiliser pour « quand est venue Zoé pour la dernière fois ? », « combien de fois Louis est-il venu ? ». Ne donne ni e-mail ni téléphone.
| Argument | Type | Description |
|---|---|---|
| id | string | Identifiant du client (UUID), tel que rendu par chercher_clients. Prioritaire sur prenom. |
| mois | integer | Nombre de mois dans la courbe des passages (défaut 12). |
| prenom | string | Prénom du client, éventuellement suivi de l’initiale ou du nom (« Maëlle P. »). Accents et casse ignorés. |
| inclure_offerts | boolean | true : l’historique montre aussi les tampons offerts (bienvenue, avis), signalés comme tels. Défaut false : seulement les vrais passages. |
| historique_limite | integer | Nombre de passages récents à détailler (défaut 15). |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Identifiant du client (UUID), tel que rendu par chercher_clients. Prioritaire sur prenom."
},
"mois": {
"type": "integer",
"default": 12,
"maximum": 36,
"minimum": 1,
"description": "Nombre de mois dans la courbe des passages (défaut 12)."
},
"prenom": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Prénom du client, éventuellement suivi de l’initiale ou du nom (« Maëlle P. »). Accents et casse ignorés."
},
"inclure_offerts": {
"type": "boolean",
"default": false,
"description": "true : l’historique montre aussi les tampons offerts (bienvenue, avis), signalés comme tels. Défaut false : seulement les vrais passages."
},
"historique_limite": {
"type": "integer",
"default": 15,
"maximum": 200,
"minimum": 0,
"description": "Nombre de passages récents à détailler (défaut 15)."
}
},
"additionalProperties": false
}Lit ou modifie la fiche du commerce : nom, type de commerce, panier moyen (sert aux estimations du tableau de bord), langue des clients, coordonnées imprimées au dos de la carte (adresse, téléphone, horaires, site web, message de bienvenue), lien public d’inscription des clients (stampywallet.com/rejoindre/<lien>, celui du QR), et les lieux où la carte se présente quand un client passe devant (jusqu’à 10 : boutique, marché, emplacement de food truck), avec leurs jours et horaires. Sans paramètre de changement : rend la fiche actuelle. Avec des changements : confirmer=false (défaut) montre l’avant/après, confirmer=true écrit après accord explicite. Un ancien lien public continue de fonctionner après un changement (les QR déjà imprimés restent bons).
| Argument | Type | Description |
|---|---|---|
| nom | string | Nom du commerce (aussi imprimé sur la carte). |
| lien | string | Lien public voulu, en clair (« Le Fournil de la Gare » devient « le-fournil-de-la-gare »), de 3 à 32 caractères. Un lien déjà pris par un autre commerce est refusé. |
| langue | string | Langue du commerce : celle de la carte, des pages et des messages vus par les clients. |
| metier | string | Type de commerce, l’un des métiers de l’inscription. « autre » : tout ce qui n’a pas son métier. |
| adresse | string | Adresse, au dos de la carte (160 caractères au plus). |
| effacer | array |
Liste les messages déjà envoyés aux clients, du plus récent au plus ancien, avec leur bilan de remise : reçus, clients sans écran (injoignables), échecs, et encore en cours d’envoi. Résume aussi les messages automatiques partis sur la période (relances des perdus de vue, anniversaires) et dit si un message peut encore partir aujourd’hui. À utiliser pour savoir ce qui a été envoyé, vérifier qu’un envoi est bien arrivé, ou avant d’en écrire un nouveau.
| Argument | Type | Description |
|---|---|---|
| depuis | string | Seulement les envois à partir de ce jour (AAAA-MM-JJ). Sert aussi de début de période pour le résumé des automatiques (30 derniers jours par défaut). |
| limite | integer | Nombre maximum de résultats. |
| decalage | integer | Nombre de résultats à sauter (pagination). |
| jusqu_au | string | Seulement les envois jusqu’à ce jour inclus (AAAA-MM-JJ). |
{
"type": "object",
"properties": {
"depuis": {
"type": "string",
"format": "date",
"description": "Seulement les envois à partir de ce jour (AAAA-MM-JJ). Sert aussi de début de période pour le résumé des automatiques (30 derniers jours par défaut)."
},
"limite": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Nombre maximum de résultats."
},
"decalage": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Nombre de résultats à sauter (pagination)."
},
"jusqu_au": {
"type": "string",
"format": "date",
"description": "Seulement les envois jusqu’à ce jour inclus (AAAA-MM-JJ)."
}
},
"additionalProperties": false
}Crée une invitation personnelle valable 14 jours, comme employé (scanner seulement) ou responsable (chiffres, clients, messages, carte). Avec « email », elle part par e-mail à la personne ; sinon le lien est rendu pour être transmis. Nommer un propriétaire se fait dans l’application. Réservé au propriétaire. confirmer=false (défaut) rend un aperçu ; confirmer=true agit, après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| nom | string | Repère pour s’y retrouver dans les invitations (ex. « Julie, le matin »). |
| role | string | staff (défaut) = employé, ne voit que le scanner ; manager = responsable, voit chiffres, clients, messages et règle la carte. |
| string | Adresse de la personne invitée : l’invitation lui est envoyée par e-mail. Sans adresse, le lien est rendu. | |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
{
"type": "object",
"properties": {
"nom": {
"type": "string",
"maxLength": 60,
"description": "Repère pour s’y retrouver dans les invitations (ex. « Julie, le matin »)."
},
"role": {
"enum": [
"staff",
"manager"
],
"type": "string",
"description": "staff (défaut) = employé, ne voit que le scanner ; manager = responsable, voit chiffres, clients, messages et règle la carte."
},
"email": {
"type": "string",
"maxLength": 254,
"description": "Adresse de la personne invitée : l’invitation lui est envoyée par e-mail. Sans adresse, le lien est rendu."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
}
},
"additionalProperties": false
}Liste l’équipe du commerce (nom, e-mail, rôle, tampons posés) et les invitations en attente avec leur lien. Ne change rien. Réservé au propriétaire.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Liste les congés du commerce (à venir et des deux derniers mois, avec leur id) et les jours fermés chaque semaine. Ne change rien. Les jours fermés ne comptent pas dans l’absence d’un client : des congés bien déclarés évitent que des habitués passent pour « perdus de vue » et reçoivent une relance au retour.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Liste les messages récurrents du commerce (actifs et en pause), avec leur id, leur rythme, le groupe visé et le prochain envoi. Ne change rien.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Montre quand les clients viennent : moyenne de passages par jour de la semaine, répartition par heure, ou les créneaux (jour + heure) les plus chargés, sur une période au choix et à l’heure locale du commerce. Peut aussi compter les inscriptions de nouveaux clients. À utiliser pour « quel est mon meilleur jour ? », « à quelle heure ai-je le plus de monde ? », « quand lancer une offre pour remplir un creux ? ».
| Argument | Type | Description |
|---|---|---|
| au | string | Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui. |
| du | string | Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee ». |
| par | string | jour_semaine (défaut) : moyenne par lundi, mardi… ; heure : total par heure de la journée ; creneau : les couples jour + heure les plus chargés. |
| jours | array | Pour par=heure ou creneau : ne garder que ces jours de la semaine (ex. ["samedi"]). |
| limite | integer | Pour par=creneau : nombre de créneaux rendus (défaut 10). |
| mesure | string | passages (défaut) ou nouveaux_clients (inscriptions à la carte). |
| periode | string | Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_90_jours. |
Change un ou plusieurs réglages de la carte de fidélité du commerce, en un seul appel : nom imprimé, style (collection, palette ou couleur libre), tampon, règle de récompense (mode tampons/paliers/points, seuils, récompenses), tampons offerts à l’inscription, expiration des récompenses, en mode paliers la forme de la carte (forme_paliers : tampons ou l’une des cinq formes), et en mode points le nom des points, la forme de la carte (forme_points), la valeur par défaut d’un passage, les raccourcis et les points par euro. Seuls les réglages donnés changent ; lire d’abord la carte avec voir_carte. Appeler avec confirmer=false (défaut) pour montrer l’avant/après, puis avec confirmer=true après accord explicite. Un changement de règle s’applique aussi aux cartes déjà chez les clients. Les images (logo, fond, tampon en image) se changent dans l’application, page Carte.
| Argument | Type | Description |
|---|---|---|
| nom | string | Nom du commerce, imprimé en haut de la carte. |
| mode | string | tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables). |
| tampon | string | Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion. |
Change le texte ou le rythme d’un message récurrent (id donné par lister_messages_recurrents). Seuls les champs donnés changent ; sans_fin=true retire la fin. Règles : un message par jour (un jour où un autre message part déjà, l’occurrence est sautée), jours de fermeture et congés sautés (ou décalés au jour ouvert suivant avec si_ferme=decaler), heures calmes respectées, premier envoi dans les 60 jours. confirmer=false (défaut) rend un aperçu ; confirmer=true l’exécute, après l’accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| id* | integer | La règle visée, donnée par lister_messages_recurrents. |
| fin | string | Dernier jour possible, inclus (AAAA-MM-JJ). Facultatif. |
| rang | string | Pour frequence=mois : « premier » lundi, …, « dernier » vendredi du mois (avec jour_rang). |
| debut | string | Premier jour possible (AAAA-MM-JJ). Par défaut aujourd’hui. |
| heure | string | L’heure du commerce, HH:MM, entre 07:00 et 21:45. |
| jours | array | Pour frequence=semaine : les jours d’envoi. |
| texte | string | Le texte exact de la notification, 180 caractères au plus. |
Programme un message qui se répète tout seul sur l’écran verrouillé des clients : chaque semaine (un ou plusieurs jours), ou chaque mois (tel jour du mois, ou « le premier lundi », « le dernier vendredi »), à une heure du commerce entre 7 h et 21 h 45. Exemples : « chaque mardi 11 h, l’emplacement du food truck », « le 1er de chaque mois, aux anniversaires du mois ». Le groupe visé se recalcule à chaque envoi. Fin facultative : une date, ou un nombre d’envois. Règles : un message par jour (un jour où un autre message part déjà, l’occurrence est sautée), jours de fermeture et congés sautés (ou décalés au jour ouvert suivant avec si_ferme=decaler), heures calmes respectées, premier envoi dans les 60 jours. confirmer=false (défaut) rend un aperçu ; confirmer=true l’exécute, après l’accord explicite de la personne. Pour un envoi unique et immédiat, utiliser envoyer_message.
| Argument | Type | Description |
|---|---|---|
| fin | string | Dernier jour possible, inclus (AAAA-MM-JJ). Facultatif. |
| rang | string | Pour frequence=mois : « premier » lundi, …, « dernier » vendredi du mois (avec jour_rang). |
| debut | string | Premier jour possible (AAAA-MM-JJ). Par défaut aujourd’hui. |
| heure | string | L’heure du commerce, HH:MM, entre 07:00 et 21:45. |
| jours | array | Pour frequence=semaine : les jours d’envoi. |
| texte* |
Lit et règle les messages que StampyWallet envoie tout seul aux clients : la relance des habitués qui ne viennent plus (quand leur absence dépasse une fois et demie leur rythme habituel, ou, sans assez d’historique, le délai du commerce, proposé selon son métier et réglable), le message d’anniversaire, les rappels « plus qu’un tampon » et « récompense prête » (et leur délai), les heures calmes pendant lesquelles rien ne part ; montre aussi le bilan du lundi envoyé au commerçant. Sans paramètre de changement : rend l’état actuel, textes compris. Avec des changements : confirmer=false rend un aperçu avant → après sans rien modifier, confirmer=true enregistre. Seuls les champs fournis changent. Pour un message ponctuel, utiliser envoyer_message.
| Argument | Type | Description |
|---|---|---|
| effacer | array | Textes à effacer. texte_relance revient au texte par défaut ; texte_anniversaire vide coupe de fait les envois d’anniversaire ; delai_relance revient au délai proposé pour le métier. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| canal_avis | string | Canal de « demande d’avis » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord), email (e-mail si la notification ne porte pas). |
| reserve_sms | integer | Part du budget SMS mensuel gardée pour les messages importants, en % : 0, 25, 50, 75, 100. |
Remplace les jours fermés chaque semaine (par exemple fermé le dimanche et le lundi). Les jours fermés ne comptent pas dans l’absence d’un client : des congés bien déclarés évitent que des habitués passent pour « perdus de vue » et reçoivent une relance au retour. En option, prevenir_clients=true avec un texte prépare aussi une notification à tous les clients (mêmes règles qu’envoyer_message : un message par jour). confirmer=false (défaut) rend un aperçu ; confirmer=true enregistre (et envoie le message s’il est demandé), après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| texte | string | Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| jours_fermes* | array | La liste COMPLÈTE des jours fermés chaque semaine (liste vide = ouvert tous les jours). |
| prevenir_clients | boolean | true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour. |
{
"type": "object",
"required": [
"jours_fermes"
],
"properties": {
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"jours_fermes": {
"type": "array",
"items": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi"
],
"type": "string"
},
"maxItems": 7,
"description": "La liste COMPLÈTE des jours fermés chaque semaine (liste vide = ouvert tous les jours)."
},
"prevenir_clients": {
"type": "boolean",
"default": false,
"description": "true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour."
}
},
"additionalProperties": false
}Dit si la carte de fidélité rapporte, sur une période au choix : part des clients qui reviennent, passages de retour et ce qu’ils représentent en euros (estimation : passages × panier moyen), rythme médian entre deux visites, récompenses offertes et leur coût si on le donne, récompenses encore à servir, et résultat de la relance automatique. Le panier moyen et le coût d’une récompense peuvent être ajustés pour refaire le calcul. À utiliser pour « est-ce que ça vaut le coup ? », « ça me rapporte combien ? », « mes clients reviennent-ils ? ». Pour les chiffres bruts d’une période, tableau_de_bord.
| Argument | Type | Description |
|---|---|---|
| au | string | Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui. |
| du | string | Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee ». |
| periode | string | Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_90_jours. |
| comparer | boolean | Ajoute la période de même durée juste avant, pour voir si ça progresse. |
| panier_moyen | number | Panier moyen en euros pour ce calcul. Défaut : celui déclaré dans les réglages du commerce. |
| cout_recompense | number | Ce que coûte UNE récompense au commerçant (prix de revient), en euros. Sans lui, le coût des récompenses n’est pas chiffré. |
Relance un message récurrent en pause, à partir d’aujourd’hui, sans rattraper les jours de la pause. confirmer=false (défaut) rend un aperçu ; confirmer=true l’exécute, après l’accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| id* | integer | La règle visée, donnée par lister_messages_recurrents. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "La règle visée, donnée par lister_messages_recurrents."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
}
},
"additionalProperties": false
}Retire l’accès d’un membre au commerce et ferme ses sessions ouvertes. Les tampons qu’il a posés restent dans l’historique. Réservé au propriétaire. confirmer=false (défaut) rend un aperçu ; confirmer=true agit, après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| string | Ou l’e-mail du membre, à la place de membre_id. | |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| membre_id | string | Identifiant du membre, lu avec lister_equipe. |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"description": "Ou l’e-mail du membre, à la place de membre_id."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"membre_id": {
"type": "string",
"maxLength": 36,
"description": "Identifiant du membre, lu avec lister_equipe."
}
},
"additionalProperties": false
}Estime ce que coûte une carte de fidélité à tampons (la récompense rapportée au panier) et combien de visites en plus la rentabilisent. À utiliser pour choisir une récompense et un nombre de passages, ou quand quelqu’un se demande si une carte vaut le coup. Sans compte.
| Argument | Type | Description |
|---|---|---|
| marge | number | Marge brute sur un panier, en pourcentage (défaut 65 %, typique en restauration et services). |
| tampons* | integer | Passages pour obtenir la récompense. |
| comparer | array | Autres nombres de passages à comparer (ex. [6, 10, 12]). |
| panier_moyen* | number | Dépense moyenne d’un client par passage, en euros. |
| clients_fideles | integer | Clients qui prendraient la carte chaque mois (défaut 60). |
| cout_recompense* | number | Ce que coûte la récompense AU COMMERÇANT (prix de revient, pas prix de vente), en euros. |
| visites_par_mois | number | Visites par mois d’un client fidèle aujourd’hui (défaut 2). |
Supprime une période de fermeture par son id (donné par lister_fermetures). En option, prevenir_clients=true avec un texte prépare aussi une notification à tous les clients (mêmes règles qu’envoyer_message : un message par jour). confirmer=false (défaut) rend un aperçu ; confirmer=true enregistre (et envoie le message s’il est demandé), après accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| id* | string | Identifiant de la période à supprimer (donné par lister_fermetures). |
| texte | string | Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| prevenir_clients | boolean | true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Identifiant de la période à supprimer (donné par lister_fermetures)."
},
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Texte de la notification aux clients (180 caractères au plus), si prevenir_clients=true."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"prevenir_clients": {
"type": "boolean",
"default": false,
"description": "true : envoie aussi une notification à tous les clients avec texte. Compte comme le message du jour."
}
},
"additionalProperties": false
}Met en pause un message récurrent actif : plus rien ne part jusqu’à reprendre_message_recurrent. confirmer=false (défaut) rend un aperçu ; confirmer=true l’exécute, après l’accord explicite de la personne.
| Argument | Type | Description |
|---|---|---|
| id* | integer | La règle visée, donnée par lister_messages_recurrents. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "La règle visée, donnée par lister_messages_recurrents."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
}
},
"additionalProperties": false
}Les chiffres de fidélité du commerce sur une période au choix : passages en caisse, clients venus, nouveaux clients, taux de retour, récompenses gagnées et offertes, chiffre estimé, avec une courbe par jour, semaine ou mois et, au besoin, la comparaison avec la période précédente de même durée. À utiliser pour « comment ça marche ce mois-ci ? », « combien de clients en août ? », « est-ce que ça monte ? ». Pour la liste des clients, utiliser chercher_clients ; pour savoir si la carte rapporte, rentabilite.
| Argument | Type | Description |
|---|---|---|
| au | string | Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui. |
| du | string | Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee ». |
| courbe | string | Ce que trace la courbe. Défaut passages. |
| periode | string | Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_30_jours. |
| comparer | boolean | Ajoute la variation par rapport à la période de même durée juste avant (ex. 30 jours avant les 30 derniers jours). |
| granularite | string | Pas de la courbe. auto (défaut) : jour jusqu’à 2 mois, semaine jusqu’à ~9 mois, mois au-delà. |
Montre la carte de fidélité du commerce telle que les clients la voient dans Apple Wallet et Google Wallet, avec ses règles actuelles : mode (tampons, paliers ou points), récompenses et seuils, tampons offerts à l’inscription, expiration des récompenses, réglages des points, style, couleur, tampon, et le lien public d’inscription des clients. À utiliser avant toute modification (modifier_carte reprend les mêmes noms de réglages), ou quand le commerçant demande à quoi ressemble sa carte ou quelle est sa règle. Lecture seule.
| Argument | Type | Description |
|---|---|---|
| qr | boolean | true : joint le QR d’inscription des clients (celui de l’affichette), pour essayer la carte sur son téléphone. |
| variantes | boolean | true : montre aussi les trois palettes de la collection actuelle, pour proposer un changement de couleur (à passer ensuite en « palette » à modifier_carte). |
| tampons_poses | integer | Tampons (ou points) posés sur l’aperçu, pour montrer une carte en cours (défaut : tampons de bienvenue + 2). |
{
"type": "object",
"properties": {
"qr": {
"type": "boolean",
"default": false,
"description": "true : joint le QR d’inscription des clients (celui de l’affichette), pour essayer la carte sur son téléphone."
},
"variantes": {
"type": "boolean",
"default": false,
"description": "true : montre aussi les trois palettes de la collection actuelle, pour proposer un changement de couleur (à passer ensuite en « palette » à modifier_carte)."
},
"tampons_poses": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Tampons (ou points) posés sur l’aperçu, pour montrer une carte en cours (défaut : tampons de bienvenue + 2)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
| boolean |
| true : retire le lien de la fiche (coupe de fait toutes les demandes). |
| delai_minutes | integer | Délai entre le passage et la demande, en minutes : 0, 30, 60, 180, 1440 (1440 = le lendemain). |
| texte_demande | string | Texte de la demande, 300 caractères au plus. Le lien vers la fiche Google est ajouté après. |
| demande_active | boolean | Envoyer ou non la demande d’avis aux clients. |
{
"type": "object",
"properties": {
"lien": {
"type": "string",
"maxLength": 2000,
"description": "Lien « écrire un avis » de la fiche Google (g.page/r/…/review, search.google.com/local/writereview?placeid=…). Sans lui, aucune demande ne part."
},
"moment": {
"enum": [
"recompense",
"passages"
],
"type": "string",
"description": "Quand demander : recompense = à la première récompense ; passages = après N passages (voir passages)."
},
"effacer": {
"type": "array",
"items": {
"enum": [
"texte_demande"
],
"type": "string"
},
"description": "Champs texte à vider. texte_demande revient au texte par défaut."
},
"passages": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Nombre de passages avant la demande, si moment=passages."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"retirer_lien": {
"type": "boolean",
"description": "true : retire le lien de la fiche (coupe de fait toutes les demandes)."
},
"delai_minutes": {
"type": "integer",
"description": "Délai entre le passage et la demande, en minutes : 0, 30, 60, 180, 1440 (1440 = le lendemain)."
},
"texte_demande": {
"type": "string",
"maxLength": 300,
"minLength": 1,
"description": "Texte de la demande, 300 caractères au plus. Le lien vers la fiche Google est ajouté après."
},
"demande_active": {
"type": "boolean",
"description": "Envoyer ou non la demande d’avis aux clients."
}
},
"additionalProperties": false
}| decalage | integer | Nombre de résultats à sauter (pagination). |
| recherche | string | Morceau du prénom ou du nom (accents et casse ignorés). |
| tampons_max | integer | Tampons au plus sur la carte en cours. |
| tampons_min | integer | Tampons au moins sur la carte en cours. |
| visites_max | integer | Passages au plus depuis l’inscription. |
| visites_min | integer | Passages au moins depuis l’inscription (tampons de bienvenue exclus). |
| inscrit_avant | string | Inscrit ce jour-là ou avant (AAAA-MM-JJ). |
| inscrit_depuis | string | Inscrit ce jour-là ou après (AAAA-MM-JJ). |
| actif_depuis_jours | integer | Au moins un passage dans les N derniers jours. |
| inactif_depuis_jours | integer | Aucun passage depuis au moins N jours calendaires (un client jamais venu compte depuis son inscription). |
| derniere_visite_avant | string | Dernier passage ce jour-là ou avant (AAAA-MM-JJ). Exclut ceux jamais venus. |
| derniere_visite_depuis | string | Dernier passage ce jour-là ou après (AAAA-MM-JJ). |
{
"type": "object",
"properties": {
"tri": {
"enum": [
"derniere_visite",
"visites",
"visites_90j",
"tampons",
"recompenses",
"inscription",
"prenom"
],
"type": "string",
"default": "derniere_visite",
"description": "Ordre des résultats. Défaut derniere_visite (les plus récents d’abord)."
},
"ordre": {
"enum": [
"auto",
"asc",
"desc"
],
"type": "string",
"default": "auto",
"description": "auto (défaut) : décroissant, sauf prenom (A→Z)."
},
"limite": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "Nombre maximum de résultats."
},
"wallet": {
"enum": [
"tous",
"apple",
"google",
"aucun"
],
"type": "string",
"default": "tous",
"description": "Où le client garde sa carte. aucun = page web, sans wallet."
},
"segment": {
"enum": [
"tous",
"habitues",
"perdus",
"presque",
"recompense_prete",
"nouveaux",
"inactifs",
"un_seul_passage"
],
"type": "string",
"default": "tous",
"description": "Groupe de départ, défini comme dans l’application. tous (défaut) ; habitues = au moins 4 passages sur les 60 derniers jours ; perdus = venus au moins 4 fois, et absents depuis plus d’une fois et demie leur rythme habituel (médiane des écarts entre leurs passages), ou, sans assez d’historique, depuis plus de le délai du commerce ; congés et jours de fermeture non comptés ; presque = il ne leur manque qu’un tampon pour la récompense ; recompense_prete = une récompense gagnée, pas encore offerte, pas expirée ; nouveaux = inscrits dans les 30 derniers jours ; inactifs = aucun passage depuis plus de le délai du commerce, en jours calendaires, quel que soit leur nombre de visites ; un_seul_passage = un passage au plus : inscrits mais jamais revenus."
},
"decalage": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Nombre de résultats à sauter (pagination)."
},
"recherche": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Morceau du prénom ou du nom (accents et casse ignorés)."
},
"tampons_max": {
"type": "integer",
"minimum": 0,
"description": "Tampons au plus sur la carte en cours."
},
"tampons_min": {
"type": "integer",
"minimum": 0,
"description": "Tampons au moins sur la carte en cours."
},
"visites_max": {
"type": "integer",
"minimum": 0,
"description": "Passages au plus depuis l’inscription."
},
"visites_min": {
"type": "integer",
"minimum": 0,
"description": "Passages au moins depuis l’inscription (tampons de bienvenue exclus)."
},
"inscrit_avant": {
"type": "string",
"format": "date",
"description": "Inscrit ce jour-là ou avant (AAAA-MM-JJ)."
},
"inscrit_depuis": {
"type": "string",
"format": "date",
"description": "Inscrit ce jour-là ou après (AAAA-MM-JJ)."
},
"actif_depuis_jours": {
"type": "integer",
"maximum": 3650,
"minimum": 1,
"description": "Au moins un passage dans les N derniers jours."
},
"inactif_depuis_jours": {
"type": "integer",
"maximum": 3650,
"minimum": 1,
"description": "Aucun passage depuis au moins N jours calendaires (un client jamais venu compte depuis son inscription)."
},
"derniere_visite_avant": {
"type": "string",
"format": "date",
"description": "Dernier passage ce jour-là ou avant (AAAA-MM-JJ). Exclut ceux jamais venus."
},
"derniere_visite_depuis": {
"type": "string",
"format": "date",
"description": "Dernier passage ce jour-là ou après (AAAA-MM-JJ)."
}
},
"additionalProperties": false
}| accent | string | Couleur d’accent : les tampons posés, les jauges, les étiquettes, en hexadécimal (défaut : tirée de la collection). |
| metier | string | Type de commerce. Choisit un style, un tampon et une récompense de départ adaptés quand ils ne sont pas précisés. ongles : ongles et cils ; institut : esthétique ; barbier : barbiers et coiffeurs ; patisserie : pâtisserie et chocolaterie ; snack : kebab, burger ; sushi : sushi et poke ; vrac : épicerie vrac ; cordonnerie : cordonnerie et clés ; lavage : lavage auto ; toilettage : toilettage d’animaux ; sport : salle de sport ; loisirs : escape game, bowling, laser game. « autre » : tout ce qui n’a pas son métier. |
| tampon | string | Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion. |
| couleur | string | Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible. |
| palette | integer | Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée. |
| paliers | array | Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand. |
| tampons | integer | Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30. |
| logo_url | string | Logo du commerce, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus) : sa photo de profil Instagram fait l’affaire. Détouré quand c’est possible, posé en haut de la carte ; sans couleur, palette, encre ni accent donnés, la carte prend les couleurs du logo. |
| variantes | boolean | true : rend aussi les trois palettes de la collection choisie, pour proposer un choix. |
| collection | string | Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc). |
| recompense | string | La récompense (mode tampons). Ignorée si « paliers » est donné. |
| forme_points | string | Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte. |
| forme_paliers | string | Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte. |
| tampons_poses | integer | Tampons déjà posés sur l’aperçu, pour montrer une carte en cours (défaut : tampons de bienvenue + 2). |
| nom_des_points | string | Mode points : comment s’appellent les points (« points », « graines », « étoiles »…). |
| tampons_bienvenue | integer | Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie. |
{
"type": "object",
"properties": {
"nom": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Nom du commerce, imprimé en haut de la carte."
},
"mode": {
"enum": [
"tampons",
"paliers",
"points"
],
"type": "string",
"description": "tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables)."
},
"encre": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#1f1a14"
],
"description": "Couleur du texte de la carte, en hexadécimal (défaut : choisie pour rester lisible sur le fond)."
},
"forme": {
"enum": [
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau",
"grille",
"libre",
"objets",
"cercles"
],
"type": "string",
"description": "Le dessin de la carte, en un mot (remplace forme_points et forme_paliers). Modes points et paliers : medailles (une jauge et une grande médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S, chaque passage fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Modes tampons et paliers : la disposition des tampons, grille (défaut), libre (semés), objets (gros objets ombrés, idéal avec une photo), cercles. En paliers, une disposition garde les tampons et pose chaque récompense à la place du tampon de son seuil. Une des cinq formes sans mode donné passe la carte en mode paliers."
},
"accent": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#c2185b"
],
"description": "Couleur d’accent : les tampons posés, les jauges, les étiquettes, en hexadécimal (défaut : tirée de la collection)."
},
"metier": {
"enum": [
"cafe",
"boulangerie",
"patisserie",
"glacier",
"restaurant",
"creperie",
"sushi",
"snack",
"foodtruck",
"boucherie",
"fromagerie",
"primeur",
"vrac",
"ongles",
"institut",
"barbier",
"boutique",
"fleuriste",
"librairie",
"animalerie",
"pressing",
"cordonnerie",
"laverie",
"lavage",
"toilettage",
"sport",
"escalade",
"loisirs",
"autre"
],
"type": "string",
"description": "Type de commerce. Choisit un style, un tampon et une récompense de départ adaptés quand ils ne sont pas précisés. ongles : ongles et cils ; institut : esthétique ; barbier : barbiers et coiffeurs ; patisserie : pâtisserie et chocolaterie ; snack : kebab, burger ; sushi : sushi et poke ; vrac : épicerie vrac ; cordonnerie : cordonnerie et clés ; lavage : lavage auto ; toilettage : toilettage d’animaux ; sport : salle de sport ; loisirs : escape game, bowling, laser game. « autre » : tout ce qui n’a pas son métier."
},
"tampon": {
"enum": [
"rond",
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion."
},
"couleur": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#2b4431"
],
"description": "Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible."
},
"palette": {
"type": "integer",
"maximum": 3,
"minimum": 0,
"description": "Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée."
},
"paliers": {
"type": "array",
"items": {
"type": "object",
"required": [
"a",
"recompense"
],
"properties": {
"a": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Seuil : nombre de tampons (ou de points en mode points) pour obtenir ce palier."
},
"icone": {
"enum": [
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Icône du palier (défaut : cadeau)."
},
"image_url": {
"type": "string",
"pattern": "^https://\\S+$",
"examples": [
"https://exemple.com/croissant.jpg"
],
"maxLength": 2000,
"description": "Photo de la récompense, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus, 64 px de côté au moins). Détourée quand c’est possible, elle prend la place de l’icône sur la carte : en gris avant d’être gagnée, en couleur après. Dessinée en modes paliers et points."
},
"recompense": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Ce que le client reçoit, tel qu’imprimé sur la carte. Ex. « Un café offert »."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand."
},
"tampons": {
"type": "integer",
"maximum": 30,
"minimum": 2,
"description": "Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30."
},
"logo_url": {
"type": "string",
"pattern": "^https://\\S+$",
"examples": [
"https://exemple.com/logo.png"
],
"maxLength": 2000,
"description": "Logo du commerce, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus) : sa photo de profil Instagram fait l’affaire. Détouré quand c’est possible, posé en haut de la carte ; sans couleur, palette, encre ni accent donnés, la carte prend les couleurs du logo."
},
"variantes": {
"type": "boolean",
"default": false,
"description": "true : rend aussi les trois palettes de la collection choisie, pour proposer un choix."
},
"collection": {
"enum": [
"original",
"cafe",
"botanique",
"trattoria",
"atelier",
"pass"
],
"type": "string",
"description": "Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc)."
},
"recompense": {
"type": "string",
"maxLength": 120,
"description": "La récompense (mode tampons). Ignorée si « paliers » est donné."
},
"forme_points": {
"enum": [
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte."
},
"forme_paliers": {
"enum": [
"tampons",
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte."
},
"tampons_poses": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Tampons déjà posés sur l’aperçu, pour montrer une carte en cours (défaut : tampons de bienvenue + 2)."
},
"nom_des_points": {
"type": "string",
"maxLength": 20,
"description": "Mode points : comment s’appellent les points (« points », « graines », « étoiles »…)."
},
"tampons_bienvenue": {
"type": "integer",
"maximum": 5,
"minimum": 0,
"description": "Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie."
}
},
"additionalProperties": false
}| accent | string | Couleur d’accent : les tampons posés, les jauges, les étiquettes, en hexadécimal (défaut : tirée de la collection). |
| langue | string | Langue des textes rendus. Par défaut, celle du commerce. |
| metier | string | Type de commerce. Choisit un style, un tampon et une récompense de départ adaptés quand ils ne sont pas précisés. ongles : ongles et cils ; institut : esthétique ; barbier : barbiers et coiffeurs ; patisserie : pâtisserie et chocolaterie ; snack : kebab, burger ; sushi : sushi et poke ; vrac : épicerie vrac ; cordonnerie : cordonnerie et clés ; lavage : lavage auto ; toilettage : toilettage d’animaux ; sport : salle de sport ; loisirs : escape game, bowling, laser game. « autre » : tout ce qui n’a pas son métier. |
| tampon | string | Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion. |
| couleur | string | Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible. |
| palette | integer | Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée. |
| paliers | array | Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand. |
| tampons | integer | Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30. |
| logo_url | string | Logo du commerce, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus) : sa photo de profil Instagram fait l’affaire. Détouré quand c’est possible, posé en haut de la carte ; sans couleur, palette, encre ni accent donnés, la carte prend les couleurs du logo. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| collection | string | Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc). |
| recompense | string | La récompense (mode tampons). Ignorée si « paliers » est donné. |
| forme_points | string | Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte. |
| panier_moyen | number | Dépense moyenne d’un client, en euros (sert aux estimations du tableau de bord). |
| forme_paliers | string | Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte. |
| nom_des_points | string | Mode points : comment s’appellent les points (« points », « graines », « étoiles »…). |
| tampons_bienvenue | integer | Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie. |
{
"type": "object",
"required": [
"nom"
],
"properties": {
"nom": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Nom du commerce, imprimé en haut de la carte."
},
"mode": {
"enum": [
"tampons",
"paliers",
"points"
],
"type": "string",
"description": "tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables)."
},
"encre": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#1f1a14"
],
"description": "Couleur du texte de la carte, en hexadécimal (défaut : choisie pour rester lisible sur le fond)."
},
"forme": {
"enum": [
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau",
"grille",
"libre",
"objets",
"cercles"
],
"type": "string",
"description": "Le dessin de la carte, en un mot (remplace forme_points et forme_paliers). Modes points et paliers : medailles (une jauge et une grande médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S, chaque passage fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Modes tampons et paliers : la disposition des tampons, grille (défaut), libre (semés), objets (gros objets ombrés, idéal avec une photo), cercles. En paliers, une disposition garde les tampons et pose chaque récompense à la place du tampon de son seuil. Une des cinq formes sans mode donné passe la carte en mode paliers."
},
"accent": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#c2185b"
],
"description": "Couleur d’accent : les tampons posés, les jauges, les étiquettes, en hexadécimal (défaut : tirée de la collection)."
},
"langue": {
"enum": [
"fr",
"en",
"es"
],
"type": "string",
"description": "Langue des textes rendus. Par défaut, celle du commerce."
},
"metier": {
"enum": [
"cafe",
"boulangerie",
"patisserie",
"glacier",
"restaurant",
"creperie",
"sushi",
"snack",
"foodtruck",
"boucherie",
"fromagerie",
"primeur",
"vrac",
"ongles",
"institut",
"barbier",
"boutique",
"fleuriste",
"librairie",
"animalerie",
"pressing",
"cordonnerie",
"laverie",
"lavage",
"toilettage",
"sport",
"escalade",
"loisirs",
"autre"
],
"type": "string",
"description": "Type de commerce. Choisit un style, un tampon et une récompense de départ adaptés quand ils ne sont pas précisés. ongles : ongles et cils ; institut : esthétique ; barbier : barbiers et coiffeurs ; patisserie : pâtisserie et chocolaterie ; snack : kebab, burger ; sushi : sushi et poke ; vrac : épicerie vrac ; cordonnerie : cordonnerie et clés ; lavage : lavage auto ; toilettage : toilettage d’animaux ; sport : salle de sport ; loisirs : escape game, bowling, laser game. « autre » : tout ce qui n’a pas son métier."
},
"tampon": {
"enum": [
"rond",
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion."
},
"couleur": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#2b4431"
],
"description": "Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible."
},
"palette": {
"type": "integer",
"maximum": 3,
"minimum": 0,
"description": "Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée."
},
"paliers": {
"type": "array",
"items": {
"type": "object",
"required": [
"a",
"recompense"
],
"properties": {
"a": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Seuil : nombre de tampons (ou de points en mode points) pour obtenir ce palier."
},
"icone": {
"enum": [
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Icône du palier (défaut : cadeau)."
},
"image_url": {
"type": "string",
"pattern": "^https://\\S+$",
"examples": [
"https://exemple.com/croissant.jpg"
],
"maxLength": 2000,
"description": "Photo de la récompense, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus, 64 px de côté au moins). Détourée quand c’est possible, elle prend la place de l’icône sur la carte : en gris avant d’être gagnée, en couleur après. Dessinée en modes paliers et points."
},
"recompense": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Ce que le client reçoit, tel qu’imprimé sur la carte. Ex. « Un café offert »."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand."
},
"tampons": {
"type": "integer",
"maximum": 30,
"minimum": 2,
"description": "Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30."
},
"logo_url": {
"type": "string",
"pattern": "^https://\\S+$",
"examples": [
"https://exemple.com/logo.png"
],
"maxLength": 2000,
"description": "Logo du commerce, par son adresse https (PNG, JPEG ou WebP, 5 Mo au plus) : sa photo de profil Instagram fait l’affaire. Détouré quand c’est possible, posé en haut de la carte ; sans couleur, palette, encre ni accent donnés, la carte prend les couleurs du logo."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"collection": {
"enum": [
"original",
"cafe",
"botanique",
"trattoria",
"atelier",
"pass"
],
"type": "string",
"description": "Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc)."
},
"recompense": {
"type": "string",
"maxLength": 120,
"description": "La récompense (mode tampons). Ignorée si « paliers » est donné."
},
"forme_points": {
"enum": [
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte."
},
"panier_moyen": {
"type": "number",
"maximum": 10000,
"minimum": 0.5,
"description": "Dépense moyenne d’un client, en euros (sert aux estimations du tableau de bord)."
},
"forme_paliers": {
"enum": [
"tampons",
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte."
},
"nom_des_points": {
"type": "string",
"maxLength": 20,
"description": "Mode points : comment s’appellent les points (« points », « graines », « étoiles »…)."
},
"tampons_bienvenue": {
"type": "integer",
"maximum": 5,
"minimum": 0,
"description": "Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie."
}
},
"additionalProperties": false
}| audience | string | Qui reçoit le message. tous = tous les clients ; habitues = 4 passages ou plus sur 60 jours ; perdus = habitués dont l’absence dépasse une fois et demie leur rythme habituel, ou le délai du commerce sans assez d’historique (la définition de l’écran Clients) ; presque = il ne manque qu’un tampon avant la récompense ; nouveaux = inscrits depuis 30 jours (ou depuis inscrit_depuis) ; recompense_prete = une récompense gagnée, pas encore retirée ; inactifs = tout client sans passage depuis inactif_depuis_jours jours d’ouverture (par défaut le délai du commerce), habitué ou non. Toute audience autre que tous, ou tout filtre, demande la fonction « notifications ciblées ». |
| aussi_sms | boolean | Avec client_id : aussi par SMS (formule Croissance, budget du mois, entre 8 h et 20 h, sinon à l’ouverture). Défaut false. |
| client_id | string | Identifiant (UUID) d’UN client, rendu par chercher_clients ou fiche_client : le message part à lui seul. Exclut audience et filtres. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| aussi_email | boolean | Avec client_id : aussi par e-mail, si le client en a laissé un. Défaut false. |
| tampons_max | integer | Filtre : au plus N tampons sur la carte en cours. |
| tampons_min | integer | Filtre : au moins N tampons sur la carte en cours. |
| passages_min | integer | Filtre : au moins N passages au total depuis l’inscription. |
| inscrit_avant | string | Filtre : inscrits avant ce jour-là (AAAA-MM-JJ, exclu). |
| inscrit_depuis | string | Filtre : inscrits ce jour-là ou après (AAAA-MM-JJ). |
| actif_depuis_jours | integer | Filtre : au moins un passage dans les N derniers jours d’ouverture. |
| inactif_depuis_jours | integer | Filtre : pas de passage depuis au moins N jours d’OUVERTURE (les jours fermés et les congés ne comptent pas). |
{
"type": "object",
"properties": {
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Le texte exact de la notification, 180 caractères au plus. Il est précédé du nom du commerce sur le téléphone : inutile de le répéter. Obligatoire sans client_id ; avec client_id, seulement pour modele=libre."
},
"langue": {
"enum": [
"fr",
"en",
"es"
],
"type": "string",
"description": "Avec client_id et un modèle : la langue du texte prêt. Par défaut, celle du commerce."
},
"modele": {
"enum": [
"pret",
"retrait",
"recu",
"attente",
"libre"
],
"type": "string",
"description": "Avec client_id : pret = « Votre commande est prête… », retrait = « Votre article est prêt à être retiré… », recu = « Nous avons bien reçu votre commande… », attente = « Votre commande vous attend toujours… », libre = le texte donné. Par défaut : libre si texte est donné."
},
"audience": {
"enum": [
"tous",
"habitues",
"perdus",
"presque",
"nouveaux",
"recompense_prete",
"inactifs"
],
"type": "string",
"default": "tous",
"description": "Qui reçoit le message. tous = tous les clients ; habitues = 4 passages ou plus sur 60 jours ; perdus = habitués dont l’absence dépasse une fois et demie leur rythme habituel, ou le délai du commerce sans assez d’historique (la définition de l’écran Clients) ; presque = il ne manque qu’un tampon avant la récompense ; nouveaux = inscrits depuis 30 jours (ou depuis inscrit_depuis) ; recompense_prete = une récompense gagnée, pas encore retirée ; inactifs = tout client sans passage depuis inactif_depuis_jours jours d’ouverture (par défaut le délai du commerce), habitué ou non. Toute audience autre que tous, ou tout filtre, demande la fonction « notifications ciblées »."
},
"aussi_sms": {
"type": "boolean",
"default": false,
"description": "Avec client_id : aussi par SMS (formule Croissance, budget du mois, entre 8 h et 20 h, sinon à l’ouverture). Défaut false."
},
"client_id": {
"type": "string",
"description": "Identifiant (UUID) d’UN client, rendu par chercher_clients ou fiche_client : le message part à lui seul. Exclut audience et filtres."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"aussi_email": {
"type": "boolean",
"default": false,
"description": "Avec client_id : aussi par e-mail, si le client en a laissé un. Défaut false."
},
"tampons_max": {
"type": "integer",
"maximum": 500,
"minimum": 0,
"description": "Filtre : au plus N tampons sur la carte en cours."
},
"tampons_min": {
"type": "integer",
"maximum": 500,
"minimum": 0,
"description": "Filtre : au moins N tampons sur la carte en cours."
},
"passages_min": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Filtre : au moins N passages au total depuis l’inscription."
},
"inscrit_avant": {
"type": "string",
"format": "date",
"description": "Filtre : inscrits avant ce jour-là (AAAA-MM-JJ, exclu)."
},
"inscrit_depuis": {
"type": "string",
"format": "date",
"description": "Filtre : inscrits ce jour-là ou après (AAAA-MM-JJ)."
},
"actif_depuis_jours": {
"type": "integer",
"maximum": 730,
"minimum": 1,
"description": "Filtre : au moins un passage dans les N derniers jours d’ouverture."
},
"inactif_depuis_jours": {
"type": "integer",
"maximum": 730,
"minimum": 1,
"description": "Filtre : pas de passage depuis au moins N jours d’OUVERTURE (les jours fermés et les congés ne comptent pas)."
}
},
"additionalProperties": false
}| Champs à vider. « lien » : l’adresse publique redevient l’identifiant technique (le lien reste réservé à ce commerce). |
| horaires | string | Horaires d’ouverture, en texte libre (ex. « Mar–sam 7 h–19 h »). |
| site_web | string | Site web ou page Instagram. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| telephone | string | Téléphone, au dos de la carte. |
| panier_moyen | number | Dépense moyenne d’un client par passage, en euros. |
| lieux_ajouter | array | Lieux à ajouter pour l’alerte de proximité (la carte se présente quand un client passe devant) : marché, emplacement d’un food truck… 10 lieux au plus en tout, adresse principale comprise. Chacun avec une adresse ou des coordonnées. |
| lieux_retirer | array | Lieux à retirer, par identifiant. « principal » retire seulement le point de l’adresse (il revient si l’adresse change). |
| lieux_modifier | array | Lieux à renommer, déplacer (adresse ou coordonnées) ou replanifier (jours, plage). Les jours donnés remplacent les anciens ; sans jours ni heures, le planning ne change pas. |
| message_bienvenue | string | Petit mot au dos de la carte, lu par le client en l’ajoutant. |
{
"type": "object",
"properties": {
"nom": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Nom du commerce (aussi imprimé sur la carte)."
},
"lien": {
"type": "string",
"maxLength": 120,
"description": "Lien public voulu, en clair (« Le Fournil de la Gare » devient « le-fournil-de-la-gare »), de 3 à 32 caractères. Un lien déjà pris par un autre commerce est refusé."
},
"langue": {
"enum": [
"fr",
"en",
"es"
],
"type": "string",
"description": "Langue du commerce : celle de la carte, des pages et des messages vus par les clients."
},
"metier": {
"enum": [
"cafe",
"boulangerie",
"patisserie",
"glacier",
"restaurant",
"creperie",
"sushi",
"snack",
"foodtruck",
"boucherie",
"fromagerie",
"primeur",
"vrac",
"ongles",
"institut",
"barbier",
"boutique",
"fleuriste",
"librairie",
"animalerie",
"pressing",
"cordonnerie",
"laverie",
"lavage",
"toilettage",
"sport",
"escalade",
"loisirs",
"autre"
],
"type": "string",
"description": "Type de commerce, l’un des métiers de l’inscription. « autre » : tout ce qui n’a pas son métier."
},
"adresse": {
"type": "string",
"maxLength": 160,
"description": "Adresse, au dos de la carte (160 caractères au plus)."
},
"effacer": {
"type": "array",
"items": {
"enum": [
"adresse",
"telephone",
"horaires",
"site_web",
"message_bienvenue",
"lien"
],
"type": "string"
},
"maxItems": 6,
"description": "Champs à vider. « lien » : l’adresse publique redevient l’identifiant technique (le lien reste réservé à ce commerce)."
},
"horaires": {
"type": "string",
"maxLength": 120,
"description": "Horaires d’ouverture, en texte libre (ex. « Mar–sam 7 h–19 h »)."
},
"site_web": {
"type": "string",
"maxLength": 160,
"description": "Site web ou page Instagram."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"telephone": {
"type": "string",
"maxLength": 30,
"description": "Téléphone, au dos de la carte."
},
"panier_moyen": {
"type": "number",
"maximum": 100000,
"minimum": 0.01,
"description": "Dépense moyenne d’un client par passage, en euros."
},
"lieux_ajouter": {
"type": "array",
"items": {
"type": "object",
"required": [
"nom"
],
"properties": {
"nom": {
"type": "string",
"maxLength": 40,
"description": "Nom court du lieu (« Boutique », « Marché du dimanche »), 40 caractères au plus."
},
"jours": {
"type": "array",
"items": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi",
"tous"
],
"type": "string"
},
"maxItems": 7,
"description": "Jours où le lieu est actif. Absent ou « tous » : tous les jours."
},
"adresse": {
"type": "string",
"maxLength": 160,
"description": "Adresse à chercher pour placer le point (géocodée par la Base Adresse Nationale ou OpenStreetMap ; l’aperçu montre ce qui a été trouvé)."
},
"heure_fin": {
"type": "string",
"pattern": "^\\d{1,2}[:h]\\d{2}$",
"examples": [
"14:00"
],
"description": "Fin de la plage horaire, « HH:MM »."
},
"coordonnees": {
"type": "string",
"maxLength": 400,
"description": "Ou des coordonnées « 45.7640, 4.8357 », ou un lien Google Maps / OpenStreetMap."
},
"heure_debut": {
"type": "string",
"pattern": "^\\d{1,2}[:h]\\d{2}$",
"examples": [
"11:30"
],
"description": "Début de la plage horaire, « HH:MM » (facultatif, écrit au dos de la carte : les téléphones n’allument un lieu que pour la journée)."
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Lieux à ajouter pour l’alerte de proximité (la carte se présente quand un client passe devant) : marché, emplacement d’un food truck… 10 lieux au plus en tout, adresse principale comprise. Chacun avec une adresse ou des coordonnées."
},
"lieux_retirer": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 10,
"description": "Lieux à retirer, par identifiant. « principal » retire seulement le point de l’adresse (il revient si l’adresse change)."
},
"lieux_modifier": {
"type": "array",
"items": {
"type": "object",
"required": [
"lieu"
],
"properties": {
"nom": {
"type": "string",
"maxLength": 40,
"description": "Nom court du lieu (« Boutique », « Marché du dimanche »), 40 caractères au plus."
},
"lieu": {
"type": "string",
"maxLength": 40,
"description": "Le lieu à modifier : son identifiant (rendu par la lecture de la fiche) ou « principal » (celui de l’adresse au dos de la carte)."
},
"jours": {
"type": "array",
"items": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi",
"tous"
],
"type": "string"
},
"maxItems": 7,
"description": "Jours où le lieu est actif. Absent ou « tous » : tous les jours."
},
"adresse": {
"type": "string",
"maxLength": 160,
"description": "Adresse à chercher pour placer le point (géocodée par la Base Adresse Nationale ou OpenStreetMap ; l’aperçu montre ce qui a été trouvé)."
},
"heure_fin": {
"type": "string",
"pattern": "^\\d{1,2}[:h]\\d{2}$",
"examples": [
"14:00"
],
"description": "Fin de la plage horaire, « HH:MM »."
},
"coordonnees": {
"type": "string",
"maxLength": 400,
"description": "Ou des coordonnées « 45.7640, 4.8357 », ou un lien Google Maps / OpenStreetMap."
},
"heure_debut": {
"type": "string",
"pattern": "^\\d{1,2}[:h]\\d{2}$",
"examples": [
"11:30"
],
"description": "Début de la plage horaire, « HH:MM » (facultatif, écrit au dos de la carte : les téléphones n’allument un lieu que pour la journée)."
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Lieux à renommer, déplacer (adresse ou coordonnées) ou replanifier (jours, plage). Les jours donnés remplacent les anciens ; sans jours ni heures, le planning ne change pas."
},
"message_bienvenue": {
"type": "string",
"maxLength": 180,
"description": "Petit mot au dos de la carte, lu par le client en l’ajoutant."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"au": {
"type": "string",
"format": "date",
"description": "Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui."
},
"du": {
"type": "string",
"format": "date",
"description": "Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee »."
},
"par": {
"enum": [
"jour_semaine",
"heure",
"creneau"
],
"type": "string",
"default": "jour_semaine",
"description": "jour_semaine (défaut) : moyenne par lundi, mardi… ; heure : total par heure de la journée ; creneau : les couples jour + heure les plus chargés."
},
"jours": {
"type": "array",
"items": {
"enum": [
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi",
"dimanche"
],
"type": "string"
},
"maxItems": 7,
"description": "Pour par=heure ou creneau : ne garder que ces jours de la semaine (ex. [\"samedi\"])."
},
"limite": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Pour par=creneau : nombre de créneaux rendus (défaut 10)."
},
"mesure": {
"enum": [
"passages",
"nouveaux_clients"
],
"type": "string",
"default": "passages",
"description": "passages (défaut) ou nouveaux_clients (inscriptions à la carte)."
},
"periode": {
"enum": [
"aujourdhui",
"hier",
"derniers_7_jours",
"derniers_30_jours",
"derniers_90_jours",
"derniers_12_mois",
"cette_semaine",
"semaine_derniere",
"ce_mois",
"mois_dernier",
"cette_annee",
"annee_derniere",
"depuis_le_debut",
"personnalisee"
],
"type": "string",
"default": "derniers_90_jours",
"description": "Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_90_jours."
}
},
"additionalProperties": false
}| couleur | string | Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible. |
| palette | integer | Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée. |
| paliers | array | Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand. |
| tampons | integer | Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| collection | string | Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc). |
| recompense | string | La récompense (mode tampons). Ignorée si « paliers » est donné. |
| forme_points | string | Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte. |
| forme_paliers | string | Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte. |
| nom_des_points | string | Mode points : comment s’appellent les points (« points », « graines », « étoiles »…). |
| points_par_euro | number | Mode points : points par euro dépensé, repère affiché au commerçant (ex. 1 ou 0,5). |
| points_par_defaut | integer | Mode points : points posés par défaut à chaque passage (1 à 100 000). |
| points_raccourcis | array | Mode points : les valeurs proposées d’un geste au scan (jusqu’à 6, triées et dédoublonnées). Ex. [1, 2, 5, 10]. |
| tampons_bienvenue | integer | Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie. |
| expiration_recompense_jours | integer | Jours pendant lesquels une récompense gagnée reste valable : 0, 30, 60, 90, 180, 365 (0 = n’expire pas). |
{
"type": "object",
"properties": {
"nom": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Nom du commerce, imprimé en haut de la carte."
},
"mode": {
"enum": [
"tampons",
"paliers",
"points"
],
"type": "string",
"description": "tampons : une récompense à un seuil (le plus simple). paliers : plusieurs récompenses sur la même carte (ex. 5 et 10). points : le commerçant saisit un nombre de points à chaque passage (paniers variables)."
},
"tampon": {
"enum": [
"rond",
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Le signe posé à chaque passage. « rond » : le point simple. Beauté : etincelle, eclat, goutte, main, pinceau, oeil, ciseaux, sechoir, fleur, lotus, coeur, etoile, diamant, couronne, soleil, lune, talon, robe, sac, serviette. Food : cafe, grain, the, cookie, gateau, pain, part, burger, glace, bol, plat, verre, biere, bulles, cocktail, cerises, orange, avocat, piment, oeuf, poisson, fromage, popcorn, couteau, carotte, bocal, esquimau. Divers : feuille, flamme, eclair, sourire, patte, chien, chat, cadeau, haltere, velo, livre, note, appareil, palette, dent, parapluie, ballon, tshirt, basket, tulipe, plante, os, cintre, lavelinge, voiture, cle, botte, montagne, trophee, des, camion."
},
"couleur": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"examples": [
"#2b4431"
],
"description": "Couleur de fond libre, en hexadécimal. L’encre (texte) est choisie automatiquement pour rester lisible."
},
"palette": {
"type": "integer",
"maximum": 3,
"minimum": 0,
"description": "Palette de la collection : 0, 1 ou 2 (chaque collection en propose trois ; pass en propose une quatrième, 3). Ignorée si « couleur » est donnée."
},
"paliers": {
"type": "array",
"items": {
"type": "object",
"required": [
"a",
"recompense"
],
"properties": {
"a": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Seuil : nombre de tampons (ou de points en mode points) pour obtenir ce palier."
},
"icone": {
"enum": [
"etincelle",
"eclat",
"goutte",
"main",
"pinceau",
"oeil",
"ciseaux",
"sechoir",
"fleur",
"lotus",
"coeur",
"etoile",
"diamant",
"couronne",
"soleil",
"lune",
"talon",
"robe",
"sac",
"serviette",
"cafe",
"grain",
"the",
"cookie",
"gateau",
"pain",
"part",
"burger",
"glace",
"bol",
"plat",
"verre",
"biere",
"bulles",
"cocktail",
"cerises",
"orange",
"avocat",
"piment",
"oeuf",
"poisson",
"fromage",
"popcorn",
"couteau",
"carotte",
"bocal",
"esquimau",
"feuille",
"flamme",
"eclair",
"sourire",
"patte",
"chien",
"chat",
"cadeau",
"haltere",
"velo",
"livre",
"note",
"appareil",
"palette",
"dent",
"parapluie",
"ballon",
"tshirt",
"basket",
"tulipe",
"plante",
"os",
"cintre",
"lavelinge",
"voiture",
"cle",
"botte",
"montagne",
"trophee",
"des",
"camion",
"croissant"
],
"type": "string",
"description": "Icône du palier (défaut : cadeau)."
},
"recompense": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Ce que le client reçoit, tel qu’imprimé sur la carte. Ex. « Un café offert »."
}
},
"additionalProperties": false
},
"maxItems": 6,
"minItems": 1,
"description": "Les récompenses et leurs seuils (modes paliers et points). Du plus petit au plus grand."
},
"tampons": {
"type": "integer",
"maximum": 30,
"minimum": 2,
"description": "Nombre de passages pour obtenir la récompense (mode tampons), de 2 à 30."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"collection": {
"enum": [
"original",
"cafe",
"botanique",
"trattoria",
"atelier",
"pass"
],
"type": "string",
"description": "Style de la carte : original (sobre), cafe (cadre fin), botanique (italique, feuillages), trattoria (festonné), atelier (moderne), pass (comme un pass Apple Wallet : logo en grand, tampons en objets ombrés, fond franc)."
},
"recompense": {
"type": "string",
"maxLength": 120,
"description": "La récompense (mode tampons). Ignorée si « paliers » est donné."
},
"forme_points": {
"enum": [
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode points : le dessin de la carte. medailles (défaut) : une jauge épaisse et une grande médaille par récompense. vitrine : les récompenses côte à côte, chacune sa petite jauge. remplissage : la prochaine récompense en grand, qui se colore à mesure. chemin : une route en S, les récompenses en étapes. anneau : une jauge ronde autour de la prochaine récompense, la liste à côté. Les photos des récompenses se déposent dans l’application, page Carte."
},
"forme_paliers": {
"enum": [
"tampons",
"medailles",
"vitrine",
"remplissage",
"chemin",
"anneau"
],
"type": "string",
"description": "Mode paliers : le dessin de la carte. tampons (défaut) : les tampons en grille, chaque récompense à la place du tampon de son seuil. Ou l’une des cinq formes des points, qui compte alors des tampons : medailles (une jauge et une médaille par récompense), vitrine (les récompenses côte à côte, chacune sa jauge), remplissage (la prochaine récompense en grand, qui se colore), chemin (une route en S où chaque tampon fait avancer le curseur), anneau (une jauge ronde autour de la prochaine récompense). Les photos des récompenses se déposent dans l’application, page Carte."
},
"nom_des_points": {
"type": "string",
"maxLength": 20,
"description": "Mode points : comment s’appellent les points (« points », « graines », « étoiles »…)."
},
"points_par_euro": {
"type": "number",
"maximum": 10000,
"minimum": 0.01,
"description": "Mode points : points par euro dépensé, repère affiché au commerçant (ex. 1 ou 0,5)."
},
"points_par_defaut": {
"type": "integer",
"maximum": 100000,
"minimum": 1,
"description": "Mode points : points posés par défaut à chaque passage (1 à 100 000)."
},
"points_raccourcis": {
"type": "array",
"items": {
"type": "integer",
"maximum": 100000,
"minimum": 1
},
"maxItems": 12,
"minItems": 1,
"description": "Mode points : les valeurs proposées d’un geste au scan (jusqu’à 6, triées et dédoublonnées). Ex. [1, 2, 5, 10]."
},
"tampons_bienvenue": {
"type": "integer",
"maximum": 5,
"minimum": 0,
"description": "Tampons offerts à l’inscription du client (0 à 5). 1 par défaut : une carte entamée donne envie d’être finie."
},
"expiration_recompense_jours": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Jours pendant lesquels une récompense gagnée reste valable : 0, 30, 60, 90, 180, 365 (0 = n’expire pas)."
}
},
"additionalProperties": false
}| nombre | integer | Ou : le nombre d’envois réellement partis après lequel la règle s’arrête. |
| sans_fin | boolean | Pour modifier : retirer la date de fin ou le nombre d’envois. |
| si_ferme | string | Un jour de fermeture ou de congés : sauter (défaut) ou décaler au jour ouvert suivant. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| frequence | string | semaine : avec jours. mois : avec jour_mois, ou rang et jour_rang. |
| jour_mois | integer | Pour frequence=mois : le jour du mois (1 à 31 ; un 31 tombe le dernier jour d’un mois plus court). |
| jour_rang | string | Le jour de la semaine qui va avec rang. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"description": "La règle visée, donnée par lister_messages_recurrents."
},
"fin": {
"type": "string",
"format": "date",
"description": "Dernier jour possible, inclus (AAAA-MM-JJ). Facultatif."
},
"rang": {
"enum": [
"premier",
"deuxieme",
"troisieme",
"quatrieme",
"dernier"
],
"type": "string",
"description": "Pour frequence=mois : « premier » lundi, …, « dernier » vendredi du mois (avec jour_rang)."
},
"debut": {
"type": "string",
"format": "date",
"description": "Premier jour possible (AAAA-MM-JJ). Par défaut aujourd’hui."
},
"heure": {
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$",
"description": "L’heure du commerce, HH:MM, entre 07:00 et 21:45."
},
"jours": {
"type": "array",
"items": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi"
],
"type": "string"
},
"maxItems": 7,
"description": "Pour frequence=semaine : les jours d’envoi."
},
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Le texte exact de la notification, 180 caractères au plus."
},
"nombre": {
"type": "integer",
"maximum": 366,
"minimum": 1,
"description": "Ou : le nombre d’envois réellement partis après lequel la règle s’arrête."
},
"sans_fin": {
"type": "boolean",
"description": "Pour modifier : retirer la date de fin ou le nombre d’envois."
},
"si_ferme": {
"enum": [
"sauter",
"decaler"
],
"type": "string",
"description": "Un jour de fermeture ou de congés : sauter (défaut) ou décaler au jour ouvert suivant."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"frequence": {
"enum": [
"semaine",
"mois"
],
"type": "string",
"description": "semaine : avec jours. mois : avec jour_mois, ou rang et jour_rang."
},
"jour_mois": {
"type": "integer",
"maximum": 31,
"minimum": 1,
"description": "Pour frequence=mois : le jour du mois (1 à 31 ; un 31 tombe le dernier jour d’un mois plus court)."
},
"jour_rang": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi"
],
"type": "string",
"description": "Le jour de la semaine qui va avec rang."
}
},
"additionalProperties": false
}| string |
| Le texte exact de la notification, 180 caractères au plus. |
| groupe | string | Qui le reçoit, recalculé à chaque envoi : tous, inactifs_30/60/90 (pas venus depuis N jours), proches (à 1 ou 2 tampons de la récompense), anniversaires (nés ce mois-ci), meilleurs, nouveaux. Un groupe autre que tous demande les notifications ciblées. Pour programmer seulement (défaut tous). |
| nombre | integer | Ou : le nombre d’envois réellement partis après lequel la règle s’arrête. |
| si_ferme | string | Un jour de fermeture ou de congés : sauter (défaut) ou décaler au jour ouvert suivant. |
| confirmer | boolean | false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true. |
| frequence | string | semaine : avec jours. mois : avec jour_mois, ou rang et jour_rang. |
| jour_mois | integer | Pour frequence=mois : le jour du mois (1 à 31 ; un 31 tombe le dernier jour d’un mois plus court). |
| jour_rang | string | Le jour de la semaine qui va avec rang. |
{
"type": "object",
"required": [
"texte"
],
"properties": {
"fin": {
"type": "string",
"format": "date",
"description": "Dernier jour possible, inclus (AAAA-MM-JJ). Facultatif."
},
"rang": {
"enum": [
"premier",
"deuxieme",
"troisieme",
"quatrieme",
"dernier"
],
"type": "string",
"description": "Pour frequence=mois : « premier » lundi, …, « dernier » vendredi du mois (avec jour_rang)."
},
"debut": {
"type": "string",
"format": "date",
"description": "Premier jour possible (AAAA-MM-JJ). Par défaut aujourd’hui."
},
"heure": {
"type": "string",
"pattern": "^\\d{1,2}:\\d{2}$",
"description": "L’heure du commerce, HH:MM, entre 07:00 et 21:45."
},
"jours": {
"type": "array",
"items": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi"
],
"type": "string"
},
"maxItems": 7,
"description": "Pour frequence=semaine : les jours d’envoi."
},
"texte": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Le texte exact de la notification, 180 caractères au plus."
},
"groupe": {
"enum": [
"tous",
"inactifs_30",
"inactifs_60",
"inactifs_90",
"proches",
"anniversaires",
"meilleurs",
"nouveaux"
],
"type": "string",
"description": "Qui le reçoit, recalculé à chaque envoi : tous, inactifs_30/60/90 (pas venus depuis N jours), proches (à 1 ou 2 tampons de la récompense), anniversaires (nés ce mois-ci), meilleurs, nouveaux. Un groupe autre que tous demande les notifications ciblées. Pour programmer seulement (défaut tous)."
},
"nombre": {
"type": "integer",
"maximum": 366,
"minimum": 1,
"description": "Ou : le nombre d’envois réellement partis après lequel la règle s’arrête."
},
"si_ferme": {
"enum": [
"sauter",
"decaler"
],
"type": "string",
"description": "Un jour de fermeture ou de congés : sauter (défaut) ou décaler au jour ouvert suivant."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"frequence": {
"enum": [
"semaine",
"mois"
],
"type": "string",
"description": "semaine : avec jours. mois : avec jour_mois, ou rang et jour_rang."
},
"jour_mois": {
"type": "integer",
"maximum": 31,
"minimum": 1,
"description": "Pour frequence=mois : le jour du mois (1 à 31 ; un 31 tombe le dernier jour d’un mois plus court)."
},
"jour_rang": {
"enum": [
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi"
],
"type": "string",
"description": "Le jour de la semaine qui va avec rang."
}
},
"additionalProperties": false
}| canal_rappels | string | Canal de « rappels » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord). |
| canal_relance | string | Canal de « relance » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord). |
| texte_relance | string | Texte de la relance, 180 caractères au plus. Pour revenir au texte par défaut, mettre "texte_relance" dans effacer. |
| canal_messages | string | Canal de « messages du commerçant » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord). |
| rappel_presque | boolean | Rappel « plus qu’un tampon » quand il ne manque qu’un passage. |
| relance_active | boolean | Active ou coupe la relance automatique des perdus de vue (une par client et par absence). |
| importance_avis | string | Importance de « demande d’avis » : importante (passe avant dans le budget SMS) ou petite. |
| heures_calmes_fin | integer | Fin des heures calmes (heure de 0 à 23) : les envois reprennent à partir de cette heure. |
| rappel_recompense | boolean | Rappel « votre récompense vous attend » quand elle est gagnée. |
| canal_anniversaire | string | Canal de « anniversaire » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord), email (e-mail si la notification ne porte pas). |
| importance_rappels | string | Importance de « rappels » : importante (passe avant dans le budget SMS) ou petite. |
| importance_relance | string | Importance de « relance » : importante (passe avant dans le budget SMS) ou petite. |
| texte_anniversaire | string | Texte du message d’anniversaire, 180 caractères au plus, idéalement avec le cadeau offert. Sans texte, rien ne part. |
| anniversaire_active | boolean | Active ou coupe le message d’anniversaire (il ne part que si un texte existe et si la carte demande la date d’anniversaire). |
| cadeau_anniversaire | string | Le cadeau d’anniversaire, valable 30 jours à partir du jour J : message (le texte seul), pourcent (une réduction sur chaque achat), un_offert (« 1 acheté, 1 offert », une fois), choix (le client choisit au comptoir entre la réduction et « 1 acheté, 1 offert »). Les cadeaux déjà ouverts ne changent pas. |
| delai_relance_jours | integer | Délai du commerce avant qu’un habitué soit « perdu de vue », en jours calendaires : une valeur parmi 14, 21, 28, 35, 42, 60, 90. Il sert aux clients sans assez d’historique et borne le rythme des autres (de la moitié au double). Pour revenir au délai proposé pour le métier, mettre "delai_relance" dans effacer. |
| heures_calmes_debut | integer | Début des heures calmes (heure de 0 à 23) : aucune notification automatique n’arrive après. |
| importance_messages | string | Importance de « messages du commerçant » : importante (passe avant dans le budget SMS) ou petite. |
| delai_rappel_minutes | integer | Délai entre le passage et le rappel, en minutes : une valeur parmi 0, 30, 60, 180, 1440 (1440 = le lendemain). |
| pourcent_anniversaire | integer | Le pourcentage de la réduction d’anniversaire (pourcent et choix), de 1 à 90. |
| importance_anniversaire | string | Importance de « anniversaire » : importante (passe avant dans le budget SMS) ou petite. |
{
"type": "object",
"properties": {
"effacer": {
"type": "array",
"items": {
"enum": [
"texte_relance",
"texte_anniversaire",
"delai_relance"
],
"type": "string"
},
"description": "Textes à effacer. texte_relance revient au texte par défaut ; texte_anniversaire vide coupe de fait les envois d’anniversaire ; delai_relance revient au délai proposé pour le métier."
},
"confirmer": {
"type": "boolean",
"default": false,
"description": "false (défaut) : rend seulement un aperçu de ce qui serait fait, sans rien changer. true : exécute. Toujours montrer l’aperçu à la personne et attendre son accord avant de repasser avec true."
},
"canal_avis": {
"enum": [
"auto",
"notif",
"secours",
"sms",
"email"
],
"type": "string",
"description": "Canal de « demande d’avis » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord), email (e-mail si la notification ne porte pas)."
},
"reserve_sms": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Part du budget SMS mensuel gardée pour les messages importants, en % : 0, 25, 50, 75, 100."
},
"canal_rappels": {
"enum": [
"auto",
"notif",
"secours",
"sms"
],
"type": "string",
"description": "Canal de « rappels » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord)."
},
"canal_relance": {
"enum": [
"auto",
"notif",
"secours",
"sms"
],
"type": "string",
"description": "Canal de « relance » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord)."
},
"texte_relance": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Texte de la relance, 180 caractères au plus. Pour revenir au texte par défaut, mettre \"texte_relance\" dans effacer."
},
"canal_messages": {
"enum": [
"auto",
"notif",
"secours",
"sms"
],
"type": "string",
"description": "Canal de « messages du commerçant » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord)."
},
"rappel_presque": {
"type": "boolean",
"description": "Rappel « plus qu’un tampon » quand il ne manque qu’un passage."
},
"relance_active": {
"type": "boolean",
"description": "Active ou coupe la relance automatique des perdus de vue (une par client et par absence)."
},
"importance_avis": {
"enum": [
"importante",
"petite"
],
"type": "string",
"description": "Importance de « demande d’avis » : importante (passe avant dans le budget SMS) ou petite."
},
"heures_calmes_fin": {
"type": "integer",
"maximum": 23,
"minimum": 0,
"description": "Fin des heures calmes (heure de 0 à 23) : les envois reprennent à partir de cette heure."
},
"rappel_recompense": {
"type": "boolean",
"description": "Rappel « votre récompense vous attend » quand elle est gagnée."
},
"canal_anniversaire": {
"enum": [
"auto",
"notif",
"secours",
"sms",
"email"
],
"type": "string",
"description": "Canal de « anniversaire » : auto (recommandé : un message important part d’abord par SMS sauf aux clients qui répondent aux notifications, un petit en notification et par SMS seulement aux clients qui répondent mieux aux SMS), notif, secours (SMS si la notification ne porte pas), sms (SMS d’abord), email (e-mail si la notification ne porte pas)."
},
"importance_rappels": {
"enum": [
"importante",
"petite"
],
"type": "string",
"description": "Importance de « rappels » : importante (passe avant dans le budget SMS) ou petite."
},
"importance_relance": {
"enum": [
"importante",
"petite"
],
"type": "string",
"description": "Importance de « relance » : importante (passe avant dans le budget SMS) ou petite."
},
"texte_anniversaire": {
"type": "string",
"maxLength": 180,
"minLength": 1,
"description": "Texte du message d’anniversaire, 180 caractères au plus, idéalement avec le cadeau offert. Sans texte, rien ne part."
},
"anniversaire_active": {
"type": "boolean",
"description": "Active ou coupe le message d’anniversaire (il ne part que si un texte existe et si la carte demande la date d’anniversaire)."
},
"cadeau_anniversaire": {
"enum": [
"message",
"pourcent",
"un_offert",
"choix"
],
"type": "string",
"description": "Le cadeau d’anniversaire, valable 30 jours à partir du jour J : message (le texte seul), pourcent (une réduction sur chaque achat), un_offert (« 1 acheté, 1 offert », une fois), choix (le client choisit au comptoir entre la réduction et « 1 acheté, 1 offert »). Les cadeaux déjà ouverts ne changent pas."
},
"delai_relance_jours": {
"type": "integer",
"description": "Délai du commerce avant qu’un habitué soit « perdu de vue », en jours calendaires : une valeur parmi 14, 21, 28, 35, 42, 60, 90. Il sert aux clients sans assez d’historique et borne le rythme des autres (de la moitié au double). Pour revenir au délai proposé pour le métier, mettre \"delai_relance\" dans effacer."
},
"heures_calmes_debut": {
"type": "integer",
"maximum": 23,
"minimum": 0,
"description": "Début des heures calmes (heure de 0 à 23) : aucune notification automatique n’arrive après."
},
"importance_messages": {
"enum": [
"importante",
"petite"
],
"type": "string",
"description": "Importance de « messages du commerçant » : importante (passe avant dans le budget SMS) ou petite."
},
"delai_rappel_minutes": {
"type": "integer",
"description": "Délai entre le passage et le rappel, en minutes : une valeur parmi 0, 30, 60, 180, 1440 (1440 = le lendemain)."
},
"pourcent_anniversaire": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"description": "Le pourcentage de la réduction d’anniversaire (pourcent et choix), de 1 à 90."
},
"importance_anniversaire": {
"enum": [
"importante",
"petite"
],
"type": "string",
"description": "Importance de « anniversaire » : importante (passe avant dans le budget SMS) ou petite."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"au": {
"type": "string",
"format": "date",
"description": "Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui."
},
"du": {
"type": "string",
"format": "date",
"description": "Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee »."
},
"periode": {
"enum": [
"aujourdhui",
"hier",
"derniers_7_jours",
"derniers_30_jours",
"derniers_90_jours",
"derniers_12_mois",
"cette_semaine",
"semaine_derniere",
"ce_mois",
"mois_dernier",
"cette_annee",
"annee_derniere",
"depuis_le_debut",
"personnalisee"
],
"type": "string",
"default": "derniers_90_jours",
"description": "Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_90_jours."
},
"comparer": {
"type": "boolean",
"default": false,
"description": "Ajoute la période de même durée juste avant, pour voir si ça progresse."
},
"panier_moyen": {
"type": "number",
"maximum": 10000,
"minimum": 0.1,
"description": "Panier moyen en euros pour ce calcul. Défaut : celui déclaré dans les réglages du commerce."
},
"cout_recompense": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Ce que coûte UNE récompense au commerçant (prix de revient), en euros. Sans lui, le coût des récompenses n’est pas chiffré."
}
},
"additionalProperties": false
}| tampons_bienvenue |
| integer |
| Tampons offerts à l’inscription. |
{
"type": "object",
"required": [
"panier_moyen",
"cout_recompense",
"tampons"
],
"properties": {
"marge": {
"type": "number",
"default": 65,
"maximum": 100,
"minimum": 1,
"description": "Marge brute sur un panier, en pourcentage (défaut 65 %, typique en restauration et services)."
},
"tampons": {
"type": "integer",
"maximum": 30,
"minimum": 2,
"description": "Passages pour obtenir la récompense."
},
"comparer": {
"type": "array",
"items": {
"type": "integer",
"maximum": 30,
"minimum": 2
},
"maxItems": 5,
"description": "Autres nombres de passages à comparer (ex. [6, 10, 12])."
},
"panier_moyen": {
"type": "number",
"maximum": 10000,
"minimum": 0.5,
"description": "Dépense moyenne d’un client par passage, en euros."
},
"clients_fideles": {
"type": "integer",
"default": 60,
"maximum": 100000,
"minimum": 1,
"description": "Clients qui prendraient la carte chaque mois (défaut 60)."
},
"cout_recompense": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Ce que coûte la récompense AU COMMERÇANT (prix de revient, pas prix de vente), en euros."
},
"visites_par_mois": {
"type": "number",
"default": 2,
"maximum": 60,
"minimum": 0.1,
"description": "Visites par mois d’un client fidèle aujourd’hui (défaut 2)."
},
"tampons_bienvenue": {
"type": "integer",
"default": 1,
"maximum": 5,
"minimum": 0,
"description": "Tampons offerts à l’inscription."
}
},
"additionalProperties": false
}| indicateurs |
| array |
| Indicateurs à rendre, dans cet ordre. Défaut : tous. taux_retour = part des clients venus sur la période qui étaient déjà venus avant ; chiffre_estime = passages × panier moyen déclaré (une estimation, pas une caisse). |
{
"type": "object",
"properties": {
"au": {
"type": "string",
"format": "date",
"description": "Dernier jour inclus (AAAA-MM-JJ). Défaut : aujourd’hui."
},
"du": {
"type": "string",
"format": "date",
"description": "Premier jour inclus (AAAA-MM-JJ). Le donner suffit : la période devient « personnalisee »."
},
"courbe": {
"enum": [
"passages",
"clients_venus",
"nouveaux_clients",
"recompenses_gagnees",
"recompenses_offertes",
"aucune"
],
"type": "string",
"default": "passages",
"description": "Ce que trace la courbe. Défaut passages."
},
"periode": {
"enum": [
"aujourdhui",
"hier",
"derniers_7_jours",
"derniers_30_jours",
"derniers_90_jours",
"derniers_12_mois",
"cette_semaine",
"semaine_derniere",
"ce_mois",
"mois_dernier",
"cette_annee",
"annee_derniere",
"depuis_le_debut",
"personnalisee"
],
"type": "string",
"default": "derniers_30_jours",
"description": "Période étudiée, en jours du fuseau du commerce, aujourd’hui inclus pour les périodes en cours (ce_mois = du 1er à aujourd’hui). « personnalisee » utilise du/au. Défaut derniers_30_jours."
},
"comparer": {
"type": "boolean",
"default": true,
"description": "Ajoute la variation par rapport à la période de même durée juste avant (ex. 30 jours avant les 30 derniers jours)."
},
"granularite": {
"enum": [
"auto",
"jour",
"semaine",
"mois"
],
"type": "string",
"default": "auto",
"description": "Pas de la courbe. auto (défaut) : jour jusqu’à 2 mois, semaine jusqu’à ~9 mois, mois au-delà."
},
"indicateurs": {
"type": "array",
"items": {
"enum": [
"passages",
"clients_venus",
"nouveaux_clients",
"taux_retour",
"passages_par_client",
"recompenses_gagnees",
"recompenses_offertes",
"chiffre_estime",
"total_clients"
],
"type": "string"
},
"maxItems": 9,
"minItems": 1,
"description": "Indicateurs à rendre, dans cet ordre. Défaut : tous. taux_retour = part des clients venus sur la période qui étaient déjà venus avant ; chiffre_estime = passages × panier moyen déclaré (une estimation, pas une caisse)."
}
},
"additionalProperties": false
}