Platform
Chatbot Builder Bulk Messaging Team Inbox Mini CRM API & Webhooks AI Integration WhatsApp Flows
Industries
E-commerce & D2C Real Estate Education Healthcare Finance & BFSI Logistics Hospitality Retail
Integrations
Learn
Learning Hub Help & Docs Connect Guides Automation Codex Blog Message Templates
Pricing Start Free Trial →
HomeConnect › Connect Zoho Books to WhatsApp
Zoho Books Integration Guide · Accounting / India

Connect Zoho Books to WhatsApp

Send WhatsApp invoice alerts the moment a Zoho Books invoice is created or paid, and automate payment reminders from outstanding receivables. OAuth 2.0 setup, India-region domain, workflow webhook configuration, and live balance queries covered.

Published 23 June 2026  ·  8 min read  ·  Accounting / India
Indian businesses: use zohoapis.in, not zohoapis.com

Zoho operates regional data centres. Indian Zoho Books accounts use https://www.zohoapis.in/books/v3/ and https://accounts.zoho.in/oauth/v2/. Using the .com domain with an Indian account returns errors or empty responses. If you are unsure of your region, log in to your Zoho account and check the URL: accounts.zoho.in confirms the India region.

organization_id is required on every API call

Zoho Books supports multiple organisations per account. Every API endpoint requires ?organization_id=YOUR_ORG_ID as a query parameter. Omitting it returns an error. Retrieve it once with GET /books/v3/organizations and store it for all future calls.

Step 1: OAuth 2.0 setup (Self Client, server integration)

Zoho Books uses OAuth 2.0. For a server-to-server integration (where you control both Zoho Books and WA.Expert), use the Self Client flow in the Zoho Developer Console. This avoids building a full redirect-URI flow.

1
Go to api-console.zoho.in (India region) and sign in with your Zoho account.
2
Click Self Client from the client type list and click Create Now. Note the Client ID and Client Secret shown on the Client Secret tab.
3
Click the Generate Code tab. Enter these scopes comma-separated:
ZohoBooks.fullaccess.all (or narrower scopes: ZohoBooks.invoices.READ,ZohoBooks.invoices.CREATE,ZohoBooks.settings.CREATE). Set Time Duration to the longest available (typically 10 minutes).
4
Click Create. Copy the one-time grant token immediately.
5
Exchange the grant token for access and refresh tokens with a POST call (see below). Store both tokens securely.
Exchange grant token for access and refresh tokens (India region)
POST https://accounts.zoho.in/oauth/v2/token
Content-Type: application/x-www-form-urlencoded

Body (form-encoded):
  grant_type=authorization_code
  &code=YOUR_GRANT_TOKEN
  &client_id=YOUR_CLIENT_ID
  &client_secret=YOUR_CLIENT_SECRET
  &redirect_uri=https://www.zoho.in/books

Response:
{
  "access_token":  "1000.41d9xxxx...c2d1",
  "refresh_token": "1000.xxxx...yyyy",
  "expires_in":    3600,
  "token_type":    "Bearer"
}

Store both. Use access_token in API calls.
Refresh when it expires (after 1 hour).
Refresh the access token when it expires
POST https://accounts.zoho.in/oauth/v2/token
Content-Type: application/x-www-form-urlencoded

Body:
  grant_type=refresh_token
  &refresh_token=YOUR_REFRESH_TOKEN
  &client_id=YOUR_CLIENT_ID
  &client_secret=YOUR_CLIENT_SECRET

Response: new access_token (valid another 1 hour).
Run this automatically when you receive a 401 response.

Step 2: Get your organization ID

GET organizations — retrieve your organization_id
GET https://www.zohoapis.in/books/v3/organizations
Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN

Response:
{
  "organizations": [
    {
      "organization_id": "10234695",
      "name":            "ABC Traders",
      "country_code":    "IN",
      "currency_code":   "INR"
    }
  ]
}

Copy organization_id and add it to every subsequent request:
  ?organization_id=10234695
Authorization header format

Zoho Books uses a specific prefix in the Authorization header: Zoho-oauthtoken YOUR_ACCESS_TOKEN. Not Bearer, not token. The exact string is Zoho-oauthtoken followed by a space and the token.

Direction A: Zoho Books workflow webhook fires a WhatsApp

Configure a Workflow Rule in Zoho Books so that when an invoice is created or a payment is received, Zoho Books POSTs the details to your WA.Expert automation URL automatically.

Set up the workflow webhook

1
In Zoho Books, go to Settings → Automation → Workflow Rules.
2
Click New Workflow Rule. Set Module to Invoices (or Payments). Set Trigger to Record Created or Record Updated.
3
Add a condition if needed (e.g. Status is Sent, or Payment Mode is any).
4
Under Actions, click Add Action → Webhook.
5
Enter your WA.Expert webhook URL as the target. Set method to POST, content type to JSON. Optionally add a secret header for verification.
6
Save the rule. Zoho Books now sends invoice and payment data to WA.Expert in real time.
Official docs

