INOSHOP lit les commandes WooCommerce, les valide, et envoie l'événement Purchase à la Meta Conversions API depuis le serveur. Le site n'a rien à installer : ni script, ni clé, ni appel vers CONTROL.
Purchase
Il a une seule chose à faire : écrire six métas sur la commande au moment du checkout. Elles sont invisibles pour le client et ne coûtent rien — mais ce sont elles qui décident si Meta reconnaît l'acheteur ou non.
Pourquoi le site et pas nous ? Ces valeurs n'existent qu'à l'instant du passage de commande, dans le navigateur du client. Quand INOSHOP envoie l'événement — souvent des heures plus tard, à la validation d'un paiement à la livraison — il ne voit plus que son propre serveur. Les reprendre à ce moment-là donnerait l'IP de CONTROL et le user-agent de Guzzle : un rapprochement nul et un EMQ qui s'effondre.
À écrire sur la commande WooCommerce, en une seule fois, juste après sa création.
_fbp
_fbc
fbclid
_external_id
_client_ip
_client_user_agent
_event_source_url
event_source_url
Les cinq premières alimentent le user_data de l'événement. La sixième n'en fait pas partie : elle devient l'event_source_url, c'est-à-dire le lieu déclaré de l'achat.
user_data
// Côté SERVEUR du site, au moment où la commande est créée. // `contexte` est ce que vous avez déjà sous la main dans le handler. await marquerMetaCommande(orderId, { _fbp: suivi.fbp, _fbc: suivi.fbc, _external_id: suivi.external_id, _client_ip: contexte.ip, _client_user_agent: contexte.userAgent, _event_source_url: contexte.url, // ex. https://soraparfume.com/commande });
Ou directement en REST WooCommerce :
PUT /wp-json/wc/v3/orders/1042 { "meta_data": [ { "key": "_fbp", "value": "fb.1.1699..." }, { "key": "_fbc", "value": "fb.1.1699....IwAR..." }, { "key": "_external_id", "value": "c-8842" }, { "key": "_client_ip", "value": "41.207.x.x" }, { "key": "_client_user_agent", "value": "Mozilla/5.0 (...)" }, { "key": "_event_source_url", "value": "https://soraparfume.com/commande" } ] }
Une méta absente n'est jamais bloquante : INOSHOP omet le champ plutôt que d'envoyer une valeur vide, et tente un repli sur la session INOTRACK liée si le traqueur est installé. Mais un repli reste un repli — la valeur du checkout est toujours meilleure.
C'est le domaine que Meta considère comme l'origine de l'achat. Il doit être celui où le pixel s'exécute et qui est vérifié dans le Business Manager.
Sur une boutique headless, c'est le piège : l'API vit sur api.soraparfume.com, les clients achètent sur soraparfume.com. Sans cette méta, INOSHOP retombe sur l'adresse publique réglée dans CONTROL — correcte, mais c'est le domaine seul, pas la page. Avec la méta, l'Achat porte la même URL que le Prospect et que l'événement du pixel navigateur, ce que Meta exploite pour les rapprocher.
api.soraparfume.com
soraparfume.com
**INOSHOP → Boutiques → votre boutique → Connexion → « Adresse vue par les clients »**.
À remplir uniquement si la boutique est headless. Sur une boutique WooCommerce classique, les deux adresses se confondent : laissez le champ vide.
C'est le point qui coûte le plus cher quand on se trompe, et il est contre-intuitif.
INOSHOP envoie le Purchase à la validation de la commande, pas au checkout. Sur du paiement à la livraison, cela peut être des heures ou des jours plus tard — c'est délibéré : dater l'événement à la création garde l'achat dans la fenêtre d'attribution de la publicité qui l'a généré.
L'event_id est tiré à cet instant-là, côté serveur. Le navigateur du client, qui est passé bien avant, ne peut pas le connaître. Il n'y a donc aucune déduplication possible.
event_id
Conséquence : si votre page de confirmation déclenche un fbq('track', 'Purchase'), chaque vente est comptée deux fois dans l'Events Manager, et votre ROAS affiché est faux d'un facteur deux.
fbq('track', 'Purchase')
PageView
ViewContent
AddToCart
InitiateCheckout
Lead
Si vous tenez à un Purchase navigateur (pour une mesure immédiate), dites-le nous : il faudra que le site pose lui-même l'event_id au checkout et qu'INOSHOP le reprenne — ce qui n'est pas le fonctionnement actuel, et ce que la fenêtre de déduplication de Meta (48 h) rend de toute façon inopérant sur une validation tardive.
Rien à faire pour vous, mais utile à savoir pour lire l'Events Manager :
event_time
action_source = website : l'achat a bien eu lieu sur le site, et c'est cette valeur qui autorise Meta à exploiter _fbp / _fbc.
action_source
website
Téléphone, email, nom, ville sont pris sur la commande et hachés en SHA-256 après normalisation. Rien de personnel ne part en clair.
Un remboursement part comme événement personnalisé à valeur négative, daté du jour.
Dans l'ordre, chacune se vérifie seule :
Une commande de test passée depuis le site porte bien les six métas (WooCommerce → la commande → « Champs personnalisés », ou GET /wp-json/wc/v3/orders/{id}).
GET /wp-json/wc/v3/orders/{id}
_fbc est présent quand on arrive depuis une publicité (URL avec fbclid). C'est le signal le plus précieux : sans lui, l'achat n'est pas rattaché à la campagne.
_client_ip est l'IP du client, pas celle de votre serveur Next.js (attention derrière un proxy : lire x-forwarded-for).
x-forwarded-for
CONTROL → la commande → onglet Meta CAPI : la provenance de chaque champ indique order et non session ou absent.
order
session
absent
Events Manager : un seul Purchase par commande, aucun avertissement de domaine non vérifié.
fbq('track','Purchase')
Voir aussi : ../inotrack/ — le traqueur, qui alimente le repli des signaux quand le checkout n'en transmet pas.
../inotrack/