All templates

Sales quote template

A4 portrait

An A4 sales quote (estimate) with an itemized table, an estimated-total panel, a validity date, and a sign-to-accept block. One API call per prospect turns your numbers into the PDF you attach.

Preview of the Sales quote template rendered as a PDF

The exact PDF the API produces. What you preview is what you generate.

Generate with the API

Use this template, publish it to get a template id, then call the API with your data. Replace YOUR_TEMPLATE_ID and YOUR_API_KEY with your own.

import { writeFile } from "node:fs/promises";
import { PdfGlyph } from "pdfglyph";

const client = new PdfGlyph({
  apiKey: "YOUR_API_KEY",
  baseUrl: "https://api.pdfglyph.dev",
});

const { pdf } = await client.generate({
  templateId: "YOUR_TEMPLATE_ID",
  data: {
    "quoteNumber": "QUO-2026-0117",
    "issueDate": "June 10, 2026",
    "validUntil": "July 10, 2026",
    "company": {
      "name": "Northwind Studio",
      "addressLine1": "128 Maple Avenue, Suite 5",
      "addressLine2": "Portland, OR 97204",
      "email": "hello@northwind.studio"
    },
    "client": {
      "name": "Acme Corporation",
      "addressLine1": "500 Industrial Parkway",
      "addressLine2": "Austin, TX 78701"
    },
    "items": [
      {
        "description": "Discovery and strategy workshop",
        "quantity": "1",
        "rate": "$2,500.00",
        "amount": "$2,500.00"
      },
      {
        "description": "Brand identity system",
        "quantity": "1",
        "rate": "$4,200.00",
        "amount": "$4,200.00"
      },
      {
        "description": "Marketing site (design + build)",
        "quantity": "1",
        "rate": "$6,800.00",
        "amount": "$6,800.00"
      }
    ],
    "subtotal": "$13,500.00",
    "taxLabel": "Tax (8.5%)",
    "taxAmount": "$1,147.50",
    "total": "$14,647.50",
    "preparedBy": "Jordan Reyes",
    "notes": "This estimate is valid for 30 days. A 50% deposit is due on acceptance, with the balance on delivery."
  },
});

// pdf is a Uint8Array — write it to a file, return it, or stream it.
await writeFile("document.pdf", pdf);

Sample data

The JSON this preview was rendered from. Match these fields, or edit the template to fit the data you already have.

{
  "quoteNumber": "QUO-2026-0117",
  "issueDate": "June 10, 2026",
  "validUntil": "July 10, 2026",
  "company": {
    "name": "Northwind Studio",
    "addressLine1": "128 Maple Avenue, Suite 5",
    "addressLine2": "Portland, OR 97204",
    "email": "hello@northwind.studio"
  },
  "client": {
    "name": "Acme Corporation",
    "addressLine1": "500 Industrial Parkway",
    "addressLine2": "Austin, TX 78701"
  },
  "items": [
    {
      "description": "Discovery and strategy workshop",
      "quantity": "1",
      "rate": "$2,500.00",
      "amount": "$2,500.00"
    },
    {
      "description": "Brand identity system",
      "quantity": "1",
      "rate": "$4,200.00",
      "amount": "$4,200.00"
    },
    {
      "description": "Marketing site (design + build)",
      "quantity": "1",
      "rate": "$6,800.00",
      "amount": "$6,800.00"
    }
  ],
  "subtotal": "$13,500.00",
  "taxLabel": "Tax (8.5%)",
  "taxAmount": "$1,147.50",
  "total": "$14,647.50",
  "preparedBy": "Jordan Reyes",
  "notes": "This estimate is valid for 30 days. A 50% deposit is due on acceptance, with the balance on delivery."
}

Start from the Sales quote template

Open it in the editor as a new draft, adjust the HTML until it looks like yours, then generate PDFs from your code.