Commande (order)

Une order est une commande commerciale passée par un acheteur. Elle porte les montants, les lignes d'article et le statut de fulfillment, et sert de pivot entre la session de paiement, la facturation et le suivi opérationnel de la livraison.

Rôle

La commande modélise le cycle de vie commercial d'un achat : de la création initiale jusqu'à la livraison et la clôture. Elle peut être créée directement via l'API ou produite automatiquement par un processus d'orchestration à l'issue d'une checkout session.

La commande est également le point d'ancrage naturel pour la facturation : les factures et avoirs peuvent être créés directement depuis une commande, ou être liés à une commande existante après coup.

Identifiant et structure

Chaque commande porte un identifiant stable préfixé par ord_.

JSON
"order":{17 items
"object":"order"
"id":"ord_7e3b9f2a1c4d8e5f"
"buyer_id":"cmp_3a8f1d9c2b4e7f6a"
"buyer_contact_id":"ctc_d12e3f4a5b6c7d8e"
"checkout_session_id":"cs_5e2d8f1a9b3c4d7e"
"source_reference":"ORDER-2026-00842"
"status":"confirmed"
"currency":"eur"
"amount_excluding_tax":100000
"amount_tax":20000
"amount_including_tax":120000
"metadata":{}0 items
"confirmed_at":"2026-06-17T10:05:00.000Z"
"fulfilled_at":null
"closed_at":null
"created_at":"2026-06-17T10:00:00.000Z"
"updated_at":"2026-06-17T10:05:00.000Z"
}
{
  "object": "order",
  "id": "ord_7e3b9f2a1c4d8e5f",
  "buyer_id": "cmp_3a8f1d9c2b4e7f6a",
  "buyer_contact_id": "ctc_d12e3f4a5b6c7d8e",
  "checkout_session_id": "cs_5e2d8f1a9b3c4d7e",
  "source_reference": "ORDER-2026-00842",
  "status": "confirmed",
  "currency": "eur",
  "amount_excluding_tax": 100000,
  "amount_tax": 20000,
  "amount_including_tax": 120000,
  "metadata": {},
  "confirmed_at": "2026-06-17T10:05:00.000Z",
  "fulfilled_at": null,
  "closed_at": null,
  "created_at": "2026-06-17T10:00:00.000Z",
  "updated_at": "2026-06-17T10:05:00.000Z"
}

Champs

ChampTypeDescription
idstringIdentifiant de la commande (préfixe ord_).
objectstringToujours "order".
buyer_idstringEntreprise acheteuse (cmp_…). Requis pour émettre une facture depuis la commande.
buyer_contact_idstringContact acheteur (ctc_…). Optionnel.
checkout_session_idstringSession de paiement ayant produit cette commande (cs_…). Optionnel.
sales_channelenum | nullCanal de vente : web, pos, admin, marketplace, call_center, edi, other ou null.
billing_detailsobject | nullCoordonnées de facturation structurées de la commande.
shipping_detailsobject | nullCoordonnées de livraison structurées de la commande.
statusenumStatut de la commande : draft, created, confirmed, fulfilled, completed, cancelled.
currencystringCode devise ISO 4217 en minuscules (ex. eur).
amount_excluding_taxintegerMontant HT en centimes. Doit satisfaire : HT + taxe = TTC.
amount_taxintegerMontant de la taxe en centimes.
amount_including_taxintegerMontant TTC en centimes.
source_referencestringRéférence dans votre système (numéro de commande interne, panier…).
metadataobjectMap plate de scalaires `string | number | boolean`, selon la convention metadata de l’API.
confirmed_atdatetimeHorodatage de confirmation. Renseigné au plus tôt à confirmed.
fulfilled_atdatetimeHorodatage de livraison. Renseigné à partir de fulfilled.
closed_atdatetimeHorodatage de clôture (completed ou cancelled).
created_atdatetimeDate de création.
updated_atdatetimeDate de dernière mise à jour.

Cycle de vie

La commande suit un cycle de vie linéaire avec deux états finaux. Le statut initial (draft ou created) est choisi à la création — les statuts suivants ne sont accessibles que via les endpoints de transition dédiés.

Statuts

StatutDescriptionFinal
draftBrouillon non encore actif. Modifiable. Ne peut pas être confirmé — seule sortie possible : annulation.non
createdCommande active, transmise à l'acheteur. Modifiable. Peut être confirmée ou annulée.non
confirmedCommande acceptée. Non modifiable. Peut être livrée ou annulée.non
fulfilledMarchandises ou services livrés. Non modifiable.non
completedCommande terminée et clôturée.oui
cancelledCommande annulée. Accessible depuis draft, created ou confirmed.oui

Transitions

ActionEndpointDepuisVersTimestamps mis à jour
ConfirmerPOST /:id/confirmcreatedconfirmedconfirmed_at
LivrerPOST /:id/fulfillconfirmedfulfilledfulfilled_at
CompléterPOST /:id/completefulfilledcompletedclosed_at
AnnulerPOST /:id/canceldraft, created, confirmedcancelledclosed_at

Les timestamps de progression sont cumulatifs : passer directement à fulfilled sans être passé explicitement par confirmed renseigne également confirmed_at. De même, complete renseigne fulfilled_at s'il était encore null.

Modification en cours de vie Seules les commandes en statut draft ou created peuvent être modifiées via POST /:id (montants, lignes, acheteur, métadonnées). À partir de confirmed, tous les champs sont figés — toute correction passe par une annulation et une nouvelle commande, ou par un avoir.

