RenderInvoicePrivate
Examples
StarOpen app
Open
API · agents · integrations

No backend. Yours to self-host.

RenderInvoice runs entirely in your browser. For programmatic PDFs, self-host the free Cloudflare Worker. If you want a spreadsheet workflow, use the Google Sheets script without setting up an external API.

hithismani/render-invoice
Self-hosted render API
Programmatic PDFs

Self-hosted PDF worker

Send a POST /v1/render request with { "invoice": {…} } (or a bare invoice object). Same template as the playground. You get a PDF with selectable text. Cloudflare free plan.

Deploy PDF worker to Cloudflare
  1. Click Deploy (free) above, or run npx wrangler deploy from the repo root.
  2. Set the secret: npx wrangler secret put API_KEY_SECRET (required).
  3. Optional IP allowlist: Worker var ALLOWED_IPS=1.2.3.4,5.6.7.8.
  4. Call POST /v1/render withAuthorization: Bearer <API_KEY_SECRET>.
# Deploy
npx wrangler secret put API_KEY_SECRET
npx wrangler deploy
# Render
curl -X POST \
  https://your-worker.workers.dev/v1/render \
  -H 'Authorization: Bearer $API_KEY_SECRET' \
  -H 'Content-Type: application/json' \
  --data-binary @invoice.json \
  --output invoice.pdf
# Image
?format=png
Disclaimer

Provided as-is. No warranties.

RenderInvoice, the playground, and the Cloudflare Worker are provided without warranties or guarantees of any kind, including merchantability, fitness for a particular purpose, accuracy of rendered output, uptime, or continued free-tier availability.

You are responsible for verifying invoice totals, tax, legal fields, and recipient details before sending documents. Hosted free tiers may sleep, throttle, change pricing, or terminate services. Self-hosted deployments are your responsibility for security, secrets, IPs, and scaling.

Use of the software is at your own risk. See Terms of service and Privacy policy.

Spreadsheet auto-fill
No backend

Google Sheets to invoices

A single HYPERLINK formula creates a pre-filled playground URL from a spreadsheet row. Opening the link loads every field into the playground without API calls.

  • • The playground reads invoice JSON directly from the URL hash.
  • • Data stays in your browser and is not sent to RenderInvoice servers.
  • • For advanced setups (such as multi-recipient invoices or dynamic columns), use the prompt below to generate an Apps Script or formula.
