Build an invoice by pasting JSON
Fill in the invoice form, with all of its line items, from a pasted JSON document.
The line items are the slow part of an invoice, and they are usually already written down — on a timesheet, in a quote, in the email where the work was agreed. Importing turns that into a draft invoice in one step.
Find it on New invoice, under Import JSON. Use Copy the prompt in the import box to get this format plus the instructions an assistant needs, then paste in the timesheet or quote you are working from and paste back what it gives you.
Importing fills in the form. It does not save anything. The figures land in the ordinary invoice editor, with the subtotal, tax and total worked out in front of you, and creating the draft stays a separate click. Nothing is written until you make it.
Totals are never taken from the document either: the subtotal, discount, tax and total are worked out from the items, the same as on a typed invoice.
The document is checked against exactly the same rules the form uses, and anything it gets wrong is marked on the field it belongs to, so you can correct it in the form rather than in the document.
The document
{
"contact": "Northgate Studio",
"issueDate": "2026-09-30",
"dueDate": "2026-10-30",
"currency": "GBP",
"taxRatePercent": 20,
"items": []
}
| Field | Type | Notes |
|---|---|---|
contact |
string, required | Who to bill. See below. |
issueDate |
string, optional | YYYY-MM-DD. Today if left out. |
dueDate |
string, optional | YYYY-MM-DD, on or after the issue date. Worked out from the contact's payment terms if left out. |
currency |
string, optional | A three-letter code such as GBP. Your invoicing default if left out. |
taxRatePercent |
number, optional | 0 to 100. Your invoicing default if left out. |
discount |
object, optional | { "amount": 50, "isPercent": false }. A percentage discount cannot exceed 100. |
notes |
string, optional | Shown on the invoice, up to 5,000 characters. |
terms |
string, optional | Payment terms shown at the foot, up to 5,000 characters. Your default if left out. |
items |
array, required | At least one line item, up to 200. |
The contact
contact is a name, not an id — a document written elsewhere has no way to
know a contact's id. It must match a contact already in this Personal or team
space, either its listed name or its company name, exactly (capitals do not
matter).
If no contact matches, or more than one does, the import is refused rather than guessed at: billing the wrong customer is not a mistake anyone can be expected to spot on a finished draft. Add the contact first, or rename one of the two.
Line items
{ "description": "Design work, September", "quantity": 12, "unitPrice": 75 }
| Field | Type | Notes |
|---|---|---|
description |
string, required | What the item is for, up to 500 characters. |
quantity |
number, optional | Above zero. Defaults to 1. |
unitPrice |
number, required | Zero or more, in whole currency units — 75 or 75.50, not pence or cents. |
Write amounts the way they appear on the invoice. unitPrice is the price for
one; the line total is worked out for you.
A complete example
{
"contact": "Northgate Studio",
"issueDate": "2026-09-30",
"dueDate": "2026-10-30",
"currency": "GBP",
"taxRatePercent": 20,
"discount": { "amount": 10, "isPercent": true },
"notes": "Spring range, phase one.",
"terms": "Payment within 30 days by bank transfer.",
"items": [
{ "description": "Design work, September", "quantity": 12, "unitPrice": 75 },
{ "description": "Photography day rate", "quantity": 1, "unitPrice": 480 },
{ "description": "Print proofs", "quantity": 3, "unitPrice": 22.5 }
]
}
If an import is rejected for a reason you can't work out, Contact support.