PDF templates / Statement

Account Summary Statement

SaaS / subscription account summary on A4: customer + billing period header, charges table, credits applied, usage breakdown (included vs used vs overage) and a totals card with balance due. Suitable for monthly platform billing.

First page of the Account Summary Statement template, rendered with its sample data
statement-account-summary.pdfpage 1 of 2

DSL source

The whole template. Learn the language in the template DSL guide.

js
const chargesCols = [["Description", "1fr"], ["Period", "auto"], ["Amount", "auto", "right"]];
const creditsCols = [["Description", "1fr"], ["Amount", "auto", "right"]];
const usageCols = [["Metric", "1fr"], ["Included", "auto", "right"], ["Used", "auto", "right"], ["Overage", "auto", "right"]];

const template = doc(
  { size: "A4", title: "Statement {{statementNumber}}", padding: [28, 32, 28, 32],
    styles: {
      ".brand-bar": { "background-color": "#0B3A5B", color: "#ffffff", padding: [14, 16, 14, 16], "border-radius": 4 },
      ".brand-title": { "font-size": 18, "font-weight": 700, color: "#ffffff" },
      ".brand-sub": { "font-size": 9, color: "#BBD3E4" },
      ".meta-card": { "background-color": "#F4F7FA", padding: [10, 12, 10, 12], "border-radius": 4 },
      ".meta-label": { "font-size": 7.5, color: "#6B7A87", "font-weight": 600 },
      ".meta-value": { "font-size": 10, color: "#0B3A5B", "font-weight": 600 },
      ".section-title": { "font-size": 11, "font-weight": 700, color: "#0B3A5B", margin: [0, 0, 4, 0] },
      ".stat-box": { "background-color": "#F4F7FA", padding: [8, 10, 8, 10], "border-radius": 4 },
      ".stat-label": { "font-size": 7.5, color: "#6B7A87", "font-weight": 600 },
      ".stat-value": { "font-size": 11, color: "#0B3A5B", "font-weight": 700 },
      ".due-card": { "background-color": "#0B3A5B", color: "#ffffff", padding: [14, 16, 14, 16], "border-radius": 4 },
      ".due-label": { "font-size": 8, color: "#BBD3E4", "font-weight": 600 },
      ".due-amount": { "font-size": 22, color: "#ffffff", "font-weight": 700 },
      ".due-sub": { "font-size": 9, color: "#BBD3E4" },
      ".sum-row-label": { "font-size": 9.5, color: "#3B4A58" },
      ".sum-row-value": { "font-size": 9.5, color: "#0B3A5B", "font-weight": 600 },
      ".note": { "font-size": 8.5, color: "#3B4A58", "line-height": 1.35 },
      ".disc": { "font-size": 7.5, color: "#6B7A87", "line-height": 1.3 },
    }
  },

  // Brand header bar
  r(".brand-bar",
    col("60%",
      s(".brand-title", "{{institution.name}}"),
      s(".brand-sub", "{{institution.address1}} · {{institution.address2}}"),
      s(".brand-sub", "{{institution.phone}} · {{institution.website}}"),
    ),
    col("40%", { align: "right" },
      s({ "font-size": 13, "font-weight": 700, color: "#ffffff" }, "Account Statement"),
      s(".brand-sub", "{{statementNumber}}"),
      s(".brand-sub", "Issued {{issuedOn}}"),
    ),
  ),
  gap(10),

  // Account + period meta
  r(
    col("49%", { class: "meta-card" },
      s(".meta-label", "ACCOUNT HOLDER"),
      s(".meta-value", "{{account.holder}}"),
      gap(3),
      s(".meta-label", "ACCOUNT"),
      s(".meta-value", "{{account.number}} · {{account.type}}"),
      gap(3),
      r(
        col("50%",
          s(".meta-label", "BRANCH"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{account.branch}}"),
        ),
        col("25%",
          s(".meta-label", "CURRENCY"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{account.currency}}"),
        ),
        col("25%",
          s(".meta-label", "BSB"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{account.bsb}}"),
        ),
      ),
    ),
    col("2%", s(" ")),
    col("49%", { class: "meta-card" },
      s(".meta-label", "STATEMENT PERIOD"),
      s(".meta-value", "{{period.label}}"),
      gap(3),
      r(
        col("50%",
          s(".meta-label", "PERIOD START"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{period.start}}"),
        ),
        col("50%",
          s(".meta-label", "PERIOD END"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{period.end}}"),
        ),
      ),
      gap(3),
      r(
        col("50%",
          s(".meta-label", "ROUTING"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{institution.routingNumber}}"),
        ),
        col("50%",
          s(".meta-label", "SWIFT"),
          s({ "font-size": 9, color: "#0B3A5B" }, "{{institution.swift}}"),
        ),
      ),
    ),
  ),
  gap(10),

  // Balance / activity stats row
  r(
    col("19.2%", { class: "stat-box" },
      s(".stat-label", "OPENING BALANCE"),
      s(".stat-value", "${{openingBalance}}"),
    ),
    col("1%", s(" ")),
    col("19.2%", { class: "stat-box" },
      s(".stat-label", "TOTAL CREDITS"),
      s({ "font-size": 11, color: "#2E7D4F", "font-weight": 700 }, "${{totalCredits}}"),
    ),
    col("1%", s(" ")),
    col("19.2%", { class: "stat-box" },
      s(".stat-label", "TOTAL DEBITS"),
      s({ "font-size": 11, color: "#A0342C", "font-weight": 700 }, "${{totalDebits}}"),
    ),
    col("1%", s(" ")),
    col("19.2%", { class: "stat-box" },
      s(".stat-label", "TRANSACTIONS"),
      s(".stat-value", "{{transactionCount}}"),
    ),
    col("1%", s(" ")),
    col("19.2%", { class: "stat-box" },
      s(".stat-label", "CLOSING BALANCE"),
      s(".stat-value", "${{closingBalance}}"),
    ),
  ),
  gap(12),

  // Charges
  s(".section-title", "Charges"),
  table(chargesCols, "c in charges",
    [["{{c.description}}", "1fr"], ["{{c.period}}", "auto"], ["${{c.amount}}", "auto", "right"]],
  ),
  gap(8),

  // Credits
  s(".section-title", "Credits Applied"),
  table(creditsCols, "cr in credits",
    [["{{cr.description}}", "1fr"], ["−${{cr.amount}}", "auto", "right"]],
  ),
  gap(8),

  // Usage
  s(".section-title", "Usage This Period"),
  table(usageCols, "u in usage",
    [["{{u.metric}}", "1fr"], ["{{u.included}}", "auto", "right"], ["{{u.used}}", "auto", "right"], ["{{u.overage}}", "auto", "right"]],
  ),
  gap(12),

  // Summary + Balance Due
  r(
    col("55%",
      s(".section-title", "Payment Instructions"),
      s(".note", "{{paymentInstructions}}"),
      gap(6),
      s(".section-title", "Support"),
      s(".note", "{{institution.supportHours}}"),
      s(".note", "{{institution.phone}} · {{institution.website}}"),
    ),
    col("3%", s(" ")),
    col("42%",
      r(
        col("60%", s(".sum-row-label", "Subtotal")),
        col("40%", { align: "right" }, s(".sum-row-value", "${{summary.subtotal}}")),
      ),
      gap(2),
      r(
        col("60%", s(".sum-row-label", "Credits applied")),
        col("40%", { align: "right" }, s({ "font-size": 9.5, color: "#2E7D4F", "font-weight": 600 }, "−${{summary.creditsApplied}}")),
      ),
      gap(2),
      r(
        col("60%", s(".sum-row-label", "{{summary.taxLabel}}")),
        col("40%", { align: "right" }, s(".sum-row-value", "${{summary.taxAmount}}")),
      ),
      gap(6),
      r(".due-card",
        col("60%",
          s(".due-label", "BALANCE DUE"),
          s(".due-sub", "Due {{summary.dueDate}}"),
        ),
        col("40%", { align: "right" },
          s(".due-amount", "${{summary.balanceDue}}"),
          s(".due-sub", "{{account.currency}}"),
        ),
      ),
    ),
  ),
  gap(10),

  hr(4, "#E1E7ED"),
  s(".disc", "{{disclosures}}"),

  ftrPages("Cascadia FCU · Statement STMT-2026-03-0048271"),
);

