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
Préremplit la page de paiement et reçoit le PDF envoyé depuis le Dashboard.
due_datestring (date)facultatif
Égale ou postérieure à invoice_date. Détermine quand la facture devient en retard.
customer_idstring (uuid)facultatif
Associe un [client](/payments/customers) existant. 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.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: invoice-amina-september" \
  -d '{
    "customer_name": "Amina Traoré",
    "customer_email": "amina@example.com",
    "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": "INV-202609-0001",
"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 est la référence lisible imprimée sur le document. Elle se compose de INV-, de l'année et du mois, puis d'un compteur qui repart à 0001 chaque mois.

2. Ouvrir sa page de paiement

Une facture au statut draft ne peut pas être payée. Sa page publique répond 403 This invoice is not available for payment. à 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.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…"

La réponse est 200, avec status: "sent" et sent_at horodaté.

3. Transmettre l'URL

L'envoi vous revient : WhatsApp, SMS, votre propre e-mail ou tout autre moyen déjà utilisé avec ce client. L'adresse 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.

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-09-01",
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"data": {
"id": "inv_LRQqYvlhrgUOE225KMKU",
"invoice_number": "INV-202609-0001",
"status": "paid",
"currency": "XAF",
"total": 450000,
"amount_paid": 450000,
"amount_due": 0,
"paid_at": "2026-09-11T15:42:09+00:00"
}
}

Il n'existe aucun événement invoice.paid, invoice.sent ou invoice.overdue. Une facture ne peut émettre que invoice.created, invoice.updated et invoice.deleted. Le statut du payload vous indique donc la transition concernée.

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, il est ajouté à amount_paid. La facture reste alors au statut partial jusqu'à ce que le total soit couvert. Une facture annulée ou remboursée refuse l'appel avec 400.

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 d'une tâche nocturne. 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éeUne tâche, chaque nuit à 01 h 00
cancelledClôturée, plus payableVotre appel /cancel
refundedPayée, puis rembourséeUn remboursement du paiement

Que pensez-vous de ce contenu ?