Free proforma invoice generator

Set out the price of a sale before it is final, and download a proforma invoice as a PDF. No sign-up, and no watermark.

  • No sign-up
  • No watermark
  • 10 free PDFs a day
pdfgen.com/tools/proforma-invoice-generator

Add your logo

PNG, JPG or WebP

1Your business
2Buyer
3Proforma details
4Items

Estimated total $3,331.60

5Payment

Live preview

Estimated total $3,331.60

Free for up to 10 PDFs a day. Includes a small “Made with PDFgen” line at the foot of each page.

Your proforma invoice in three steps

  1. PF-2026-112

    Step 1

    Fill in your details

    Add your logo, the proforma invoice details and each item. The page updates as you type.

  2. $3,331.60

    Step 2

    Check the preview

    What you see is what you get, and totals are worked out for you.

  3. PDF

    proforma-invoice.pdf

    Step 3

    Download the PDF

    Download your proforma invoice, ready to send or print.

Anatomy of a proforma invoice

Everything that belongs on the page, and where it goes.

When to use a proforma invoice

A proforma invoice is a preview of the invoice a buyer will receive. It looks like an invoice but it is not one: it does not record a sale, and it does not ask for payment in the accounting sense. The final invoice follows once the goods or services are delivered.

Buyers often ask for one to get a purchase approved internally, to arrange a deposit, or to give customs and banks an idea of a shipment’s value before the commercial invoice exists. Rules for imports vary, so confirm with your freight forwarder or customs broker what they will accept.

Make every proforma invoice automatic

This request creates the document in the form above, and it updates as you type. Connect it to your app or order system and each proforma invoice makes itself.

  • The same template, filled from your own data
  • A PDF back from a single POST request
  • No browsers or servers to run yourself
