APPEL D’OFFRESUn appel d’offres remporté exige PunchOut ?Télécharger le Tender Kit

E-commerce sur mesure · développeurs

Spécifications d’intégration PunchOut pour boutiques sur mesure

Ce que votre boutique sur mesure ou headless doit implémenter pour fonctionner avec la passerelle PunchOut Rocket, avec les mêmes fonctions que nos plugins : sessions PunchOut avec connexion automatique, retour du panier, correspondances des catégories et, avec le forfait Premium, bons de commande, confirmations et avis d’expédition. La passerelle gère cXML et OCI avec le client.

  • Les mêmes fonctions que les plugins
  • JSON via HTTPS
  • cXML et OCI gérés par la passerelle

Ce que votre boutique implémente

Chaque fonction est un petit endpoint JSON ou un formulaire de navigateur sur votre boutique. Implémentez d’abord les éléments obligatoires ; les bons de commande et leurs mises à jour peuvent suivre.

Fonctions, implémentation dans votre boutique et forfait nécessaire
SectionFonctionnalitéCe que votre boutique implémenteObligatoireForfait
2–3Session PunchOut (create, edit, inspect) avec connexion automatiqueEndpoint de clonage et connexion SSOOuiToutes les licences
4Transfert du panier vers le système d’achatFormulaire à envoi automatique vers PunchOut RocketOuiToutes les licences
5Correspondances des catégories, par exemple UNSPSCEndpoint des catégoriesRecommandéToutes les licences
6Bons de commande (cXML OrderRequest)Endpoint de création des commandesFacultatifForfait Premium
7Confirmations de commande et avis d’expédition (cXML ConfirmationRequest, ShipNoticeRequest)Endpoint d’état des commandesFacultatif, nécessite 6Forfait Premium + option OC & ASN
8Mises à jour immédiates des commandesNotification à PunchOut RocketFacultatif, nécessite 7Forfait Premium + option OC & ASN
–Paniers prédéfinisRien : PunchOut Rocket les présente au client et envoie lui-même le panier choisi au système d’achat–Forfait Premium

L’essai gratuit inclut les fonctions du forfait Premium. Les confirmations et avis d’expédition sont une option du forfait Premium (OC & ASN) : contactez-nous pour l’activer.

1. Configuration dans PunchOut Rocket

Site e-commerce

Champs du site pour une plateforme sur mesure
ChampValeur
E-commerce PlatformCustom
Site URLURL de base de votre boutique, par exemple https://your-store.example.com. Elle peut inclure un chemin (https://example.com/shop) ; le / final est supprimé
API KeyUn secret d’au moins 10 caractères. PunchOut Rocket l’envoie à chaque appel à votre boutique : celle-ci doit connaître la même valeur
Custom Clone EndpointChemin de l’endpoint de clonage. Si vide : /api/punchout/clone
Custom Categories EndpointChemin de l’endpoint des catégories. Si vide : /api/punchout/categories
Custom Create Order EndpointChemin de l’endpoint de création des commandes. Si vide : /api/punchout/create-order
Custom Order Status EndpointChemin de l’endpoint d’état des commandes. Si vide : /api/punchout/order-status
Use Reverse Proxy, Reverse Proxy URLActivé par défaut. Reverse Proxy URL est en lecture seule, générée à partir de Site Name, par exemple https://your-store.punchoutrocket.com : les clients ouvrent votre boutique par cette adresse, ce qui évite les problèmes SameSite et CORS dans les systèmes d’achat. Le schéma et l’hôte de sso_url retourné sont remplacés par ceux de cette URL ; le chemin et la requête sont conservés

Les chemins des endpoints sont ajoutés tels quels à Site URL et doivent donc commencer par /. Exemple : Site URL https://your-store.example.com + /api/punchout/clone → https://your-store.example.com/api/punchout/clone.

Formulaire Add E-commerce Site pour une plateforme sur mesure : Site Name, Site URL, Use Reverse Proxy avec Reverse Proxy URL en lecture seule, les quatre endpoints personnalisés, API Key avec Generate, DUNS et ANID
Paramètres du site e-commerce pour une plateforme sur mesure

Les bons de commande (section 6) et paniers prédéfinis sont inclus dans le forfait Premium et l’essai gratuit : votre forfait les active sur le site et la page du client final affiche alors les sections Orders et Predefined Carts. Les confirmations et avis d’expédition (sections 7–8) nécessitent aussi l’option OC & ASN.

