A/B testing QR code : trouver la variante gagnante sans se tromper
Tester deux QR codes collés côte à côte mesure surtout leur emplacement, pas leur design. Voici comment mener un vrai A/B test sur un seul QR code dynamique : rotation de destination, métriques qui comptent vraiment et le bon moment pour déclarer une variante gagnante.
A/B testing QR code : trouver la variante gagnante sans se tromper
J'ai lancé mon premier test A/B sur un QR code en 2023, sur une affiche de restaurant. Deux designs, deux QR codes différents collés côte à côte sur la même vitrine. Résultat au bout de trois jours : la variante B scannait 40 % plus. J'étais content. J'ai tout basculé sur B.
Erreur complète. Le QR A était placé côté rue passante, le B côté stationnement. J'avais mesuré l'emplacement, pas le design. Ça m'a pris deux semaines à comprendre pourquoi les chiffres ne collaient plus une fois le changement fait.
Depuis, je fais les tests A/B sur un seul QR code dynamique avec rotation de destination, pas sur deux codes physiques distincts. C'est la seule méthode qui élimine le biais d'emplacement, d'éclairage, ou de position dans le champ de vision. Voici comment je m'y prends, et surtout, comment je sais quand arrêter le test sans me fier à du bruit statistique déguisé en résultat.
Rotation de destination sur un même code
Le principe est simple : un seul qr code dynamique imprimé, une seule URL visible, mais le serveur redirige vers deux destinations différentes selon un algorithme de répartition. Le scanneur ne voit jamais qu'il fait partie d'un test.
Techniquement, ça se configure via l'API en définissant deux (ou trois) destinations pour un même code, avec un pourcentage de trafic attribué à chacune. Une requête POST type ressemble à ça :
POST /v1/qrcodes/{id}/rotation
{
"variants": [
{"url": "https://exemple.com/menu-a", "weight": 50},
{"url": "https://exemple.com/menu-b", "weight": 50}
]
}
La répartition 50/50 est mon défaut. Je passe à une pondération inégale (genre 80/20) seulement quand je teste une variante risquée que je ne veux pas exposer à trop de trafic pendant la phase de validation. Sinon, 50/50 garde le calcul de significativité plus simple et plus rapide à atteindre.
Règle que je ne brise jamais : une fois le test lancé, je ne touche plus aux poids de répartition avant la fin. Changer la pondération en cours de route, même pour « accélérer les résultats », pollue complètement le calcul statistique. J'ai vu des gens ajuster à 70/30 à mi-parcours parce qu'une variante semblait perdre, pour « sauver » les données. Ça ne sauve rien, ça invalide tout le test.
Le redirect doit aussi être instantané et sans cache. Si le serveur met en cache la redirection côté CDN, la moitié de vos scanneurs vont continuer à atterrir sur l'ancienne destination pendant des heures après un ajustement. Chez QR Code Agency, chaque redirection 302 porte un Cache-Control: no-store obligatoire, précisément pour éviter ce genre de décalage invisible qui fausse un test sans que personne ne s'en rende compte.
Les métriques qui comptent
Le taux de scan brut, c'est la métrique la plus facile à lire et la moins utile pour décider quoi que ce soit. Si votre variante A scanne plus mais convertit moins derrière, vous venez de choisir un perdant en croyant choisir un gagnant.
Ce que je regarde, dans l'ordre :
- Taux de scan : volume brut, utile seulement pour vérifier que l'échantillon grossit normalement
- Taux de conversion post-scan : combien de scanneurs complètent l'action visée (commande, formulaire, inscription)
- Heure du scan : un pic à midi n'a pas le même comportement qu'un pic à 20h
- Device et OS : iOS et Android n'ouvrent pas le scanneur natif de la même façon, et ça change le comportement de clic
Le taux de conversion post-scan est celui qui m'a le plus souvent fait changer d'avis en cours de test. Sur une campagne pour un client en immobilier, la variante avec photo du condo scannait mieux, mais la variante avec plan d'étage convertissait deux fois plus en prises de rendez-vous. Sans tracker la conversion, on aurait déclaré le mauvais gagnant.
L'heure et le device comptent aussi parce qu'ils révèlent des patterns cachés. Un QR sur une affiche de bar scanné majoritairement après 22h sur Android a un comportement différent d'un scan de 14h sur iPhone. Si une variante gagne surtout le soir et perd le jour, la moyenne globale peut masquer un signal utile : peut-être que vous avez besoin de deux messages différents selon le moment, pas d'une seule variante universelle.
Le mot-clé ici, c'est tracker les scans qr avec assez de granularité pour voir ces découpages, pas juste un compteur qui monte. Un générateur qui donne uniquement le total de scans sans segmentation par device, pays ou heure ne permet pas de faire de l'A/B testing sérieux, seulement de compter des clics.
Ce genre de granularité s'applique aussi à d'autres cas d'usage que j'ai déjà couverts. Sur un QR multilingue par exemple, la répartition par langue suit une logique similaire de segmentation fine, j'en parle dans cet article sur la redirection auto par langue. Le principe de fond est le même : ne jamais juger une performance sur un seul chiffre agrégé.
Taille d'échantillon et durée
C'est ici que la plupart des tests A/B sur QR code partent en vrille. Les gens regardent les chiffres après 48 heures, voient un écart de 15 points de pourcentage, et déclarent un gagnant. Sauf que sur un échantillon de 40 scans, un écart de 15 points ne veut rien dire statistiquement.
Ma règle personnelle : je ne regarde même pas les résultats avant d'avoir au moins 100 scans par variante. En bas de ce seuil, chaque scan individuel pèse trop lourd dans le pourcentage final, et une poignée de scans d'origine bizarre (un bot, un partage sur un forum) peut fausser toute la lecture.
Au-delà du volume, la durée minimale compte aussi. Un test lancé un lundi et arrêté un mercredi capture un pattern de comportement de semaine, pas de weekend. J'ai fait cette erreur sur une campagne de resto : le test tournait bien du lundi au jeudi, mais le vendredi soir, tout le comportement changeait parce que la clientèle changeait. Il faut couvrir au minimum un cycle complet de sept jours pour capturer les variations naturelles de trafic, sinon vous optimisez pour un jour de la semaine en particulier sans le savoir.
Pour la significativité statistique proprement dite, je n'ai pas besoin d'un doctorat en stats, juste d'une règle simple : l'écart entre les deux variantes doit être stable sur au moins trois jours consécutifs, et pas juste un pic isolé. Si le classement des variantes s'inverse d'un jour à l'autre, le test n'est pas fini, peu importe le volume cumulé.
Un tableau simple que j'utilise pour décider si je peux clore un test :
| Critère | Seuil minimum |
|---|---|
| Scans par variante | 100+ |
| Durée du test | 7 jours minimum |
| Stabilité du classement | 3 jours consécutifs sans inversion |
| Écart de conversion | Supérieur à 5 points de pourcentage |
Si un de ces quatre critères manque, je continue le test. Pas d'exception, même si le client presse pour une réponse rapide.
Automatiser sans perdre le contrôle
Une fois qu'un test tourne régulièrement, la tentation est d'automatiser la bascule vers la variante gagnante via l'api qr code dynamique. C'est faisable, et ça vaut la peine sur des campagnes à volume élevé, mais je le fais avec un filet de sécurité.
Mon script d'automatisation ne bascule jamais à 100 % d'un coup. Il passe la variante gagnante à 80 % et garde 20 % sur l'autre pendant encore une semaine, en cas de retournement de tendance saisonnier ou d'erreur de calcul en amont. J'ai vu des cas où la variante « gagnante » après deux semaines devenait perdante après un mois, simplement parce que la nouveauté de la variante B s'estompait avec le temps.
Le webhook qui notifie le changement de statut mérite aussi une vraie signature de sécurité, pas juste un HMAC basique sans horodatage. Un webhook trafiqué qui déclenche une fausse bascule de variante peut saboter une campagne entière sans que vous le voyiez venir avant d'avoir perdu des jours de données propres.
D'ailleurs, ce genre d'attention à la sécurité de la redirection rejoint des enjeux que j'ai déjà traités ailleurs, notamment sur les risques de détournement de destination. Si le sujet vous intéresse, j'ai écrit sur les réflexes anti-quishing qui s'appliquent aussi bien à la protection d'un test A/B qu'à la sécurité générale d'un QR public, à lire ici.
L'action à prendre maintenant
Arrêtez de tester deux QR codes physiques distincts. Configurez une rotation de destination sur un seul code, laissez tourner sept jours minimum sans toucher aux poids, et ne déclarez un gagnant que si le classement reste stable trois jours d'affilée avec au moins 100 scans par variante.
Le reste, c'est du bruit habillé en donnée. Et le bruit coûte plus cher qu'un test qui prend une semaine de plus.
À lire aussi
Continuer la lecture
QR code sur les réseaux sociaux : un seul scan vers Instagram, TikTok et vos profils
Un seul QR code dynamique vers une page qui regroupe Instagram, TikTok et vos autres profils bat cinq codes séparés qui divisent l'attention. Voici pourquoi centraliser, comment bâtir la page de destination, et où placer le code pour maximiser les scans.
QR code immobilier : la pancarte qui capte les acheteurs avant la visite
Une pancarte « À vendre » avec un simple numéro de téléphone laisse les passants du soir et de la fin de semaine sans aucun moyen d'agir. Un QR code dynamique vers une fiche mobile complète capte ces acheteurs 24 h sur 24. Voici comment le construire et où le placer.
Après le scan : la page qui transforme le visiteur en client
Un QR code parfait qui redirige vers une page mal ciblée ne convertit personne. La vraie bataille se joue dans les trois secondes après le scan. Voici comment concevoir une page de destination mobile alignée sur l'intention du visiteur, avec un seul objectif et zéro friction.