Skip to content

Email Template API

Create, list, preview, and manage email templates with variable substitution using syntax.

Endpoints

MethodPathDescription
GET/api/email-templates/:orgId/listList templates (filterable by type)
GET/api/email-templates/:orgId/variables/:typeGet available variables for a template type
POST/api/email-templates/:orgId/createCreate a new template
GET/api/email-templates/:orgId/:templateIdGet template by ID
PUT/api/email-templates/:orgId/:templateId/updateUpdate a template
DELETE/api/email-templates/:orgId/:templateId/deleteDelete a template
POST/api/email-templates/:orgId/:templateId/previewPreview rendered template
POST/api/email-templates/:orgId/:templateId/set-defaultSet template as default for its type

Path Parameters

ParameterTypeDescription
orgIdstringOrganization ID
templateIdstringEmail template ID
typestringTemplate type (see below)

Query Parameters

EndpointParameterTypeDescription
ListtypestringFilter by template type

Template Types

TypeDescription
invoiceInvoice email
booking_confirmationBooking confirmation email
payment_receiptPayment receipt email
quoteQuotation email
welcome_guestGuest welcome email
checkout_summaryCheck-out summary email
customCustom template

List Templates

GET /api/email-templates/:orgId/list
GET /api/email-templates/:orgId/list?type=invoice

Response — 200 OK

json
{
  "success": true,
  "data": [
    {
      "_id": "66611b2c3d4e5f6a7b8c9d0e",
      "name": "Standard Invoice",
      "type": "invoice",
      "subject": "Invoice {{invoice_number}} from {{organization_name}}",
      "isDefault": true,
      "createdAt": "2026-02-20T08:00:00.000Z"
    },
    {
      "_id": "66611b2c3d4e5f6a7b8c9d0f",
      "name": "Booking Confirmation",
      "type": "booking_confirmation",
      "subject": "Booking Confirmed — {{booking_number}}",
      "isDefault": true,
      "createdAt": "2026-02-20T08:00:00.000Z"
    },
    {
      "_id": "66611b2c3d4e5f6a7b8c9d10",
      "name": "Payment Thank You",
      "type": "payment_receipt",
      "subject": "Payment Receipt — {{payment_number}}",
      "isDefault": true,
      "createdAt": "2026-02-20T08:00:00.000Z"
    }
  ]
}

Get Template Variables

GET /api/email-templates/:orgId/variables/:type

Example: GET /api/email-templates/:orgId/variables/invoice

Response — 200 OK

json
{
  "success": true,
  "data": {
    "type": "invoice",
    "variables": [
      { "key": "invoice_number", "description": "Invoice number (e.g. INV-1042)" },
      { "key": "invoice_date", "description": "Invoice date" },
      { "key": "due_date", "description": "Payment due date" },
      { "key": "guest_name", "description": "Guest full name" },
      { "key": "guest_email", "description": "Guest email address" },
      { "key": "room_number", "description": "Room number" },
      { "key": "check_in_date", "description": "Check-in date" },
      { "key": "check_out_date", "description": "Check-out date" },
      { "key": "subtotal", "description": "Subtotal before tax" },
      { "key": "tax_amount", "description": "Total tax amount" },
      { "key": "total_amount", "description": "Grand total" },
      { "key": "organization_name", "description": "Organization name" },
      { "key": "organization_email", "description": "Organization email" },
      { "key": "organization_phone", "description": "Organization phone" },
      { "key": "organization_address", "description": "Organization address" }
    ]
  }
}

Create Template

POST /api/email-templates/:orgId/create

Request Body

json
{
  "name": "Detailed Invoice",
  "type": "invoice",
  "subject": "Invoice {{invoice_number}} — {{organization_name}}",
  "headerColor": "#1a73e8",
  "headerText": "Tax Invoice",
  "bodyHtml": "<p>Dear {{guest_name}},</p><p>Please find your invoice <strong>{{invoice_number}}</strong> dated {{invoice_date}} attached.</p><table><tr><td>Room</td><td>{{room_number}}</td></tr><tr><td>Check-in</td><td>{{check_in_date}}</td></tr><tr><td>Check-out</td><td>{{check_out_date}}</td></tr><tr><td>Subtotal</td><td>{{subtotal}}</td></tr><tr><td>Tax</td><td>{{tax_amount}}</td></tr><tr><td><strong>Total</strong></td><td><strong>{{total_amount}}</strong></td></tr></table>",
  "footerText": "Thank you for staying with us! — {{organization_name}}"
}

Response — 201 Created

json
{
  "success": true,
  "message": "Email template created successfully",
  "data": {
    "_id": "66611b2c3d4e5f6a7b8c9d11",
    "name": "Detailed Invoice",
    "type": "invoice",
    "subject": "Invoice {{invoice_number}} — {{organization_name}}",
    "headerColor": "#1a73e8",
    "headerText": "Tax Invoice",
    "bodyHtml": "<p>Dear {{guest_name}},</p><p>Please find your invoice <strong>{{invoice_number}}</strong> dated {{invoice_date}} attached.</p><table><tr><td>Room</td><td>{{room_number}}</td></tr><tr><td>Check-in</td><td>{{check_in_date}}</td></tr><tr><td>Check-out</td><td>{{check_out_date}}</td></tr><tr><td>Subtotal</td><td>{{subtotal}}</td></tr><tr><td>Tax</td><td>{{tax_amount}}</td></tr><tr><td><strong>Total</strong></td><td><strong>{{total_amount}}</strong></td></tr></table>",
    "footerText": "Thank you for staying with us! — {{organization_name}}",
    "isDefault": false,
    "orgId": "663f1a2b3c4d5e6f7a8b9c0d",
    "createdAt": "2026-02-23T11:00:00.000Z",
    "updatedAt": "2026-02-23T11:00:00.000Z"
  }
}

