Mail merge from Excel or CSV to PDF, right in the chat.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user wants to mail merge from Excel or CSV to PDF: personalized letters from a spreadsheet (thank-you letters for each donor, the same letter to 200 people with their names), certificates in bulk from a name list (award, completion, participation), or envelopes from a contact list (#10 with return address). Fills {{Field}} placeholders with defaults, formats and {{#if}} conditions for each row and returns ONE combined PDF (one document per record, up to 2,000 per batch) plus a per-record merge report CSV. Does not send email, mail, or print anything, and does not make mailing labels. Do not use for Outlook or Gmail bulk email.
What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter.
Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known.
The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx.
Shortcut for a plain list of names (one column called Name), e.g. ["Ana Lopez", "Ben Okafor"]. Handy for certificates.
For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data.
Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic.
Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. ["Riverbend Animal Shelter", "120 Elm St", "Springfield, IL 62701"].
Letters: closing line, e.g. "With gratitude,". Defaults to "Sincerely," unless the template already ends with a closing. Use "" for none.
Alternative to a file: the recipients typed as objects with the same keys, e.g. [{"First Name": "Ana", "Last Name": "Lopez", "Amount": 250}].
Certificates: up to 3 signature lines, e.g. [{"name": "Alan Brooks", "title": "Principal"}].
Letters: optional subject line printed as "Re: ...", may contain fields, e.g. "Your {{Year}} giving statement".
Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. "First Name,Last Name,City\nAna,Lopez,Austin".
Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. "Dear {{First Name|Friend}},\n\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date.
Optional explicit links from template fields to column names when names differ, e.g. {"Gift": "Donation Amount (USD)"}.
Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true.
Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false.
Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School.
For lists over 2,000 records: first record of this batch, e.g. 2001 for the second batch. Default 1.
Certificates: the line under the name, may contain fields, e.g. "for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}".
Envelopes: "10" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or "a7" for a 5-1/4 x 7-1/4 in invitation envelope.
How many records to put in this PDF (1-2000), e.g. 500. Default all, up to 2,000 per PDF.
What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading).
Certificates: the line above the name. Default "This certificate is proudly presented to" ("This certifies that" for completion).
Letters: name printed under the closing, e.g. Maria Chen.
Letters: print the recipient address block above the salutation. Default true when the sheet has address columns.
Letters: title under the signature name, e.g. Executive Director.
Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. "{{First Name}} {{Last Name}}\n{{Street}}\n{{City}}, {{State}} {{ZIP}}". Defaults to one built from the name, company and address columns.
Certificates: sets the default title and wording, e.g. completion -> "Certificate of Completion". Default achievement.
Certificates: custom title, e.g. "Certificate of Appreciation" or "Volunteer of the Year".
Certificates: the name line, e.g. "{{First Name}} {{Last Name}}". Defaults to the Name column (or First + Last).
Use this when the user wants to mail merge from Excel or CSV to PDF: personalized letters from a spreadsheet (thank-you letters for each donor, the same letter to 200 people with their names), certificates in bulk from a name list (award, completion, participation), or envelopes from a contact list (#10 with return address). Fills {{Field}} placeholders with defaults, formats and {{#if}} conditions for each row and returns ONE combined PDF (one document per record, up to 2,000 per batch) plus a per-record merge report CSV. Does not send email, mail, or print anything, and does not make mailing labels. Do not use for Outlook or Gmail bulk email.
| Argument | Type | Description |
|---|---|---|
| date | string | Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known. |
| file | object | The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx. |
| names | array | Shortcut for a plain list of names (one column called Name), e.g. ["Ana Lopez", "Ben Okafor"]. Handy for certificates. |
| sheet | string | For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data. |
| style | string | Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic. |
| sender | array | Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. ["Riverbend Animal Shelter", "120 Elm St", "Springfield, IL 62701"]. |
| closing | string | Letters: closing line, e.g. "With gratitude,". Defaults to "Sincerely," unless the template already ends with a closing. Use "" for none. |
| records | array | Alternative to a file: the recipients typed as objects with the same keys, e.g. [{"First Name": "Ana", "Last Name": "Lopez", "Amount": 250}]. |
| signers | array | Certificates: up to 3 signature lines, e.g. [{"name": "Alan Brooks", "title": "Principal"}]. |
| subject | string | Letters: optional subject line printed as "Re: ...", may contain fields, e.g. "Your {{Year}} giving statement". |
| csv_text | string | Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. "First Name,Last Name,City\nAna,Lopez,Austin". |
| template | string | Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. "Dear {{First Name|Friend}},\n\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date. |
| field_map | object | Optional explicit links from template fields to column names when names differ, e.g. {"Gift": "Donation Amount (USD)"}. |
| has_header | boolean | Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true. |
| usps_style | boolean | Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false. |
| organization | string | Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School. |
| start_record | integer | For lists over 2,000 records: first record of this batch, e.g. 2001 for the second batch. Default 1. |
| body_template | string | Certificates: the line under the name, may contain fields, e.g. "for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}". |
| document_type* | string | What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter. |
| envelope_size | string | Envelopes: "10" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or "a7" for a 5-1/4 x 7-1/4 in invitation envelope. |
| max_documents | integer | How many records to put in this PDF (1-2000), e.g. 500. Default all, up to 2,000 per PDF. |
| missing_values | string | What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading). |
| presented_line | string | Certificates: the line above the name. Default "This certificate is proudly presented to" ("This certifies that" for completion). |
| signature_name | string | Letters: name printed under the closing, e.g. Maria Chen. |
| include_address | boolean | Letters: print the recipient address block above the salutation. Default true when the sheet has address columns. |
| signature_title | string | Letters: title under the signature name, e.g. Executive Director. |
| address_template | string | Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. "{{First Name}} {{Last Name}}\n{{Street}}\n{{City}}, {{State}} {{ZIP}}". Defaults to one built from the name, company and address columns. |
| certificate_kind | string | Certificates: sets the default title and wording, e.g. completion -> "Certificate of Completion". Default achievement. |
| certificate_title | string | Certificates: custom title, e.g. "Certificate of Appreciation" or "Volunteer of the Year". |
| recipient_template | string | Certificates: the name line, e.g. "{{First Name}} {{Last Name}}". Defaults to the Name column (or First + Last). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"document_type"
],
"properties": {
"date": {
"type": "string",
"maxLength": 30,
"description": "Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known."
},
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
},
"names": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 5000,
"description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates."
},
"sheet": {
"type": "string",
"maxLength": 100,
"description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data."
},
"style": {
"enum": [
"classic",
"gold",
"modern",
"deco"
],
"type": "string",
"description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic."
},
"sender": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 6,
"description": "Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. [\"Riverbend Animal Shelter\", \"120 Elm St\", \"Springfield, IL 62701\"]."
},
"closing": {
"type": "string",
"maxLength": 60,
"description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none."
},
"records": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
},
"maxItems": 5000,
"description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}]."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Signer name, e.g. Dr. Alan Brooks."
},
"title": {
"type": "string",
"maxLength": 80,
"description": "Signer title, e.g. Principal."
}
}
},
"maxItems": 3,
"description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}]."
},
"subject": {
"type": "string",
"maxLength": 300,
"description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\"."
},
"csv_text": {
"type": "string",
"maxLength": 400000,
"description": "Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. \"First Name,Last Name,City\\nAna,Lopez,Austin\"."
},
"template": {
"type": "string",
"maxLength": 20000,
"description": "Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. \"Dear {{First Name|Friend}},\\n\\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}\". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date."
},
"field_map": {
"type": "object",
"description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"has_header": {
"type": "boolean",
"description": "Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true."
},
"usps_style": {
"type": "boolean",
"description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false."
},
"organization": {
"type": "string",
"maxLength": 120,
"description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School."
},
"start_record": {
"type": "integer",
"maximum": 20000,
"minimum": 1,
"description": "For lists over 2,000 records: first record of this batch, e.g. 2001 for the second batch. Default 1."
},
"body_template": {
"type": "string",
"maxLength": 600,
"description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\"."
},
"document_type": {
"enum": [
"letter",
"certificate",
"envelope"
],
"type": "string",
"description": "What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter."
},
"envelope_size": {
"enum": [
"10",
"a7"
],
"type": "string",
"description": "Envelopes: \"10\" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or \"a7\" for a 5-1/4 x 7-1/4 in invitation envelope."
},
"max_documents": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"description": "How many records to put in this PDF (1-2000), e.g. 500. Default all, up to 2,000 per PDF."
},
"missing_values": {
"enum": [
"leave_blank",
"skip_record",
"placeholder"
],
"type": "string",
"description": "What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading)."
},
"presented_line": {
"type": "string",
"maxLength": 120,
"description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion)."
},
"signature_name": {
"type": "string",
"maxLength": 100,
"description": "Letters: name printed under the closing, e.g. Maria Chen."
},
"include_address": {
"type": "boolean",
"description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns."
},
"signature_title": {
"type": "string",
"maxLength": 120,
"description": "Letters: title under the signature name, e.g. Executive Director."
},
"address_template": {
"type": "string",
"maxLength": 1000,
"description": "Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. \"{{First Name}} {{Last Name}}\\n{{Street}}\\n{{City}}, {{State}} {{ZIP}}\". Defaults to one built from the name, company and address columns."
},
"certificate_kind": {
"enum": [
"achievement",
"completion",
"participation",
"appreciation",
"recognition",
"excellence"
],
"type": "string",
"description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement."
},
"certificate_title": {
"type": "string",
"maxLength": 80,
"description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\"."
},
"recipient_template": {
"type": "string",
"maxLength": 200,
"description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last)."
}
}
}Use this when the user wants to check a mail merge before printing: see how their spreadsheet (CSV or Excel) or list fills a letter, certificate or envelope template, which template fields like {{First Name}} have no matching column, which columns were matched by a similar name (first_name for First Name), and which records have empty values. Returns the first 3 merged records (or from preview_from) and a missing-field report; no files. Does not send email, print, or make labels. Do not use for Outlook or Gmail email merges.
| Argument | Type | Description |
|---|---|---|
| date | string | Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known. |
| file | object | The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx. |
| names | array | Shortcut for a plain list of names (one column called Name), e.g. ["Ana Lopez", "Ben Okafor"]. Handy for certificates. |
| sheet | string | For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data. |
| style | string | Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic. |
| sender | array |
| Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. ["Riverbend Animal Shelter", "120 Elm St", "Springfield, IL 62701"]. |
| closing | string | Letters: closing line, e.g. "With gratitude,". Defaults to "Sincerely," unless the template already ends with a closing. Use "" for none. |
| records | array | Alternative to a file: the recipients typed as objects with the same keys, e.g. [{"First Name": "Ana", "Last Name": "Lopez", "Amount": 250}]. |
| signers | array | Certificates: up to 3 signature lines, e.g. [{"name": "Alan Brooks", "title": "Principal"}]. |
| subject | string | Letters: optional subject line printed as "Re: ...", may contain fields, e.g. "Your {{Year}} giving statement". |
| csv_text | string | Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. "First Name,Last Name,City\nAna,Lopez,Austin". |
| template | string | Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. "Dear {{First Name|Friend}},\n\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date. |
| field_map | object | Optional explicit links from template fields to column names when names differ, e.g. {"Gift": "Donation Amount (USD)"}. |
| has_header | boolean | Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true. |
| usps_style | boolean | Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false. |
| organization | string | Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School. |
| preview_from | integer | Record number to start the preview at, e.g. 1 (default) or 25 to check later rows. |
| body_template | string | Certificates: the line under the name, may contain fields, e.g. "for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}". |
| document_type* | string | What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter. |
| envelope_size | string | Envelopes: "10" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or "a7" for a 5-1/4 x 7-1/4 in invitation envelope. |
| missing_values | string | What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading). |
| presented_line | string | Certificates: the line above the name. Default "This certificate is proudly presented to" ("This certifies that" for completion). |
| signature_name | string | Letters: name printed under the closing, e.g. Maria Chen. |
| include_address | boolean | Letters: print the recipient address block above the salutation. Default true when the sheet has address columns. |
| signature_title | string | Letters: title under the signature name, e.g. Executive Director. |
| address_template | string | Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. "{{First Name}} {{Last Name}}\n{{Street}}\n{{City}}, {{State}} {{ZIP}}". Defaults to one built from the name, company and address columns. |
| certificate_kind | string | Certificates: sets the default title and wording, e.g. completion -> "Certificate of Completion". Default achievement. |
| certificate_title | string | Certificates: custom title, e.g. "Certificate of Appreciation" or "Volunteer of the Year". |
| recipient_template | string | Certificates: the name line, e.g. "{{First Name}} {{Last Name}}". Defaults to the Name column (or First + Last). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"document_type"
],
"properties": {
"date": {
"type": "string",
"maxLength": 30,
"description": "Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known."
},
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
},
"names": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 5000,
"description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates."
},
"sheet": {
"type": "string",
"maxLength": 100,
"description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data."
},
"style": {
"enum": [
"classic",
"gold",
"modern",
"deco"
],
"type": "string",
"description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic."
},
"sender": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 6,
"description": "Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. [\"Riverbend Animal Shelter\", \"120 Elm St\", \"Springfield, IL 62701\"]."
},
"closing": {
"type": "string",
"maxLength": 60,
"description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none."
},
"records": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
},
"maxItems": 5000,
"description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}]."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Signer name, e.g. Dr. Alan Brooks."
},
"title": {
"type": "string",
"maxLength": 80,
"description": "Signer title, e.g. Principal."
}
}
},
"maxItems": 3,
"description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}]."
},
"subject": {
"type": "string",
"maxLength": 300,
"description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\"."
},
"csv_text": {
"type": "string",
"maxLength": 400000,
"description": "Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. \"First Name,Last Name,City\\nAna,Lopez,Austin\"."
},
"template": {
"type": "string",
"maxLength": 20000,
"description": "Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. \"Dear {{First Name|Friend}},\\n\\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}\". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date."
},
"field_map": {
"type": "object",
"description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"has_header": {
"type": "boolean",
"description": "Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true."
},
"usps_style": {
"type": "boolean",
"description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false."
},
"organization": {
"type": "string",
"maxLength": 120,
"description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School."
},
"preview_from": {
"type": "integer",
"maximum": 20000,
"minimum": 1,
"description": "Record number to start the preview at, e.g. 1 (default) or 25 to check later rows."
},
"body_template": {
"type": "string",
"maxLength": 600,
"description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\"."
},
"document_type": {
"enum": [
"letter",
"certificate",
"envelope"
],
"type": "string",
"description": "What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter."
},
"envelope_size": {
"enum": [
"10",
"a7"
],
"type": "string",
"description": "Envelopes: \"10\" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or \"a7\" for a 5-1/4 x 7-1/4 in invitation envelope."
},
"missing_values": {
"enum": [
"leave_blank",
"skip_record",
"placeholder"
],
"type": "string",
"description": "What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading)."
},
"presented_line": {
"type": "string",
"maxLength": 120,
"description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion)."
},
"signature_name": {
"type": "string",
"maxLength": 100,
"description": "Letters: name printed under the closing, e.g. Maria Chen."
},
"include_address": {
"type": "boolean",
"description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns."
},
"signature_title": {
"type": "string",
"maxLength": 120,
"description": "Letters: title under the signature name, e.g. Executive Director."
},
"address_template": {
"type": "string",
"maxLength": 1000,
"description": "Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. \"{{First Name}} {{Last Name}}\\n{{Street}}\\n{{City}}, {{State}} {{ZIP}}\". Defaults to one built from the name, company and address columns."
},
"certificate_kind": {
"enum": [
"achievement",
"completion",
"participation",
"appreciation",
"recognition",
"excellence"
],
"type": "string",
"description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement."
},
"certificate_title": {
"type": "string",
"maxLength": 80,
"description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\"."
},
"recipient_template": {
"type": "string",
"maxLength": 200,
"description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last)."
}
}
}