---
name: invoiceize
description: Make an invoice, receipt or quote for the user with Invoiceize (invoiceize.com). You write the details into a link; the user opens it, checks the filled-in editor and downloads the PDF. Free, no account, no API key.
---

# Invoiceize: make invoices, receipts and quotes

Invoiceize is a free invoice generator that runs in the browser. You do not call an API and you do not
need an account or key. You build **one link** that carries the document's details, and give it to the user.
When they open it, the editor is already filled in. They check it, change anything they like, and click
Download PDF.

The details live after the `#` in the link. Browsers do not send that part to Invoiceize when loading the
page. The editor saves the document in the browser. If the user is signed in and uses cloud sync, the
document can also sync to their account. Anyone with the full link can read its contents, so share it
only with the intended recipient.

## 1. Agree on the details

Ask the user only for what you don't already know. Usually:

- **Who is billing** (`from`): name, email, address, tax ID if they use one
- **Who is paying** (`to`): name, email, address
- **What for** (`items`): one line per thing, with quantity and unit price
- **Currency**, tax rate, due date or payment terms, how to pay (bank / PayPal / link)

Don't invent numbers, tax IDs or bank details. Leave out anything the user didn't give you; they can fill
it in on the page.

## 2. Write the JSON

Every field is optional. Leave out what you don't have.

```json
{
  "from": { "name": "Studio Kumo", "email": "hi@kumo.studio", "phone": "", "address": "12 Market St\nSan Francisco, CA", "taxId": "" },
  "to": { "name": "Acme Inc.", "email": "ap@acme.com", "address": "500 Main St\nAustin, TX" },
  "meta": { "number": "INV-0042", "issueDate": "2026-11-12", "dueDate": "2026-12-12", "paymentTerms": "Net 30", "poNumber": "" },
  "currency": "USD",
  "items": [
    { "description": "Logo design", "details": "3 concepts, 2 rounds of revisions", "quantity": "1", "rate": "1200" },
    { "description": "Brand guidelines", "quantity": "1", "rate": "450" }
  ],
  "taxPercent": "8.25",
  "discount": "",
  "shipping": "",
  "amountPaid": "",
  "notes": "Thanks for working with us!",
  "terms": "",
  "paymentInfo": "Bank: First Bank · Account 123456789 · Routing 021000021",
  "template": "modern"
}
```

| Field | Notes |
|---|---|
| `from` / `to` | `name`, `email`, `phone`, `address` (use `\n` for new lines), `taxId`. Extra rows: `"extra": [{ "key": "VAT", "value": "GB123" }]` |
| `shipTo` | `{ "name": "", "address": "" }`, only when shipping somewhere else |
| `meta` | `number`, `issueDate` and `dueDate` as `YYYY-MM-DD`, `paymentTerms`, `poNumber`, `extra` rows like above. On a quote, `dueDate` is "valid until". On a receipt, `issueDate` is the payment date |
| `currency` | ISO 4217 code: `USD`, `EUR`, `GBP`, `JPY`, `CNY`… |
| `items` | `description`, optional `details` (a second, smaller line), `quantity` (default 1), `rate` = **unit price**, not the line total |
| `taxPercent` | Tax rate in percent, e.g. `"8.25"` |
| `discount`, `shipping`, `amountPaid` | Amounts in the invoice currency |
| `notes`, `terms`, `paymentInfo` | Free text shown on the document |
| `template` | `classic`, `modern` or `minimal` (optional) |

Amounts are plain numbers without currency symbols or thousands separators: `"1200.50"`, not `"$1,200.50"`.
Leave out `number`, `issueDate` and `dueDate` to let Invoiceize pick the next number and today's date.

## 3. Build the link

Pick the page by document type, then add `#fill=` and the JSON encoded as **base64url** (UTF-8):

| Document | Page |
|---|---|
| Invoice | `https://invoiceize.com/` |
| Receipt | `https://invoiceize.com/receipt-generator/` |
| Quote / estimate | `https://invoiceize.com/quotation-generator/` |

For an editor in the user's language, put `/zh`, `/ja`, `/de` or `/es` before the path, for example
`https://invoiceize.com/de/receipt-generator/`. English has no prefix.

If you can run a command, encode it like this (save the JSON to `invoice.json` first):

```bash
node -e 'const j=require("fs").readFileSync("invoice.json","utf8");console.log("https://invoiceize.com/#fill="+Buffer.from(JSON.stringify(JSON.parse(j))).toString("base64url"))'
```

```bash
python3 -c 'import base64,json,sys;d=json.load(open("invoice.json"));print("https://invoiceize.com/#fill="+base64.urlsafe_b64encode(json.dumps(d,ensure_ascii=False).encode()).decode().rstrip("="))'
```

If you can't run commands, put `encodeURIComponent(JSON)` after `#fill=` instead (percent-encoded JSON).
Invoiceize accepts both forms.

## 4. Hand it over

Give the user the link as a clickable link and tell them to check the details and click **Download PDF**.
For example: "Here's your invoice, ready to check and download: [Open invoice INV-0042](https://invoiceize.com/#fill=…)".

- Opening the link starts a new document. An unsaved draft on that page is kept in the user's recent
  documents, so nothing is lost.
- If the page says the link couldn't be read, it was cut off or wasn't valid JSON. Build it again.
- The PDF is made in the user's browser. You can't download it for them.
- Invoices made here are billing documents between businesses and clients, not government tax invoices
  (for example China's 增值税发票). Don't promise legal or tax compliance.
- Pay stubs aren't supported through links. Send the user to `https://invoiceize.com/pay-stub-generator/`.