curl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"seller": {
"name": "Pacific Supply Co.",
"address": "500 Cannery Row\nMonterey, CA 93940"
},
"buyer": {
"name": "Northwind Studio",
"address": "120 Market St\nSan Francisco, CA 94103"
},
"proformaNumber": "PF-2026-112",
"currency": "USD",
"taxRate": 8.5,
"shipping": 120,
"paymentTerms": "50% deposit on order, balance before dispatch.",
"issuedDate": "2026-11-03",
"validUntil": "2026-12-03",
"items": [
{
"description": "Standing desk (electric)",
"quantity": 4,
"unitPrice": 480,
"amount": 1920
},
{
"description": "Ergonomic chair",
"quantity": 4,
"unitPrice": 260,
"amount": 1040
}
],
"subtotal": 2960,
"tax": 251.6,
"total": 3331.6
},
"format": "A4",
"engine": "handlebars",
"html": "<div style=\"max-width:760px;margin:0 auto;padding:48px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;\">\n <div style=\"display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:36px;\">\n <div>\n {{#if logo}}<img src=\"{{logo}}\" alt=\"\" style=\"display:block;max-width:200px;max-height:56px;margin:0 0 10px;\">{{/if}}\n <h1 style=\"font-size:22px;font-weight:800;margin:0;\">{{seller.name}}</h1>\n <p style=\"color:#6b7280;margin:6px 0 0;font-size:13px;white-space:pre-line;\">{{seller.address}}</p>\n </div>\n <div style=\"text-align:right;\">\n <h2 style=\"font-size:24px;letter-spacing:2px;color:#4338ca;margin:0;font-weight:800;\">PROFORMA INVOICE</h2>\n <p style=\"margin:8px 0 0;color:#6b7280;font-size:13px;\">#{{proformaNumber}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;font-size:13px;\">{{formatDate issuedDate}}</p>\n </div>\n </div>\n <div style=\"display:flex;justify-content:space-between;margin-bottom:28px;\">\n <div>\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;\">Prepared for</p>\n <p style=\"margin:0;font-weight:600;\">{{buyer.name}}</p>\n <p style=\"margin:2px 0 0;color:#6b7280;font-size:13px;white-space:pre-line;\">{{buyer.address}}</p>\n </div>\n <div style=\"text-align:right;\">\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;\">Valid until</p>\n <p style=\"margin:0;font-weight:600;\">{{formatDate validUntil}}</p>\n </div>\n </div>\n <table style=\"width:100%;border-collapse:collapse;font-size:14px;line-height:inherit;\">\n <thead>\n <tr style=\"background:#eef2ff;text-align:left;\">\n <th style=\"padding:12px;border-bottom:1px solid #c7d2fe;\">Description</th>\n <th style=\"padding:12px;border-bottom:1px solid #c7d2fe;text-align:center;\">Qty</th>\n <th style=\"padding:12px;border-bottom:1px solid #c7d2fe;text-align:right;\">Unit</th>\n <th style=\"padding:12px;border-bottom:1px solid #c7d2fe;text-align:right;\">Amount</th>\n </tr>\n </thead>\n <tbody>\n {{#each items}}\n <tr>\n <td style=\"padding:12px;border-bottom:1px solid #f3f4f6;\">{{description}}</td>\n <td style=\"padding:12px;border-bottom:1px solid #f3f4f6;text-align:center;\">{{quantity}}</td>\n <td style=\"padding:12px;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency unitPrice ../currency}}</td>\n <td style=\"padding:12px;border-bottom:1px solid #f3f4f6;text-align:right;\">{{formatCurrency amount ../currency}}</td>\n </tr>\n {{/each}}\n </tbody>\n </table>\n <table style=\"font-size:14px;line-height:inherit;min-width:240px;margin:20px 0 0 auto;\">\n <tr><td style=\"padding:4px 0;color:#6b7280;\">Subtotal</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency subtotal currency}}</td></tr>\n {{#if taxRate}}<tr><td style=\"padding:4px 0;color:#6b7280;\">Tax ({{taxRate}}%)</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency tax currency}}</td></tr>{{/if}}\n {{#if shipping}}<tr><td style=\"padding:4px 0;color:#6b7280;\">Shipping</td><td style=\"padding:4px 0;text-align:right;\">{{formatCurrency shipping currency}}</td></tr>{{/if}}\n <tr><td style=\"padding:12px 0 0;font-weight:800;font-size:16px;\">Estimated total</td><td style=\"padding:12px 0 0;text-align:right;font-weight:800;font-size:16px;color:#4338ca;\">{{formatCurrency total currency}}</td></tr>\n </table>\n {{#if paymentTerms}}\n <p style=\"font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:#9ca3af;font-weight:700;margin:0 0 8px;margin-top:32px;\">Payment terms</p>\n <p style=\"margin:0;font-size:13px;color:#374151;white-space:pre-line;\">{{paymentTerms}}</p>\n {{/if}}\n <p style=\"margin-top:40px;font-size:12px;color:#9ca3af;border-top:1px solid #f3f4f6;padding-top:16px;\">This proforma invoice is an estimate. It is not a tax invoice or a demand for payment.</p>\n</div>"
}' --output proforma-invoice.pdf
200 OKapplication/pdf · proforma-invoice.pdf

Questions, answered

The things people usually ask before they download.

Is a proforma invoice a legal invoice?

No. It is an estimate and is not a tax invoice, so do not record it as a sale or claim tax on it. This template says so at the bottom of the page.

What is the difference between a proforma invoice and a quote?

A quote offers a price for a buyer to consider. A proforma usually comes later, once they intend to buy, and looks close to the final invoice.

Can a buyer pay against a proforma invoice?

Yes, it is common to take a deposit or full prepayment against a proforma. Send a final invoice and a receipt once the sale is complete.

Is this proforma invoice generator really free?

Yes. You can create up to 10 PDFs a day without an account or a credit card.

Will there be a watermark on my PDF?

No. Your document stays clean, with one small “Made with PDFgen” line at the foot of each page.

Do you store what I enter?

No. Your details are sent to our server to create the PDF and are not saved. The form lives in your browser, so copy anything you want to keep before leaving the page.

Can I create proforma invoices automatically?

Yes. The API call further up this page produces the same proforma invoice from your own data, so your app or order system can create them without anyone filling in a form.

Make this proforma invoice your own

Match the template to your brand, then create one for every order or customer with a single API call.