Lignes d'article

Les lignes d'article décrivent le détail des produits ou services compris dans la commande. Elles peuvent être fournies à la création et remplacées atomiquement lors d'une mise à jour (tant que la commande est en draft ou created). Elles sont ensuite accessibles via GET /v1/orders/:id/line-items.

JSON
"line_item":{14 items
"object":"line_item"
"id":"li_a1b2c3d4e5f6"
"product_name":"Abonnement Pro"
"description":"Accès 12 mois"
"line_type":"service"
"product_reference":"PROD-PRO-12M"
"quantity":1
"unit_amount_excluding_tax":100000
"unit_amount_including_tax":120000
"amount_excluding_tax":100000
"amount_tax":20000
"amount_including_tax":120000
"currency":"eur"
"tax":{3 items
"type":"percent"
"rate":0.2
"code":"TVA20"
}
}
{
  "object": "line_item",
  "id": "li_a1b2c3d4e5f6",
  "product_name": "Abonnement Pro",
  "description": "Accès 12 mois",
  "line_type": "service",
  "product_reference": "PROD-PRO-12M",
  "quantity": 1,
  "unit_amount_excluding_tax": 100000,
  "unit_amount_including_tax": 120000,
  "amount_excluding_tax": 100000,
  "amount_tax": 20000,
  "amount_including_tax": 120000,
  "currency": "eur",
  "tax": { "type": "percent", "rate": 0.20, "code": "TVA20" }
}
ChampTypeDescription
product_namestringNom du produit ou service. Requis.
descriptionstringDescription complémentaire. Optionnel.
line_typeenumproduct, service, shipping, discount, fee. Optionnel.
product_referencestringRéférence produit dans votre catalogue. Optionnel.
quantityintegerQuantité (entier positif).
unit_amount_excluding_taxintegerPrix unitaire HT en centimes.
unit_amount_including_taxintegerPrix unitaire TTC en centimes.
amount_excluding_taxintegerMontant ligne HT (= unit_ht × quantity si absent).
amount_taxintegerMontant taxe de la ligne.
amount_including_taxintegerMontant ligne TTC.
currencystringDevise de la ligne. Doit correspondre à la devise de la commande.
taxobjectDétail de la taxe : type (percent, fixed, none), rate, code, amount.

La contrainte d'égalité HT + taxe = TTC s'applique à chaque ligne individuellement. Les montants de ligne (amount_*) sont calculés automatiquement si absents (unit_amount × quantity).

Facturation

Une commande peut être associée à une ou plusieurs factures ou avoirs. Deux modes sont disponibles : créer une facture directement depuis la commande, ou lier des factures existantes.

Créer une facture depuis la commande

POST /v1/orders/:id/invoices crée une facture héritant automatiquement du merchant_id, du buyer_id et de la currency de la commande — ces champs ne peuvent pas être surchargés. La commande doit avoir un buyer_id pour qu'une facture puisse être émise.

HTTP
POST /v1/orders/ord_7e3b/invoices
{8 items
"type":"invoice"
"amount_excluding_tax":100000
"amount_tax":20000
"amount_including_tax":120000
"reference":"FAC-2026-00042"
"issue_date":"2026-06-17"
"due_date":"2026-07-17"
"issue":true
}
{
  "type": "invoice",
  "amount_excluding_tax": 100000,
  "amount_tax": 20000,
  "amount_including_tax": 120000,
  "reference": "FAC-2026-00042",
  "issue_date": "2026-06-17",
  "due_date": "2026-07-17",
  "issue": true
}

Passer "issue": true émet immédiatement la facture (transition vers status: "issued") et déclenche l'événement invoice.issued en plus de invoice.created. Pour les avoirs, utilisez "type": "credit_note" et référencez la facture d'origine via source_invoice_id.

Lier des factures existantes

Des factures existantes (créées indépendamment) peuvent être rattachées à la commande.

EndpointEffet
GET /v1/orders/:id/invoicesListe toutes les factures liées à la commande.
POST /v1/orders/:id/invoice-linksRemplace atomiquement l'ensemble des liens. Envoie { "invoice_ids": ["inv_…", …] }.
DELETE /v1/orders/:id/invoice-links/:invoice_idRetire un lien sans toucher aux autres.

Les factures liées doivent appartenir au même marchand et au même acheteur que la commande. Le lien est purement relationnel — il n'affecte pas le statut de la facture.

Dans les processus

Il n'existe pas de node dédié à la création ou aux transitions d'une commande. L'objet est géré via des appels API directs depuis vos systèmes ou via des actions HTTP dans un processus d'orchestration.

La commande peut être passée en paramètre à certains nodes de paiement — par exemple create_psp_payment accepte un champ order optionnel pour rattacher le paiement à la commande correspondante. Une fois persistée, elle est récupérable dans un processus via le helper générique fetch_order.

Événements

ÉvénementDéclencheur
order.createdLa commande vient d'être créée.
order.updatedLa commande a été mise à jour (montants, acheteur, lignes…).
order.confirmedLa commande est passée à "confirmed".
order.fulfilledLa commande est passée à "fulfilled".
order.completedLa commande est passée à "completed".
order.cancelledLa commande est passée à "cancelled".

Les événements de transition (confirmed, fulfilled, completed, cancelled) incluent un diff avec le statut final dans after. L'événement order.updated inclut un diff avec le statut précédent dans before et les champs modifiés dans after.