Template gallery / thank-you-letter

Donor thank-you letter template

Donor or volunteer thank-you on letterpress letterhead: a centred masthead, paragraphs that lead with what the gift did, two to four impact figures set in EB Garamond across a ruled band rather than in boxes, one story set as a passage in the display face, a signature that can be set in script or left as a rule, a postscript for the ask, and an anchored foot that points at the tax receipt rather than trying to be one.

chromium default PDF 14 top-level fields Billed per page

Rendered preview of the thank-you-letter template
Rendered by Galley from the example payload below, at 816px wide , scale 2.

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 one plum spot: the strapline, the impact figures, the P.S. mark and the signature. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.
letter_date string (date) required
organisation object { name, strapline, address, phone, … } required
recipient object { name, salutation, address_line1, address_line2, … } required
salutation string optional
body array of string required The paragraphs before the impact figures. Lead with what the gift did, not with how grateful you are.
impact array of object { value, label } optional Two to four figures. Specific beats impressive.
story object { heading, text, attribution } optional One person, named or not, in their own words if you have them.
body_after array of string optional Paragraphs after the story and before the sign-off.
valediction string optional
signer object { name, title, script } required
postscript string optional The line most people read first. Put the ask or the invitation here.
receipt_note string optional Where the tax receipt is. Keep a thank-you letter and a receipt as separate documents; this line points at the other one.
tax_status string optional

Default render options

Applied unless you override them. Options are part of the cache key.

page_size "Letter"
margin "0.85in"
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.

example.jsonjson
{
  "letter_date": "2027-01-12",
  "organisation": {
    "name": "Riverlight Community Food Bank, Inc.",
    "strapline": "Feeding New Hanover County since 1994",
    "address": "2200 Vance Street, Wilmington, NC 28401",
    "phone": "(910) 555-0126",
    "email": "giving@riverlightfood.example.test",
    "website": "riverlightfood.example.test",
    "ein": "56-2418907"
  },
  "recipient": {
    "name": "Marguerite and Anselm Achterberg",
    "salutation": "Marguerite and Anselm",
    "address_line1": "417 Castle Street",
    "address_line2": "Apartment 3B",
    "city_state_zip": "Wilmington, NC 28401"
  },
  "body": [
    "Your check arrived on November 20, which was the week the heating went out at the Vance Street pantry and we were decidi… [267 characters, shortened for display]",
    "The second thing it did is easier to count."
  ],
  "impact": [
    {
      "value": "3,120",
      "label": "meals your giving paid for this year, at $0.48 each"
    },
    {
      "value": "41,600",
      "label": "households Riverlight served in 2026"
    },
    {
      "value": "14",
      "label": "cases you carried in yourselves in October"
    }
  ],
  "story": {
    "heading": "What this looked like on a Tuesday",
    "text": "A woman came in on a Tuesday in March with two children and a bus transfer that expired in forty minutes. We had eleven … [329 characters, shortened for display]",
    "attribution": "Delphine Marchetti, pantry coordinator"
  },
  "body_after": [
    "We are a food bank with four paid staff and a hundred and ten volunteers, and what keeps us upright is not any single large gift. It is two hundred and forty households giving every month.",
    "Thank you for being one of them for the fourth year running."
  ],
  "valediction": "With thanks,",
  "signer": {
    "name": "Imogen Thorsdottir",
    "title": "Executive Director, Riverlight Community Food Bank",
    "script": "Imogen"
  },
  "postscript": "The mobile pantry runs on the first Saturday of the month and we are two drivers short for the spring. If either of you has a licence and a free morning, Delphine will call you.",
  "receipt_note": "Your 2026 contribution statement is enclosed separately; that is the document to keep for your tax records.",
  "tax_status": "Riverlight Community Food Bank, Inc. is exempt from federal income tax under section 501(c)(3). EIN 56-2418907."
}

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

With an API keyshell
curl -sS https://api.galleyrender.com/v1/render \
  -H "Authorization: Bearer $GALLEY_API_KEY" \
  -H 'content-type: application/json' \
  -d '{
  "template": "thank-you-letter@1",
  "format": "pdf",
  "data": "… the example payload above …"
}'
With no API key, over MCPshell
# 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": "thank-you-letter",
        "format": "pdf",
        "data": { … see the example payload above … }
      }
    }
  }'

Pin the version — thank-you-letter@1 — in anything you ship. Publishing a new version never changes an old one. Render endpoint reference →

Try a free tool

Renders the example payload on the production service. No account, no key.

JSON Schema