Client final

Chaque entreprise cliente est un client final de votre site. Outre ses identifiants de protocole (identités cXML et shared secret, ou utilisateur et mot de passe OCI), ces champs concernent votre boutique :

Champs du client final concernant votre boutique
ChampUtilisé pour
E-commerce User to CloneNom d’utilisateur (ou email) d’un utilisateur de votre boutique. Envoyé comme username à l’endpoint de clonage et comme customer_email à la création de commande : les utilisateurs PunchOut du client sont clonés à partir de lui et ses commandes lui sont attribuées. Attribuez-lui les prix, remises et adresses prévus pour ce client
Default UNSPSCCode de catégorie utilisé pour les produits dont les catégories n’ont pas de code associé (section 5)
Default Lead TimeDélai de livraison en jours envoyé avec chaque article OCI (3 par défaut)
EA Override, BX OverrideRemplacent l’unité de mesure EA ou BX envoyée par votre boutique (section 4) par le code attendu par ce client. Appliqués uniquement lorsque la boutique envoie ce code : une unité vide devient EA sans remplacement
Category MappingVos catégories, chargées avec « Update from e-commerce », chacune associée à un code (section 5)
Shipping Method, Payment MethodEnvoyés à la création de commande (section 6). Laissez-les vides pour utiliser les valeurs par défaut de votre boutique
Send order status updates, Order status URL, Supplier shared secretActivent les sections 7–8 pour ce client : l’URL et le secret sont ceux de son système d’achat
Page Edit End Customer avec les sections General, PunchOut Connection, Cart Defaults, Category Mapping et Orders
Paramètres du client final

Le reste des pages du site et du client final fonctionne comme pour les autres plateformes : consultez la documentation.

Règles communes

Elles s’appliquent à chaque appel de PunchOut Rocket à vos endpoints (sections 2, 5, 6 et 7) :

  • Méthode et format : toujours POST avec un corps JSON (Content-Type: application/json). Répondez en JSON.
  • Authentification : le corps contient toujours api_key. Comparez-la à la clé configurée dans votre boutique et rejetez l’appel avec HTTP 401 si elle ne correspond pas.
  • HTTPS uniquement.
  • Erreurs : répondez avec un statut HTTP non 2xx et {"status": "error", "message": "<reason>"} (error_code est facultatif). Rendez le message explicite, par exemple Product X-100 not found : il figure dans les journaux et les emails d’erreur envoyés au propriétaire du site.
  • Délais d’attente : les appels de création et d’état des commandes expirent après 30 secondes. Répondez rapidement et effectuez ensuite les opérations lentes.

2. Endpoint de clonage

Chemin par défaut : /api/punchout/clone. Appelé lorsqu’un client ouvre votre boutique depuis son système d’achat. Votre boutique crée (ou réutilise) un utilisateur cloné de username, lié à cette session PunchOut, et retourne une URL SSO qui connecte cet utilisateur (section 3).

Corps de la requête

Endpoint de clonage : champs de requête
ChampTypeSignification
usernamestring« E-commerce User to Clone » du client final
api_keystringClé API du site
session_tokenstringID de session PunchOut (BuyerCookie cXML ou UUID pour OCI). Conservez-le : il est renvoyé dans le formulaire du panier (section 4)
end_customer_idintegerID du client final dans PunchOut Rocket. Conservez-le : il est renvoyé dans le formulaire du panier (section 4)
operationstringcreate, edit ou inspect pour cXML ; toujours create pour OCI
gateway_base_urlstringURL de base de PunchOut Rocket : le formulaire du panier (section 4) envoie à {gateway_base_url}/start-sso-checkout
selected_itemobject, facultatifcXML uniquement : le produit choisi par le client dans le catalogue du système d’achat. Contient supplier_part_id (SKU) et/ou supplier_part_auxiliary_id (ID produit), uniquement ceux envoyés par le client
cart_itemsarray, facultatifcXML edit et inspect uniquement : le panier à restaurer. Absent si le système du client n’a envoyé aucun article
Chaque article de cart_items, tel que renvoyé par le système d’achat
ChampTypeSignification
skustringSKU (peut être vide)
product_idstringID produit dans votre boutique (peut être vide)
quantitystringQuantité, par exemple "2"
pricestringPrix unitaire, point comme séparateur décimal, par exemple "15.95". Informatif : le panier utilise vos prix actuels
descriptionstringDescription du produit
currencystringCode ISO 4217

