Brussels Premier Padel 2027 · architecture technique

Ticketing
Onebox TDS

Vue complète de l'intégration : vitrine, plateforme ambassadeurs, back-office, collecte analytics, webhooks signés et réconciliation. Chaque flux porte son contrat. Le dernier bloc liste ce qu'il faut fournir pour lancer le chantier.

1. Vue d'ensemble

CLIENT Vitrine bpp27.tero.be/fr/billetterie · configurateur Widget Onebox v2plan + sièges (ob-widget-seats) Club Action (ambassadeurs)code · classement · espace Admin plateformestats · ventes · intégrations API PUBLIQUES POST /api/tickets/quoteprix + remise code POST /api/orderscréation BASKET + code POST /api/tickets/eventsfunnel 6 étapes /api/analytics/collect1 évènement · 204 Oneboxwidget-sdk BACKEND (Astro SSR) Services billetspricing · codes · availabilityquote · fever/onebox link Attribution & ventessale → ambassadeur (code)compteurs · paliers · rang Jobs / outboxmail.send · onebox.syncretries · dead letter · 02:00 Settings chiffrésonebox · brevo · analyticsreadonly prod · audit PERSISTANCE PostgreSQL 16sales · ambassadors · codesanalytics_events · email_events Webhook deliveriesob-delivery-id (idempotent)statut · tentatives Audit append-onlyqui · quand · quoisecrets masqués Backupspg_dump avant migrationrétention 30 j ONEBOX TDS OAuth2 /tokenclient_credentials · channel Catalog APIevents · sessions · prices Distribution APIBASKET → CONFIRM · hold Webhooks signésHMAC · ob-event/action Ordersrefunds CANAUX SORTANTS Brevo (mail)magic link · transactions GA4 · Google Adsflags admin · consent Fever (legacy)décommissionné Access Controlscan billets

Trait plein = appel synchrone. Trait pointillé = flux asynchrone (webhook, job, token). Le widget Onebox est le seul composant tiers exécuté dans le navigateur.

2. Les pages, une par une

Vitrine — bpp27.tero.be

PageRôleDépendances ticketing
/fr/billetterie/ · /nl/tickets/ · /en/tickets/Configurateur : session → formule → zone → sièges → codeCatalog (sessions, prix), Widget v2, quote serveur
/fr/ accueilFaits, compteur, CTA vers billetterieaucune (statique)
/fr/hospitalite/Hospitality, demande de contactform_submit analytics
/fr/tournoi/ · /fr/lieu/ · /fr/restauration/Informations, plan d'accèsscroll/cta analytics
/fr/conditions-generales/ · /fr/politique-de-confidentialite/CGV, RGPD, rétention analyticsconsent_version
404 FR/NL/EN, llms.txt, sitemapsSEO/GEO trilingueaucune

Plateforme — staging-ambassador.bpp27.tero.be

PageRôleDépendances ticketing
/fr/ Club ActionPitch, 8 paliers, fédérations, CTApaliers (barème), analytics
/fr/demande-acces/Formulaire ambassadeurform_submit + email transactionnel
/fr/loginConnexion + magic linkBrevo outbox
/fr/espace/Code en gros, compteurs, progression, rangventes attribuées (webhook Onebox)
/fr/classement/Top 50 + ma ligneagrégat ventes par code
/fr/paliers/8 paliers cumulatifs, rewardsseuils + sessions comptées
/fr/faq/ · /fr/conditions/Règles du programmeCGV

Admin — back-office

ModuleRôleDépendances ticketing
/admin/Tableau de bord, alertessanté Onebox, jobs
/admin/demandes/Valider / refuser un ambassadeurcode généré à la validation
/admin/ambassadeurs/Fiche : code, ventes, rangventes Onebox
/admin/codes/Attribution, imports CSVunicité par club
/admin/ventes/Ventes, réconciliation, remboursementsOrders API + webhooks
/admin/paliers/ · /admin/rewards/Seuils, rewards, choix raquettecumul des ventes
/admin/entonnoir/Funnel 6 étapes, par codeanalytics_events
/admin/stats/Audience, UTM, langue, device, cohortescollecte first-party
/admin/integrations/Onebox, Brevo, GA4, Ads, pricing, UTMregistre chiffré + tests
/admin/cloture/Gel, snapshot, rapport finalexport ventes
/admin/comptes/ · journalRBAC owner/admin/viewer + auditaudit append-only

3. Flux d'achat, étape par étape

#ÉtapeAppelCe qu'on stocke
1Choix session + formuleGET catalog/sessions (cache 60 s)rien
2Saisie du code ambassadeurPOST /api/tickets/quotecode haché, remise calculée
3Sélection des placesWidget v2 → cartorder_id local (BASKET)
4Création d'ordrePOST Distribution /orders avec reference=CODEorder code Onebox + code
5Paiementcheckout Onebox (ou nôtre)statut PRE_CONFIRM
6Confirmationwebhook ORDER / PURCHASEsale, attributions, compteurs
7Emailsoutbox mail.sendemail_events masqué

