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.