quantity et price sont des chaînes : convertissez-les avant utilisation.

Requête : création avec un article sélectionné

{
  "username": "buyer123",
  "api_key": "site-api-key-abc",
  "session_token": "sess-012345",
  "operation": "create",
  "end_customer_id": 2,
  "gateway_base_url": "https://middleware.example.com",
  "selected_item": {
    "supplier_part_id": "X-100",
    "supplier_part_auxiliary_id": "19853"
  }
}

Requête : edit, avec le panier à restaurer

{
  "username": "buyer123",
  "api_key": "site-api-key-abc",
  "session_token": "sess-67890",
  "operation": "edit",
  "end_customer_id": 2,
  "gateway_base_url": "https://middleware.example.com",
  "cart_items": [
    {"sku": "ABC-001", "product_id": "19852", "quantity": "2", "price": "15.95",
     "description": "Example description", "currency": "EUR"},
    {"sku": "XYZ-002", "product_id": "19854", "quantity": "1", "price": "249.00",
     "description": "Another example description", "currency": "EUR"}
  ]
}

Réponse de succès

HTTP 2xx

HTTP 200
{
  "status": "success",
  "sso_url": "https://your-store.example.com/punchout/sso?token=eyJ..."
}

sso_url est le seul champ lu : il est obligatoire et doit être une URL absolue http:// ou https://. PunchOut Rocket y dirige le navigateur du client (via le système d’achat pour cXML, directement pour OCI).

Réponses d’erreur

Tout statut non 2xx ou réponse sans sso_url valide fait échouer le PunchOut : le client reçoit une erreur dans son système d’achat. Votre réponse (statut et corps) est enregistrée dans le journal de session PunchOut ; expliquez donc la raison dans le message.

Endpoint de clonage : réponses d’erreur
HTTPQuandCorps
400Champs manquants ou non valides{"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"}
401api_key incorrecte{"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"}
422SSO impossible, par exemple username introuvable{"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"}
500Erreur interne{"status": "error", "error_code": "internal_error", "message": "..."}

3. Connexion SSO

Lorsque le client ouvre sso_url, votre boutique :

  1. consomme le jeton (usage unique) et connecte l’utilisateur cloné ;
  2. pour edit et inspect : remplit le panier avec exactement les produits et quantités de cart_items, puis affiche le panier (les prix actuels s’appliquent) ;
  3. pour create : affiche le produit selected_item s’il a été envoyé et existe encore, sinon la page d’accueil de la boutique.

Donnez au jeton une validité de quelques minutes, pas de secondes : lorsque le client final dispose de paniers prédéfinis, il voit d’abord leur page et n’ouvre sso_url qu’en choisissant de poursuivre vers la boutique.

4. Transfert du panier (formulaire à envoi automatique)

Pour un utilisateur PunchOut, le bouton de validation ne doit pas démarrer votre processus de commande : il envoie le panier à PunchOut Rocket. Votre boutique retourne une page HTML qui soumet automatiquement un formulaire masqué, idéalement avec un indicateur de chargement.

  • URL : {gateway_base_url}/start-sso-checkout (gateway_base_url de la requête de clonage)
  • Méthode : POST, application/x-www-form-urlencoded (envoi classique d’un formulaire du navigateur)
  • Pas d’api_key : la session est identifiée par session_token et end_customer_id.
Champs de transfert du panier
ChampObligatoireSignification
session_tokenOuiDe la requête de clonage
end_customer_idOuiDe la requête de clonage
products[i][sku]OuiSKU. Devient le SupplierPartID cXML ou la référence article fournisseur OCI
products[i][product_id]OuiID produit dans votre boutique. Devient le SupplierPartAuxiliaryID cXML : le client le renvoie dans edit et les bons de commande
products[i][description]OuiNom ou description du produit. Les balises HTML sont supprimées
products[i][quantity]OuiQuantité, point comme séparateur décimal
products[i][price]OuiPrix unitaire, point comme séparateur décimal, sans séparateur de milliers
products[i][currency]OuiCode ISO 4217
products[i][unit_of_measure]NonCode d’unité UN/CEFACT. Par défaut EA
products[i][manufacturer_name]NonFabricant
products[i][category_ids]NonID séparés par des virgules des catégories auxquelles le produit appartient directement (feuilles de l’arbre), retournés par l’endpoint des catégories (section 5). Utilisés pour trouver l’UNSPSC du produit