schema.json (14 top-level properties)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Thank-you letter",
  "type": "object",
  "required": [
    "organisation",
    "recipient",
    "letter_date",
    "body",
    "signer"
  ],
  "additionalProperties": true,
  "properties": {
    "accent": {
      "type": "string",
      "description": "The one plum spot: the strapline, the impact figures, the P.S. mark and the signature. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
      "examples": [
        "#5b2a5f"
      ],
      "default": "#5b2a5f",
      "pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
    },
    "letter_date": {
      "type": "string",
      "format": "date",
      "examples": [
        "2026-09-16"
      ]
    },
    "organisation": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "examples": [
            "Riverlight Community Food Bank, Inc."
          ]
        },
        "strapline": {
          "type": "string",
          "examples": [
            "Feeding New Hanover County since 1994"
          ]
        },
        "address": {
          "type": "string",
          "examples": [
            "2200 Vance Street, Wilmington, NC 28401"
          ]
        },
        "phone": {
          "type": "string",
          "examples": [
            "(910) 555-0126"
          ]
        },
        "email": {
          "type": "string",
          "format": "email",
          "examples": [
            "giving@riverlightfood.example.test"
          ]
        },
        "website": {
          "type": "string",
          "examples": [
            "riverlightfood.example.test"
          ]
        },
        "ein": {
          "type": "string",
          "examples": [
            "56-2418907"
          ]
        },
        "logo_url": {
          "type": "string",
          "format": "uri",
          "examples": [
            "https://example.com/riverlight.png"
          ]
        }
      }
    },
    "recipient": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "examples": [
            "Marguerite and Anselm Achterberg"
          ]
        },
        "salutation": {
          "type": "string",
          "description": "Used after \"Dear\". Use the name they would want, not the one on the check.",
          "examples": [
            "Marguerite and Anselm"
          ]
        },
        "address_line1": {
          "type": "string",
          "examples": [
            "417 Castle Street"
          ]
        },
        "address_line2": {
          "type": "string",
          "examples": [
            "Apartment 3B"
          ]
        },
        "city_state_zip": {
          "type": "string",
          "examples": [
            "Wilmington, NC 28401"
          ]
        }
      }
    },
    "salutation": {
      "type": "string",
      "default": "Dear",
      "examples": [
        "Dear"
      ]
    },
    "body": {
      "type": "array",
      "minItems": 1,
      "description": "The paragraphs before the impact figures. Lead with what the gift did, not with how grateful you are.",
      "items": {
        "type": "string",
        "examples": [
          "Your gift arrived in the week we ran out of shelf-stable milk."
        ]
      },
      "examples": [
        [
          "Your gift arrived in the week we ran out of shelf-stable milk."
        ]
      ]
    },
    "impact": {
      "type": "array",
      "description": "Two to four figures. Specific beats impressive.",
      "items": {
        "type": "object",
        "required": [
          "value",
          "label"
        ],
        "properties": {
          "value": {
            "type": "string",
            "examples": [
              "3,120"
            ]
          },
          "label": {
            "type": "string",
            "examples": [
              "meals your gift paid for, at $0.48 each"
            ]
          }
        }
      }
    },
    "story": {
      "type": "object",
      "description": "One person, named or not, in their own words if you have them.",
      "properties": {
        "heading": {
          "type": "string",
          "examples": [
            "What this looked like on a Tuesday"
          ]
        },
        "text": {
          "type": "string",
          "examples": [
            "A woman came to the Vance Street pantry on a Tuesday in March with two children and a bus transfer that expired in forty minutes."
          ]
        },
        "attribution": {
          "type": "string",
          "examples": [
            "Delphine Marchetti, pantry coordinator"
          ]
        }
      }
    },
    "body_after": {
      "type": "array",
      "description": "Paragraphs after the story and before the sign-off.",
      "items": {
        "type": "string",
        "examples": [
          "None of this is possible in a month when giving drops."
        ]
      },
      "examples": [
        [
          "None of this is possible in a month when giving drops."
        ]
      ]
    },
    "valediction": {
      "type": "string",
      "default": "With thanks,",
      "examples": [
        "With thanks,"
      ]
    },
    "signer": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "examples": [
            "Imogen Thorsdottir"
          ]
        },
        "title": {
          "type": "string",
          "examples": [
            "Executive Director"
          ]
        },
        "script": {
          "type": "string",
          "description": "A signature set in italic serif. Without it, a blank rule prints for a pen.",
          "examples": [
            "Imogen"
          ]
        }
      }
    },
    "postscript": {
      "type": "string",
      "description": "The line most people read first. Put the ask or the invitation here.",
      "examples": [
        "The mobile pantry runs on the first Saturday of the month and we are two drivers short. If you have a driving licence and a free morning, reply to this letter."
      ]
    },
    "receipt_note": {
      "type": "string",
      "description": "Where the tax receipt is. Keep a thank-you letter and a receipt as separate documents; this line points at the other one.",
      "examples": [
        "Your 2026 contribution statement is enclosed separately and is the document to keep for your tax records."
      ]
    },
    "tax_status": {
      "type": "string",
      "examples": [
        "Riverlight Community Food Bank, Inc. is exempt from federal income tax under section 501(c)(3) of the Internal Revenue Code."
      ]
    }
  }
}