Flowie
Compliance · 🇫🇷 France

Refusal, rejection & on hold — when an invoice stops, stalls or dies

Most of the French lifecycle is about an invoice moving forward. This page is about the three statuses where it doesn't: 210 Refusée (the buyer refuses a valid invoice), 213 Rejetée (a platform rejects a non-conform one) and 208 Suspendue (processing is paused pending documents). Two of them are mandatory and terminal — they cancel the invoice for VAT and force a corrective — so getting them right matters more than any happy-path status. The third is the reversible "on hold". This is the full reference: the code and label, who emits it and when, the exact Flowie call, the coded motif — and how the same three ideas surface outside France.

The one distinction that trips everyone up
Rejet (213) is a platform saying an invoice is malformed before it validly exists — technical, automatic. Refus (210) is a buyer saying no to a valid invoice after receiving it — a business decision. They map to different AFNOR codes, carry different motifs, and put the responsibility on different parties. Conflating them is the single most common integration bug in this area.

The three at a glance

210 · MDT-105

Refusée

Refused — business refusal

The buyer deliberately refuses a valid, well-formed invoice. Cancels it; the supplier must issue a corrective (and an avoir if it was already accepted).

ObligatoireTerminal · échecBuyerMotif required
213 · MDT-105

Rejetée

Rejected — technical rejection

A platform control (format, SIRET, duplicate, antivirus…) rejects the invoice. It never validly entered the network. Fix the payload and send a new invoice.

ObligatoireTerminal · échecPlatformMotif required
208 · MDT-105

Suspendue

Suspended — on hold

The buyer pauses processing pending supporting documents. Reversible: the supplier answers with 209 Complétée and the invoice re-enters processing.

LibreNon-terminalBuyerMotif expected
CodeLabelTierEmitted byPhaseTerminal?EffectUNTDID 1373
210RefuséeObligatoireBuyerTraitement Yes — failureInvoice cancelled for VAT; corrective required50 Rejected
213RejetéeObligatoireAny platformTransmission Yes — failureInvoice never validly existed; re-send a new one8 Rejected (technical)
208SuspendueLibreBuyerTraitement No — reversibleProcessing paused; resolves via 209 Complétée39 Suspended

Where they sit in the global process

The happy path runs 200 → … → 212. These three are the exits and the pause off that rail. 213 can fire before the invoice validly enters (at emission or at reception); 210 fires after the buyer has the invoice; 208 is a loop inside processing that 209 unwinds.

Transmission Traitement Settlement 200Déposée 204Prise en charge 205Approuvée 212Encaissée 213 Rejetée 208 209 Suspendue → Complétée 210 Refusée
Happy terminal (212) Terminal failure (210, 213) Reversible hold (208 → 209)

See the full 14-status graph, animated, on the lifecycle explorer. The rule that makes these exits legal without every intermediate status: optional statuses may be skipped, so a lifecycle can jump straight from 200 to 210 or 213.

210 · Refusée — business refusal

What it is. A deliberate, human decision by the buyer to refuse a valid, well-formed invoice that was correctly delivered. It is not about format — the invoice passed every technical control — it is about the content of the deal. 210 is mandatory, terminal, and cancels the invoice for VAT: the supplier must issue a corrective invoice, plus an avoir (credit note) if the original had already been accepted.

When to use it. After the invoice is delivered and visible to the buyer (typically after 203/204), when a business reason makes it unacceptable:

Refuse, or dispute first?
210 is final. If the disagreement might still be resolved, prefer 207 En litige (dispute) or 208 Suspendue (ask for documents) first — both are reversible and keep the invoice alive. Reach for 210 only when you are certain the invoice must be cancelled and re-issued.

How to emit it with Flowie. One call, from the buyer org:

curl -X POST https://api.flowie.ink/v1/documents/{document_id}/lifecycle \
  -H "Authorization: Bearer $FLOWIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "rejected",
    "reasonCode": "<code from the AFNOR motif annex>",
    "reason": "Prix unitaire ligne 3 non conforme au devis"
  }'

Flowie builds the CDAR, transmits 210 to the DGFiP (it is one of the four mandatory statuses), and fires lifecycle.updated. The reasonCode/reason travel verbatim as MDT-113/MDT-114 — see the motif section.

213 · Rejetée — technical rejection

What it is. An automatic rejection by a platform control — the sending PA, the receiving PA, or the PPF concentrator — because the invoice is non-conform. The invoice never validly entered the network. It is mandatory and terminal. The norm splits it into « Rejetée à l'émission » (caught sender-side, before it ever leaves) and « Rejetée en réception » (caught at the recipient's platform).

What triggers it.

Never mutate a rejected invoice
213 is terminal because the invoice legally never existed. You do not "resubmit" or patch it — you fix the payload and send a new invoice (which starts its own lifecycle at 200). Re-using the number of a 213'd invoice is fine; re-using the number of a 210'd one needs a corrective, because that invoice did exist.

How you see it with Flowie. 213 is automatic — you don't emit it, you observe it. When a control fails, Flowie fires document.failed (and, for the reporting leg, compliance.reported.failed) with the platform's motif attached. Then:

208 · Suspendue — on hold

What it is. The buyer pauses processing because something is missing — a delivery note, a PO reference, a supporting document. Unlike 210/213, 208 is not terminal: the invoice is alive, just parked. It is a libre (optional) status, but a very useful one — it tells the supplier exactly what's blocking payment.

