Sept vérifications, dans l'ordre. Chacune ne prend que quelques secondes, et chacune ferme une cause de panne — c'est ce qui évite de chercher au mauvais endroit.
curl https://api.inovertix.com/api/inoshop/ingest/ping \ -H "Authorization: Bearer INOSHP_ING_votre_cle"
Vous devez lire le nom de votre boutique. Si vous lisez celui d'une autre, la clé n'est pas la bonne.
Dans la réponse du ping, accepted_statuses liste ce que nous savons traduire. Le mot que votre application écrit doit y figurer. Sinon, dites-le nous : c'est un réglage de la boutique, pas une modification de votre code.
ping
accepted_statuses
Faites une vraie souscription à un tarif minimal. Elle doit apparaître dans le cockpit INOSHOP avec son type, son plan et sa périodicité — pas seulement avec son montant. Si le type manque, c'est order.kind qui n'est pas envoyé.
order.kind
Ouvrez l'Events Manager de votre pixel, onglet Événements de test, avec le code de test que nous avons renseigné. Vous devez y voir un Purchase dont la source est Serveur — et non Navigateur.
Purchase
Regardez ensuite la qualité de correspondance (EMQ). En dessous de 5, il manque des signaux : vérifiez que tracking part bien avec la vente, et que l'IP et le user-agent sont ceux du client, pas ceux de votre serveur (l'erreur la plus fréquente, et la plus silencieuse).
tracking
Renvoyez exactement le même appel. Vous devez lire "result": "duplicate", et rien de nouveau ne doit apparaître ni dans le cockpit ni dans l'Events Manager.
"result": "duplicate"
Si votre site est mesuré par INOTRACK et que vous avez transmis session_uid, la vente doit porter sa source d'acquisition dans le cockpit. Sinon, c'est que le cookie de session n'a pas été lu au checkout.
session_uid
Tant qu'un code de test est renseigné, aucun événement de la boutique n'alimente vos statistiques ni vos audiences Meta. C'est l'étape qu'on oublie, et elle coûte des semaines de mesure.
Surveillez ensuite l'ingestion pendant 48 heures avant de considérer la mise en service terminée.
code
401
missing_api_key
Authorization: Bearer INOSHP_ING_…
invalid_api_key
403
shop_inactive
422
empty_payload
external_ref
events
too_many_events
invalid_payload
products: []
429
rate_limit_exceeded
200
result
reason
duplicate
error
invalid_external_ref
unknown_event
event
created
updated
status_changed
unknown_status
invalid_occurred_at
2026-09-01T10:15:00+00:00
source_not_push
write_failed
accepted
Trois causes, dans l'ordre de fréquence :
Le statut n'est pas « confirmé ». Une vente pending est enregistrée mais n'est pas une vente : rien ne part. Vérifiez mapped_status dans le journal d'ingestion.
pending
mapped_status
Un code de test est actif et vous regardez l'onglet des événements réels — ou l'inverse.
Le pixel ou le jeton Meta de la boutique n'est pas renseigné. Dans ce cas la vente est bien enregistrée, mais aucun envoi n'est tenté : nous le voyons dans le cockpit.
La référence est la même que le mois précédent : nous répondons duplicate, comme prévu. Une échéance = une external_ref (sub_1042_2026-09, sub_1042_2026-10).
sub_1042_2026-09
sub_1042_2026-10
Le tracking est vide, ou rempli au moment de l'appel serveur. Ses valeurs doivent être lues dans le navigateur au checkout puis stockées : au moment où votre serveur nous appelle, l'IP est celle de votre serveur et le user-agent celui de votre client HTTP. Voyez la section correspondante du guide Laravel.
C'est attendu. Le statut change dans le cockpit ; aucun événement correctif n'est envoyé à Meta, parce que Meta n'offre pas de mécanisme officiel de déduction d'un achat déjà transmis. En inventer un fausserait vos statistiques plus sûrement qu'il ne les corrigerait.
Elle ne se retrouve pas — nous n'en stockons que l'empreinte. Elle se régénère, et l'ancienne se révoque. Les ventes déjà reçues ne bougent pas.