Sadia logo
Client
Sadia

Ingénierie d'activation consommateur — saisie par scan de ticket à l'échelle nationale.

Une activation de marque consommateur exécutée sur trois surfaces distinctes — un web consommateur responsive, un kiosque tablette en magasin, et une console d'opérations pour la marque — conçue comme un seul modèle de domaine rendu de trois manières. Ingestion de tickets, déduplication, modération et absorption des pics de trafic construits comme un système de production unique, pas trois produits déconnectés.

3 mois · 3 ingénieursLivré 2024
Sadia — Ingénierie d'activation consommateur — saisie par scan de ticket à l'échelle nationale.
  • 3
    Surfaces de rendu (consommateur · kiosque · console)
  • 1
    Modèle de domaine unique pour les trois clients
  • Burst
    Architecture tunée pour pics TV
  • Live
    Déploiement national, magasin + digital
Brief d'ingénierie

Le problème cadré comme ingénierie.

Une promotion consommateur nationale n'est pas un site marketing. C'est un système distribué d'ingestion de données avec des exigences fortes de correction : chaque soumission doit être dédupliquée, chaque soumission doit être auditable, chaque tirage doit être défendable face à un examen public. Le mode d'échec n'est pas la lenteur — c'est un gagnant contesté, une entrée en double, ou une soumission perdue pendant un pic de trafic.

La discipline d'ingénierie ici est l'intégrité des données sous charge en rafale avec trois clients hétérogènes écrivant dans le même domaine. Un web consommateur reçoit des soumissions depuis n'importe quel appareil à tout moment. Une tablette en magasin reçoit des soumissions depuis des rayons de supermarché où l'opérateur n'a pas de staff IT et où la session doit se récupérer seule après abandon. Une console d'opérations marque reçoit des soumissions depuis des modérateurs qui doivent prendre des décisions contraignantes sous pression temporelle.

La position de Symloop dès le premier jour : un seul modèle de domaine, un seul write path, un seul audit log — trois cibles de rendu, chacune conçue pour la réalité physique de son déploiement.

Ce que nous avons construit

Un système. Trois cibles de rendu.

Surface de saisie consommateur — un SPA responsive avec des layouts spécifiques au format. Le principe de conception : le CSS responsive étire la même UI sur tous les breakpoints, ce qui est la mauvaise architecture quand les cibles tactiles, la modalité d'input et le contexte viewport diffèrent. Nous traitons desktop, tablette et mobile comme trois cibles de rendu distinctes partageant le même modèle de formulaire, la même validation d'input et le même pipeline de soumission — en permutant l'arbre de layout à l'exécution selon la classe d'appareil et l'orientation.

Surface tablette en magasin — un client durci kiosque conçu pour une opération non-supervisée sur les rayons de supermarché. Récupération automatique de l'état de session après timeout d'inactivité, attract-mode qui prévient la panne d'écran mort, cibles tactiles dimensionnées pour des consommateurs gantés ou pressés, et une cible de déploiement étroite qui élimine la classe de bugs qui viennent de l'exécution de software généraliste dans un contexte kiosque.

Console d'opérations — une console côté marque avec séparation stricte entre ingestion et revue. L'équipe qui revoit les entrées ne partage jamais un code path avec l'équipe qui les soumet. Accès par rôle, audit log immuable par décision, et un pipeline d'export qui produit un manifeste de tirage avec une traçabilité de provenance défendable — pour que le tirage lui-même soit vérifiable de bout en bout.

Principes d'architecture

Consciente des rafales, correction d'abord, audit complet.

Isolation du write path. L'ingestion consommateur et la revue opérateur tournent sur des plans read/write séparés. Quand un spot TV fait spiker les écritures consommateur d'un ordre de magnitude, la console de revue reste réactive parce qu'elle lit depuis un path qui ne concurrence pas le firehose d'ingestion.

Déduplication déterministe au write boundary. La détection de doublons tourne au moment de la soumission, pas en batch post-facto. Hashing perceptuel sur les images de tickets, hashing d'identité stable à travers les champs de soumission, et clés d'écriture idempotentes pour qu'un retry ne crée jamais une entrée fantôme.

Audit log immuable. Chaque transition d'état — soumission, flag de validation, décision modérateur, événement d'export — est appendée à un audit log lisible par l'équipe opérations et non-mutable par qui que ce soit, y compris les ingénieurs. C'est ainsi qu'un tirage reste défendable.

Livraison statique consciente des rafales. La surface consommateur est livrée en assets statiques depuis un edge network pour qu'une rafale de trafic TV ne touche jamais l'infrastructure d'origine pour le premier paint. L'état dynamique — soumissions, validation — scale horizontalement sur des primitives managed pour que nous payions la capacité à la seconde, pas à l'heure.

Problèmes d'ingénierie qui méritent documentation