Flux statistiques — tournoi, ambassadeurs, admin

Comment une vente Onebox devient un chiffre dans le back-office et une ligne dans l'espace d'un ambassadeur. Ce schéma décrit le circuit complet, y compris les échecs.

SOURCES DE VERITE 1/2 Onebox Orders APIetat autoritaire : BASKETPRE_CONFIRM CONFIRM Onebox WebhooksORDER TICKET EVENT SESSIONHMAC + ob-delivery-id Collecte first-partyanalytics.js vers collect1 evenement 204 consent Fever legacy en extinctionsource pour ventes 2026 etcodes deja emis : lecture seule INGESTION SERVEUR POST webhooks oneboxverif HMAC puis 200 immediatenqueue job onebox.ingestidempotence delivery-id Job worker B-04claim SKIP LOCKED retriesdead letter 02:00 Bruxellesbackfill grace 6 h Attributionorder vers code ambassadeurreference puis sessionambigu : file de revue ReconciliationOrders API par plage from todetecte ventes manqueesecart egal alerte STOCKAGE orders_localorder_code code statusamount session formula sales1 ligne = 1 billetcode seance montant ambassadors codes1 code par clubtype club individual analytics_eventstenant path locale eventsession_hash utm consent webhook_deliveriesdelivery-id uniquestatut tentatives SURFACES DE LECTURE admin statsaudience UTM langue devicefunnel billets cohortes CSVsource analytics_events admin ventescommandes remboursementsreconciliation rejeu ecartsource orders_local sales admin entonnoir6 etapes par codetaux chaines periode from tosource events plus sales Espace ambassadeurcode compteurs progressionrang paliers debloquessource sales par code DESTINATIONS EXTERNES SOUS FLAGS ET CONSENTEMENT GA4 Measurement Protocolserveur puis debug ping Google Adsconversion gtag consent Brevo Eventsv3 events ext_id anonyme Onebox Access Controlvalidation billets jour J LEGENDE flux temps reel : webhook API flux planifie : job backfill export

1. Sources de vérité, et qui gagne en cas de conflit

DonnéeSource autoritaireCopie localeEn cas de conflit
Commande payéeOnebox Orders APIorders_localOnebox gagne ; écart journalisé
Billet venduOnebox (lignes de commande)sales (1 ligne = 1 billet)Onebox gagne ; ligne locale supprimée logiquement
RemboursementWebhook REFUND + Orders APIsales.amount ajustécompteur de paliers recalculé à la baisse
Attribution ambassadeurNous : code porté par la commandeorders_local.codesi absent : file de revue, jamais deviné
Trafic, comportementNotre collecte first-partyanalytics_eventsGA4/Ads sont des copies sortantes

2. Contrats internes

EndpointAppelé parEntréeSortieSécurité
POST /api/tickets/quoteConfigurateur vitrinesession, formula, qty, codeprix, remise, disponibilitéZod, rate-limit, origine
POST /api/ordersVitrine (serveur)session, seats, code, localeorder_code (BASKET)idempotency-key
POST /api/webhooks/oneboxOneboxheaders ob-* + JSON200 si signature valideHMAC sha256, delivery-id unique
POST /api/analytics/collectanalytics.js1 évènement + consent_version204 / 400 / 403 / 413 / 415 / 429origine, rate-limit, PII refusées
POST /jobs/onebox-backfillWorker 02:00from, totraités, écartsinterne, RBAC system

3. Attribution du code — trois règles, dans l'ordre

  1. Référence de commande. À la création de l'ordre, reference = BPP27-XXX-000. Si le webhook la renvoie, l'attribution est certaine : c'est le chemin nominal.
  2. Session d'achat. Si la référence manque mais qu'un code est mémorisé côté client (cookie 30 j, consentement requis), on l'applique.
  3. File de revue. Sinon la vente est marquée unattributed et apparaît dans /admin/ventes. Aucune attribution n'est devinée.

Cas limites tranchés : remboursement partiel ajuste le montant sans retirer la vente ; billet offert compte pour la session mais pas le revenu ; un code par commande (multi-codes refusé) ; deux codes différents = deux commandes.

4. Réconciliation — le filet, pas le moteur

Le webhook est le chemin nominal. Chaque nuit à 02:00 Europe/Bruxelles, le worker appelle Orders API sur la fenêtre écoulée (grâce 6 h), compare à orders_local et produit un rapport d'écart : commandes manquantes, statuts divergents, montants différents. Chaque écart crée un job de correction idempotent et une entrée d'audit. Le rapport d'écart est affiché dans /admin/ventes : non nul = incident, pas statistique.

5. Définitions des indicateurs

