AutomationFlowsAI & RAG › Wf-004 Renewal Reminder

Wf-004 Renewal Reminder

WF-004 Renewal Reminder. Uses httpRequest, emailSend, supabase. Scheduled trigger; 8 nodes.

Cron / scheduled trigger★★★★☆ complexity8 nodesHTTP RequestEmail SendSupabase
AI & RAG Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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] + '&current_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 &mdash; 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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

WF-005 Overage Warning. Uses httpRequest, emailSend, supabase. Scheduled trigger; 11 nodes.

HTTP Request, Email Send, Supabase
AI & RAG

WF-008 Monthly Report. Uses supabase, httpRequest, emailSend. Scheduled trigger; 11 nodes.

Supabase, HTTP Request, Email Send
AI & RAG

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

HTTP Request, Email Send
AI & RAG

Tech Daily Digest. Uses rssFeedRead, emailSend, httpRequest. Scheduled trigger; 22 nodes.

RSS Feed Read, Email Send, HTTP Request
AI & RAG

Ai Assistant Agent Full Workflow. Uses supabase, httpRequest, emailSend. Webhook trigger; 18 nodes.

Supabase, HTTP Request, Email Send