Ce qui a rendu ça difficile, et comment nous l'avons résolu.

  • 01

    Cohérence cross-surface sans duplication de code

    Trois cibles de rendu doivent se comporter identiquement sur les dimensions que les consommateurs expérimentent — même sémantique de formulaire, mêmes erreurs de validation, même flow de soumission de ticket — tout en différant sur les dimensions que la surface physique exige. Le mode d'échec est la divergence : le web consommateur rejette un input que le kiosque accepte, un modérateur voit un format de ticket que le consommateur n'a jamais soumis. Nous gardons le modèle de domaine unique et isolons les surfaces de rendu de la logique de domaine pour qu'aucune règle ne puisse exister dans un client et pas les autres.

  • 02

    Input adversarial sur un endpoint ouvert

    L'endpoint consommateur est public par définition. Les soumissions en double, les entrées générées par machine et la réutilisation d'images ne sont pas des cas limites — ce sont la baseline. La posture d'ingénierie est défensive dès le premier commit : hashing perceptuel sur les images, hashing d'identité à travers les champs, rate limits ancrés sur plusieurs signaux plutôt que l'IP seule, et une queue de modération avec un budget explicite pour la revue manuelle. L'objectif n'est pas le zéro fraude — c'est un taux défendable où la revue humaine est économiquement bornée.

  • 03

    Déploiement kiosque sans ingénieurs terrain

    Les kiosques tournent dans des environnements retail où nous n'avons pas de staff. Un consommateur peut abandonner l'écran en plein milieu d'une entrée, couper le courant, ou bloquer l'écran. Le software doit se récupérer de chacun de ces états vers un attract-mode known-good en quelques secondes. Nous traitons chaque boot de kiosque comme si la dernière session avait crashé — parce que statistiquement, certaines l'avaient fait.

  • 04

    Revue opérateur sous pression temporelle

    Un tirage a une deadline. L'équipe opérations revoit les soumissions sur cette deadline. Si la console de revue est lente parce que le path d'ingestion est saturé, le tirage glisse et la campagne dégrade. Nous avons séparé les plans d'ingestion et de revue au niveau infrastructure pour qu'un pic de trafic consommateur ne puisse pas faire attendre un modérateur.

Résultats

Ce qui a tourné en production, et ce qui était vérifiable.

  • 01

    Trois surfaces de rendu opérationnelles le jour du lancement contre le même modèle de domaine, sans divergence de comportement observable entre elles.

  • 02

    Console de modération a produit un manifeste de tirage auditable avec provenance complète par soumission — heure de soumission, état de dédupe, décision modérateur, événement d'export — lisible par l'équipe marque sans implication ingénieur.

  • 03

    Charge en rafale absorbée sans intervention de serveur d'origine. La livraison static-first signifie que le premier paint n'est jamais une ressource contendue, et le write path dynamique scale sur des primitives managed.

  • 04

    Kiosques auto-récupérés d'abandon sans support terrain. Le modèle de déploiement assume que l'environnement physique est hostile et ingénierie en conséquence.

Stack technique
React responsiveMobile natif (Flutter)Document store managedAssets edge-deliveredHashing perceptuelAdmin role-scopedAudit log immuableLivraison static-first
Services d'ingénierie appliqués sur ce projet
FAQ d'ingénierie

Ce que les opérateurs et acheteurs techniques nous demandent sur ce projet.

01Pourquoi traiter desktop, tablette et kiosque comme des cibles de rendu séparées plutôt qu'un codebase responsive ?+

Parce que le CSS responsive encode l'hypothèse que la même UI est correcte à travers les appareils. Elle ne l'est pas. Un kiosque dans une allée retail nécessite des timeouts de session, un attract-mode et des cibles tactiles qui n'ont pas d'analogue sur un navigateur desktop. Nous gardons le modèle de domaine unique et les cibles de rendu distinctes — la duplication est petite, le risque de divergence est plus petit, et chaque cible est adaptée à l'usage plutôt qu'un compromis.

02Comment le résultat du tirage est-il défendable sous examen ?+

Chaque transition d'état — soumission, flag de validation, décision de modération, événement d'export — est appendée à un audit log immuable indexé sur l'identité de soumission. Le manifeste de tirage est généré depuis ce log, pas depuis la base de données live. Si une soumission est contestée, la provenance est dans le log et non reconstructible après coup. C'est ainsi que nous concevons pour des événements où la sortie doit survivre à un examen public.

03Comment gérez-vous l'input adversarial sans bloquer les consommateurs légitimes ?+

La détection de doublons est déterministe et tourne au write boundary. Le rate-limiting est ancré sur plusieurs signaux — empreinte d'appareil, hash d'identité de soumission, pattern temporel — pas l'IP seule, parce que les réseaux mobiles traduisent des millions d'utilisateurs à travers un petit nombre d'IPs. La modération est réservée au petit pourcentage que les checks automatiques signalent, avec un budget explicite pour que la revue humaine soit économiquement bornée.

04Quel est le coût d'ingénierie de l'absorption de trafic en rafale ?+

Quasi-zéro quand l'architecture est correcte. La livraison static-first depuis un edge network rend le premier paint gratuit. Les écritures dynamiques scalent sur des primitives managed qui facturent à la seconde. Le modèle de coût est une fonction du volume de soumissions, pas du pic de trafic — ce qui est exactement comment des événements consommateurs en rafale devraient se tarifer.

05La même architecture se transfère-t-elle à d'autres événements de marque consommateur ?+

Oui. La forme d'ingénierie — ingestion trois-surfaces, write path en rafale, modération audit-complète, événement de sortie défendable — se répète à travers les promotions on-pack, les mécaniques scan-to-redeem, les activations de loyauté et les concours tied retail. La logique de domaine change. L'architecture non.

Vous exécutez un événement qui doit tenir sous examen ?

Symloop ingénierie les plateformes d'activation consommateur où la correction et la défendabilité sont des exigences de première classe, pas des afterthoughts. Un modèle de domaine, cibles de rendu multiples, audit-complet par défaut.