Aller au contenu

Démarrage rapide

Émettre une facture, ouvrir sa page de paiement et savoir quand elle a été payée.

Quatre appels suffisent pour passer de rien à de l'argent sur votre solde : créez le document, ouvrez sa page, transmettez l'URL au client, puis attendez le paiement. Rien ne se passe automatiquement entre ces étapes. C'est l'erreur la plus fréquente lors d'une première facture.

1. Créer le document

Une facture est créée comme brouillon et le reste jusqu'à ce que vous la fassiez avancer. Sa création enregistre un document numéroté, rien de plus : aucun argent ne circule, aucun e-mail n'est envoyé et le client n'est informé de rien.

Quatre champs sont obligatoires, mais la fiche d'un client n'en fait pas partie. Une facture est adressée à un nom. Vous pouvez donc facturer une personne qui ne vous a encore jamais payé.

POSThttps://api.wajub.com/invoices
customer_namestringobligatoire
Nom de la personne à qui la facture est adressée.
itemsarrayobligatoire
Au moins une ligne, chacune avec name, quantity et unit_price.
invoice_datestring (date)obligatoire
Date imprimée sur le document.
currencystringobligatoire
Code ISO 4217. Tous les montants de la facture utilisent cette devise.
customer_emailstringfacultatif
Adresse à laquelle /send envoie la facture et son PDF, et adresse utilisée pour son paiement et son reçu. Sans elle, /send répond 422, sauf si customer_id désigne un client doté d'un e-mail ; une facture envoyée sans e-mail depuis le Dashboard voit sa page le demander au payeur.
due_datestring (date)facultatif
Égale ou postérieure à invoice_date. Détermine quand la facture devient en retard.
acceptobjectfacultatif
Réduit les moyens de paiement proposés par la page de la facture, par countries, channels, types et currencies. Voir [Choisir ce qu'un paiement accepte](/payments/payment-methods#choosing-what-a-payment-accepts).
customer_idstringfacultatif
Associe un [client](/payments/customers) existant, par son identifiant cus_. Ses informations sont copiées dans le document lors de sa création.

La liste complète des champs, les taxes, les remises et le reste se trouvent sur la page Factures. Envoyez cette requête avec une clé secrète live.

curl https://api.wajub.com/invoices \
  -H "Authorization: sk.xxxxxxxxxxxxxxxx…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: invoice-amina-september" \
  -d '{
    "customer_name": "Amina Traoré",
    "customer_email": "[email protected]",
    "invoice_date": "2026-09-11",
    "due_date": "2026-09-25",
    "currency": "XAF",
    "items": [
      { "name": "Consulting, September", "quantity": 3, "unit_price": 150000 }
    ]
  }'

La réponse est 201 Created. Les totaux sont calculés à partir des lignes. subtotal, total et amount_due sont donc renseignés dans la réponse, même si vous ne les avez pas envoyés.

Réponse · 201 Created
{
"code": 201,
"status": "Created",
"message": "Invoice created",
"invoice": {
"id": "inv_LRQqYvlhrgUOE225KMKU",
"invoice_number": null,
"status": "draft",
"customer_name": "Amina Traoré",
"invoice_date": "2026-09-11",
"due_date": "2026-09-25",
"currency": "XAF",
"subtotal": 450000,
"total": 450000,
"amount_paid": 0,
"amount_due": 450000,
"sent_at": null,
"paid_at": null
}
}

Conservez l'id : tous les appels suivants en ont besoin. invoice_number vaut encore null. La référence lisible imprimée sur le document est attribuée à l'étape suivante, selon la numérotation de votre compte, la même séquence que celle du Dashboard : INV- (ou le préfixe que vous avez choisi), l'année, puis un compteur qui repart à 0001 chaque année.

2. Ouvrir sa page de paiement

Une facture au statut draft ne peut pas être payée. Sa page publique répond 404 Invoice not found. à toute personne qui l'ouvre. Seuls quatre statuts permettent le paiement : sent, viewed, overdue et partial.

Un appel suffit pour la sortir du statut draft.

POSThttps://api.wajub.com/invoices/{id}/send
curl -X POST https://api.wajub.com/invoices/inv_LRQqYvlhrgUOE225KMKU/send \
  -H "Authorization: sk.xxxxxxxxxxxxxxxx…"

La réponse est 200, avec status: "sent", sent_at horodaté et le invoice_number attribué. L'appel envoie aussi à customer_email un e-mail avec le lien de la facture et une copie PDF en pièce jointe. Le rappeler plus tard renvoie l'e-mail et renseigne de nouveau sent_at, sans changer le statut.

L'appel refuse d'envoyer à personne. Sans customer_email, et sans customer_id dont le client a un e-mail, il répond 422 sur customer_email et la facture reste un brouillon. Une facture déjà paid, cancelled ou refunded répond 400.

