Zoho Invoice
Let hires look up customers and invoices, see who owes what, draft and send invoices, record payments and keep notes in Zoho Invoice.
Explore 10 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.
With Zoho Invoice, a hire can:
- find customers and see what each one owes,
- list invoices by status (draft, unpaid, overdue, paid, void), customer and date,
- read an invoice with its lines, payments and history,
- see who owes what and how late (current, 1–30, 31–60, 61–90 and over 90 days),
- draft an invoice, send it by email, record a payment, and add a note to an invoice.
It works in every Zoho data centre, including Saudi Arabia (zoho.sa) and the UAE (zoho.ae). If you use Zoho Books instead, connect Zoho Books: it works the same way.
1. Make an app in the Zoho API console
Roster connects as an app you own, so you choose what it can reach and can revoke it at any time.
- Open the Zoho API console for your data centre: the same ending as your Zoho Invoice address.
For
invoice.zoho.comit'sapi-console.zoho.com; forinvoice.zoho.euit'sapi-console.zoho.eu; for Saudi Arabiaapi-console.zoho.sa; and so on. - Click Add Client and choose Server-based Applications.
- Client Name:
Roster. Homepage URL: your Roster address. - Authorized Redirect URIs: the address Roster shows on the Zoho Invoice connection. It ends
in
/api/integrations/zoho-invoice/oauth/callback. - Click Create, then copy the Client ID and Client Secret.
If you already made an app for Zoho Books, you can make a second one for Zoho Invoice the same way.
2. Connect it in Roster
- Open Integrations → Tools → Add a tool, search for Zoho Invoice and choose it.
- Paste the OAuth app client ID and OAuth app client secret.
- Data centre: where your Zoho account lives. Look at your Zoho Invoice address:
invoice.zoho.euis Europe,invoice.zoho.sais Saudi Arabia, and so on. - Organisation ID: leave it empty if you have one organisation. If you have more, open Zoho Invoice, click your organisation's name at the top, and copy the ID shown for the one hires should use.
- Click Connect, then Connect with Zoho Invoice on the new connection.
- Zoho asks you to allow Roster. Click Accept. Back in Roster, the connection says Connected with Zoho Invoice.
What hires do in Zoho Invoice shows as the Zoho user who accepted.
What Roster asks Zoho for
| Permission | Why |
|---|---|
| Contacts: read | Find customers and what they owe |
| Settings: read | Find your organisation |
| Invoices: read, create, edit | Read invoices; draft, send and comment (only hires allowed to) |
| Customer payments: read, create | See payments; record new ones (only hires allowed to) |
3. Give hires access
On the hire's Tools tab, click Give access on Zoho Invoice:
- Read only: it can look up customers, invoices and payments and see who owes what. It can't change anything, draft or send.
- Read and write: it can also draft invoices, send them, record payments and add notes.
Drafting and sending are separate. A draft stays in Zoho Invoice until someone sends it, so you can let a hire prepare invoices and check them yourself before they go out.
A hire with Read and write can also ask to void an invoice. That always waits for a person's approval: the hire asks in the thread with the invoice and the reason, and when the approver says yes, Roster voids exactly that invoice, once (more). Nobody can turn that asking off.
Hires refer to invoices by their number, like INV-000007, and to customers by name.
Watching invoices
A hire's responsibility can watch Zoho Invoice: it's woken when invoices change (paid, sent, edited) or fall overdue, with the list. Checking costs nothing when nothing changed.
If something goes wrong
- "Isn't connected yet": press Connect with Zoho Invoice on the connection.
- Zoho says the redirect URI doesn't match: the address in the API console must be exactly the one Roster shows, with no extra slash.
- "Several organisations": set the Organisation ID on the connection.
- Zoho's daily limit: the Free plan allows 1,000 requests a day. When it's used up, the hire says so and tries again later.
Tools and permissions reference
This reference is built from the same definitions Roster uses to connect Zoho Invoice and give hires access. It updates with each release.
Authentication and requested permissions
The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.
OAuth 2.0
From the Server-based Application you added in the Zoho API console.
Requested scopes:
ZohoInvoice.contacts.READZohoInvoice.settings.READZohoInvoice.invoices.READZohoInvoice.invoices.CREATEZohoInvoice.invoices.UPDATEZohoInvoice.customerpayments.READZohoInvoice.customerpayments.CREATE
Connection fields
| Field | What to provide |
|---|---|
OAuth app client IDclientIdOptional | From the Server-based Application you added in the Zoho API console. |
OAuth app client secretclientSecretOptional · sealed secret | Use the value for your account or connection. |
Data centreregionOptional | Where your Zoho account lives: look at your Zoho Invoice address, e.g. invoice.zoho.eu is Europe. Choices: United States (zoho.com) (com); Europe (zoho.eu) (eu); India (zoho.in) (in); Australia (zoho.com.au) (com.au); Japan (zoho.jp) (jp); Canada (zohocloud.ca) (ca); Saudi Arabia (zoho.sa) (sa); United Arab Emirates (zoho.ae) (ae). Starts with: |
Organisation IDorganizationOptional | Only if you have more than one organisation: in Zoho Invoice, click your organisation's name to see its ID. Empty: your default organisation. |
Per-hire limits
Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.
No additional fields.
Actions
10 actions: 5 only read and 5 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.
10 of 10 actions. Open an action for its arguments and full input schema.
list_contactsRead only
Customers in Zoho Invoice with what each owes, optionally matching words in their name, company or email, or only those with overdue or unpaid invoices.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
searchOptional | string | words in the name, company or email |
owingOptional | "any" | "unpaid" | "overdue" | See input schema below.Default: "any" |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"search": {
"description": "words in the name, company or email",
"type": "string"
},
"owing": {
"default": "any",
"type": "string",
"enum": [
"any",
"unpaid",
"overdue"
]
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}list_invoicesRead only
Invoices, newest first, filtered by status (draft, unpaid, overdue, paid, void), customer, invoice date and words in the number or reference.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
statusOptional | "any" | "draft" | "unpaid" | "overdue" | "paid" | "void" | unpaid: sent and not fully paid; overdue: unpaid and past its due dateDefault: "any" |
customerOptional | string | a customer's name or id |
fromOptional | string | invoice date on or after, yyyy-mm-dd |
toOptional | string | invoice date on or before, yyyy-mm-dd |
searchOptional | string | words in the invoice number or reference |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"status": {
"default": "any",
"description": "unpaid: sent and not fully paid; overdue: unpaid and past its due date",
"type": "string",
"enum": [
"any",
"draft",
"unpaid",
"overdue",
"paid",
"void"
]
},
"customer": {
"description": "a customer's name or id",
"type": "string"
},
"from": {
"description": "invoice date on or after, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to": {
"description": "invoice date on or before, yyyy-mm-dd",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"search": {
"description": "words in the invoice number or reference",
"type": "string"
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}get_invoiceRead only
One invoice in full: customer, dates, line items, totals, payments received and its latest comments.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. INV-000012, or its id |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. INV-000012, or its id"
}
},
"required": [
"invoice"
]
}create_draft_invoiceRead and write
Create a draft invoice for a customer. Nothing is sent: the customer sees it only once someone sends it.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
customerRequired | string | the customer's name or id |
linesRequired | object[] | See input schema below. |
dateOptional | string | invoice date, yyyy-mm-dd; default today |
due_dateOptional | string | default: the customer's payment terms |
referenceOptional | string | a PO or order number |
notesOptional | string | notes shown on the invoice |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"customer": {
"type": "string",
"minLength": 1,
"description": "the customer's name or id"
},
"lines": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"minLength": 1,
"description": "what was sold, as it should read on the invoice"
},
"quantity": {
"default": 1,
"type": "number",
"exclusiveMinimum": 0
},
"rate": {
"type": "number",
"minimum": 0,
"description": "price per unit, before tax"
},
"item": {
"description": "a product or service id or code from the accounting system",
"type": "string"
},
"account": {
"description": "an income account code, where the system needs one",
"type": "string"
}
},
"required": [
"description",
"rate"
]
}
},
"date": {
"description": "invoice date, yyyy-mm-dd; default today",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"due_date": {
"description": "default: the customer's payment terms",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"reference": {
"description": "a PO or order number",
"type": "string",
"maxLength": 100
},
"notes": {
"description": "notes shown on the invoice",
"type": "string",
"maxLength": 5000
}
},
"required": [
"customer",
"lines"
]
}send_invoiceRead and write
Email an invoice to the customer from Zoho Invoice (a draft is marked sent). Goes to the customer's contacts unless addresses are given.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. INV-000012, or its id |
toOptional | string[] | email addresses; default: the customer's contacts |
subjectOptional | string | default: the organisation's invoice email template |
messageOptional | string | the email's text; default: the template's |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. INV-000012, or its id"
},
"to": {
"description": "email addresses; default: the customer's contacts",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"subject": {
"description": "default: the organisation's invoice email template",
"type": "string",
"maxLength": 300
},
"message": {
"description": "the email's text; default: the template's",
"type": "string",
"maxLength": 10000
}
},
"required": [
"invoice"
]
}record_paymentRead and write
Record a payment the customer made against an invoice.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number or id |
amountRequired | number | See input schema below. |
dateOptional | string | when it was paid; default today |
referenceOptional | string | the bank or cheque reference |
modeOptional | string | how it was paid: banktransfer, cash, check, creditcard…Default: "banktransfer" |
accountOptional | string | the id of the bank or cash account it went into; default Zoho's |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number or id"
},
"amount": {
"type": "number",
"exclusiveMinimum": 0
},
"date": {
"description": "when it was paid; default today",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"reference": {
"description": "the bank or cheque reference",
"type": "string",
"maxLength": 100
},
"mode": {
"default": "banktransfer",
"description": "how it was paid: banktransfer, cash, check, creditcard…",
"type": "string",
"maxLength": 50
},
"account": {
"description": "the id of the bank or cash account it went into; default Zoho's",
"type": "string"
}
},
"required": [
"invoice",
"amount"
]
}list_paymentsRead only
Payments received, newest first, optionally from one customer.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
customerOptional | string | a customer's name or id |
limitOptional | integer | See input schema below.Default: 30 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"customer": {
"description": "a customer's name or id",
"type": "string"
},
"limit": {
"default": 30,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}receivables_summaryRead only
Who owes what and how late: open invoices totalled by age (current, 1-30, 31-60, 61-90, over 90 days) and the customers most overdue.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}add_noteRead and write
Add a comment to an invoice's history in Zoho Invoice, e.g. what the customer said when chased. Not shown to the customer unless asked.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. INV-000012, or its id |
noteRequired | string | See input schema below. |
show_to_customerOptional | boolean | See input schema below.Default: false |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. INV-000012, or its id"
},
"note": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"show_to_customer": {
"default": false,
"type": "boolean"
}
},
"required": [
"invoice",
"note"
]
}void_invoiceRead and writeApproval required · locked
Void an invoice in Zoho Invoice: it stays on record but is no longer owed. It always waits for a person's approval: Roster asks in the thread and voids exactly this invoice, once, when they approve.
Approval: Always asks for approval. This requirement cannot be turned off.
| Argument | Type | Details |
|---|---|---|
invoiceRequired | string | the invoice number, e.g. INV-000012, or its id |
reasonRequired | string | why, kept as a note on the invoice |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice": {
"type": "string",
"minLength": 1,
"description": "the invoice number, e.g. INV-000012, or its id"
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "why, kept as a note on the invoice"
}
},
"required": [
"invoice",
"reason"
]
}Watches and incoming events
- This integration supports a responsibility that watches for changes. The guide above explains what it checks and how to limit it.
- No incoming webhook handler is declared for this integration.
Limits and troubleshooting
- Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
- Expired or revoked access: reconnect or replace the key on the connection.
- Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
- The action schema describes accepted inputs. It does not grant additional access or bypass approvals.