The resolution loop. Suspension is one half of a pair:

  1. Buyer emits 208 Suspendue with a motif describing what's needed.
  2. Supplier supplies the material and emits 209 Complétée — the complementary data travels in the status message (MDG-43, code MAJ); the invoice itself is not re-sent.
  3. The invoice returns to 204 processing, and can then be approved (205), partially approved (206), or ultimately refused (210).

How to emit it with Flowie. Suspension rides the same disputed call as 207 En litige; the reasonCode "suspended" is the discriminator that makes Flowie transmit 208 rather than 207:

curl -X POST https://api.flowie.ink/v1/documents/{document_id}/lifecycle \
  -H "Authorization: Bearer $FLOWIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "disputed",
    "reasonCode": "suspended",
    "reason": "Bon de livraison manquant pour les lignes 4–7"
  }'

The supplier then resolves it by attaching the requested material (which emits 209):

curl -X POST https://api.flowie.ink/v1/documents/{document_id}/actions \
  -H "Authorization: Bearer $FLOWIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "action": "link", "relatedDocumentId": "doc_..." }'

Refus vs rejet vs litige vs suspension

Four statuses say some version of "not yet / not this". They are genuinely different — here is the whole quartet side by side so you never pick the wrong one:

StatusWhoAboutTerminal?Resolves to
213 RejetéePlatform (auto)Non-conformity (technical / format / regulatory)Yes— (send a new invoice)
210 RefuséeBuyerBusiness refusal of a valid invoiceYes— (corrective + avoir)
207 En litigeBuyerContests all/part, without refusing outrightNo205 / 206 / 210
208 SuspendueBuyerPauses pending supporting documentsNo209 → back to 204
Not a status: code 214 "Visée"
There is no 214 in the B2B referential — it stops at 213. Visée / Mise en paiement / Mandatée belong to the legacy Chorus Pro B2G flow; their closest B2B equivalent is 211 Paiement transmis. Treat them as custom/local statuses in a B2B context.

The coded motif — MDT-113 / MDT-114

For 210 and 213 a motif is required; for 207 and 208 it is expected. The CDAR carries it in two fields:

FieldNameContent
MDT-113ReasonCodeA coded value from the restricted controlled vocabulary of the XP Z12-012 annex (rule BR-FR-CDV-CL-09).
MDT-114ReasonOptional free text — e.g. "Prix unitaire ligne 3 non conforme au devis".

Outside the French DGFiP leg (Peppol / non-FR flows), reasonCode uses the 14 official Peppol status reason codes (OPStatusReason) instead — the full table lives in the API reference · status reason codes.

The motif codes circulating online are fabricated
The literal strings widely repeated by vendor blogs and AI summaries — TX_TVA_ERR, REJ_UNI, REJ_COH, REJ_ADR, CMD_ERR, DOUBLE_FACT, ROUTAGE_ERR, CALCUL_ERR ("~45 codes / 6 families") — do not appear anywhere in the official AFNOR XP Z12-012. The authoritative Code motif → Libellé list lives only in the « Tableau des motifs de STATUTS » sheet of the XP Z12-012 Excel annex, inside the Spécifications externes B2B ZIP (current v3.2). Flowie forwards whatever MDT-113/MDT-114 the platform returned verbatim — we never invent or re-map a motif.

API cheat-sheet

CodeYour sideWhat you do
210 RefuséeBuyerPOST …/lifecycle {"status":"rejected","reasonCode":"…","reason":"…"}
213 RejetéeSupplierAutomatic — observe document.failed / compliance.reported.failed, fix, re-send.
208 SuspendueBuyerPOST …/lifecycle {"status":"disputed","reasonCode":"suspended","reason":"…"}
209 ComplétéeSupplierPOST …/actions {"action":"link","relatedDocumentId":"…"} (or add-note) — lifts the suspension.

Every status here surfaces on the lifecycle.updated webhook and on GET /v1/documents/{id}/lifecycle. Build your consumer to be idempotent and out-of-order-tolerant — see the playbook's reference handler.

Beyond France — the same idea elsewhere

"Technical rejection", "business refusal" and "on hold" are not French inventions — every clearance or four-corner model has some notion of them, even when the codes and the bindingness differ. The generic equivalents:

Concept🇫🇷 France (CDV)🇮🇹 Italy · SDIPeppol · Invoice Response (UNCL4343)UNTDID 1373
Technical rejection 213 Rejetée Notifica di scarto (NS) — SDI rejects the file Negative Message Level Response (transport / validation layer) 8 / 27
Business refusal 210 Refusée Esito committente — rifiuto (mainly B2G/PA; no formal B2B refusal channel) RE Rejected 50
On hold / query 208 Suspendue No native SDI code — handled commercially, off-platform UQ Under Query 39 Suspended
Dispute (soft) 207 En litige No native SDI code UQ Under Query 46 Litigious
These mappings are informal — the French codes stay authoritative
There is no official normative table mapping the French 2xx codes to Peppol UNCL4343 as of mid-2026, and the semantics genuinely differ: Italy's esito committente is largely a B2G construct and does not invalidate a cleared B2B invoice the way 210 does; Peppol's UQ covers both "dispute" and "on hold". When you exchange cross-border through Flowie we translate at the edge and always keep the French codes authoritative for the DGFiP leg. Use this table to reason about equivalence, not as a wire-format spec.

References