i commence à 0, sans interruption : PunchOut Rocket arrête la lecture au premier indice manquant. Pensez à échapper les valeurs pour HTML.

Exemple de page retournée à la validation de commande

<!doctype html>
<html>
<body>
<p>Sending your cart to your procurement system…</p>
<form id="punchout_repost" method="post" action="https://middleware.example.com/start-sso-checkout">
  <input type="hidden" name="session_token" value="sess-012345"/>
  <input type="hidden" name="end_customer_id" value="2"/>
  <input type="hidden" name="products[0][sku]" value="ABC-001"/>
  <input type="hidden" name="products[0][product_id]" value="19852"/>
  <input type="hidden" name="products[0][description]" value="Example description"/>
  <input type="hidden" name="products[0][quantity]" value="2"/>
  <input type="hidden" name="products[0][price]" value="15.95"/>
  <input type="hidden" name="products[0][currency]" value="EUR"/>
  <input type="hidden" name="products[0][unit_of_measure]" value="EA"/>
  <input type="hidden" name="products[0][manufacturer_name]" value="3M"/>
  <input type="hidden" name="products[0][category_ids]" value="1145,3398"/>
  <input type="hidden" name="products[1][sku]" value="XYZ-002"/>
  <input type="hidden" name="products[1][product_id]" value="19854"/>
  <input type="hidden" name="products[1][description]" value="Another example description"/>
  <input type="hidden" name="products[1][quantity]" value="4"/>
  <input type="hidden" name="products[1][price]" value="10.90"/>
  <input type="hidden" name="products[1][currency]" value="EUR"/>
  <input type="hidden" name="products[1][manufacturer_name]" value="DEWALT"/>
  <input type="hidden" name="products[1][category_ids]" value="2146"/>
</form>
<script>document.getElementById('punchout_repost').submit();</script>
</body>
</html>

PunchOut Rocket envoie alors le panier au système d’achat et termine la session. Une session n’accepte qu’un seul panier :

Transfert du panier : réponses d’erreur
HTTPQuand
400session_token ou end_customer_id manquant ou non valide, ou aucune session correspondante
409Un panier a déjà été envoyé pour cette session

5. Endpoint des catégories

Chemin par défaut : /api/punchout/categories. Appelé lorsque le propriétaire du site clique sur « Update from e-commerce » dans le Category Mapping d’un client final. Les catégories sont ensuite associées manuellement aux codes du client, comme UNSPSC.

Requête

{"api_key": "site-api-key-abc"}

Succès : HTTP 200, status success ou ok

HTTP 200
{
  "status": "success",
  "categories": [
    {"id": 1345, "name": "Office Supplies", "parent_id": 0},
    {"id": 1847, "name": "Pens", "parent_id": 1345},
    {"id": 2345, "name": "Electronics", "parent_id": 0}
  ]
}
Catégories : champs
ChampSignification
idID de catégorie dans votre boutique, entier différent de 0 : les mêmes ID que vous envoyez dans category_ids (section 4)
nameNom affiché. Les catégories sans nom sont ignorées
parent_idID de la catégorie parente, 0 pour celles de premier niveau

Retournez l’arbre complet en une réponse. Chaque mise à jour aligne la liste du client final sur votre réponse : les catégories non retournées sont supprimées avec leur code associé ; conservez donc des ID stables.

Category Mapping avec le bouton Update from e-commerce et une arborescence de catégories avec codes UNSPSC
Category Mapping d’un client final

Comment un produit du panier obtient son code :

  1. le code associé à l’un de ses category_ids ;
  2. sinon, le code de la catégorie parente la plus proche qui en possède un ;
  3. sinon, le Default UNSPSC du client final.

6. Endpoint de création des commandes

Chemin par défaut : /api/punchout/create-order. Appelé lorsque le système d’achat du client envoie un bon de commande (cXML OrderRequest). Votre boutique crée la commande et retourne son ID et l’ID de l’article de commande créé pour chaque ligne du PO. PunchOut Rocket répond au système d’achat avec le résultat. Nécessite le forfait Premium.

Le client envoie ses bons de commande à l’« Order request URL » affichée dans la section Orders du client final, où sont définis Shipping Method, Payment Method et les mises à jour d’état (section 7) :

