Template gallery / budget-summary
HOA annual budget summary template
Annual budget summary an association can mail to owners, built as a financial statement rather than a dashboard: the headline figures in a ruled band instead of stat cards, income and grouped expenses against the prior year in right-aligned mono columns with every total and a signed change column computed by the template, a replacement reserve schedule carrying useful life, remaining life and the funded percentage per component, and assessments by unit type multiplied out to the annual figure.
chromium default PDF 17 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 | The association's navy. The ledger is black ink on white with one pale tint on each subtotal row, so this colour is held in reserve rather than sprayed over the figures. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| currency | string | optional | |
| fiscal_year | string | required | Label for the proposed column and the page heading. |
| prior_year | string | optional | Label for the comparison column. |
| period | string | optional | |
| adopted_on | string (date) | optional | |
| association | object { name, subtitle, logo_url } | required | |
| summary | string | optional | The treasurer's note under the headline band, in Newsreader: what changed and why. |
| income | array of object { category, prior, proposed, note } | required | Income lines. Totals and the change column are computed by the template, so the page always adds up. |
| expenses | array of object { title, rows } | required | Expenses grouped into categories. Each group gets a ruled header and a tinted subtotal row. |
| surplus_note | string | optional | The line under the surplus figure in the headline band. |
| reserves | object { contribution, study_date, study_by, note, … } | optional | Replacement reserve schedule. The funded percentage per component, and across all of them, is computed from balance and fully_funded. |
| assessment | object { monthly, prior_monthly, change_percent, due_note, … } | optional | What owners actually pay. `tiers` multiplies out to an annual figure and a budgeted total per unit type. |
| notes | array of string | optional | |
| footer | string | optional | Replaces the default "this is a summary" line. |
| prepared_by | string | optional | |
| prepared_on | string (date) | optional |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | {"top":"0.55in","right":"0.55in","bottom":"0.8in","left":"0.55in"} |
| 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.
{
"fiscal_year": "2027",
"prior_year": "2026",
"period": "January 1 – December 31, 2027",
"adopted_on": "2026-11-10",
"currency": "USD",
"association": {
"name": "Heron Bay Homeowners Association, Inc.",
"subtitle": "Adopted operating budget"
},
"summary": "The 2027 budget raises the monthly assessment on a detached home from $257 to $268, a 4.3 percent increase, and on a tow… [352 characters, shortened for display]",
"income": [
{
"category": "Regular assessments",
"prior": 546168,
"proposed": 569664,
"note": "142 detached homes and 44 townhomes, billed monthly"
},
{
"category": "Clubhouse rental income",
"prior": 4200,
"proposed": 4800
},
{
"category": "Interest on reserve deposits",
"prior": 5100,
"proposed": 6400,
"note": "Two laddered CDs and a money market account"
},
{
"category": "Late fees and fines",
"prior": 4600,
"proposed": 3200,
"note": "Budgeted lower after the 2026 collection policy change"
},
{
"category": "Transfer and resale fees",
"prior": 6000,
"proposed": 5400
}
],
"expenses": [
{
"title": "Grounds and common areas",
"rows": [
{
"category": "Landscape maintenance contract",
"prior": 99600,
"proposed": 104400,
"note": "Coastal Green, year three of a five-year contract with a 4.8% escalator"
},
{
"category": "Irrigation repairs and water",
"prior": 17200,
"proposed": 18600
},
{
"category": "Tree care and storm cleanup",
"prior": 13600,
"proposed": 12000
},
{
"category": "Pond and stormwater maintenance",
"prior": 14400,
"proposed": 14400
}
]
},
{
"title": "Amenities",
"rows": [
{
"category": "Pool service and chemicals",
"prior": 27900,
"proposed": 29600
},
{
"category": "Pool attendant and safety staffing",
"prior": 10900,
"proposed": 11500
},
{
"category": "Clubhouse cleaning and supplies",
"prior": 9200,
"proposed": 9600
},
{
"category": "Fitness equipment service",
"prior": 3400,
"proposed": 3400
}
]
},
{
"title": "Utilities",
"rows": [
{
"category": "Electricity, common areas and lighting",
"prior": 22400,
"proposed": 21800,
"note": "Lower after the 2026 conversion of the entrance lighting to LED"
},
{
"category": "Water and sewer, common areas",
"prior": 16900,
"proposed": 16900
},
{
"category": "Trash and recycling collection",
"prior": 77400,
"proposed": 81200,
"note": "New three-year contract at $36.38 per unit per month"
},
{
"category": "Internet and gate telephony",
"prior": 4080,
"proposed": 4200
}
]
},
{
"title": "Insurance and professional services",
"rows": [
{
"category": "Property and general liability",
"prior": 55900,
"proposed": 58700,
"note": "Coastal wind pool; the quoted renewal is 5.0% over 2026"
},
{
"category": "Directors and officers",
"prior": 4300,
"proposed": 4900
},
{
"category": "Management fee",
"prior": 42300,
"proposed": 44640,
"note": "Cape Fear Property Management, $20 per unit per month"
},
{
"category": "Audit and tax preparation",
"prior": 6500,
"proposed": 6800
},
{
"category": "Legal",
"prior": 12400,
"proposed": 9000,
"note": "Two collection matters closed in 2026"
}
]
},
{
"title": "Administration",
"rows": [
{
"category": "Postage, printing and the annual meeting",
"prior": 5900,
"proposed": 6300
},
{
"category": "Owner portal and accounting software",
"proposed": 3900,
"note": "New in 2027; replaces three shared inboxes and a spreadsheet"
},
{
"category": "Bank and payment processing fees",
"prior": 2500,
"proposed": 2600
},
{
"category": "Reserve study update",
"proposed": 4500,
"note": "Removed if the membership votes to waive the update at the annual meeting"
}
]
},
{
"title": "Repairs and contingency",
"rows": [
{
"category": "Common area repairs",
"prior": 26900,
"proposed": 24000
},
{
"category": "Gate and access control",
"prior": 9300,
"proposed": 7200
},
{
"category": "Allowance for uncollectible assessments",
"prior": 6820,
"proposed": 4800
},
{
"category": "Contingency",
"prior": 13200,
"proposed": 14000,
"note": "About 2.4% of the operating budget"
}
]
},
{
"title": "Reserve funding",
"rows": [
{
"category": "Transfer to replacement reserves",
"prior": 61000,
"proposed": 68400,
"note": "The 2024 study called for $74,200; the Board is phasing the increase over three years"
}
]
}
],
"reserves": {
"contribution": 68400,
"study_date": "2024-06-18",
"study_by": "Atlantic Reserve Advisors, LLC",
"note": "Balances are projected to January 1, 2027 and include the $38,400 clubhouse roof replacement awarded in September 2026, which is why the roofing component is low against its target.",
"components": [
{
"name": "Roofing, clubhouse and mail kiosks",
"useful_life": "25 yrs",
"remaining": "12 yrs",
"replacement_cost": 268000,
"balance": 13900,
"fully_funded": 128600
},
{
"name": "Asphalt, paving and striping",
"useful_life": "20 yrs",
"remaining": "6 yrs",
"replacement_cost": 214000,
"balance": 74200,
"fully_funded": 149800
},
{
"name": "Pool, deck and equipment",
"useful_life": "15 yrs",
"remaining": "4 yrs",
"replacement_cost": 96000,
"balance": 44800,
"fully_funded": 70400
},
{
"name": "Clubhouse interior and kitchen",
"useful_life": "12 yrs",
"remaining": "3 yrs",
"replacement_cost": 88000,
"balance": 71200,
"fully_funded": 66000
},
{
"name": "Fencing, gates and access control",
"useful_life": "18 yrs",
"remaining": "9 yrs",
"replacement_cost": 62000,
"balance": 18600,
"fully_funded": 31000
},
{
"name": "Stormwater, pond and outfall",
"useful_life": "30 yrs",
"remaining": "21 yrs",
"replacement_cost": 140000,
"balance": 9300,
"fully_funded": 42000
}
]
},
"assessment": {
"monthly": 268,
"prior_monthly": 257,
"change_percent": 4.3,
"due_note": "Assessments are due on the first of each month and are late after the tenth. Owners on autopay are drafted on the third.… [268 characters, shortened for display]",
"tiers": [
{
"name": "Detached home",
"units": 142,
"prior_monthly": 257,
"monthly": 268
},
{
"name": "Townhome",
"units": 44,
"prior_monthly": 205,
"monthly": 214,
"note": "Lower share of the landscape and paving allocation under Exhibit C of the Declaration"
}
]
},
"notes": [
"Income and expenses are budgeted on the accrual basis. The 2026 column is the budget adopted in November 2025, not actual results.",
"The insurance line is the quoted renewal from Carolina Coastal Underwriters dated October 2, 2026. If the bound premium differs by more than five percent the Board will amend the budget at the January meeting.",
"The reserve study update in Administration is removed from the budget if the membership votes at the annual meeting to waive it for 2027. That changes the budgeted surplus, not the assessment.",
"The budgeted surplus is carried to the operating contingency and is not distributed."
],
"prepared_by": "Ana Alvarez, Treasurer, with Cape Fear Property Management",
"prepared_on": "2026-10-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": "budget-summary@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": "budget-summary",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — budget-summary@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 (17 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "HOA budget summary",
"type": "object",
"required": [
"association",
"fiscal_year",
"income",
"expenses"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The association's navy. The ledger is black ink on white with one pale tint on each subtotal row, so this colour is held in reserve rather than sprayed over the figures. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"default": "#1c3f60",
"examples": [
"#1c3f60"
],
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"currency": {
"type": "string",
"default": "USD",
"examples": [
"USD"
]
},
"fiscal_year": {
"type": "string",
"description": "Label for the proposed column and the page heading.",
"examples": [
"2027"
]
},
"prior_year": {
"type": "string",
"description": "Label for the comparison column.",
"examples": [
"2026"
]
},
"period": {
"type": "string",
"examples": [
"January 1 – December 31, 2027"
]
},
"adopted_on": {
"type": "string",
"format": "date",
"examples": [
"2026-11-10"
]
},
"association": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Heron Bay Homeowners Association, Inc."
]
},
"subtitle": {
"type": "string",
"default": "Adopted operating budget",
"examples": [
"Adopted operating budget"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/heron-bay.png"
]
}
}
},
"summary": {
"type": "string",
"description": "The treasurer's note under the headline band, in Newsreader: what changed and why.",
"examples": [
"The 2027 budget raises the monthly assessment on a detached home from $257 to $268."
]
},
"income": {
"type": "array",
"minItems": 1,
"description": "Income lines. Totals and the change column are computed by the template, so the page always adds up.",
"items": {
"type": "object",
"required": [
"category",
"proposed"
],
"properties": {
"category": {
"type": "string",
"examples": [
"Regular assessments"
]
},
"prior": {
"type": "number",
"description": "Prior year. Omit and the row prints an em dash and contributes nothing to the comparison total.",
"examples": [
546168
]
},
"proposed": {
"type": "number",
"examples": [
569664
]
},
"note": {
"type": "string",
"examples": [
"142 detached homes and 44 townhomes, billed monthly"
]
}
}
}
},
"expenses": {
"type": "array",
"minItems": 1,
"description": "Expenses grouped into categories. Each group gets a ruled header and a tinted subtotal row.",
"items": {
"type": "object",
"required": [
"title",
"rows"
],
"properties": {
"title": {
"type": "string",
"examples": [
"Grounds and common areas"
]
},
"rows": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"category",
"proposed"
],
"properties": {
"category": {
"type": "string",
"examples": [
"Landscape maintenance contract"
]
},
"prior": {
"type": "number",
"examples": [
99600
]
},
"proposed": {
"type": "number",
"examples": [
104400
]
},
"note": {
"type": "string",
"examples": [
"Year three of a five-year contract with a 4.8% escalator"
]
}
}
}
}
}
}
},
"surplus_note": {
"type": "string",
"description": "The line under the surplus figure in the headline band.",
"examples": [
"Income less expenses, including the reserve contribution."
]
},
"reserves": {
"type": "object",
"description": "Replacement reserve schedule. The funded percentage per component, and across all of them, is computed from balance and fully_funded.",
"properties": {
"contribution": {
"type": "number",
"description": "This year's transfer to reserves. State it here as well as in the expense table so the callout can name it.",
"examples": [
68400
]
},
"study_date": {
"type": "string",
"format": "date",
"examples": [
"2024-06-18"
]
},
"study_by": {
"type": "string",
"examples": [
"Atlantic Reserve Advisors, LLC"
]
},
"note": {
"type": "string",
"examples": [
"Balances are projected to January 1, 2027."
]
},
"components": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"balance",
"fully_funded"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Asphalt, paving and striping"
]
},
"useful_life": {
"type": "string",
"examples": [
"20 yrs"
]
},
"remaining": {
"type": "string",
"examples": [
"6 yrs"
]
},
"replacement_cost": {
"type": "number",
"examples": [
214000
]
},
"balance": {
"type": "number",
"description": "What is actually in the component.",
"examples": [
74200
]
},
"fully_funded": {
"type": "number",
"exclusiveMinimum": 0,
"description": "The fully funded target from the study. Drives the funded percentage; anything under 50 percent is marked 'under target' in words rather than in colour, so it survives a photocopier.",
"examples": [
149800
]
}
}
}
}
}
},
"assessment": {
"type": "object",
"description": "What owners actually pay. `tiers` multiplies out to an annual figure and a budgeted total per unit type.",
"properties": {
"monthly": {
"type": "number",
"description": "Headline monthly assessment, shown as the fourth figure in the headline band.",
"examples": [
268
]
},
"prior_monthly": {
"type": "number",
"examples": [
257
]
},
"change_percent": {
"type": "number",
"examples": [
4.3
]
},
"due_note": {
"type": "string",
"examples": [
"Assessments are due on the first of each month and are late after the tenth."
]
},
"tiers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"units",
"monthly"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Detached home"
]
},
"units": {
"type": "integer",
"minimum": 1,
"examples": [
142
]
},
"monthly": {
"type": "number",
"examples": [
268
]
},
"prior_monthly": {
"type": "number",
"examples": [
257
]
},
"note": {
"type": "string",
"examples": [
"Lower share of the landscape allocation under Exhibit C"
]
}
}
}
}
}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"examples": [
"The 2026 column is the budget adopted in November 2025, not actual results."
]
},
"examples": [
[
"The 2026 column is the adopted budget, not actual results."
]
]
},
"footer": {
"type": "string",
"description": "Replaces the default \"this is a summary\" line.",
"examples": [
"The line-item budget and the reserve study are available to any owner on request."
]
},
"prepared_by": {
"type": "string",
"examples": [
"Ana Alvarez, Treasurer, with Cape Fear Property Management"
]
},
"prepared_on": {
"type": "string",
"format": "date",
"examples": [
"2026-10-31"
]
}
}
}