Airtable to invoice
Turn the records in your base into numbered invoices with tax per line, a PDF and a hosted page.
An Airtable invoice in ASHDOCS starts as records: an Invoices table with linked Line items, or a single view with one row per line. ASHDOCS numbers each invoice, calculates tax on every line, renders the PDF and creates a hosted invoice page your customer can open. ASHDOCS has no Airtable extension; you either import a CSV export of a view or let Zapier, Make or an automation script send each record to the API.
Whichever route you pick, the record becomes the same request: the customer, one line_items entry per linked line, and the record ID as reference so you can trace the invoice back. The request below was built from an Invoices record with two linked lines.
curl -X POST https://www.ashdocs.com/api/v1/invoices \
-H "X-API-Key: ash_test_..." \
-H "Content-Type: application/json" \
-d '{
"customer": { "name": "Northwind Studio", "email": "accounts@northwind.example" },
"line_items": [
{ "description": "Website redesign", "quantity": "1", "unit_price": "1200.00", "tax_rate": "10" },
{ "description": "Hosting, monthly", "quantity": "12", "unit_price": "15.00", "tax_rate": "10" }
],
"currency": "USD",
"reference": "recA1b2C3d4E5f6G7",
"issue": true
}'const body = {
"customer": { "name": "Northwind Studio", "email": "accounts@northwind.example" },
"line_items": [
{ "description": "Website redesign", "quantity": "1", "unit_price": "1200.00", "tax_rate": "10" },
{ "description": "Hosting, monthly", "quantity": "12", "unit_price": "15.00", "tax_rate": "10" }
],
"currency": "USD",
"reference": "recA1b2C3d4E5f6G7",
"issue": true
};
const res = await fetch("https://www.ashdocs.com/api/v1/invoices", {
method: "POST",
headers: { "X-API-Key": "ash_test_...", "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const invoice = await res.json();
console.log(invoice.number, invoice.hosted_url, invoice.pdf_url);import requests
body = {
"customer": {"name": "Northwind Studio", "email": "accounts@northwind.example"},
"line_items": [
{"description": "Website redesign", "quantity": "1", "unit_price": "1200.00", "tax_rate": "10"},
{"description": "Hosting, monthly", "quantity": "12", "unit_price": "15.00", "tax_rate": "10"},
],
"currency": "USD",
"reference": "recA1b2C3d4E5f6G7",
"issue": True,
}
r = requests.post(
"https://www.ashdocs.com/api/v1/invoices",
headers={"X-API-Key": "ash_test_..."},
json=body,
)
invoice = r.json()
print(invoice["number"], invoice["hosted_url"], invoice["pdf_url"]){
"id": "inv_315cb2bcc1b045b28242",
"kind": "invoice",
"status": "issued",
"number": "INV-0001",
"customer": { "name": "Northwind Studio", "email": "accounts@northwind.example", "id": "cus_da4dddf61db945fc9e5c" },
"line_items": [
{ "description": "Website redesign", "quantity": "1", "unit_price": "1200.00", "tax_rate": "10", "amount_formatted": "$1,200.00" },
{ "description": "Hosting, monthly", "quantity": "12", "unit_price": "15.00", "tax_rate": "10", "amount_formatted": "$180.00" }
],
"currency": "USD",
"issue_date": "2026-10-05",
"due_date": "2026-11-04",
"reference": "recA1b2C3d4E5f6G7",
"testing": true,
"totals": { "subtotal_formatted": "$1,380.00", "tax_formatted": "$138.00", "total_formatted": "$1,518.00", "balance_formatted": "$1,518.00" },
"credits_cost": 0,
"pdf_url": "https://api.ashdocs.com/api/v1/invoices/inv_315cb2bcc1b045b28242/pdf",
"hosted_url": "https://api.ashdocs.com/i/1a5TvIhq7lkk7z4cpnoLy4gKdilfjvD5C_qJ0r4V3VY"
}Response from a test key, trimmed. Save the PDF from pdf_url in the same run, because the link is temporary; hosted_url does not expire.
Linked lines, one invoice
Keep lines in their own table linked to the invoice record. Each linked line becomes one line_items entry, with its own quantity, unit price and tax rate.
Results back in the record
The response carries number, hosted_url and pdf_url, ready to write into Invoice number, Invoice link and a PDF attachment field on the same record.
Numbering you don't maintain
ASHDOCS assigns the next number in your sequence when the invoice is issued, with the prefix and padding from your invoicing settings, so the base never has to count.
From Airtable invoice records to issued invoices, in four steps
This is the route that needs no automation tool: a CSV export of one view, imported into ASHDOCS. The template at /invoice-templates/ashdocs-invoice-rows.csv shows the column names the import expects.
- 1. Make a grid view with one record per invoice line and fields named like the template's columns: customer name, customer email, description, quantity, unit price, tax rate, currency and group.
- 2. Give every line of the same invoice the same group value, for example the invoice's record ID or name pulled in with a lookup field.
- 3. Download the view as CSV, then in ASHDOCS open Invoices, choose Import CSV and check the column matches.
- 4. Create the invoices as Drafts or as issued invoices. Each issued invoice gets a number, a PDF and a hosted page, which you can send from the dashboard.
Multiple line items on one invoice from linked records
In the CSV route, the group column does the work: rows with the same group value become one invoice with one line per row, and the customer comes from the group's first row.
In an automated route, the lines travel inside one request. An Airtable automation with a "Run a script" action can read the record's linked Line items and send one line_items entry for each, in the order they are linked; that is how the request above was built. In Zapier or Make, look up the linked line records after the Airtable trigger and pass them to the Line Items field of Create Invoice as a list (in Make, through an Array aggregator). Map the record ID into Reference, and into Idempotency Key so a retried run returns the first invoice instead of a second one.
Airtable fields and the API
A two-table base works well: Invoices, and Line items linked to it. These field names match the request above. With an HTTP step, send the API field names; the Zapier column shows the matching label in the ASHDOCS Zapier app (available by invite), and the Make column the label the Make app will use once it is available.
| Airtable field | API field | Zapier field | Make field |
|---|---|---|---|
| Invoices → Customer name | customer.name | Customer Name | Customer name |
| Invoices → Customer email | customer.email | Customer Email | Customer email |
| Line items → Description | line_items[].description | Line Items → Line item description | Line items → Description |
| Line items → Quantity | line_items[].quantity | Line Items → Quantity | Line items → Quantity |
| Line items → Unit price | line_items[].unit_price | Line Items → Unit Price | Line items → Unit price |
| Line items → Tax rate (a Number, e.g. 10) | line_items[].tax_rate | Line Items → Tax Rate (%) | Line items → Tax rate (%) |
| Record ID | reference, Idempotency-Key header | Reference, Idempotency Key | Reference, Idempotency key |
| Invoice number (written back) | number | Invoice Number | Invoice number |
| Invoice link (written back) | hosted_url | Payment Page URL | Payment page URL |
| PDF attachment (written back) | pdf_url | PDF URL (needs your API key) | PDF URL (needs your API key) |
What exists today
The CSV template and the Import CSV dialog work today. The ASHDOCS Zapier app is available by invite while Zapier reviews the public listing, and the ASHDOCS community node runs on self-hosted n8n; there is no ASHDOCS Make app yet. Without an app, Zapier's and Make's HTTP steps, or an Airtable script using fetch, call POST /api/v1/invoices directly with an X-API-Key header.
Runs made with a test key cost nothing, so you can try the base end to end first. Issuing an invoice uses 1 credit, and the free plan includes 100 credits per month. Airtable sets its own limits on automation runs and script time.
Frequently asked questions
Can Airtable create invoices automatically?
Yes, through Zapier, Make or an automation script that calls the ASHDOCS API when a record is ready. ASHDOCS numbers the invoice, renders the PDF and returns the number, hosted page link and PDF link to write back to the record.
How do I add line items from linked records?
Keep the lines in their own table and link them to the invoice record. Read the linked records and send one line_items entry for each in the same request; in a CSV export, give the lines the same group value instead.
Can the invoice number follow my own format?
Yes. In ASHDOCS invoicing settings you set the prefix, the padding and an optional format with the year. ASHDOCS assigns the number when the invoice is issued, so Airtable never has to count.
Can I email the invoice from Airtable?
Yes. Add send with an email channel to the request, or set Email to Customer in the Zapier or Make action, and ASHDOCS emails the invoice to the customer email in the same call. The email links to the hosted invoice page.
Plans
- 100 credits per month
- 1 seat
- No webhooks
- 1,500 credits per month
- 1 seat
- Webhooks
- 10,000 credits per month
- 3 seats
- Webhooks
- 30,000 credits per month
- 5 seats
- Webhooks
- 100,000 credits per month
- 10 seats
- Webhooks
Test keys are free, never expire and never use credits; plan rate limits apply. Webhooks are on paid plans. Issuing an invoice uses 1 credit. No per-seat fees. See full pricing.