Section Orders d’un client final avec Order request URL, Shipping Method, Payment Method et interrupteur Send order status updates avec Order status URL et Supplier shared secret
Paramètres Orders du client final

Corps de la requête

Création des commandes : champs de requête
ChampTypeSignification
api_keystringClé API du site
gateway_urlstringURL de base de PunchOut Rocket, pour la notification d’état (section 8)
customer_emailstring« E-commerce User to Clone » du client final (même valeur que username dans la requête de clonage, donc pas nécessairement un email) : attribuez la commande à cet utilisateur
order_idstringNuméro de PO du client. Enregistrez-le dans la commande : c’est la référence connue du client
order_datestringDate du PO envoyée par le client (ISO 8601)
currencystringISO 4217
totalstringTotal du PO, point comme séparateur décimal
shipping_methodstringShipping Method du client final. Peut être vide : utilisez votre valeur par défaut
payment_methodstringPayment Method du client final, par exemple virement bancaire. Peut être vide : utilisez votre valeur par défaut
billing_address, shipping_addressobjectname, street (plusieurs lignes séparées par \n, par exemple une ligne « Attn: » avant la rue), city, state, postal_code, country_code (ISO 3166-1 alpha-2), email. Les champs absents du PO sont des chaînes vides
itemsarrayLignes du PO, voir ci-dessous
Création des commandes : chaque article
ChampTypeSignification
line_numberstringNuméro de ligne du PO : renvoyez-le dans la réponse
skustringSKU (cXML SupplierPartID)
product_idstringID produit (SupplierPartAuxiliaryID cXML). Peut être vide : recherchez alors le produit par sku
quantityintegerQuantité commandée
unit_pricestringPrix unitaire du PO (prix approuvé par le client), point comme séparateur décimal
currencystringISO 4217
descriptionstringDescription de la ligne

Requête

{
  "api_key": "site-api-key-abc",
  "gateway_url": "https://middleware.example.com",
  "customer_email": "buyer123",
  "order_id": "PO-4500123",
  "order_date": "2026-11-10T10:00:00+01:00",
  "currency": "EUR",
  "total": "280.90",
  "shipping_method": "Standard",
  "payment_method": "Bank transfer",
  "billing_address": {"name": "ACME Spa", "street": "Via Roma 1", "city": "Milano",
    "state": "MI", "postal_code": "20100", "country_code": "IT", "email": "ap@acme.example"},
  "shipping_address": {"name": "ACME Spa - Warehouse", "street": "Attn: Mario Rossi\nVia Milano 5",
    "city": "Torino", "state": "TO", "postal_code": "10100", "country_code": "IT", "email": ""},
  "items": [
    {"line_number": "1", "sku": "ABC-001", "product_id": "19852", "quantity": 2,
     "unit_price": "15.95", "currency": "EUR", "description": "Example description"},
    {"line_number": "2", "sku": "XYZ-002", "product_id": "19854", "quantity": 1,
     "unit_price": "249.00", "currency": "EUR", "description": "Another example description"}
  ]
}

Réponse de succès

HTTP 2xx

HTTP 200
{
  "status": "success",
  "order_id": "100045",
  "items": [
    {"line_number": "1", "order_item_id": "5501"},
    {"line_number": "2", "order_item_id": "5502"}
  ]
}
Création des commandes : champs de réponse
ChampObligatoireSignification
statusOuiExactement success
order_idOuiID de commande dans votre boutique : PunchOut Rocket le transmet à l’endpoint d’état des commandes (section 7). Il doit rester inchangé pendant toute la vie de la commande
itemsRecommandéPour chaque ligne du PO créée, l’ID de son article de commande (les mêmes ID retournés par l’endpoint d’état). Si deux lignes deviennent le même article de commande (même produit), listez les deux valeurs line_number avec cet order_item_id

items permet à PunchOut Rocket de confirmer le PO et de notifier les expéditions ligne par ligne. Sans ce champ, confirmations et expéditions partielles ne peuvent pas être signalées : la commande est confirmée en totalité et seule sa première expédition est notifiée, comme une expédition complète.

Erreurs

Tout statut non 2xx ou un status autre que success signifie que la commande n’a pas été créée : le système d’achat reçoit une erreur et le propriétaire du site un email avec votre message. Cas courants : customer_email introuvable, produit introuvable, commande impossible à créer.