const sampleData = {
  statementNumber: "STMT-2026-03-0048271",
  account: {
    number: "**** **** **** 4829",
    holder: "Harriet Okonkwo-Salazar",
    type: "Everyday Chequing — Gold",
    branch: "Northline Seattle — 0412",
    currency: "USD",
    bsb: "104-827",
  },
  institution: {
    name: "Cascadia Federal Credit Union",
    address1: "200 Pike Street, Suite 1800",
    address2: "Seattle, WA 98101",
    phone: "+1 (206) 555-0137",
    website: "www.cascadiafcu.com",
    supportHours: "Mon–Fri 07:00–19:00 PT · Sat 08:00–14:00 PT",
    routingNumber: "325070760",
    swift: "CASCUS33",
  },
  period: {
    start: "1 March 2026",
    end: "31 March 2026",
    label: "1 March 2026 – 31 March 2026",
  },
  issuedOn: "2 April 2026",
  openingBalance: "8,421.74",
  closingBalance: "6,984.55",
  totalDebits: "9,284.17",
  totalCredits: "7,846.98",
  transactionCount: 47,
  transactions: [],
  charges: [
    { description: "Platform subscription — Automation Suite (seat × 24)", period: "1–31 Mar 2026", amount: "2,880.00" },
    { description: "Usage overage — API renders beyond plan allowance", period: "1–31 Mar 2026", amount: "184.60" },
    { description: "Premium Support — Tier 2 SLA", period: "1–31 Mar 2026", amount: "299.00" },
    { description: "Custom fonts add-on", period: "1–31 Mar 2026", amount: "49.00" },
    { description: "Data egress — EU region transfer", period: "1–31 Mar 2026", amount: "27.18" },
  ],
  credits: [
    { description: "Annual prepay discount (pro-rated March portion)", amount: "120.00" },
    { description: "Service credit — 2026-03-14 incident (SEV-2, 42 min)", amount: "48.00" },
  ],
  usage: [
    { metric: "PDF renders", included: "50,000", used: "58,420", overage: "8,420" },
    { metric: "API credits", included: "12,000", used: "11,764", overage: "0" },
    { metric: "Storage (GB)", included: "25", used: "18.4", overage: "0" },
    { metric: "Custom fonts", included: "2 families", used: "3 families", overage: "1 family" },
    { metric: "Egress (GB)", included: "200", used: "213.6", overage: "13.6" },
  ],
  summary: {
    subtotal: "3,439.78",
    creditsApplied: "168.00",
    taxRate: 0.088,
    taxLabel: "Sales Tax (WA 8.8%)",
    taxAmount: "288.00",
    balanceDue: "3,559.78",
    dueDate: "20 April 2026",
  },
  paymentInstructions: "Automatic payment scheduled for 20 April 2026 from the account ending in 4829. To update payment method or dispute a charge, contact billing@northline.studio within 30 days of statement date.",
  disclosures: "This statement is provided for informational purposes. Review all entries carefully. Report any unauthorized transactions to Cascadia FCU within 60 days of the statement date. Member FDIC. Equal Housing Lender.",
};

