Skip to content
CastPDF
Free billing template

Quotes and estimates clients can sign straight away

Turn a list of work into a clear quote. Optional extras sit apart from the total, the discount and VAT are worked out, and the client signs at the bottom.

  • A4, portrait
  • 1 page
  • Updated
The quote template filled with sample data, page 1. A quote or estimate for a piece of work: the lines included, optional extras listed apart, a discount, VAT and the total, a valid-until date and a space for the client to accept and sign.
Page 1, rendered by CastPDF from the sample data on this page.

What is inside the quote template

  1. Job summary. The quote number, a short title and one sentence on what the work is.
  2. Client and dates. Who it is for, the date, the valid-until date and who prepared it.
  3. Included work. Each line with quantity, unit and rate. These lines make up the total.
  4. Discount, VAT, total. One discount in percent, the VAT for each rate and the total in a bold bar.
  5. Optional extras. Priced lines with tick boxes, kept out of the total.
  6. Acceptance. Name, date and signature lines for the client.

What this quote template is for

Use it to price a job before it starts. Agencies, studios, builders, repair firms and consultants send quotes or estimates every week. The words differ by trade, but the paper is the same.

Each line has a quantity, a unit and a rate. Lines you mark as optional move to their own box and stay out of the total. One discount in percent applies to the included work, and the VAT follows from there.

The bottom of the page is an acceptance block. The client writes a name, a date and a signature, then sends the page back to you.

What a good quote includes

  • A quote number, so both sides can refer to it later.
  • The date and a valid-until date, after which prices may change.
  • Who it is for, and who prepared it.
  • A short summary of the job in plain words.
  • Each piece of work with its quantity and rate.
  • Any discount, the tax and the total, each on its own row.
  • Optional extras, priced but kept out of the total.
  • How to accept, and what happens after that.

The fields it fills

Each field fills one part of your quote. Send new details and the quote keeps its design. Leave out an optional field and its line simply disappears.

Fields of the quote template and what each one fills
FieldWhat it fills
General
currencyCurrency for every amount, such as EUR.
localeHow numbers and dates are written, such as en-IE.
Seller
seller.nameYour business name (your brand settings win).
seller.shortA short name shown as a word mark, when you have no logo.
seller.addressYour address, one line per line.
seller.emailWhere the client can reply.
seller.tax_idYour VAT number.
Client
client.nameThe client’s name.
client.contactWho it is for at the client (optional).
client.addressThe client’s address.
Quote
quote.numberThe quote number.
quote.titleThe job in a few words, shown as the heading.
quote.summaryOne sentence on what the client gets.
quote.issuedThe date of the quote.
quote.valid_untilThe last day the prices stand.
quote.prepared_byWho prepared it.
quote.discountA discount on the included work, in percent (0 for none).
quote.notesA note beside the totals, such as timing.
quote.acceptanceHow to accept and what happens next.
quote.termsYour small print.
Items
items[].descriptionA piece of work, one line each.
items[].detailA short note under the line (optional).
items[].quantityHow many.
items[].unitThe unit, such as pages or months (optional).
items[].unit_priceThe rate for one unit, before VAT.
items[].vat_rateThe VAT rate of the line, in percent.
items[].optionaltrue for an extra the client can add, kept out of the total.

Make it automatically

Use the template in the dashboard once, then let your systems fill it. Every way below uses the same template, so a change to the design shows up everywhere.

From your app, with the API

One request per quote: the template id and your data in, the finished PDF out. Add deliver.email and CastPDF emails it too. The PDF endpoint.

From a spreadsheet

Upload a CSV or XLSX file with one row per quote. One batch makes every PDF and hands them back in one ZIP. PDFs from a spreadsheet.

In a no-code workflow

One request from your app

Copy the template id from the editor and save it with your data in request.json. Then send the file. The reply is the finished PDF.

Request
curl https://api.castpdf.com/v1/pdf \
  -H "Authorization: Bearer $CASTPDF_API_KEY" \
  -H "Content-Type: application/json" \
  -d @request.json \
  --output quote.pdf
import { readFile, writeFile } from 'node:fs/promises';

const res = await fetch('https://api.castpdf.com/v1/pdf', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CASTPDF_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: await readFile('request.json', 'utf8'),
});
if (!res.ok) throw new Error((await res.json()).error.message);
await writeFile('quote.pdf', Buffer.from(await res.arrayBuffer()));
import json, os
import requests

with open("request.json") as f:
    body = json.load(f)

res = requests.post(
    "https://api.castpdf.com/v1/pdf",
    headers={"Authorization": f"Bearer {os.environ['CASTPDF_API_KEY']}"},
    json=body,
    timeout=60,
)
res.raise_for_status()
with open("quote.pdf", "wb") as f:
    f.write(res.content)
