Bon de commande fournisseur (purchase_order)

Un purchase_order est un bon de commande émis par un marchand à destination d'un fournisseur. Il porte les montants, les lignes d'article et le statut d'avancement, et sert de point d'ancrage pour les factures fournisseur reçues en retour.

Rôle

Le bon de commande est l'objet d'entrée du cycle Accounts Payable (AP). Il formalise l'engagement du marchand envers un fournisseur avant que les marchandises ou services ne soient livrés et facturés. Son cycle de vie suit le parcours opérationnel : rédaction → approbation interne → envoi au fournisseur → réception → clôture.

Les factures fournisseur reçues peuvent être créées directement depuis le bon de commande ou liées a posteriori. Les lignes de facture peuvent référencer des lignes du bon de commande pour un rapprochement précis.

Le fournisseur est une company de la plateforme — les mêmes objets servent pour les acheteurs (flux AR) et les fournisseurs (flux AP).

Identifiant et structure

Chaque bon de commande porte un identifiant stable préfixé par po_.

JSON
"purchase_order":{22 items
"object":"purchase_order"
"id":"po_3c8f1a9b2d4e7f6a"
"merchant_id":"mer_1a2b3c4d5e6f7a8b"
"supplier_id":"cmp_9b2e4f1a7c3d8e5f"
"supplier_contact_id":null
"source_reference":"erp::tenant-42::purchase_order::158"
"reference":"PO-2026-00158"
"supplier_order_reference":"CONF-SUP-8741"
"delivery_details":{1 item
"address":{...}4 items
}
"status":"sent"
"currency":"eur"
"amount_excluding_tax":250000
"amount_tax":50000
"amount_including_tax":300000
"metadata":{}0 items
"approved_at":"2026-06-17T09:00:00.000Z"
"sent_at":"2026-06-17T10:30:00.000Z"
"cancelled_at":null
"fulfilled_at":null
"completed_at":null
"created_at":"2026-06-17T08:45:00.000Z"
"updated_at":"2026-06-17T10:30:00.000Z"
}
{
  "object": "purchase_order",
  "id": "po_3c8f1a9b2d4e7f6a",
  "merchant_id": "mer_1a2b3c4d5e6f7a8b",
  "supplier_id": "cmp_9b2e4f1a7c3d8e5f",
  "supplier_contact_id": null,
  "source_reference": "erp::tenant-42::purchase_order::158",
  "reference": "PO-2026-00158",
  "supplier_order_reference": "CONF-SUP-8741",
  "delivery_details": {
    "address": {
      "line1": "4 rue des Ateliers",
      "city": "Lyon",
      "postal_code": "69007",
      "country": "FR"
    }
  },
  "status": "sent",
  "currency": "eur",
  "amount_excluding_tax": 250000,
  "amount_tax": 50000,
  "amount_including_tax": 300000,
  "metadata": {},
  "approved_at": "2026-06-17T09:00:00.000Z",
  "sent_at": "2026-06-17T10:30:00.000Z",
  "cancelled_at": null,
  "fulfilled_at": null,
  "completed_at": null,
  "created_at": "2026-06-17T08:45:00.000Z",
  "updated_at": "2026-06-17T10:30:00.000Z"
}

Champs

ChampTypeDescription
idstringIdentifiant du bon de commande (préfixe po_).
objectstringToujours "purchase_order".
merchant_idstringMarchand émetteur.
supplier_idstringFournisseur destinataire (cmp_…). Requis à la création.
supplier_contact_idstring | nullContact fournisseur (ctc_…). Optionnel.
source_referencestring | nullIdentité ou provenance du bon dans votre système source.
referencestring | nullNuméro métier du bon de commande attribué par le marchand.
supplier_order_referencestring | nullNuméro de commande ou confirmation attribué par le fournisseur en réponse au bon.
delivery_detailsobject | nullInformations ouvertes de livraison ou destination utiles au flux P2P.
statusenumStatut du bon de commande : draft, approved, sent, cancelled, fulfilled, completed.
currencystringCode devise ISO 4217 en minuscules (ex. eur).
amount_excluding_taxintegerMontant HT en centimes.
amount_taxintegerMontant de la taxe en centimes.
amount_including_taxintegerMontant TTC en centimes. Contrainte : HT + taxe = TTC.
metadataobjectMap plate de scalaires `string | number | boolean`, selon la convention metadata de l’API.
approved_atdatetime | nullHorodatage d'approbation interne.
sent_atdatetime | nullHorodatage d'envoi au fournisseur.
cancelled_atdatetime | nullHorodatage d'annulation.
fulfilled_atdatetime | nullHorodatage de réception des marchandises ou services.
completed_atdatetime | nullHorodatage de clôture comptable.
created_atdatetimeDate de création.
updated_atdatetimeDate de dernière mise à jour.

Cycle de vie

