Order paid → the invoice, in the customer’s inbox

The invoice is owed the moment the payment clears — not when someone gets to it.

Trigger → artefact

Payment succeeds in your systema numbered tax invoice and a receipt, both as PDF bytes

Invoices look simple until the second tax rate arrives. Then it is subtotals per rate, a rounding rule, a line count nobody predicted, and a footer that has to land on the last page and only the last page. That logic ends up spread across a template, a helper file and a Chrome flag.

Here it lives inside the document. You POST the rows; the arithmetic, the per-rate tax table and the pagination happen during the render. Send a line item without an amount and the render fails and names the field, rather than shipping an invoice with a blank in it.

Built with the HTML API. Need a designed image or certificate instead? Use the Canvas API — same data, same free year.

A tax invoice PDF rendered by PixlDocs, with line items and a per-rate tax summary
Tax invoice — rendered by the template this page calls.

What ships in this category

The documents, and the part of each that is hard.

A tax invoice PDF rendered by PixlDocs, with line items and a per-rate tax summary

Tax invoice

A compliant tax invoice with seller and buyer identity, per-rate tax breakdown and totals — in your currency, with your tax named the way your jurisdiction names it.

Hard part Tax subtotals per rate, computed from the lines you send.

template_id 001eb79f-5fcc-4c5d-bb1e-3fe0b891097a

An order receipt PDF rendered by PixlDocs, showing payment method, items and total paid

Order receipt

The paid-in-full confirmation: payment method and reference, discounts, shipping and the amount actually taken.

Hard part Discount and shipping lines that only appear when they apply.

template_id 2f686558-0b28-4b9d-9572-ec7fe61e5df6

A credit note PDF rendered by PixlDocs, showing returned lines and the tax adjustment

Credit note

The invoice going the other way: returned lines with the reason, the tax adjustment on what was credited, and how the credit settles — against the account or as a refund.

Hard part Tax reversed on the credited lines, not on the original invoice total.

template_id 4d35ed62-1657-4dad-9c39-a7847146aad2

A rent receipt PDF rendered by PixlDocs, showing the period, charges and the amount received

Rent receipt

Money actually received for a period: rent, arrears brought forward, any late fee, and withholding tax deducted at source where the law requires it.

Hard part A receipt that states what was received, not what is owed — and says so on its face.

template_id b3d6d998-56a3-441d-a228-48f51dc76e18

A maintenance bill PDF rendered by PixlDocs for a residents’ association, with charges and payment details

Maintenance bill

Per-unit association billing: common-area charges, sinking fund, arrears, late fee, and the bank and UPI details to pay it.

Hard part Arrears carried in from the last period, added without being folded into a charge line.

template_id 32242e1a-01b3-45d3-8cd8-033ce4947029

The whole integration

One call. Named fields. No SDK to install.

the call your product makesbash
# your billing webhook, on payment success
curl https://api.pixldocs.com/v1/render \
  -H "Authorization: Bearer $PIXLDOCS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "001eb79f-5fcc-4c5d-bb1e-3fe0b891097a",
    "format": "pdf",
    "data": {
      "invoice_no": "INV-2026-0417",
      "invoice_date": "2026-08-04",
      "buyer_name": "Northwind Traders",
      "line_items": [
        { "description": "Annual licence", "qty": 1, "unit": "yr", "rate": 4800, "tax_rate": 8.25 }
      ]
    }
  }' --output invoice.pdf

Run against the API before publishing: 200, application/pdf. The template id is real and public, so this works with the demo key and no account.

The contract

Exactly what you send, exactly what you get.

These templates take named keys — no positional arguments, no layout to describe. Send a row array and the pagination follows it.

Tax invoice

001eb79f-5fcc-4c5d-bb1e-3fe0b891097a

Fields · 20

seller_nameseller_addressseller_tax_idseller_emailseller_phonecurrency_codecurrency_localetax_labelinvoice_noinvoice_datedue_datebuyer_namebuyer_addressbuyer_tax_idbank_namebank_accountbank_routingamount_in_wordstermssignatory

Rows · line_items[]

description · item_code · qty · unit · rate · tax_rate

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

Order receipt

2f686558-0b28-4b9d-9572-ec7fe61e5df6

Fields · 27

merchant_namemerchant_addressmerchant_emailmerchant_phonemerchant_tax_idreceipt_noorder_noorder_datepayment_datepayment_methodpayment_referencecurrency_codecurrency_localecustomer_namecustomer_emailbilling_addressshipping_addressshipping_methoddiscount_labeldiscount_percent #shipping_amount #tax_labeltax_rate #amount_paid #notessupport_emailrefund_policy

Rows · line_items[]

description · sku · qty · unit_price

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

Credit note

4d35ed62-1657-4dad-9c39-a7847146aad2

Fields · 21

company_namecompany_addresscompany_emailcompany_phonecompany_tax_idcredit_note_numbercredit_note_datereturn_referenceoriginal_invoice_numberoriginal_invoice_datecustomer_namecustomer_addresscustomer_tax_idreason_for_returncurrency_codecurrency_localetax_labeltax_rate #settlement_methodauthorized_bynotes

Rows · line_items[]

description · sku · qty · unit_price · amount

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

Rent receipt

b3d6d998-56a3-441d-a228-48f51dc76e18

Fields · 21

landlord_namelandlord_addresslandlord_panlandlord_emaillandlord_phonereceipt_noreceipt_dateperiod_fromperiod_totenant_nametenant_emailproperty_addressagreement_referencecurrency_codecurrency_localetds_labeltds_percent #payment_modepayment_referencepayment_datenotes

Rows · charges[]

description · amount

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

Maintenance bill

32242e1a-01b3-45d3-8cd8-033ce4947029

Fields · 22

association_nameassociation_addressassociation_reg_nobill_numberbill_datebilling_perioddue_dateunit_numberresident_nameunit_areacurrency_codecurrency_localearrears #late_fee #bank_nameaccount_nameaccount_numberrouting_referencepayment_linkpayment_qr_datapayment_qr_captionnotes

Rows · charges[]

description · amount

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

What you would ask next.

Our invoice has to look like ours, not like yours.

Describe it in a sentence, or paste the HTML you already send, and you get a working template with named fields — measured at about 30 seconds for the first one. Every document on this page was produced that way.

Who owns the invoice number?

You do. We never generate a number, a date or a sequence. We render exactly the values you send, which is the only way a finance document can be reproducible.

Can we regenerate an old invoice byte-for-byte?

Yes, if you pin the template version in the call. Renders are deterministic and a published template is locked; that is a contract, not a best effort.

Your system already knows when the document is owed.

Free to start · No credit card required