Restaurants et commerces de proximité
BonAppli
Le logiciel qui permet aux restaurants et aux commerces de tenir seuls leur site, leur carte et leurs commandes. On l'a conçu, codé, mis en production, et on le fait tourner.
Bon n° A-400Porte 7
- Conception et design UX/UI
- Développement de l'application
- Mise en production
- Facturation Stripe
- Click & Collect
- Site vitrine et SEO
Toujours en service
Le chantier, bon par bon.
De la carte qu'on édite à la page qui vend l'offre, chaque morceau de BonAppli est passé par nos mains. Les voici dans l'ordre où ils ont été servis.
- A-401L'éditeur de carteSix styles, sept couleurs, aperçu mobile
- A-402La mise en productionPréproduction, retour arrière automatique
- A-403La facturationStripe, au restaurant publié
- A-404Les domainesVérifiés et servis sans redéploiement
- A-405Le Click & CollectCode, créneaux, tableau des commandes
- A-406Le site vitrineRepositionnement, 13 pages métiers
Une carte qui s'édite là où elle s'affiche.
Pas de formulaire d'un côté et d'aperçu de l'autre : le restaurateur clique sur sa carte et la modifie. On a construit cet éditeur, puis tout ce qui se règle autour.

- Le design en réglages
- Six styles de texte, sept couleurs, quatre arrondis réglables un par un. Le restaurateur habille sa carte à ses couleurs sans toucher une ligne de code.
- L'aperçu mobile dans l'éditeur
- Ses clients liront la carte sur un téléphone, à table. Il la voit comme eux avant de publier.
- La carte telle qu'elle est vraiment
- Plusieurs tarifs pour un même plat (la bolée, la bouteille), des formules à choix, les 14 allergènes en icônes dont le nom s'affiche au toucher.
Une mise en production qui sait revenir en arrière.
On a repris le prototype pour le rendre exploitable : hébergé en France, une préproduction pour tester, et des déploiements qui ne laissent jamais le site par terre.
- Chaque proposition de code reconstruit l'image, pour vérifier qu'elle passe
- L'image de production est étiquetée par commit, jamais écrasée
- Une validation manuelle ouvre la mise en production
- Déploiement, puis test de santé sur l'adresse publique
- Test en échec : retour automatique à la version précédente
- Des comptes vérifiés
- Inscription confirmée par email, liens de réinitialisation à usage unique, stockés hachés en base.
- Des tentatives limitées
- Connexion, inscription et chaque code envoyé ont leur plafond, et les formulaires publics un champ piège contre les robots.
- Deux revues de code complètes
- Menées avant l'ouverture, corrigées phase par phase : critiques d'abord, cohérence ensuite, finitions pour finir.
Un prix par restaurant publié, calculé au jour près.
L'additionpar compte
| Starter1 restaurant en ligne | 0 € |
|---|---|
| Classiquepar restaurant publié | 8 € / mois |
| Premiumpar restaurant publié | 12 € / mois |
- Brouillons
- gratuits
- Publier en cours de mois
- prorata immédiat
- Dépublier
- aucun crédit
- Essai
- 14 jours
- Résilier
- accès jusqu'à l'échéance
Le modèle économique vit dans le code, branché sur Stripe. On a écrit ses règles pour qu'elles restent justes dans tous les cas, y compris ceux qu'on ne voit qu'en production.
- Un double clic ne débite pas deux fois : chaque mise à jour envoyée à Stripe porte une clé d'idempotence.
- Après une résiliation, les restaurants en trop repassent en brouillon. Rien n'est effacé, tout se republie.
- Un parrain touche chaque mois une commission sur ce que ses filleuls paient réellement.
Le nom de domaine du restaurant, sans nous appeler.
En Premium, la carte se sert sur le domaine du client. Il ajoute un enregistrement DNS, BonAppli le vérifie, écrit la route, et le certificat HTTPS arrive au premier accès. Aucun redéploiement. Même logique pour les polices : un restaurant importe la sienne, servie par BonAppli.
// Faut-il écarter ce domaine de la configuration Traefik ?
// Non destructif sur erreur : on n'écarte QUE sur une réponse
// DNS claire qui ne correspond pas. Un lookup en échec est
// inconclusif : on garde le domaine, sinon on couperait tous
// les domaines perso au redémarrage.
async function shouldExclude(domain, targetIp) {
try {
const ips = await resolve4(domain); // suit CNAME → A
return !ips.includes(targetIp);
} catch {
return false; // timeout, resolver pas prêt : on garde
}
}La règle qu'on s'est donnée : un domaine qui pointe ailleurs est écarté, un DNS qui tarde à répondre ne coupe personne.
La commande en ligne, sans commission ni application.
Le plus gros chantier : faire de la carte un point de vente. Le client commande depuis son téléphone et paie au retrait, le commerçant suit tout depuis un tableau.
Tourné sur une copie locale, avec un restaurant et des clients fictifs.
- Un code plutôt qu'un compte
- Six chiffres reçus par email confirment chaque commande. Pas de mot de passe à créer, pas de fausses commandes.
- Le serveur a le dernier mot
- Les prix sont recalculés côté serveur : un panier modifié dans le navigateur ne change pas l'addition.
- Des créneaux tirés des horaires
- Calculés depuis les heures d'ouverture, à l'heure de Paris, avec un délai de préparation et une capacité par créneau.
- Une pause pour le coup de feu
- Le commerçant coupe les commandes d'un geste, sans dépublier sa carte. Le client, lui, rejoue une ancienne commande en un clic.
Le dernier créneau
Deux clients, une place. Un cas qu'on ne croise jamais en test, mais qui arrive dès qu'un commerce a du monde. Le serveur verrouille le commerce le temps de compter les places : les commandes passent l'une après l'autre, jamais en même temps.
- YannPanier prêt, code reçu
- SolènePanier prêt, code reçu
Il ne reste qu'une place à 12:30. Les deux clients valident à la même seconde.
Repositionner le produit, puis refaire sa vitrine.
Avant : un menu à scanner
Après : le site internet de votre restaurant ou de votre commerce.
BonAppli se vendait comme un QR code posé sur la table. Le produit faisait bien plus : un site, une carte, une boutique. On l'a repositionné, puis on a refait bonappli.fr pour le dire.


- 7 rubriques et 13 pages métiers, de la boulangerie au fleuriste, tirées d'un seul gabarit
- Plan du site, métadonnées et image de partage générés par le code
- Les tarifs affichés lisent la même source que la facturation