Sample data

json
{
  "statementNumber": "STMT-2026-03-0048271",
  "account": {
    "number": "**** **** **** 4829",
    "holder": "Harriet Okonkwo-Salazar",
    "type": "Everyday Chequing — Gold",
    "branch": "Northline Seattle — 0412",
    "currency": "USD",
    "bsb": "104-827"
  },
  "institution": {
    "name": "Cascadia Federal Credit Union",
    "address1": "200 Pike Street, Suite 1800",
    "address2": "Seattle, WA 98101",
    "phone": "+1 (206) 555-0137",
    "website": "www.cascadiafcu.com",
    "supportHours": "Mon–Fri 07:00–19:00 PT · Sat 08:00–14:00 PT",
    "routingNumber": "325070760",
    "swift": "CASCUS33"
  },
  "period": {
    "start": "1 March 2026",
    "end": "31 March 2026",
    "label": "1 March 2026 – 31 March 2026"
  },
  "issuedOn": "2 April 2026",
  "openingBalance": "8,421.74",
  "closingBalance": "6,984.55",
  "totalDebits": "9,284.17",
  "totalCredits": "7,846.98",
  "transactionCount": 47,
  "transactions": [],
  "charges": [
    {
      "description": "Platform subscription — Automation Suite (seat × 24)",
      "period": "1–31 Mar 2026",
      "amount": "2,880.00"
    },
    {
      "description": "Usage overage — API renders beyond plan allowance",
      "period": "1–31 Mar 2026",
      "amount": "184.60"
    },
    {
      "description": "Premium Support — Tier 2 SLA",
      "period": "1–31 Mar 2026",
      "amount": "299.00"
    },
    {
      "description": "Custom fonts add-on",
      "period": "1–31 Mar 2026",
      "amount": "49.00"
    },
    {
      "description": "Data egress — EU region transfer",
      "period": "1–31 Mar 2026",
      "amount": "27.18"
    }
  ],
  "credits": [
    {
      "description": "Annual prepay discount (pro-rated March portion)",
      "amount": "120.00"
    },
    {
      "description": "Service credit — 2026-03-14 incident (SEV-2, 42 min)",
      "amount": "48.00"
    }
  ],
  "usage": [
    {
      "metric": "PDF renders",
      "included": "50,000",
      "used": "58,420",
      "overage": "8,420"
    },
    {
      "metric": "API credits",
      "included": "12,000",
      "used": "11,764",
      "overage": "0"
    },
    {
      "metric": "Storage (GB)",
      "included": "25",
      "used": "18.4",
      "overage": "0"
    },
    {
      "metric": "Custom fonts",
      "included": "2 families",
      "used": "3 families",
      "overage": "1 family"
    },
    {
      "metric": "Egress (GB)",
      "included": "200",
      "used": "213.6",
      "overage": "13.6"
    }
  ],
  "summary": {
    "subtotal": "3,439.78",
    "creditsApplied": "168.00",
    "taxRate": 0.088,
    "taxLabel": "Sales Tax (WA 8.8%)",
    "taxAmount": "288.00",
    "balanceDue": "3,559.78",
    "dueDate": "20 April 2026"
  },
  "paymentInstructions": "Automatic payment scheduled for 20 April 2026 from the account ending in 4829. To update payment method or dispute a charge, contact billing@northline.studio within 30 days of statement date.",
  "disclosures": "This statement is provided for informational purposes. Review all entries carefully. Report any unauthorized transactions to Cascadia FCU within 60 days of the statement date. Member FDIC. Equal Housing Lender."
}

Render it with your data

Any API key can render this template by its ID. This call uses the sample data; add a data object to use your own. See the API reference.

bash
curl -X POST https://makespdf.com/api/v1/render \
  -H "Authorization: Bearer $MAKESPDF_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"templateId": "statement-account-summary"}' \
  -o output.pdf