Skip to content

210 × 297 mm

Quotes & estimates

Project proposal

An A4 project proposal that is easy to edit visually: a letterhead header, key facts, a phase table that repeats per phase, an optional early-signature discount, terms, two signature lines and page numbers.

A4 portraitLocale en-GBHTML + JinjaHeader & footer

Opens Dynamic Document API with this template preloaded in a free workspace.

Template language features

  • Loops
  • Conditionals
  • Currency formatting
  • Date formatting
  • Header & footer
  • Page numbers
  • Repeating table headers
  • signature
  • columns

Filters such as format_currency and qrcode are described in the template language reference.

Variables

Derived from the sample data: 6 top-level fields, 27 paths in total. Send the same shape as data.

PathTypeExample
agencyobject
agency.namestring"Northlight Studio"
agency.leadstring"Ines Marlow"
agency.lead_titlestring"Creative Director"
agency.emailstring"hello@northlight.example.com"
agency.websitestring"northlight.example.com"
clientobject
client.namestring"Brightwater Cycles Ltd."
client.contactstring"Tom Aldridge"
proposalobject
proposal.numberstring"P-2026-031"
proposal.titlestring"Website relaunch and booking flow"
proposal.issued_ondate"2026-09-14"
proposal.valid_untildate"2026-10-14"
proposal.summarystring"Brightwater Cycles wants its rental bookings o…"
proposal.notestring"Hosting and third-party licences are not inclu…"
phasesarray<object> · 4
phases[].namestring"Discovery"
phases[].descriptionstring"Interviews with shop staff and 8 customers, an…"
phases[].weeksnumber2
phases[].feenumber4800
totalsobject
totals.weeksnumber14
totals.subtotalnumber41000
totals.discountnumber2050
totals.totalnumber38950
termsarray<string> · 4"40 % is invoiced on signature, 30 % after the …"

Sample data

Fictional records used for previews. Replace them with your own data when you call the API.

data.json
{
  "agency": {
    "name": "Northlight Studio",
    "lead": "Ines Marlow",
    "lead_title": "Creative Director",
    "email": "hello@northlight.example.com",
    "website": "northlight.example.com"
  },
  "client": {
    "name": "Brightwater Cycles Ltd.",
    "contact": "Tom Aldridge"
  },
  "proposal": {
    "number": "P-2026-031",
    "title": "Website relaunch and booking flow",
    "issued_on": "2026-09-14",
    "valid_until": "2026-10-14",
    "summary": "Brightwater Cycles wants its rental bookings online. We propose a four-phase project: research with your shop staff, a new visual design, a booking flow connected to your stock system, and a supported launch. Every phase ends with a review, so you can stop after any phase and keep the results.",
    "note": "Hosting and third-party licences are not included and are billed at cost after written approval."
  },
  "phases": [
    {
      "name": "Discovery",
      "description": "Interviews with shop staff and 8 customers, analytics review, booking journey map.",
      "weeks": 2,
      "fee": 4800.0
    },
    {
      "name": "Design",
      "description": "Design system, 12 key screens, clickable prototype, two feedback rounds.",
      "weeks": 4,
      "fee": 11200.0
    },
    {
      "name": "Build",
      "description": "Responsive site, booking flow with stock sync, CMS set-up, accessibility check.",
      "weeks": 6,
      "fee": 21600.0
    },
    {
      "name": "Launch and support",
      "description": "Migration, staff training, 30 days of priority support.",
      "weeks": 2,
      "fee": 3400.0
    }
  ],
  "totals": {
    "weeks": 14,
    "subtotal": 41000.0,
    "discount": 2050.0,
    "total": 38950.0
  },
  "terms": [
    "40 % is invoiced on signature, 30 % after the design phase and 30 % at launch; invoices are due within 14 days.",
    "Two feedback rounds per phase are included; further rounds are billed at €95 per hour.",
    "You own all designs and source code once the final invoice is paid.",
    "Either party can end the project after any phase review with 10 days' written notice."
  ]
}

Source

The body markup with Jinja, the stylesheet placed in <head> and the header and footer settings.