Get Template by ID

GET /api/email-templates/:orgId/:templateId

Response — 200 OK

json
{
  "success": true,
  "data": {
    "_id": "66611b2c3d4e5f6a7b8c9d11",
    "name": "Detailed Invoice",
    "type": "invoice",
    "subject": "Invoice {{invoice_number}} — {{organization_name}}",
    "headerColor": "#1a73e8",
    "headerText": "Tax Invoice",
    "bodyHtml": "<p>Dear {{guest_name}},</p><p>Please find your invoice <strong>{{invoice_number}}</strong> dated {{invoice_date}} attached.</p><table><tr><td>Room</td><td>{{room_number}}</td></tr><tr><td>Check-in</td><td>{{check_in_date}}</td></tr><tr><td>Check-out</td><td>{{check_out_date}}</td></tr><tr><td>Subtotal</td><td>{{subtotal}}</td></tr><tr><td>Tax</td><td>{{tax_amount}}</td></tr><tr><td><strong>Total</strong></td><td><strong>{{total_amount}}</strong></td></tr></table>",
    "footerText": "Thank you for staying with us! — {{organization_name}}",
    "isDefault": false,
    "orgId": "663f1a2b3c4d5e6f7a8b9c0d",
    "createdAt": "2026-02-23T11:00:00.000Z",
    "updatedAt": "2026-02-23T11:00:00.000Z"
  }
}

Update Template

PUT /api/email-templates/:orgId/:templateId/update

Request Body

json
{
  "name": "Detailed Invoice v2",
  "subject": "Invoice {{invoice_number}} — Due {{due_date}}",
  "headerColor": "#0d47a1",
  "footerText": "Payment due by {{due_date}}. Contact us at {{organization_email}}."
}

Response — 200 OK

json
{
  "success": true,
  "message": "Email template updated successfully",
  "data": {
    "_id": "66611b2c3d4e5f6a7b8c9d11",
    "name": "Detailed Invoice v2",
    "type": "invoice",
    "subject": "Invoice {{invoice_number}} — Due {{due_date}}",
    "headerColor": "#0d47a1",
    "headerText": "Tax Invoice",
    "bodyHtml": "<p>Dear {{guest_name}},</p>...",
    "footerText": "Payment due by {{due_date}}. Contact us at {{organization_email}}.",
    "isDefault": false,
    "orgId": "663f1a2b3c4d5e6f7a8b9c0d",
    "createdAt": "2026-02-23T11:00:00.000Z",
    "updatedAt": "2026-02-23T13:00:00.000Z"
  }
}

Delete Template

DELETE /api/email-templates/:orgId/:templateId/delete

Response — 200 OK

json
{
  "success": true,
  "message": "Email template deleted successfully"
}

Preview Template

POST /api/email-templates/:orgId/:templateId/preview

Renders the template with sample data. Optionally override specific variables.

Request Body

json
{
  "sampleData": {
    "invoice_number": "INV-1042",
    "invoice_date": "2026-02-23",
    "due_date": "2026-03-05",
    "guest_name": "Arjun Mehta",
    "guest_email": "arjun@example.com",
    "room_number": "101",
    "check_in_date": "2026-02-20",
    "check_out_date": "2026-02-23",
    "subtotal": "₹15,000",
    "tax_amount": "₹2,700",
    "total_amount": "₹17,700",
    "organization_name": "Grand Palace Hotel",
    "organization_email": "info@grandpalace.com",
    "organization_phone": "+91-9876543210",
    "organization_address": "12 Marine Drive, Mumbai"
  }
}

Response — 200 OK

json
{
  "success": true,
  "data": {
    "subject": "Invoice INV-1042 — Due 2026-03-05",
    "html": "<div style=\"background:#0d47a1;color:#fff;padding:20px\"><h1>Tax Invoice</h1></div><p>Dear Arjun Mehta,</p><p>Please find your invoice <strong>INV-1042</strong> dated 2026-02-23 attached.</p><table><tr><td>Room</td><td>101</td></tr><tr><td>Check-in</td><td>2026-02-20</td></tr><tr><td>Check-out</td><td>2026-02-23</td></tr><tr><td>Subtotal</td><td>₹15,000</td></tr><tr><td>Tax</td><td>₹2,700</td></tr><tr><td><strong>Total</strong></td><td><strong>₹17,700</strong></td></tr></table><footer>Payment due by 2026-03-05. Contact us at info@grandpalace.com.</footer>"
  }
}

Set Default Template

POST /api/email-templates/:orgId/:templateId/set-default

Sets this template as the default for its type. Any previously default template of the same type is unset.

Response — 200 OK

json
{
  "success": true,
  "message": "Template set as default for type 'invoice'",
  "data": {
    "_id": "66611b2c3d4e5f6a7b8c9d11",
    "name": "Detailed Invoice v2",
    "type": "invoice",
    "isDefault": true
  }
}

Released under the MIT License.