AI prompt
I want to turn a Google Sheet into a one-click invoice generator using RenderInvoice (https://renderinvoice.com, a browser-only invoice tool with no backend).

The integration is pure link-building. An Apps Script reads the active row, builds an RenderInvoice invoice JSON object, and constructs a URL like:

  https://renderinvoice.com/playground#j=<encodeURIComponent(JSON.stringify(invoice))>

Opening that URL pre-fills every field in the playground. From there I (or my client) review and download a PDF. No API calls, no auth, no Cloudflare Worker, and no Drive integration.

Please:
1. Propose a Google Sheet column layout that matches my business (described below). Keep one row per invoice. Include columns for: From block, Bill To block, invoice meta (number, date, due, project), line items (description / qty / rate / amount up to N rows), summary rows (subtotal, tax, total), and design settings (accentColor hex, design = "classic" or "bold").
2. Write a complete Apps Script (Code.gs) with: buildInvoice(row), shareUrlFor(invoice), openActiveRow() that pops a modal that calls window.open(url), and onOpen() that adds an "RenderInvoice" menu.
3. Make the script defensive about empty cells and stop reading line items at the first blank row.

Before writing code, please READ these reference docs so the JSON shape and URL format are correct:
- Plain-language schema and share-URL spec for AI agents: https://renderinvoice.com/llms.txt
- API page (schema reference, examples): https://renderinvoice.com/developers
- Live invoice examples to model after: https://renderinvoice.com/examples

Constraints from the schema:
- Every key used in lineItems[] rows must also appear in columns[].
- summary[].value is a string or number that I compute in the sheet; RenderInvoice never calculates totals, formats currency, or applies tax.
- Pre-fill design ("classic" or "bold") and accentColor (#RRGGBB).
- Every text field accepts markdown: **bold** *italic* ~~strike~~ `code` [label](url), #–####### headings, {@18} / {@p:18} absolute size, {@18:span} inline size, - lists, 1. numbered, > quotes. Single newlines are kept. Wrap a key in @Label@ to hide it (from/to/meta). Currency glyphs (₹ € £ ¥) are fine as plain text.

My business: <describe your invoicing, e.g., "UK design freelancer billing hourly + 20% VAT", "SaaS with monthly seats and proration", "agency with retainers and split shipping addresses">.

My existing sheet (if any): <paste a header row, or describe the columns you already have, or leave blank to start from your suggestion>.
# One Sheets formula. Copy down a column.
=HYPERLINK(
  "https://renderinvoice.com/playground#j="
    & ENCODEURL(G2),
  "Open ↗"
)

# G2 holds the JSON for that row,
# built with & concatenation
# from your other columns.
Share-URL protocol

Hand off an invoice with a URL.

Encoding invoice JSON into the URL hash loads the invoice with no server. Point the hash at /playground to edit, or /print-view to print.

#i=  compressed with lz-string compressToEncodedURIComponent for shorter URLs.
https://renderinvoice.com/playground#i=N4IgdghgtgpiBcIAuBLAdkgNCAlgOwCcB7TCAOgA8AHJAVwBsFE...
#j=  standard encodeURIComponent(JSON.stringify(invoice)). Generates longer URLs that can be constructed from shell scripts, Apps Script, or curl.
https://renderinvoice.com/playground#j=%7B%22design%22%3A%22classic%22...
# or skip the editor:
https://renderinvoice.com/print-view#j=…same JSON…
Agent manifest

/llms.txt

Follows the llms.txt convention. Automated agents can read this file to understand the schema and worker configuration.

Read /llms.txt
Markdown

Every text field.

Markdown in every text field (invoiceHeading, invoiceDescription, invoiceFrom keys & values, invoiceTo keys & values, metaTop / metaBottom keys & values, columns, line-item cells, summary labels & values, footerText, cancelledNotes). Inline: **bold** *italic* ***bold italic*** ~~strike~~ `code` [label](url) {@18:inline size}. Blocks: # … ####### headings {@18} / {@p:18} line size - list 1. numbered > quote ---. Size: #–####### scale from the field base size; {@18} / {@p:18} set absolute px for a line; {@18:span} sizes an inline run. Keys: wrap a key in @…@ (e.g. "@note@") to hide the label and print the value only. Line breaks: a single newline is kept (no need for a blank line). Currency/punctuation glyphs (₹ € £ ¥ ₩ ₽ • — – … → ← ·) render via the invoice font + Inter fallback. Not supported: tables, images, raw HTML, footnotes, task lists.

TagMeaning
**text** or __text__inlineBold
*text* or _text_inlineItalic
***text***inlineBold + italic
~~text~~inlineStrikethrough
`code`inlineInline code (monospace chip)
[label](https://…)inlineLink (blue, underlined; clickable in PDF)
user@host (bare email)inlineAutolinked mailto in PDF
# heading … ####### headingsizeH1–H7 - scale from the field’s base size, bold
{@18} rest of linesizeAbsolute font size in px for the rest of that line
{@p:18} rest of linesizeSame as {@18} (paragraph-size alias)
{@18:span text}sizeInline run at absolute px size
- item or * itemblockUnordered list
1. itemblockOrdered list
> quoteblockBlockquote
---blockHorizontal rule
single newlineblockHard line break (kept; no blank line required)
@Label@ (full key)keysHide the key label; print the value only (from / to / meta)
spaces around @…@keysTrimmed first - " @note@ " still hides the label

Not supported: tables, images, raw HTML, footnotes, task lists.

Schema reference

The invoice contract.

Every field accepted by the JSON editor and render worker. Text fields accept the markdown tags above.

design"classic" | "bold"Optionaldefault: "classic"

Visual variant for the rendered invoice. "classic" is the default; "bold" uses an accent header.

fontstringOptional

Typeface for playground, PDF, and worker. One of: Inter, Source Serif 4, IBM Plex Sans, Playfair Display, Space Grotesk, DM Sans, Fraunces, Libre Baskerville, Instrument Sans, Newsreader. Default Inter. Unknown names fall back to Inter.

accentColorstringOptionaldefault: "#2563eb"

Accent color (hex) threaded through headings, totals, and borders.

logoPosition"center" | "left" | "right"Optionaldefault: "center"

Where the logo sits in the header.

direction"ltr" | "rtl"Optionaldefault: "ltr"

Reading direction. Use "rtl" for Arabic, Hebrew, Urdu, Farsi, and other right-to-left scripts.

autoSizebooleanOptionaldefault: true

PDF page sizing. true (default): portrait A4 width, height = max(A4, content). false: scale the whole invoice onto one A4 page.

filenamestringOptional

The filename to use for the generated PDF.

invoiceHeadingstringOptional

The main heading or title for the invoice (e.g., "Invoice").

invoiceDescriptionstringOptional

Subtitle. Full markdown: **bold** *italic* ~~strike~~ `code` [label](url) #–####### headings {@18}/ {@p:18} size {@18:span} - list 1. numbered > quote. Line breaks kept.

invoiceFromRecord<string, string>

Sender key-value pairs. Keys and values accept full markdown including size overrides ({@18}, # headings). Wrap a key in @…@ (e.g. "@note@") to hide the label and print the value only.

invoiceToArray<Record<string, string>>

Recipients as key-value objects. Keys and values accept full markdown including size overrides. Wrap a key in @…@ to hide the label.

metaTopRecord<string, string>

Metadata above line items. Keys and values accept full markdown including size overrides. Wrap a key in @…@ to hide the label.

metaBottomRecord<string, string>Optionaldefault: {}

Metadata below line items. Keys and values accept full markdown including size overrides. Wrap a key in @…@ to hide the label.

columnsArray<string>

Column headers for the line items table. Markdown supported.

lineItemsArray<Record<string, string | number>>

Line item cells aligned with columns. Full markdown including currency glyphs (₹ € £) and size overrides.

summaryArray<Object>

Invoice summary items.

labelstring

Label for a summary item. Markdown supported.

valuestring | number

Value for the summary item. Markdown and currency glyphs supported.

logoUrlOptional

Company logo URL or embedded data URL.

logoSizeObjectOptional

Logo dimensions.

widthnumber
heightnumber
digitalSignatureUrlOptional

Digital signature image URL or embedded data URL.

signatureSizeObjectOptional

Signature dimensions.

widthnumber
heightnumber
footerTextObject

Footer text. Full markdown (bold/italic/code/links/headings/lists/quotes), single newlines kept, size overrides {@18} / #–#######.

topTextstringOptional
bottomTextstringOptional
isCancelledbooleanOptional
cancelledNotesstringOptional

Notes shown when the invoice is cancelled. Same markdown as the description.

amountsVerifiedHideDisclaimerbooleanOptionaldefault: false

If false, a disclaimer about verifying amounts will be displayed.

showBuiltWithbooleanOptionaldefault: false

If true, shows a small "Built with RenderInvoice" line at the bottom of the invoice.

includeEditLinkbooleanOptional

If true (default), add a full-width footer rule that links back to this invoice in the playground (PDF only).

RenderInvoice

Un-opinionated invoices. Selectable PDFs. Zero backend.

A BusinessAddons product.

Star
Product
  • Playground
  • Examples
  • Changelog
API
  • Overview
  • PDF worker · free
  • llms.txt
  • GitHub
Company
  • About
  • Pricing
  • Licenses
  • Privacy policy
  • Terms of service
  • Issues
© 2026 RenderInvoice · BusinessAddonshithismani/render-invoice