<h1>{{ proposal.title }}</h1>
<p>Prepared for <strong>{{ client.name }}</strong> · {{ client.contact }}</p>
<table class="facts">
  <tbody>
    <tr>
      <th scope="row">Proposal no.</th>
      <td>{{ proposal.number }}</td>
      <th scope="row">Issued</th>
      <td>{{ proposal.issued_on | format_date("long", "en-GB") }}</td>
    </tr>
    <tr>
      <th scope="row">Valid until</th>
      <td>{{ proposal.valid_until | format_date("long", "en-GB") }}</td>
      <th scope="row">Project lead</th>
      <td>{{ agency.lead }}</td>
    </tr>
  </tbody>
</table>

<h2>Summary</h2>
<p>{{ proposal.summary }}</p>

<h2>Scope and fees</h2>
<table class="phases">
  <thead>
    <tr>
      <th scope="col">Phase</th>
      <th class="duration" scope="col">Duration</th>
      <th class="fee" scope="col">Fee</th>
    </tr>
  </thead>
  <tbody>
    {% for phase in phases %}
    <tr>
      <td>
        <p class="phase-name">{{ phase.name }}</p>
        <p class="phase-note">{{ phase.description }}</p>
      </td>
      <td class="duration">{{ phase.weeks }} weeks</td>
      <td class="fee">{{ phase.fee | format_currency("EUR", "en-GB") }}</td>
    </tr>
    {% endfor %}
    <tr class="subtotal">
      <td>Subtotal</td>
      <td class="duration">{{ totals.weeks }} weeks</td>
      <td class="fee">{{ totals.subtotal | format_currency("EUR", "en-GB") }}</td>
    </tr>
  </tbody>
</table>
{% if totals.discount %}<p class="right">Early-signature discount: {{ totals.discount | format_currency("EUR", "en-GB") }} when signed by {{ proposal.valid_until | format_date("long", "en-GB") }}.</p>{% endif %}
<p class="total">Total excl. VAT: {{ totals.total | format_currency("EUR", "en-GB") }}</p>
{% if proposal.note %}<p class="note">{{ proposal.note }}</p>{% endif %}

<h2>Terms</h2>
<ul class="terms">
  {% for term in terms %}
  <li>{{ term }}</li>
  {% endfor %}
</ul>

<div class="acceptance">
  <h2>Acceptance</h2>
  <p>Signing below confirms the scope, fees and terms of this proposal.</p>
  <div class="signatures">
    <div>
      <p class="signature">For the agency</p>
      <p class="signature date">Date</p>
      <p>{{ agency.lead }}<br><span class="muted">{{ agency.lead_title }}</span></p>
    </div>
    <div>
      <p class="signature">For the client</p>
      <p class="signature date">Date</p>
      <p>{{ client.contact }}</p>
    </div>
  </div>
</div>

Render it with the API

After adding the template to your workspace, render it by ID and pass your data. Arrays are shortened here.

curl -X POST https://api-eu.dynamicdocumentapi.com/v1/renders \
  -H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "input": {
    "type": "template",
    "template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C"
  },
  "data": {
    "agency": {
      "name": "Northlight Studio",
      "lead": "Ines Marlow",
      "lead_title": "Creative Director",
      "email": "hello@northlight.example.com",
      "website": "northlight.example.com"
    },
    "client": {
      "name": "Brightwater Cycles Ltd.",
      "contact": "Tom Aldridge"
    },
    "proposal": {
      "number": "P-2026-031",
      "title": "Website relaunch and booking flow",
      "issued_on": "2026-09-14",
      "valid_until": "2026-10-14",
      "summary": "Brightwater Cycles wants its rental bookings online. We propose a four-phase project: research with your shop staff, a new visual design, a booking flow connected to your stock system, and a supported launch. Every phase ends with a review, so you can stop after any phase and keep the results.",
      "note": "Hosting and third-party licences are not included and are billed at cost after written approval."
    },
    "phases": [
      {
        "name": "Discovery",
        "description": "Interviews with shop staff and 8 customers, analytics review, booking journey map.",
        "weeks": 2,
        "fee": 4800
      },
      {
        "name": "Design",
        "description": "Design system, 12 key screens, clickable prototype, two feedback rounds.",
        "weeks": 4,
        "fee": 11200
      }
    ],
    "totals": {
      "weeks": 14,
      "subtotal": 41000,
      "discount": 2050,
      "total": 38950
    },
    "terms": [
      "40 % is invoiced on signature, 30 % after the design phase and 30 % at launch; invoices are due within 14 days.",
      "Two feedback rounds per phase are included; further rounds are billed at €95 per hour."
    ]
  },
  "output": {
    "format": "pdf",
    "filename": "quote-project-proposal.pdf"
  }
}'