Si un produit est introuvable, vous pouvez créer la commande sans lui et omettre son line_number de items : cette ligne sera rejetée dans la confirmation de commande.

PunchOut Rocket ne détecte pas un PO envoyé deux fois : si votre boutique possède déjà une commande pour cet order_id et cet utilisateur, retournez-la au lieu d’en créer une seconde.

7. Endpoint d’état des commandes

Chemin par défaut : /api/punchout/order-status. Appelé uniquement pour les clients finaux avec « Send order status updates » activé, pour les commandes créées via la section 6 : chaque heure pendant 60 jours après la commande et immédiatement après une notification (section 8). Nécessite l’option OC & ASN. À partir de la réponse, PunchOut Rocket envoie au système d’achat du client :

  • une confirmation de commande (cXML ConfirmationRequest), une seule fois, lorsque la commande est acceptée ou annulée ;
  • un avis d’expédition (cXML ShipNoticeRequest) pour chaque nouvelle expédition d’une commande confirmée.

PunchOut Rocket mémorise ses envois : répondez toujours avec l’état actuel de la commande et PunchOut Rocket détermine les nouveautés.

Requête : order_id est celui retourné par votre endpoint de création des commandes

{"api_key": "site-api-key-abc", "order_id": "100045"}

Réponse de succès

HTTP 200

HTTP 200
{
  "status": "success",
  "order_status": "shipped",
  "items": ["5501", "5502"],
  "quantities": [
    {"order_item_id": "5501", "quantity": 2},
    {"order_item_id": "5502", "quantity": 1}
  ],
  "shipments": [
    {
      "id": "SH-1",
      "shipped_at": "2026-11-12T09:30:00+01:00",
      "carrier": "UPS",
      "tracking": "1Z999AA10123456784",
      "items": [{"order_item_id": "5501", "quantity": 2}]
    }
  ]
}
État des commandes : champs de réponse
ChampObligatoireSignification
statusOuiExactement success
order_statusOuiL’état de votre commande associé à l’une des valeurs ci-dessous
itemsOuiID des articles encore présents dans la commande. Un article supprimé n’apparaît pas ici
quantitiesRecommandéQuantité actuelle de chaque article de commande. Sans ce champ, un article encore présent est considéré comme contenant intégralement ses lignes du PO : une quantité réduite ne peut pas être signalée
shipmentsRecommandéUne entrée par expédition envoyée. Vide ([]) si votre boutique ne suit pas les expéditions : seules les confirmations sont alors envoyées, sans avis d’expédition
Valeurs de order_status
ValeurSignificationEnvoyé au client
pendingReçue, pas encore acceptéeRien
processingAcceptéeConfirmation
shippedExpédiée, partiellement ou totalementConfirmation si elle n’a pas encore été envoyée, puis avis d’expédition
deliveredLivréeIdentique à shipped
cancelledAnnuléeRejet de toute la commande, même après confirmation. Définitif : la commande n’est plus vérifiée

La confirmation est envoyée une seule fois, lorsque la commande devient pour la première fois processing, shipped ou delivered :

  • elle accepte toute la commande si chaque ligne du PO y figure intégralement ;
  • sinon, elle accepte chaque ligne pour la quantité présente dans la commande et rejette le reste (articles supprimés, quantités réduites). Une quantité supérieure au PO est confirmée à hauteur de celle du PO ;
  • s’il ne reste aucune ligne, rien n’est envoyé : utilisez cancelled pour rejeter la commande.

Les modifications ultérieures des articles ne sont pas reconfirmées : modifiez la commande avant de l’accepter.

Chaque expédition
ChampObligatoireSignification
idOuiID d’expédition, unique dans la commande et jamais réutilisé : chaque ID est notifié une seule fois
shipped_atRecommandéDate d’expédition, ISO 8601 avec décalage de fuseau horaire
carrierNonNom du transporteur
trackingNonNuméro de suivi. Le transporteur n’est signalé qu’avec ce numéro
itemsOuiArticles de cette expédition et quantité expédiée (order_item_id de la création de commande). Une expédition sans aucun article du PO n’est pas notifiée

Signalez une expédition seulement après son départ. Les modifications effectuées après sa notification ne sont pas renvoyées. Si le système d’achat refuse une confirmation ou un avis d’expédition, PunchOut Rocket le renvoie au prochain contrôle et bloque les envois suivants jusqu’à son acceptation.

