This workflow follows the Emailsend → HTTP Request 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": "WF-004 Renewal Reminder",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * *"
}
]
}
},
"id": "wf004-node-schedule",
"name": "Daily 9AM ET",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
300
]
},
{
"parameters": {
"method": "GET",
"url": "https://yepggeqhtspgzlkhqhgo.supabase.co/rest/v1/tenants",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "supabaseApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Prefer",
"value": "return=representation"
}
]
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "subscription_status",
"value": "eq.active"
},
{
"name": "current_period_end",
"value": "={{ 'gte.' + new Date().toISOString().split('T')[0] + '¤t_period_end=lte.' + new Date(Date.now() + 3 * 86400000).toISOString().split('T')[0] }}"
},
{
"name": "select",
"value": "*"
}
]
}
},
"id": "wf004-node-get-renewing",
"name": "Get Tenants Renewing in 3 Days",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
250,
300
],
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "wf004-cond-1",
"leftValue": "={{ $input.all().length }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gt"
}
}
],
"combinator": "and"
}
},
"id": "wf004-node-if-results",
"name": "Has Renewing Tenants?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
500,
300
]
},
{
"parameters": {
"batchSize": 1,
"options": {}
},
"id": "wf004-node-loop",
"name": "Loop Over Tenants",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
750,
300
]
},
{
"parameters": {
"method": "GET",
"url": "https://yepggeqhtspgzlkhqhgo.supabase.co/rest/v1/usage_monthly",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "supabaseApi",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "tenant_id",
"value": "={{ 'eq.' + $json.id }}"
},
{
"name": "year_month",
"value": "={{ 'eq.' + new Date().getFullYear() + '-' + String(new Date().getMonth() + 1).padStart(2, '0') }}"
},
{
"name": "select",
"value": "*"
}
]
}
},
"id": "wf004-node-get-usage",
"name": "Get Tenant Usage Stats",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1000,
300
],
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Build renewal reminder email template\nconst items = $input.all();\nconst tenant = $('Loop Over Tenants').item.json;\nconst usageData = items.length > 0 && items[0].json ? items[0].json : {};\n\nconst companyName = tenant.company_name || 'Valued Customer';\nconst plan = tenant.plan || 'Standard';\nconst renewalDate = tenant.current_period_end\n ? new Date(tenant.current_period_end).toLocaleDateString('en-US', {\n year: 'numeric', month: 'long', day: 'numeric'\n })\n : 'soon';\n\nconst totalCalls = usageData.total_calls || 0;\nconst totalMinutes = usageData.total_minutes || 0;\nconst answered = usageData.answered || 0;\nconst missed = usageData.missed || 0;\nconst escalations = usageData.escalations || 0;\nconst answerRate = totalCalls > 0 ? Math.round((answered / totalCalls) * 100) : 0;\n\nconst ownerEmail = tenant.owner_email || tenant.contact_email || '';\n\nconst subject = `Renewal Reminder: Your TitleFlow AI ${plan} plan renews on ${renewalDate}`;\n\nconst htmlBody = `\n<div style=\"font-family: 'Inter', Arial, sans-serif; max-width: 600px; margin: 0 auto; background: #000000; color: #ffffff; border-radius: 16px; overflow: hidden;\">\n <div style=\"background: linear-gradient(135deg, #0080FF, #4F1AD6); padding: 32px; text-align: center;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 700;\">TitleFlow AI</h1>\n <p style=\"margin: 8px 0 0; opacity: 0.9; font-size: 14px;\">Subscription Renewal Reminder</p>\n </div>\n <div style=\"padding: 32px;\">\n <p style=\"font-size: 16px; line-height: 1.6;\">Hi <strong>${companyName}</strong>,</p>\n <p style=\"font-size: 14px; line-height: 1.6; color: #cccccc;\">Your <strong>${plan}</strong> plan is set to renew on <strong>${renewalDate}</strong>. Here's a summary of your usage this billing period:</p>\n \n <div style=\"background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; padding: 20px; margin: 20px 0;\">\n <table style=\"width: 100%; border-collapse: collapse; color: #ffffff; font-size: 14px;\">\n <tr><td style=\"padding: 8px 0;\">Total Calls</td><td style=\"text-align: right; font-weight: 700; color: #00D9FF;\">${totalCalls}</td></tr>\n <tr><td style=\"padding: 8px 0;\">Total Minutes</td><td style=\"text-align: right; font-weight: 700; color: #00D9FF;\">${totalMinutes}</td></tr>\n <tr><td style=\"padding: 8px 0;\">Answer Rate</td><td style=\"text-align: right; font-weight: 700; color: #00D9FF;\">${answerRate}%</td></tr>\n <tr><td style=\"padding: 8px 0;\">Missed Calls</td><td style=\"text-align: right; font-weight: 700; color: #00D9FF;\">${missed}</td></tr>\n <tr><td style=\"padding: 8px 0;\">Escalations</td><td style=\"text-align: right; font-weight: 700; color: #00D9FF;\">${escalations}</td></tr>\n </table>\n </div>\n \n <p style=\"font-size: 14px; color: #999999; line-height: 1.6;\">No action is needed if you'd like to continue. To update your plan or billing details, visit your dashboard.</p>\n \n <div style=\"text-align: center; margin-top: 24px;\">\n <a href=\"https://www.titleflowai.ai/dashboard/billing\" style=\"display: inline-block; background: linear-gradient(135deg, #0080FF, #4F1AD6); color: #ffffff; text-decoration: none; padding: 12px 32px; border-radius: 999px; font-weight: 600; font-size: 14px;\">Manage Subscription</a>\n </div>\n </div>\n <div style=\"padding: 16px 32px; text-align: center; font-size: 12px; color: #666666; border-top: 1px solid rgba(255,255,255,0.05);\">\n <p style=\"margin: 0;\">TitleFlow AI AI — Automating title industry communications</p>\n </div>\n</div>`;\n\nreturn [\n {\n json: {\n to: ownerEmail,\n subject: subject,\n html: htmlBody,\n tenant_id: tenant.id,\n company_name: companyName,\n renewal_date: tenant.current_period_end\n }\n }\n];"
},
"id": "wf004-node-build-email",
"name": "Build Renewal Email",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1250,
300
]
},
{
"parameters": {
"fromEmail": "user@example.com",
"toEmail": "={{ $json.to }}",
"subject": "={{ $json.subject }}",
"emailType": "html",
"html": "={{ $json.html }}"
},
"id": "wf004-node-send-email",
"name": "Send Renewal Reminder",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [
1500,
300
],
"credentials": {
"smtp": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "create",
"tableId": "notifications",
"dataToSend": "defineBelow",
"fieldsUi": {
"fieldValues": [
{
"fieldName": "tenant_id",
"fieldValue": "={{ $('Build Renewal Email').item.json.tenant_id }}"
},
{
"fieldName": "type",
"fieldValue": "renewal_reminder"
},
{
"fieldName": "title",
"fieldValue": "Renewal Reminder Sent"
},
{
"fieldName": "message",
"fieldValue": "={{ 'Renewal reminder sent to ' + $('Build Renewal Email').item.json.company_name + ' for renewal date ' + $('Build Renewal Email').item.json.renewal_date }}"
},
{
"fieldName": "channel",
"fieldValue": "email"
},
{
"fieldName": "sent_at",
"fieldValue": "={{ new Date().toISOString() }}"
}
]
}
},
"id": "wf004-node-log-notification",
"name": "Log Notification",
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
1750,
300
],
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Daily 9AM ET": {
"main": [
[
{
"node": "Get Tenants Renewing in 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Get Tenants Renewing in 3 Days": {
"main": [
[
{
"node": "Has Renewing Tenants?",
"type": "main",
"index": 0
}
]
]
},
"Has Renewing Tenants?": {
"main": [
[
{
"node": "Loop Over Tenants",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Tenants": {
"main": [
null,
[
{
"node": "Get Tenant Usage Stats",
"type": "main",
"index": 0
}
]
]
},
"Get Tenant Usage Stats": {
"main": [
[
{
"node": "Build Renewal Email",
"type": "main",
"index": 0
}
]
]
},
"Build Renewal Email": {
"main": [
[
{
"node": "Send Renewal Reminder",
"type": "main",
"index": 0
}
]
]
},
"Send Renewal Reminder": {
"main": [
[
{
"node": "Log Notification",
"type": "main",
"index": 0
}
]
]
},
"Log Notification": {
"main": [
[
{
"node": "Loop Over Tenants",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true,
"callerPolicy": "workflowsFromSameOwner",
"timezone": "America/New_York"
},
"meta": {
"templateCredsSetupCompleted": false
},
"active": false,
"tags": [
{
"name": "renewal"
},
{
"name": "email"
},
{
"name": "billing"
}
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
smtpsupabaseApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
WF-004 Renewal Reminder. Uses httpRequest, emailSend, supabase. Scheduled trigger; 8 nodes.
Source: https://github.com/rafiulislam4246/voice-sdr-title-agent/blob/main/app/n8n-workflows/WF-004-renewal-reminder.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.
WF-005 Overage Warning. Uses httpRequest, emailSend, supabase. Scheduled trigger; 11 nodes.
WF-008 Monthly Report. Uses supabase, httpRequest, emailSend. Scheduled trigger; 11 nodes.
Monitors brand mentions across Twitter/X, Reddit, and News APIs in real-time (or scheduled), fetches mentions in parallel, normalizes data, uses AI to analyze sentiment/urgency/topics, detects duplica
Tech Daily Digest. Uses rssFeedRead, emailSend, httpRequest. Scheduled trigger; 22 nodes.
Ai Assistant Agent Full Workflow. Uses supabase, httpRequest, emailSend. Webhook trigger; 18 nodes.