IndicateurDéfinition exactePiège évité
Sessionsession_hash distinct, 30 min d'inactivitéconfusion avec visite serveur
Conversion billetscommandes confirmées / sessions ayant atteint « devis prêt »jamais > 100 %
Revenumontants confirmés moins remboursementshors billets offerts et frais
Ventes d'un ambassadeurbillets attribués sur la période du programmehors période exclus du classement
Paliers atteintscumul depuis le début, gelé à la clôtureun remboursement peut faire redescendre

6. Qui voit quoi, et avec quelle latence

SurfaceVueLatenceExclusions
Espace ambassadeurson code, ses billets, progression, rang< 1 min après webhookautres codes, données acheteur
Classementtop 50 + sa lignetemps réelventes non attribuées
/admin/ventescommandes, écarts, remboursementstemps réel—
/admin/entonnoir6 étapes par code, taux chaînés5 minévènements sans consentement
/admin/statsaudience, sources, device, cohortes5 mintests internes

7. Pannes, symptômes, comportement attendu

PanneSymptômeComportement
Webhook non reçuvente absente de l'espace ambassadeurrattrapage nocturne + écart affiché, jamais silencieux
Signature invalide401 sur le webhookrejet, alerte admin, pas de retry infini
Token Onebox expirécatalog indisponiblecache 60 s + statut « erreur » dans /admin/integrations
Consentement refusétrou dans les statsaffiché « non mesuré », jamais zéro
Worker en retardcompteurs en retardheartbeat + âge du dernier job visibles

8. RGPD et sécurité

9. Runbook du jour d'ouverture

  1. Avant : /admin/integrations → Onebox « configuré », test token OK, webhook test reçu, écart de réconciliation à 0.
  2. H-1 : vente de contrôle en production (montant minimum, code de test) → webhook, espace ambassadeur, /admin/stats.
  3. H : surveiller /admin/ventes (écarts) et /admin/stats (sessions).
  4. Écart : rejeu admin uniquement, idempotent et journalisé. Jamais de correction manuelle en base.
  5. Après : réconciliation du lendemain à 0, sinon incident ouvert avec l'heure et la commande.

10. Ce qui reste à construire

ÉlémentÉtatBloqué par
Webhooks Onebox + attributionspécifié, non codésecret HMAC + décision reference
Réconciliation nocturnespécifiéeworker B-04
Envoi GA4 / Ads / Brevoflags + tests prêtsclés + Consent Mode v2
Sous-ensemble polices (dérogation LCP)à refaireoutillage fontTools
Décommissionnement Feverplanifiéfin de saison 2026

4. Ce qu'il faut pour lancer l'intégration

Compte & accès
  • Environnement test : api.oneboxtds.net
  • client_id, client_secret du seller channel
  • channel_id
  • Accès au back-office Onebox (événement, sessions, tarifs)
Domaines autorisés
  • bpp27.tero.be (widget)
  • staging-ambassador.bpp27.tero.be
  • architecture.bpp27.tero.be (cette page)
  • Sans ça, le widget refuse de s'initialiser
Données événement
  • Event Onebox ↔ nos 18 pages
  • 8 jours / 2 sessions : mapping session_key
  • Formules A→G ↔ produits Onebox
  • Zones : Central / Fixed Seats / VIP
  • Grille tarifaire 2027 (bloquant commercial)
Webhooks
  • URL de réception + IP/plages si filtrage
  • Secret HMAC de signature
  • Abonnement : ORDER (PURCHASE, REFUND, CANCEL), TICKET, EVENT, SESSION
  • Fenêtre de retry et politique de rejeu
Certification
  • Parcours de certification Onebox (doc /docs/certification)
  • Scénarios à rejouer : achat, remboursement, hold expiré, rupture
  • Validation avant bascule production
Décisions produit
  • Qui crée l'ordre : nous (attribution fiable) ou le widget (plus simple, attribution fragile)
  • Champ libre reference accepté sur les lignes ?
  • Checkout hébergé ou maison
  • Remboursements : self-service admin ou Tero uniquement
Conformité
  • CGV et politique de rétention à valider
  • DPA Onebox / transferts
  • Consent Mode v2 avant GA4/Ads
  • Mention « prix à l'ouverture » tant que la grille n'est pas validée
Exploitation
  • Comptes admin Tero (noms + emails)
  • Adresse de contrôle des emails
  • Fenêtre de bascule + rollback
  • Qui répond en cas d'incident le jour J

5. Ordre de mise en œuvre

LotContenuDuréeDépend de
L1Module onebox dans le registre + OAuth2 serveur + bouton de test1 jcreds test
L2Catalog : sessions, prix, disponibilité → configurateur1 jL1
L3Widget v2 : plan, panier, checkout2 jL1 + domaine autorisé
L4Webhooks : endpoint signé, journal, idempotence, attribution code2 jL3 + secret HMAC
L5Réconciliation nocturne + worker jobs (B-04)2 jL4
L6Décommissionnement Fever, bascule prod, certification2 jtous