3. Transmettre l'URL

L'e-mail ne suffit pas toujours : c'est peut-être par WhatsApp ou par SMS que vous joignez vraiment ce client. L'adresse à partager correspond à l'identifiant de la facture sur son propre domaine.

L'URL du client
https://invoice.wajub.com/inv_LRQqYvlhrgUOE225KMKU

Cette URL ne figure pas dans la réponse de l'API. Construisez-la à partir de l'id conservé. Seul le domaine peut varier : un marchand qui distribue ses factures depuis un domaine personnalisé et vérifié utilise ce domaine. Le Dashboard affiche l'adresse réelle sur la facture.

La page qui s'ouvre est un checkout classique. Elle reprend votre identité visuelle, les lignes de la facture et les opérateurs disponibles pour sa devise. La première fois que le client l'ouvre, la facture passe automatiquement de sent à viewed.

Si vous n'avez pas renseigné customer_email, /send refuse la facture : envoyez-la plutôt depuis le Dashboard, qui ouvre sa page sans envoyer d'e-mail. La page affiche alors au payeur un champ e-mail au-dessus du bouton de paiement et n'ouvre le paiement qu'une fois ce champ rempli. Cette adresse reçoit la confirmation du paiement et son reçu, et elle est inscrite sur la facture comme son customer_email (invoice.updated est envoyé) : les échéances suivantes et /send l'utilisent.

4. Savoir quand elle a été payée

Une facture payée produit deux événements qui ne sont pas interchangeables.

payment.succeeded représente l'argent. Il contient le montant, le canal et la référence du prestataire. C'est cet événement qui doit déclencher la livraison, car lui seul prouve que les fonds ont circulé.

invoice.updated représente le document. Il est émis à chaque modification de la facture. Le paiement n'est qu'une de ces modifications.

invoice.updatedévénement
Émis à chaque modification de la facture. Lisez `data.status` pour connaître laquelle.
Payload
{
"id": "evt_aio5DpN577tNU2vOxdmuZGhT",
"event": "invoice.updated",
"livemode": true,
"created": "2026-09-11T15:42:10+00:00",
"api_version": "2026-10-11",
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"data": {
"id": "inv_LRQqYvlhrgUOE225KMKU",
"invoice_number": "INV-2026-0001",
"status": "paid",
"currency": "XAF",
"total": 450000,
"amount_paid": 450000,
"amount_due": 0,
"paid_at": "2026-09-11T15:42:09+00:00"
}
}

Deux autres événements suivent l'argent du côté du document. invoice.payment_succeeded arrive pour chaque paiement effectué sur la page de la facture, échéance comprise, et invoice.paid une fois la facture réglée en totalité. Tous deux portent la facture. Il n'existe aucun invoice.sent ni invoice.overdue : pour ceux-là, le statut du payload d'un invoice.updated vous indique la transition concernée. Et payment.succeeded désigne la facture payée dans son champ invoice.

Livrez à partir du paiement, rapprochez à partir de la facture

Livrez l'achat du client à la réception de payment.succeeded. Utilisez invoice.updated pour maintenir votre copie du document à jour. Faire l'inverse revient à agir selon un statut que le marquage manuel comme payé peut également produire.

Quand l'argent a été reçu ailleurs

Espèces, virement bancaire ou paiement qui n'est jamais passé par Wajub : enregistrez-le sur le document au lieu de laisser la facture ouverte.

POSThttps://api.wajub.com/invoices/{id}/mark-paid

N'envoyez aucun amount pour régler entièrement la facture. Si vous en envoyez un, supérieur à zéro, il est ajouté à amount_paid. La facture reste alors au statut partial jusqu'à ce que le total soit couvert. Un brouillon, une facture déjà payée, annulée ou remboursée refusent l'appel avec 400 ; un amount nul répond 422.

Les statuts et qui les attribue

Vous ne pouvez définir que trois des huit statuts. Les autres résultent des actions du client ou de Wajub, pendant la nuit. Il est utile de le savoir avant de construire votre propre machine à états.

StatutSignificationDéfini par
draftCréée, non payableCréation
sentPayable, en attenteVotre appel /send
viewedLe client a ouvert la pageLe client, à la première ouverture
partialUne partie du total a été reçueUn paiement ou votre appel /mark-paid
paidEntièrement régléeUn paiement ou votre appel /mark-paid
overdueÉchéance dépassée, toujours impayéeWajub, pendant la nuit une fois due_date passée
cancelledClôturée, plus payableVotre appel /cancel
refundedPayée, puis rembourséeDes remboursements couvrant tous les paiements en ligne qui l'ont réglée

Que pensez-vous de ce contenu ?