The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Wy\u015blij mail transakcyjny przez mailstack",
"nodes": [
{
"id": "trigger",
"name": "When clicking Execute",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
300
],
"parameters": {}
},
{
"id": "config",
"name": "Configuration (EDIT ME)",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
300,
300
],
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "baseUrl",
"value": "https://mail.yourdomain.com",
"type": "string"
},
{
"id": "a2",
"name": "apiKey",
"value": "your-mailstack-api-key",
"type": "string"
},
{
"id": "a3",
"name": "brand",
"value": "acme",
"type": "string"
},
{
"id": "a4",
"name": "template",
"value": "payment",
"type": "string"
},
{
"id": "a5",
"name": "to",
"value": "customer@example.com",
"type": "string"
},
{
"id": "a6",
"name": "name",
"value": "Jane Smith",
"type": "string"
},
{
"id": "a7",
"name": "amount",
"value": "149.00",
"type": "string"
},
{
"id": "a8",
"name": "currency",
"value": "PLN",
"type": "string"
},
{
"id": "a9",
"name": "item",
"value": "Pro Plan",
"type": "string"
},
{
"id": "a10",
"name": "orderId",
"value": "ORD-7788",
"type": "string"
},
{
"id": "a11",
"name": "date",
"value": "2026-07-19",
"type": "string"
},
{
"id": "a12",
"name": "invoiceUrl",
"value": "https://example.com/invoice/ORD-7788.pdf",
"type": "string"
},
{
"id": "a13",
"name": "orderUrl",
"value": "https://example.com/orders/ORD-7788",
"type": "string"
}
]
},
"includeOtherFields": false,
"options": {}
}
},
{
"id": "build",
"name": "Build request body",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
300
],
"parameters": {
"jsCode": "// Assemble the mailstack /v1/send body from Configuration, keeping baseUrl/apiKey\n// out of it (those configure the HTTP request itself, not the email content).\nconst c = $input.first().json;\nconst body = {\n brand: c.brand,\n template: c.template,\n to: c.to,\n name: c.name,\n amount: c.amount,\n currency: c.currency,\n item: c.item,\n orderId: c.orderId,\n date: c.date,\n invoiceUrl: c.invoiceUrl,\n orderUrl: c.orderUrl,\n};\nreturn [{ json: { baseUrl: c.baseUrl, apiKey: c.apiKey, body } }];"
}
},
{
"id": "send",
"name": "Send email via mailstack",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
900,
300
],
"onError": "continueRegularOutput",
"parameters": {
"method": "POST",
"url": "={{ $json.baseUrl }}/v1/send",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $json.apiKey }}"
}
]
},
"sendBody": true,
"contentType": "json",
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify($json.body) }}",
"options": {}
}
},
{
"id": "st0",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-60,
-420
],
"parameters": {
"content": "## Wysy\u0142aj self-hostowane maile transakcyjne przez mailstack\n\n[mailstack](https://github.com/jurczykpawel/mailstack) to darmowy, samodzielnie hostowany wysy\u0142acz e-maili (Cloudflare Worker + Amazon SES), kt\u00f3ry wdra\u017casz raz i wywo\u0142ujesz sk\u0105dkolwiek - bez SaaS-owego API do maili, bez p\u0142acenia za sztuk\u0119, bez vendor lock-inu.\n\n### Jak to dzia\u0142a\n- Node **Configuration** trzyma adres mailstacka, klucz API i tre\u015b\u0107 maila (ten przyk\u0142ad wysy\u0142a potwierdzenie `payment` - mailstack ma te\u017c szablony `welcome`, `received` i `notice`).\n- **Build request body** buduje JSON, jakiego oczekuje mailstack (adres i klucz API zostaj\u0105 poza tre\u015bci\u0105 body).\n- **HTTP Request** wysy\u0142a POST na `/v1/send` z kluczem API jako Bearer token (tryb zaufany) - mailstack renderuje branded mail HTML+text i wysy\u0142a go przez Amazon SES.\n- Ustawienie `orderUrl` sprawia, \u017ce mailstack automatycznie dodaje przycisk akcji w Gmailu (\"Zobacz zam\u00f3wienie\") - bez dodatkowej konfiguracji.\n\n### Konfiguracja\n1. Wdr\u00f3\u017c mailstack (`git clone` + `wrangler deploy` - patrz README repo) i zanotuj jego adres oraz id brandu.\n2. Utw\u00f3rz klucz API: ustaw sekret `API_KEY` przez `wrangler secret put API_KEY`.\n3. Podmie\u0144 trigger **When clicking Execute** na w\u0142asny (webhook, formularz, event z CRM, cron...).\n4. Uzupe\u0142nij **Configuration (EDIT ME)**: `baseUrl`, `apiKey`, `brand` i pola maila.\n5. Uruchom raz - sprawd\u017a skrzynk\u0119 odbiorcy.\n\n### Wskaz\u00f3wki\nZmie\u0144 `template` na `welcome`, `received` lub `notice` dla innych typ\u00f3w maili (pola ka\u017cdego szablonu - patrz README mailstacka). Podepnij `to`/`name`/`amount`/itd. z danych triggera zamiast wpisywa\u0107 je na sztywno.\n",
"width": 1020,
"height": 340,
"color": 1
}
},
{
"id": "sec1",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-60,
160
],
"parameters": {
"content": "## 1. Co wys\u0142a\u0107\nUruchom flow, potem uzupe\u0142nij odbiorc\u0119, szablon i tre\u015b\u0107 w Configuration.",
"width": 480,
"height": 420,
"color": 7
}
},
{
"id": "sec2",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
560,
160
],
"parameters": {
"content": "## 2. Wy\u015blij\nZbuduj JSON, jakiego oczekuje mailstack, i wy\u015blij POST z kluczem API jako Bearer token.",
"width": 460,
"height": 420,
"color": 7
}
},
{
"id": "st1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
280,
620
],
"parameters": {
"content": "## Chro\u0144 sw\u00f3j klucz API\nKlucz API mailstacka odblokowuje tryb zaufany (dowolny odbiorca, dowolny szablon). W produkcji trzymaj go w credentials/zmiennych \u015brodowiskowych n8n - nie commituj workflowa z prawdziwym kluczem.",
"width": 300,
"height": 160,
"color": 3
}
}
],
"connections": {
"When clicking Execute": {
"main": [
[
{
"node": "Configuration (EDIT ME)",
"type": "main",
"index": 0
}
]
]
},
"Configuration (EDIT ME)": {
"main": [
[
{
"node": "Build request body",
"type": "main",
"index": 0
}
]
]
},
"Build request body": {
"main": [
[
{
"node": "Send email via mailstack",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Wyślij mail transakcyjny przez mailstack. Uses httpRequest. Event-driven trigger; 8 nodes.
Source: https://github.com/jurczykpawel/mailstack/blob/33cd942efbff78b7637f0a910bdbe1b6a9f44964/examples/n8n/workflows/send-transactional-email-PL.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow listens for an “Approved” label on a Trello card, reads the AI draft bookkeeping JSON from card comments, and posts the corresponding transaction to Xero. It then adds a Xero deep link b
02_LLM_Pipeline v1.0. Uses executeWorkflowTrigger, httpRequest, seaTable. Event-driven trigger; 65 nodes.
This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)