Template gallery / engagement-letter
Consulting engagement letter template
Engagement letter for a consultant or small firm, set as a letter rather than as a proposal: letterhead over a single keyline, then date, inside address, subject, salutation and body at a 4.7in measure. The rate card is a small table stepped out past the measure, the billing and engagement terms are run-in bold lead-ins a reader can skim by their first two words, and the letter closes with a signature space and a signed acceptance block on a rule.
chromium default PDF 22 top-level fields Billed per page
Fields
The full JSON Schema is below. Required fields are marked; anything missing comes back as a 422 naming the path, the expected type and a value that would be accepted.
| Field | Type | Required | Description |
|---|---|---|---|
| accent | string | optional | Masthead rule and acceptance-block colour. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| currency | string | optional | |
| letter_date | string (date) | required | |
| subject | string | optional | |
| firm | object { name, strapline, address, phone, … } | required | |
| client | object { name, contact, salutation, address_line1, … } | required | |
| salutation | string | optional | |
| opening | array of string | optional | The paragraphs before the first heading. |
| services_intro | string | optional | |
| services | array of string | optional | |
| not_included | array of string | optional | Say it here or argue about it later. |
| rates | array of object { role, note, basis, amount, … } | optional | The rate card. Give `amount` for a figure the template formats, or `text` for anything that is not a plain number. |
| fees | array of object { title, text } | optional | Billing terms as a bold lead-in and a sentence. |
| retainer | string | optional | |
| terms | array of object { title, text } | optional | The terms of the engagement, each a bold lead-in and a sentence. |
| closing_paragraphs | array of string | optional | |
| valediction | string | optional | |
| signer | object { name, title, organization } | required | |
| acceptance | string | optional | Replaces the default wording in the acceptance block. |
| start_date | string (date) | optional | |
| end_date | string (date) | optional | |
| footer | string | optional | Replaces the default entire-agreement line. |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | {"top":"0.9in","right":"1.1in","bottom":"1in","left":"1.1in"} |
| print_background | true |
Example payload
This exact object renders the preview above. It is also what the API echoes back in a validation error, so an agent can repair a payload without a round trip to the docs.
{
"letter_date": "2026-09-16",
"currency": "USD",
"subject": "Engagement letter — fractional operations, October 2026 through March 2027",
"firm": {
"name": "Ashcroft Systems LLC",
"strapline": "Operations and systems for small manufacturers",
"address": "221 Bellwether Road, Suite 4, Providence, RI 02903",
"phone": "(401) 555-0134",
"email": "wren@ashcroftsystems.test",
"website": "ashcroftsystems.test"
},
"client": {
"name": "Bindery Goods, Inc.",
"contact": "Marisol Trevino",
"salutation": "Marisol",
"address_line1": "1100 Canal Street, Floor 3",
"city_state_zip": "New Orleans, LA 70112",
"signatory": "Marisol Trevino",
"signatory_title": "VP Operations"
},
"opening": [
"Thank you for asking me to help. This letter sets out what I will do for Bindery, what it costs, and the handful of terms we both work under. It is deliberately short, and everything in it is negotiable until you sign it.",
"It replaces the scope we sketched on the call on September 11 and takes over from the project work under SOW-2026-07, which finishes on acceptance of its last deliverable.",
"I have written it the way I would want it written to me: what you get, what it costs, what happens if either of us wants… [241 characters, shortened for display]"
],
"services_intro": "From October 1, 2026 I will act as your fractional operations lead, about two days a week, ordinarily Tuesdays and Thursdays. In that role I will:",
"services": [
"Run the weekly operations review and own the actions that come out of it",
"Hold the order-to-cash process end to end: intake, reconciliation, exceptions and the daily report",
"Manage the two operations coordinators day to day, with hiring, pay and reviews staying with you",
"Build and maintain the monthly operations pack for your board, delivered by the fifth business day",
"Run the vendor review for the freight and fulfilment contracts due for renewal in February 2027",
"Sit in on the Thursday production call and carry anything that needs an operations decision",
"Give you two weeks notice, in writing, of anything I think will slip"
],
"not_included": [
"Anything requiring a licensed accountant, attorney or engineer, including tax and employment advice",
"Signing contracts, opening accounts or committing Bindery's funds; I recommend, you sign",
"Software development beyond configuration of tools you already own",
"Work for any Bindery entity other than Bindery Goods, Inc.",
"Cover for the coordinators during holiday or sick leave beyond the two days a week"
],
"rates": [
{
"role": "Fractional operations lead",
"note": "Two days a week, ordinarily Tuesdays and Thursdays",
"basis": "Monthly retainer",
"amount": 9600
},
{
"role": "Additional days beyond two a week",
"note": "By prior written agreement only",
"basis": "Per day",
"amount": 1400
},
{
"role": "Travel to New Orleans",
"note": "One visit a quarter is included in the retainer",
"basis": "Per additional trip",
"amount": 950
},
{
"role": "Out-of-pocket expenses",
"note": "Anything over $250 pre-approved in writing",
"basis": "Pass-through",
"text": "At cost, with receipts"
}
],
"fees": [
{
"title": "Invoicing.",
"text": "Invoiced on the first business day of each month for that month, by email to accountspayable@binderygoods.test with you copied."
},
{
"title": "Payment terms.",
"text": "Net 15 from the invoice date, by ACH. Invoices unpaid 15 days past due accrue 1.5 percent per month."
},
{
"title": "Expenses.",
"text": "Billed with the following month's retainer, itemised, with receipts attached. Nothing over $250 goes on an invoice without your written approval first."
},
{
"title": "Time records.",
"text": "I keep a day log and send it with each invoice. You are paying for two days a week, not for hours, but you should be able to see where they went."
},
{
"title": "Rate review.",
"text": "The retainer is fixed for the term of this engagement. Any change after March 31, 2027 is agreed in writing at least 30 days beforehand."
}
],
"retainer": "A retainer of $9,600, equal to one month, is due before work begins. It is applied to the final month of the engagement rather than the first, and is refunded in full if either of us terminates before October 1, 2026.",
"terms": [
{
"title": "Term and termination.",
"text": "The engagement runs from October 1, 2026 through March 31, 2027. Either of us may end it on 30 days written notice. On t… [249 characters, shortened for display]"
},
{
"title": "Confidentiality.",
"text": "Neither of us discloses the other's confidential information, during the engagement or after it, except where the law requires it. That obligation survives the engagement by three years."
},
{
"title": "Conflicts.",
"text": "I do not currently act for any Bindery competitor. If a conflict comes up I will tell you before accepting the other work, and you may end this engagement on that basis without notice or penalty."
},
{
"title": "Ownership.",
"text": "Everything I produce specifically for Bindery in this engagement is yours on payment. Tools, templates and methods I brought with me stay mine, and you get a perpetual licence to keep using the versions delivered to you."
},
{
"title": "Independent contractor.",
"text": "I am an independent contractor, not an employee. I carry my own insurance and pay my own taxes, and nothing here creates a partnership or a joint venture."
},
{
"title": "Liability.",
"text": "My total liability under this engagement is capped at the fees paid in the three months before the claim. Neither of us is liable to the other for indirect or consequential loss."
},
{
"title": "Communication.",
"text": "Slack for the day to day, email for anything either of us would want a record of. I answer within one business day, and I am not on call at weekends."
},
{
"title": "Governing law.",
"text": "Rhode Island law, and we will try mediation in good faith before either of us files anything."
}
],
"closing_paragraphs": [
"I am looking forward to it. If anything above does not match what we discussed on September 11, tell me before you sign rather than after — it is a much cheaper conversation now."
],
"valediction": "Sincerely,",
"signer": {
"name": "Wren Ashcroft",
"title": "Principal",
"organization": "Ashcroft Systems LLC"
},
"acceptance": "Please sign below and return one copy, or reply in writing that you accept. Either one means you agree to the scope, the fees and the terms in this letter.",
"start_date": "2026-10-01",
"end_date": "2027-03-31"
}
Values longer than 240 characters — data URIs, inline SVG — are shortened here so the
shape of the payload stays readable, and the replacement says how much was left out.
get_template and GET /v1/templates/:ref return them in full.
Render it
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "engagement-letter@1",
"format": "pdf",
"data": "… the example payload above …"
}' # No API key. The first call mints a trial of 10 PDF pages or 10 images.
curl -sS https://mcp.galleyrender.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "render",
"arguments": {
"template": "engagement-letter",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — engagement-letter@1 — in anything you ship. Publishing a new
version never changes an old one. Render endpoint reference →
Renders the example payload on the production service. No account, no key.
JSON Schema
schema.json (22 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Engagement letter",
"type": "object",
"required": [
"firm",
"client",
"letter_date",
"signer"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "Masthead rule and acceptance-block colour. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#4338ca"
],
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"currency": {
"type": "string",
"default": "USD",
"examples": [
"USD"
]
},
"letter_date": {
"type": "string",
"format": "date",
"examples": [
"2026-09-16"
]
},
"subject": {
"type": "string",
"examples": [
"Engagement letter — fractional operations, Q4 2026 through Q1 2027"
]
},
"firm": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Ashcroft Systems LLC"
]
},
"strapline": {
"type": "string",
"examples": [
"Operations and systems for small manufacturers"
]
},
"address": {
"type": "string",
"examples": [
"221 Bellwether Road, Suite 4, Providence, RI 02903"
]
},
"phone": {
"type": "string",
"examples": [
"(401) 555-0134"
]
},
"email": {
"type": "string",
"format": "email",
"examples": [
"wren@ashcroftsystems.test"
]
},
"website": {
"type": "string",
"examples": [
"ashcroftsystems.test"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/ashcroft.png"
]
}
}
},
"client": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The entity being engaged by.",
"examples": [
"Bindery Goods, Inc."
]
},
"contact": {
"type": "string",
"description": "The person the letter is addressed to.",
"examples": [
"Marisol Trevino"
]
},
"salutation": {
"type": "string",
"description": "Used after \"Dear\".",
"examples": [
"Marisol"
]
},
"address_line1": {
"type": "string",
"examples": [
"1100 Canal Street, Floor 3"
]
},
"city_state_zip": {
"type": "string",
"examples": [
"New Orleans, LA 70112"
]
},
"signatory": {
"type": "string",
"examples": [
"Marisol Trevino"
]
},
"signatory_title": {
"type": "string",
"examples": [
"VP Operations"
]
}
}
},
"salutation": {
"type": "string",
"default": "Dear",
"examples": [
"Dear"
]
},
"opening": {
"type": "array",
"description": "The paragraphs before the first heading.",
"items": {
"type": "string",
"examples": [
"Thank you for asking me to help with the order intake problem."
]
},
"examples": [
[
"Thank you for asking me to help."
]
]
},
"services_intro": {
"type": "string",
"examples": [
"For the period of this engagement I will act as your fractional operations lead, roughly two days a week."
]
},
"services": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Run the weekly operations review and own the actions out of it"
]
},
"examples": [
[
"Run the weekly operations review"
]
]
},
"not_included": {
"type": "array",
"description": "Say it here or argue about it later.",
"items": {
"type": "string",
"examples": [
"Anything requiring a licensed accountant, attorney or engineer"
]
},
"examples": [
[
"Anything requiring a licensed professional"
]
]
},
"rates": {
"type": "array",
"description": "The rate card. Give `amount` for a figure the template formats, or `text` for anything that is not a plain number.",
"items": {
"type": "object",
"required": [
"role",
"basis"
],
"properties": {
"role": {
"type": "string",
"examples": [
"Fractional operations lead"
]
},
"note": {
"type": "string",
"examples": [
"Two days a week, Tuesdays and Thursdays"
]
},
"basis": {
"type": "string",
"examples": [
"Monthly retainer"
]
},
"amount": {
"type": "number",
"minimum": 0,
"examples": [
9600
]
},
"text": {
"type": "string",
"description": "Used when the rate is not a single number.",
"examples": [
"At cost, with receipts"
]
}
}
}
},
"fees": {
"type": "array",
"description": "Billing terms as a bold lead-in and a sentence.",
"items": {
"type": "object",
"required": [
"title",
"text"
],
"properties": {
"title": {
"type": "string",
"examples": [
"Invoicing."
]
},
"text": {
"type": "string",
"examples": [
"Invoiced on the first business day of each month for that month, by email."
]
}
}
}
},
"retainer": {
"type": "string",
"examples": [
"A retainer of $9,600, equal to one month, is due before work begins. It is applied to the final month of the engagement, not the first."
]
},
"terms": {
"type": "array",
"description": "The terms of the engagement, each a bold lead-in and a sentence.",
"items": {
"type": "object",
"required": [
"title",
"text"
],
"properties": {
"title": {
"type": "string",
"examples": [
"Confidentiality."
]
},
"text": {
"type": "string",
"examples": [
"Neither of us discloses the other's confidential information, during the engagement or after it."
]
}
}
}
},
"closing_paragraphs": {
"type": "array",
"items": {
"type": "string",
"examples": [
"I am looking forward to it. If any of the above does not match what we discussed, say so before you sign."
]
},
"examples": [
[
"If any of this does not match what we discussed, say so before you sign."
]
]
},
"valediction": {
"type": "string",
"default": "Sincerely,",
"examples": [
"Sincerely,"
]
},
"signer": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Wren Ashcroft"
]
},
"title": {
"type": "string",
"examples": [
"Principal"
]
},
"organization": {
"type": "string",
"examples": [
"Ashcroft Systems LLC"
]
}
}
},
"acceptance": {
"type": "string",
"description": "Replaces the default wording in the acceptance block.",
"examples": [
"Please sign below and return one copy."
]
},
"start_date": {
"type": "string",
"format": "date",
"examples": [
"2026-10-01"
]
},
"end_date": {
"type": "string",
"format": "date",
"examples": [
"2027-03-31"
]
},
"footer": {
"type": "string",
"description": "Replaces the default entire-agreement line.",
"examples": [
"This letter is the whole agreement between us on this engagement."
]
}
}
}