Aller au contenu

Factures récurrentes

Ce que configure l'indicateur de récurrence, ce qui génère la facture suivante et ce qui ne le fait pas.

Une facture récurrente n'est pas un abonnement. C'est une facture classique marquée comme modèle : une tâche nocturne la copie dans un nouveau document à chaque cycle. Chaque copie doit encore être ouverte au paiement et réglée par le client. Rien n'est débité automatiquement, car aucune donnée réutilisable pour un débit n'est enregistrée.

Marquer une facture comme récurrente

Il n'existe ni endpoint distinct ni ressource d'abonnement. Deux champs de l'appel de création classique couvrent toute la fonctionnalité.

POSThttps://api.wajub.com/invoices
is_recurringbooleanfacultatifdéfaut : false
Marque cette facture comme celle que la tâche doit copier.
recurring_intervalenumfacultatif
daily, weekly, monthly, quarterly ou yearly. Intervalle entre les copies.
recurring_frequencyenumfacultatif
Accepté à la création comme autre nom de recurring_interval, avec les cinq mêmes valeurs.
customer_idstring (uuid)facultatif
Obligatoire ici. Une facture récurrente sans fiche client ne génère jamais rien.

Tout le reste de la facture, notamment les lignes, les totaux et les notes, fonctionne exactement comme sur une facture ponctuelle.

curl https://api.wajub.com/invoices \
  -H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "9d1f0c7a-4b2e-4f61-9d3a-7c8e5b21a940",
    "customer_name": "Amina Traoré",
    "invoice_date": "2026-09-11",
    "currency": "XAF",
    "items": [
      { "name": "Retainer", "quantity": 1, "unit_price": 250000 }
    ],
    "is_recurring": true,
    "recurring_interval": "monthly"
  }'

La réponse est la même que pour toute autre facture, avec 201 Created, status: "draft", les deux champs de récurrence et rien de plus.

Réponse · 201 Created, abrégée
{
"invoice": {
"id": "inv_LRQqYvlhrgUOE225KMKU",
"invoice_number": "INV-202609-0001",
"status": "draft",
"currency": "XAF",
"total": 250000,
"is_recurring": true,
"recurring_interval": "monthly"
}
}

Ce que l'API ne peut pas définir

La récurrence possède quatre autres réglages dans la base de données. Aucun n'est disponible dans l'API.

RéglageRôleEmplacement
recurring_end_typenever, date ou occurrencesDashboard
recurring_end_dateArrête la génération après cette dateDashboard
recurring_occurrencesArrête la génération après ce nombre de copiesDashboard
Un multiplicateur supérieur à 1Tous les deux mois, toutes les trois semainesNulle part

Une facture créée par l'API ne possède donc aucune règle de fin. Ce point est plus important qu'il n'y paraît. Lisez la section ci-dessous sur l'arrêt avant de définir is_recurring sur une facture.

Ce qui est renvoyé et ce qui ne l'est pas

is_recurring et recurring_interval sont les seuls champs de récurrence de l'objet facture. La réponse ne contient ni next_invoice_date, ni recurring_parent_id, ni règle de fin.

Vous devez tenir compte de deux conséquences. L'API ne peut pas vous indiquer la date du prochain document. Elle ne permet pas non plus de distinguer une copie générée de la facture qui lui a servi de modèle, car leur lien n'est pas exposé. GET /invoices n'a pas non plus de filtre de récurrence, contrairement à la liste du Dashboard. Conservez donc votre propre trace de la facture récurrente.

Déroulement d'un cycle

Une tâche nommée invoices:generate-recurring s'exécute chaque nuit à 02 h 00. Elle parcourt toutes les factures marquées comme récurrentes, dont la prochaine date est passée et qui ne sont pas annulées. Pour chacune, elle vérifie le plan, puis la règle de fin, avant de la copier.

La copie hériteLa copie recalcule
Les lignes, avec leurs quantités, prix et taxesSon propre invoice_number
La devise, les notes, les conditions et le pied de pageinvoice_date, définie sur la date du cycle arrivé à échéance
L'intervalle et la règle de findue_date, trente jours plus tard
Le modèle et les réglages d'affichageLe bloc client, relu depuis la fiche du client

La prochaine date de la facture d'origine avance ensuite d'un intervalle, ce qui programme le cycle suivant.

Deux de ces points méritent votre attention. Le bloc client est repris depuis la fiche actuelle à chaque cycle. Une adresse ou un nom d'entreprise corrigé sur la fiche apparaît donc dans le document suivant sans modifier les précédents. Par ailleurs, due_date est toujours fixée à trente jours après la date de la copie, quelles que soient les conditions de la facture d'origine. Le champ utilisé pour ce calcul n'existe pas sur la facture.

Arrêter une récurrence

Tant que la facture d'origine reste impayée, deux appels peuvent y mettre fin. L'annulation la retire définitivement du champ de la tâche. Une mise à jour qui désactive l'indicateur conserve le document, mais le rend inactif.

POSThttps://api.wajub.com/invoices/{id}/cancel
curl -X PUT https://api.wajub.com/invoices/inv_LRQqYvlhrgUOE225KMKU \
  -H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
  -H "Content-Type: application/json" \
  -d '{ "is_recurring": false }'

Coût selon le plan

La récurrence nécessite recurring_billing, disponible à partir de Growth. Cette condition est appliquée à deux des trois endroits possibles.

Le Dashboard refuse d'enregistrer une facture récurrente sans cette fonctionnalité. La tâche la vérifie à chaque exécution et ignore la facture si elle est absente. Elle consigne alors une information et ne modifie pas le document. Après le passage à un plan inférieur, la génération reprend donc automatiquement si le compte revient à un plan supérieur. POST /invoices ne vérifie aucune de ces conditions. La création d'une facture récurrente par l'API réussit avec tous les plans, mais ne génère simplement rien.

Que pensez-vous de ce contenu ?