Invoice Ninja is free, open-source invoicing popular with Indian freelancers and small businesses. The simplest auth model in this series: one static token, no OAuth, no expiry. Webhooks deliver the full payload so a follow-up GET is never needed.
Invoice Ninja uses a permanent X-Api-Token header. No OAuth flow, no refresh tokens, no 30-minute or 1-hour expiry. Generate the token once in Settings and use it indefinitely. This makes Invoice Ninja the quickest accounting integration to set up.
Unlike Xero (which sends metadata only), Invoice Ninja webhooks include the complete entity: invoice number, amounts, due date, and client contact details including phone number. Map directly from the webhook payload without making a second API call.
X-Api-Token header on every API call.
The token does not expire.# All Invoice Ninja API calls use this header:
X-Api-Token: YOUR_API_TOKEN
# Example — test the connection:
GET https://invoicing.co/api/v1/ping
X-Api-Token: YOUR_API_TOKEN
# Response:
{"data": "pong"}
# For self-hosted, replace invoicing.co with your domain:
GET https://your-ninja.example.com/api/v1/pingInvoice Ninja API: api-docs.invoicing.co
| Event type | When it fires | WhatsApp to send |
|---|---|---|
| create_invoice | Invoice is created | Invoice alert: 'Your invoice INV-0142 for Rs. 48,500 has been raised.' |
| sent_invoice | Invoice is marked as Sent | Invoice sent notification with payment link or due date. |
| paid_invoice | Invoice is fully paid | Payment confirmation: 'Thanks! Invoice INV-0142 has been marked as paid.' |
| create_payment | A payment is recorded | Payment received alert: amount, invoice reference, remaining balance. |
| create_client | New client is created | Internal team alert: new client added. |
| create_quote | A quote is sent | Quote notification to client with amount and expiry date. |
Use paid_invoice (not create_payment) for customer-facing payment confirmations.
POST to your WA.Expert webhook URL:
{
"entity_type": "invoice",
"event_id": "create_invoice",
"data": {
"id": "ABC123",
"number": "INV-0142",
"status_id": "2",
"amount": 48500.00,
"balance": 48500.00,
"due_date": "2026-07-07",
"client": {
"id": "CLIENT456",
"name": "Priya Textiles",
"phone": "9820012345"
}
}
}
Map to WA.Expert variables:
data.number -> invoice_number
data.amount -> invoice_amount
data.due_date -> due_date
data.client.name -> party_name
"+91" + data.client.phone -> wa_phone <- PREPEND +91 if neededUse WA.Expert's External API Request step to pull unpaid invoices from Invoice Ninja and send WhatsApp reminders to each client.
GET https://invoicing.co/api/v1/invoices
?client_status=unpaid
&sort=due_date|asc
X-Api-Token: YOUR_API_TOKEN
Response:
{
"data": [
{
"id": "ABC123",
"number": "INV-0142",
"balance": 48500.00,
"due_date": "2026-07-07",
"client": {
"name": "Priya Textiles",
"phone": "9820012345"
}
}
]
}
For each invoice in data[]:
wa_phone = "+91" + invoice.client.phone
Send WhatsApp payment reminder.| Invoice Ninja | Zoho Books | Xero | ERPNext | Tally | |
|---|---|---|---|---|---|
| Auth | Static token, no expiry | OAuth, 1-hr token | OAuth, 30-min token | Colon token | XML + bridge |
| Webhook payload | Full data included | Full data | Metadata only | Full data | N/A (polling) |
| Cost | Free (self-host) | Paid plans | Paid plans | Free (self-host) | Paid licence |
| Best for | Freelancers, small biz | Indian SMEs | Mid-market | Tech-led businesses | Indian SMEs/CAs |
Invoice Ninja is the easiest to connect and the cheapest to run for simple invoicing needs.
1. You create invoice INV-0142 for Priya Textiles in Invoice Ninja.
2. Invoice Ninja fires create_invoice webhook to WA.Expert:
{entity_type:'invoice', data:{number:'INV-0142',
amount:48500, due_date:'2026-07-07',
client:{name:'Priya Textiles', phone:'9820012345'}}}
3. WA.Expert maps:
wa_phone = '+91' + '9820012345' = '+919820012345'
invoice_number = 'INV-0142'
invoice_amount = '48,500'
due_date = '7 July 2026'
4. WA.Expert sends Priya Textiles WhatsApp:
'Hi Priya Textiles! Invoice INV-0142 for Rs. 48,500
has been raised. Payment due: 7 July 2026.
Reply to this message for any queries.'| Symptom | Likely cause | Fix |
|---|---|---|
| 401 Unauthorized | Wrong header name or token | The header must be X-Api-Token (not Authorization, not X-Ninja-Token). Regenerate the token from Settings if lost. |
| Webhook not firing | Webhook not saved or wrong event type | Check the webhook record in Invoice Ninja. Confirm the Event Type matches the action you are taking. Trigger a test by creating an invoice manually. |
| Phone number missing from payload | Not set on client record | Open the client record in Invoice Ninja and enter the phone number. Prepend +91 for Indian mobile numbers in the automation mapping. |
| 404 on API calls (self-hosted) | Wrong base URL | Replace invoicing.co with your own domain. Confirm the path is /api/v1/ (v5). Do not use the v4 path /api/v1/ from old documentation. |
| Duplicate WhatsApp on same invoice | Webhook fired multiple times | Invoice Ninja may retry failed webhooks. Add deduplication logic on the invoice ID in your WA.Expert automation. |
| Self-hosted webhook not reaching WA.Expert | HTTPS required | Invoice Ninja only fires webhooks to HTTPS endpoints. WA.Expert webhook URLs are always HTTPS, so this should work automatically. |
Zoho Books: cloud accounting, OAuth, India domain, invoice workflow webhooks.
Read guideTallyPrime: the XML-over-HTTP gateway guide for India's most-used accounting software.
Read guideFree trial, no credit card. If you get stuck, we answer live on WhatsApp.