This workflow follows the HTTP Request → Slack recipe pattern — see all workflows that pair these two integrations.
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": "T+3 \u2014 Onboarding Email + Portal Activity (KAIA-756)",
"nodes": [
{
"id": "kairikos-tp3-trigger",
"name": "T+3 Trigger (Schedule)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [
250,
300
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * *"
}
]
}
}
},
{
"id": "kairikos-tp3-verify",
"name": "Verify Webhook Signature",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
470,
300
],
"parameters": {
"jsCode": "// HMAC-SHA256 verification against N8N_WEBHOOK_SHARED_SECRET.\n// Tally signs its webhooks with a shared secret configured per-form.\nconst crypto = require('crypto');\nconst secret = $env.N8N_WEBHOOK_SHARED_SECRET;\nif (!secret) { throw new Error('N8N_WEBHOOK_SHARED_SECRET not configured'); }\nconst sig = $input.first().headers['x-tally-signature'] || $input.first().headers['x-webhook-signature'] || '';\nconst raw = $input.first().binary?.data?.data\n ? Buffer.from($input.first().binary.data.data, 'base64').toString('utf8')\n : JSON.stringify($input.first().json);\nconst expected = crypto.createHmac('sha256', secret).update(raw).digest('hex');\ntry {\n if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {\n throw new Error('Invalid webhook signature');\n }\n} catch (e) {\n // Length mismatch also throws \u2014 treat as invalid.\n if (!(e instanceof Error && e.message.startsWith('Invalid'))) {\n throw new Error('Invalid webhook signature');\n }\n throw e;\n}\nreturn [{ json: $input.first().json }];"
}
},
{
"id": "kairikos-tp3-resolve",
"name": "Resolve Client (Prisma)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
690,
300
],
"parameters": {
"method": "POST",
"url": "={{ $env.PORTAL_API_URL }}/api/internal/lookup-client",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Kairikos-Internal-Key",
"value": "={{ $env.PORTAL_API_KEY }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"body": "={{ JSON.stringify({ email: $json.fields?.email || $json.email || $json.body?.fields?.email }) }}",
"options": {
"timeout": 15000,
"retry": {
"maxTries": 3,
"waitBetween": 5000
}
}
}
},
{
"id": "kairikos-tp3-send-email",
"name": "Send T+3 Email (Resend)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
910,
300
],
"parameters": {
"method": "POST",
"url": "https://api.resend.com/emails",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "resendApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "from",
"value": "Kairikos <hola@kairikos.com>"
},
{
"name": "to",
"value": "={{ $json.contactEmail }}"
},
{
"name": "subject",
"value": "T+3 \u2014 \u00bfC\u00f3mo vas con la configuraci\u00f3n?"
},
{
"name": "template",
"value": "t-plus-3-followup-v1"
},
{
"name": "data.company_name",
"value": "={{ $json.companyName }}"
}
]
},
"options": {
"timeout": 30000,
"retry": {
"maxTries": 3,
"waitBetween": 5000
}
}
}
},
{
"id": "kairikos-tp3-write-activity",
"name": "Write Activity to Portal",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1130,
300
],
"parameters": {
"method": "POST",
"url": "={{ $env.PORTAL_API_URL }}/api/internal/activity",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Kairikos-Internal-Key",
"value": "={{ $env.PORTAL_API_KEY }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"body": "={{ JSON.stringify({ clientId: $('Resolve Client (Prisma)').item.json.clientId, milestone: 'T+3', completedAt: new Date().toISOString(), notes: {\\\"email_subject\\\":\\\"T+3 \u2014 \u00bfC\u00f3mo vas con la configuraci\u00f3n?\\\",\\\"send_status\\\":\\\"sent\\\",\\\"provider\\\":\\\"resend\\\",\\\"email_message_id\\\":\\\"${{ $json.id }}\\\",\\\"template\\\":\\\"t-plus-3-followup-v1\\\",\\\"locale\\\":\\\"es-ES\\\"} }) }}",
"options": {
"timeout": 15000,
"retry": {
"maxTries": 3,
"waitBetween": 5000
}
}
}
},
{
"id": "kairikos-tp3-slack-err",
"name": "Notify Slack on Error",
"type": "n8n-nodes-base.slack",
"typeVersion": 2,
"position": [
910,
520
],
"parameters": {
"channel": "#automation-alerts",
"text": ":rotating_light: T+3 flow failed for client `{{ $json.clientId || 'unknown' }}` after 3 retries. Last error: {{ $json.error }}",
"otherOptions": {
"includeLinkToWorkflow": true
}
}
}
],
"connections": {
"T+3 Trigger (Schedule)": {
"main": [
[
{
"node": "Verify Webhook Signature",
"type": "main",
"index": 0
}
]
]
},
"Verify Webhook Signature": {
"main": [
[
{
"node": "Resolve Client (Prisma)",
"type": "main",
"index": 0
}
]
]
},
"Resolve Client (Prisma)": {
"main": [
[
{
"node": "Send T+3 Email (Resend)",
"type": "main",
"index": 0
}
]
],
"error": [
[
{
"node": "Notify Slack on Error",
"type": "main",
"index": 0
}
]
]
},
"Send T+3 Email (Resend)": {
"main": [
[
{
"node": "Write Activity to Portal",
"type": "main",
"index": 0
}
]
],
"error": [
[
{
"node": "Notify Slack on Error",
"type": "main",
"index": 0
}
]
]
},
"Write Activity to Portal": {
"error": [
[
{
"node": "Notify Slack on Error",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveExecutionProgress": true,
"saveManualExecutions": true,
"timezone": "Europe/Madrid"
},
"staticData": null,
"meta": {
"template": "kairikos-portal-internal-activity",
"templateVersion": "1.0",
"dayOffset": 3,
"milestone": "T+3",
"author": "Automation Engineer",
"linkedIssue": "KAIA-756",
"triggerDescription": "Daily schedule, fires once per row flagged with `nextRunAt <= now()`."
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
T+3 — Onboarding Email + Portal Activity (KAIA-756). Uses httpRequest, slack. Scheduled trigger; 6 nodes.
Source: https://github.com/lagop/kairikos-chatbotAI-dash/blob/c78c8d645b75d0404898f7ced390bd7c003a8823/automations/portal-internal-activity/t-3-portal.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.
Bet Assistant - Monitoring i Alerty Systemu. Uses httpRequest, slack, emailSend. Scheduled trigger; 10 nodes.
[DEPRECATED — use portal-internal-activity] T+7 — Follow-up (writes chatbot_activity). Uses httpRequest, slack. Scheduled trigger; 7 nodes.
[DEPRECATED — use portal-internal-activity] T+3 — Follow-up (writes chatbot_activity). Uses httpRequest, slack. Scheduled trigger; 7 nodes.
[DEPRECATED — use portal-internal-activity] T+14 — Follow-up (writes chatbot_activity). Uses httpRequest, slack. Scheduled trigger; 7 nodes.
T+7 — Onboarding Email + Portal Activity (KAIA-756). Uses httpRequest, slack. Scheduled trigger; 6 nodes.