État des commandes : réponses d’erreur
HTTPQuandEffet
404 avec {"status": "error", ...}La commande n’existe pas, par exemple elle a été suppriméeJournalisé, vérifié à nouveau au prochain cycle
Autres statuts non 2xxTout autre échecJournalisé, vérifié à nouveau au prochain cycle

8. Notification de l’état des commandes (facultative)

Sans elle, PunchOut Rocket lit l’état des commandes chaque heure. Pour envoyer confirmations et avis d’expédition en quelques secondes, notifiez PunchOut Rocket dès qu’une commande créée via la section 6 change (état, articles, nouvelle expédition) :

  • URL : {gateway_url}/order-status-changed (gateway_url de la requête de création de commande)
  • Méthode : POST, Content-Type: application/json
  • Sans authentification : la notification ne transporte aucune donnée ; elle déclenche seulement l’appel de votre endpoint d’état (section 7) par PunchOut Rocket pour cette commande.

Notification et réponse

POST {gateway_url}/order-status-changed
Content-Type: application/json

{"order_id": "100045"}

HTTP 202
{"status": "queued"}

Envoyez-la après l’enregistrement de la modification, sans faire attendre l’utilisateur (fire and forget, délai d’attente court). Les échecs peuvent être ignorés : le contrôle horaire rattrape les changements.

9. Contrôles avant la mise en production

  1. Configurez le site (section 1) et renseignez la même clé API dans votre boutique.
  2. Créez un client final et définissez son « E-commerce User to Clone ».
  3. Cliquez sur « Update from e-commerce » dans son Category Mapping et associez les catégories ; définissez un Default UNSPSC.
  4. Testez un PunchOut avec le formulaire de test cXML du panneau d’administration : create, puis edit avec un panier, puis retournez le panier.
  5. Pour les bons de commande (forfait Premium) : envoyez un OrderRequest de test et vérifiez la commande dans votre boutique.
  6. Pour les mises à jour d’état (option OC & ASN) : activez « Send order status updates » sur le client final, faites passer la commande de test par vos états et vérifiez que le système du client reçoit la confirmation et les avis d’expédition.

À retenir :

  • Les utilisateurs PunchOut ne doivent pas finaliser une commande sur votre boutique : leur panier retourne au système d’achat (section 4) et la commande arrive ensuite via la section 6.
  • Les commandes reçues via la section 6 sont déjà approuvées par le système d’achat du client : aucun paiement en ligne n’est nécessaire.

Besoin d’un client de test ou d’une revue de votre implémentation ? Parlez à nos développeurs ou confiez-nous le développement avec Go-Live Assist.

FAQ

Questions sur l’intégration

Quels champs dois-je renseigner dans PunchOut Rocket ?

Avec E-commerce Platform défini sur Custom : Site URL et API Key. Les quatre chemins d’endpoints (clonage, catégories, création et état des commandes) ne sont nécessaires que si vous n’utilisez pas ceux par défaut.

L’endpoint des catégories est-il nécessaire ?

Il est recommandé. Il permet d’associer vos catégories aux codes requis par les clients, comme UNSPSC ; sans lui, chaque produit reçoit le Default UNSPSC du client final.

Le lien SSO peut-il être réutilisé ?

Non. Le jeton doit fonctionner une seule fois, en HTTPS. Donnez-lui une validité de quelques minutes, pas de secondes : avec les paniers prédéfinis, le client ouvre le lien seulement après avoir choisi de poursuivre vers votre boutique.

Comment les bons de commande arrivent-ils dans une boutique sur mesure ?

Via votre endpoint de création des commandes : la passerelle reçoit le cXML OrderRequest du client et l’envoie à votre boutique en JSON. Cette fonction est incluse dans le forfait Premium et l’essai gratuit.

Ma boutique peut-elle envoyer des confirmations et avis d’expédition ?

Oui, avec l’option OC & ASN du forfait Premium (contactez-nous pour l’activer). Implémentez l’endpoint d’état : la passerelle lit l’état de chaque commande et envoie cXML ConfirmationRequest et ShipNoticeRequest au système du client.

Essai gratuit de 30 jours · sans carte bancaire

Votre client attend. Passons à l’action.

Installez le plugin aujourd’hui et lancez votre première session de test cet après-midi. Si votre échéance est proche, dites-le-nous : nous traiterons votre demande en priorité.