request.json (the sample data)
{
  "template_id": "YOUR_TEMPLATE_ID",
  "data": {
    "currency": "EUR",
    "locale": "en-IE",
    "seller": {
      "name": "Fernhill Digital Studio Ltd",
      "short": "Fernhill",
      "address": "3 Dock Street, Galway\nH91 X2C7, Ireland",
      "email": "[email protected]",
      "tax_id": "IE 3318402TH"
    },
    "client": {
      "name": "Oakridge Veterinary Clinic",
      "contact": "Attn: Practice manager",
      "address": "Unit 4, Meadow Court, Athenry\nCo. Galway H65 TW31"
    },
    "quote": {
      "number": "Q-2026-058",
      "title": "Website and online booking",
      "summary": "A faster, mobile-friendly website for the clinic, with appointment booking and clear pages for every service.",
      "issued": "2026-10-06",
      "valid_until": "2026-11-05",
      "prepared_by": "Niamh Delaney, project lead",
      "discount": 10,
      "notes": "The discount applies to the included work. We start within two weeks of your go-ahead, and the new site is ready about eight weeks later.",
      "acceptance": "To go ahead, sign below and send this page back before the quote expires. We then send a short agreement and the first invoice for 40% of the total.",
      "terms": "Prices are valid until the date above. Extra work outside this quote is charged at our day rate after your approval."
    },
    "items": [
      {
        "description": "Discovery workshop",
        "detail": "Goals, audiences and a review of the current site with your team",
        "quantity": 1,
        "unit": "",
        "unit_price": 950,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Sitemap and content plan",
        "quantity": 1,
        "unit": "",
        "unit_price": 1200,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Visual design of page templates",
        "unit": "templates",
        "quantity": 8,
        "unit_price": 380,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Build and testing",
        "detail": "Responsive pages, accessibility checks and speed tuning",
        "quantity": 1,
        "unit": "",
        "unit_price": 5400,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Online booking integration",
        "quantity": 1,
        "unit": "",
        "unit_price": 1650,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Content migration",
        "unit": "pages",
        "quantity": 40,
        "unit_price": 22,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Staff training session, two hours",
        "quantity": 1,
        "unit": "",
        "unit_price": 450,
        "vat_rate": 23,
        "optional": false
      },
      {
        "description": "Care plan: hosting, updates and backups",
        "unit": "months",
        "optional": true,
        "quantity": 12,
        "unit_price": 65,
        "vat_rate": 23
      },
      {
        "description": "Copywriting for service pages",
        "unit": "pages",
        "optional": true,
        "quantity": 6,
        "unit_price": 180,
        "vat_rate": 23
      },
      {
        "description": "Photography at the clinic, half day",
        "optional": true,
        "quantity": 1,
        "unit": "",
        "unit_price": 690,
        "vat_rate": 23
      }
    ]
  }
}

New to the API? The quickstart gets you from a free key to your first PDF in about five minutes.

Make one without code

  1. Sign up free. You do not need a card. "Use this template" opens the editor with this template ready.
  2. Open the quote template. Put your own details into the quote’s sample data, and change the words and colours.
  3. Check the preview. It updates as you type and is free. Every page carries a small “Preview” label.
  4. Generate the PDF. Verify your email and press Generate PDF for a clean copy. It counts as one PDF on your plan.

Make it yours

  • Set the discount to 0 and the discount row disappears.
  • Mark a line with optional: true to move it into the extras box.
  • Retitle it "Estimate" if that is the word your trade uses.
  • Put your deposit or payment schedule in the acceptance text.
  • Every save is a new version, and your last 50 versions are kept.

Optional extras that do not inflate the price

Clients like choice, but a quote that adds every idea to the total looks expensive. This template keeps the two apart.

Included lines make up the subtotal, the discount, the VAT and the total. Optional lines sit in a dashed box with tick boxes and prices before VAT. The client ticks what they want, and you add it to the order.

Questions about quote templates

What is the difference between a quote and an estimate?

A quote is usually a fixed price for agreed work. An estimate is a best guess that may change once the work starts. The layout is the same, so this template suits both: change the heading and the wording.

What should a quotation include?

Your details and the client’s, a number and date, how long the price stands, the work with prices, any discount and tax, the total and how to accept. Optional extras help the client choose.

How long should a quote be valid?

Thirty days is common, but it depends on your costs. Materials that change price quickly call for a shorter window. The valid-until date prints near the top of the page.

Can I turn an accepted quote into an invoice?

Yes, with your own system in the middle. The lines are already in your data, so send them to the invoice template with an invoice number. CastPDF makes each PDF, and your system tracks which quote became which invoice.

Can clients sign the quote online?

Signing happens outside CastPDF. The client can print, sign and scan the page, or you can pass the PDF to an e-signature service you already use.

Is there a free estimate generator?

Yes. The Free plan covers 100 PDFs a month, enough for most small firms. Edit the sample in the dashboard, check the preview and press Generate PDF when it looks right.

Are the rates shown with or without VAT?

Without. Every rate in the table is a net price, and the VAT rows sit just above the total. If your clients expect prices with VAT, change the wording or add a column in the template.
All templates

Make your first quote PDF

Sign up free and this template is ready for you. Add your logo and details, and download your first quote in minutes. 100 PDFs a month are free, and you never need a card to start.