Zoho Books API: zoho.com/books/api/v3

Zoho Books webhook payload — invoice created
{
  "invoice_id":    "INV-000142",
  "customer_name": "Priya Textiles",
  "mobile":        "9820012345",
  "total":         48500.00,
  "balance":       48500.00,
  "due_date":      "2026-07-07",
  "status":        "sent",
  "currency_code": "INR"
}

Map to WA.Expert variables:
  customer_name  -> party_name
  "+91" + mobile -> wa_phone   <- PREPEND +91 if bare 10-digit
  invoice_id     -> invoice_number
  total          -> invoice_amount
  due_date       -> payment_due
  balance        -> outstanding

Direction B: Query Zoho Books for payment reminders

Run a scheduled WA.Expert automation each morning that pulls all overdue invoices and sends payment reminder WhatsApp messages.

GET overdue invoices — automated payment reminders
GET https://www.zohoapis.in/books/v3/invoices
    ?organization_id=10234695
    &status=overdue
    &sort_column=due_date
    &sort_order=A
Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN

Response:
{
  "code": 0,
  "invoices": [
    {
      "invoice_id":    "INV-000138",
      "customer_name": "Rajesh Enterprises",
      "mobile":        "9820012345",
      "total":         22000.00,
      "balance":       22000.00,
      "due_date":      "2026-06-20"
    }
  ]
}

For each invoice in the response:
  wa_phone = "+91" + mobile
  Send WhatsApp payment reminder with invoice_id, balance, due_date.

Worked example: daily overdue payment reminders

Scheduled automation — Zoho Books overdue invoices to WhatsApp
Trigger: Every day at 9:00 AM IST (scheduled)

Step 1 (External API Request — GET overdue invoices):
  GET https://www.zohoapis.in/books/v3/invoices
      ?organization_id=10234695&status=overdue
  Authorization: Zoho-oauthtoken ACCESS_TOKEN

Step 2 (Loop through each invoice):
  For each invoice where balance > 0:
    wa_phone = '+91' + invoice.mobile
    Send WhatsApp utility template:
      'Dear Rajesh Enterprises,
       Invoice INV-000138 for Rs. 22,000 was due on 20 June.
       Kindly arrange payment. Reply here for any queries.'

Troubleshooting

SymptomLikely causeFix
Invalid domain / 404 errorsUsing .com domain for Indian accountIndian Zoho Books accounts use zohoapis.in. Replace all .com with .in in your API URLs and oauth URLs.
401 UnauthorizedAccess token expired or wrong formatAccess tokens expire after 1 hour. Use the refresh token to get a new one. Header must be 'Zoho-oauthtoken TOKEN' (not Bearer, not token).
org_id required / errororganization_id missingAdd ?organization_id=YOUR_ORG_ID to every API call. Retrieve the ID from GET /books/v3/organizations.
Grant token expiredGrant token not exchanged within 10 minutesThe Self Client grant token is valid for only a few minutes. Generate a new grant token and exchange it immediately.
Workflow webhook not firingWorkflow rule condition not matchingCheck the Workflow Rule conditions in Zoho Books. If the rule has a status condition, ensure new invoices match that status.
Mobile number missing from payloadNot set on Contact recordEnsure the mobile number is stored on the customer's Contact record in Zoho Books. Prepend +91 to bare 10-digit numbers before sending WhatsApp.

Common questions

Which API domain for Indian businesses?
+
zohoapis.in for APIs, accounts.zoho.in for OAuth. Using .com with an Indian account returns errors.
Why is organization_id required on every call?
+
One Zoho account can have multiple organizations (businesses). The org ID tells the API which one to access. Get it from GET /books/v3/organizations.
How do Zoho Books access tokens work?
+
They expire after 1 hour. Use the refresh token to get a new one without re-authorising. Refresh on any 401 response.
How do I trigger WhatsApp on invoice creation?
+
Settings > Automation > Workflow Rules > New Rule. Trigger on Record Created (Invoices). Action: Webhook, point to WA.Expert automation URL.
How do I send automated payment reminders?
+
Scheduled automation calling GET /books/v3/invoices?status=overdue. Loop through results and send WhatsApp to each party's mobile. Run daily.
Does this incur extra WA.Expert charges?
+
Each WhatsApp uses a message credit: Rs. 0.14 on Starter (utility). Zoho Books API calls count against your plan's daily limit.

Connect ERPNext to WhatsApp

ERPNext: open-source ERP with token auth and built-in webhooks.

Read guide

Connect Tally to WhatsApp

TallyPrime: XML-over-HTTP gateway, payment reminders, voucher creation.

Read guide

External API Request Step

Master every field in WA.Expert's HTTP action step.

Read guide

Connect Zoho Books to WhatsApp today

Free trial, no credit card. If you get stuck, we answer live on WhatsApp.

Start Free Trial → Book a Demo
1