Le bon de commande suit un cycle linéaire depuis la rédaction jusqu'à la clôture. Seul le statut draft est modifiable.

Statuts

StatutDescriptionFinal
draftBrouillon. Modifiable (montants, lignes, contact). Seul statut initial possible.non
approvedApprouvé en interne. Non modifiable.non
sentEnvoyé au fournisseur.non
fulfilledMarchandises ou services reçus.non
completedClôturé — traitement comptable terminé.oui
cancelledAnnulé. Accessible depuis draft, approved ou sent.oui

Transitions

ActionEndpointDepuisVersTimestamp renseigné
ApprouverPOST /:id/approvedraftapprovedapproved_at
EnvoyerPOST /:id/sendapprovedsentsent_at
RéceptionnerPOST /:id/fulfillapproved, sentfulfilledfulfilled_at
ClôturerPOST /:id/completefulfilledcompletedcompleted_at
AnnulerPOST /:id/canceldraft, approved, sentcancelledcancelled_at
Timestamps cumulatifs Les timestamps de progression sont cumulatifs : passer directement de approved à fulfilled renseigne également sent_at. Passer de draft directement à fulfilled renseigne approved_at et sent_atau même horodatage. De même, complete renseigne fulfilled_at s'il était encore null.

Lignes d'article

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

ChampTypeDescription
idstringIdentifiant de la ligne (préfixe li_).
product_namestringNom du produit ou service. Requis.
descriptionstring | nullDescription complémentaire.
product_referencestring | nullRéférence produit dans votre catalogue.
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 (= unit_ttc × quantity si absent).
currencystringDevise. Doit correspondre à la devise du bon de commande.

Si amount_excluding_tax ou amount_including_tax ne sont pas fournis, ils sont calculés automatiquement (unit_amount × quantity). La contrainte HT + taxe = TTC s'applique à chaque ligne.

Les lignes de facture fournisseur peuvent référencer une ligne de bon de commande via purchase_order_line_item_id pour un rapprochement ligne à ligne.

Factures fournisseur

Un bon de commande peut être associé à une ou plusieurs factures fournisseur via une relation plusieurs-à-plusieurs. Une facture peut aussi être liée à plusieurs bons de commande (livraisons partielles sur plusieurs PO).

Créer une facture depuis le bon de commande

POST /v1/purchase-orders/:id/supplier-invoices crée une facture fournisseur héritant automatiquement de la devise du bon de commande et établissant le lien entre les deux objets.

HTTP
POST /v1/purchase-orders/po_3c8f/supplier-invoices
{8 items
"type":"invoice"
"amount_excluding_tax":250000
"amount_tax":50000
"amount_including_tax":300000
"reference":"FAC-FOURNISSEUR-2026-0042"
"issue_date":"2026-06-17"
"received_at":"2026-06-18T09:00:00.000Z"
"due_date":"2026-07-17"
}
{
  "type": "invoice",
  "amount_excluding_tax": 250000,
  "amount_tax": 50000,
  "amount_including_tax": 300000,
  "reference": "FAC-FOURNISSEUR-2026-0042",
  "issue_date": "2026-06-17",
  "received_at": "2026-06-18T09:00:00.000Z",
  "due_date": "2026-07-17"
}

La facture est créée avec status = received, settlement_status = unpaid et disputed = false. Ces trois informations évoluent indépendamment : réception/approbation, règlement et litige.

Lier des factures existantes

EndpointEffet
GET /v1/purchase-orders/:id/supplier-invoicesListe les factures fournisseur liées.
POST /v1/purchase-orders/:id/supplier-invoice-linksRemplace atomiquement l'ensemble des liens. Envoie { "supplier_invoice_ids": ["si_…"] }.
DELETE /v1/purchase-orders/:id/supplier-invoice-links/:supplier_invoice_idRetire un lien sans toucher aux autres.

Les liens sont également gérables depuis la facture fournisseur via POST /v1/supplier-invoices/:id/purchase-order-links.

Dans les processus

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

Le bon de commande peut être passé comme entrée typée dans un processus — il est récupérable via le helper générique fetch_purchase_order à partir de son identifiant.

Dans un flux AP typique, le processus est déclenché par un événement de réception (purchase_order.fulfilled ou supplier_invoice.received), puis orchestre l'approbation de la facture et le paiement fournisseur.

Événements

ÉvénementDéclencheur
purchase_order.createdBon de commande créé.
purchase_order.updatedBon de commande mis à jour (montants, lignes, contact).
purchase_order.approvedPassé à approved.
purchase_order.sentPassé à sent.
purchase_order.fulfilledPassé à fulfilled — réception confirmée.
purchase_order.completedPassé à completed — clôture comptable.
purchase_order.cancelledPassé à cancelled.

Les événements de transition incluent le statut final dans leur payload. Le payload contient également supplier_id pour permettre de filtrer les événements par fournisseur dans un processus.