Rent due reminders on WhatsApp
Three days before rent is due, each tenant gets a polite WhatsApp reminder with the amount and date.
How it works
- Read the Tenants sheet (tenant, phone, unit, rent, due day).
- Keep active tenants whose rent is due in 3 days.
- Send each a WhatsApp template with the unit, amount and due date.
Diagram
Code
JavaScript used in the Code step — already included in the template below.
// Tenants sheet columns: tenant | phone | unit | rent | due_day (1-31) | status
// Keeps active tenants whose rent is due in 3 days.
const due = new Date(Date.now() + 3 * 24 * 60 * 60 * 1000);
const dueDay = due.getDate();
const lastDay = new Date(due.getFullYear(), due.getMonth() + 1, 0).getDate();
return $input.all()
.map((item) => item.json)
.filter((t) => String(t.status).toLowerCase() === "active" && t.phone)
// A due_day of 31 in a 30-day month falls on the last day.
.filter((t) => Math.min(Number(t.due_day), lastDay) === dueDay)
.map((t) => ({
json: {
phone: String(t.phone).replace(/[^0-9]/g, ""),
tenant: t.tenant,
unit: t.unit,
rent: t.rent,
due_date: due.toISOString().slice(0, 10),
},
}));Build it
Pick your tool — same automation, step by step.
Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder.
Show code (162 lines)
{
"name": "Rent due reminders on WhatsApp (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## Rent due reminders on WhatsApp\nThree days before rent is due, each tenant gets a polite WhatsApp reminder with the amount and date.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "47157a09-cc7b-46e4-a14f-bed2240b4e25",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"id": "47157a09-cc7b-46e4-a14f-bed2240b4e25",
"name": "Every day 10:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
]
},
{
"parameters": {
"operation": "read",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Tenants",
"mode": "name"
},
"options": {}
},
"id": "47157a09-cc7b-46e4-a14f-bed2240b4e25",
"name": "Read tenants",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
300,
0
]
},
{
"parameters": {
"jsCode": "// Tenants sheet columns: tenant | phone | unit | rent | due_day (1-31) | status\n// Keeps active tenants whose rent is due in 3 days.\nconst due = new Date(Date.now() + 3 * 24 * 60 * 60 * 1000);\nconst dueDay = due.getDate();\nconst lastDay = new Date(due.getFullYear(), due.getMonth() + 1, 0).getDate();\n\nreturn $input.all()\n .map((item) => item.json)\n .filter((t) => String(t.status).toLowerCase() === \"active\" && t.phone)\n // A due_day of 31 in a 30-day month falls on the last day.\n .filter((t) => Math.min(Number(t.due_day), lastDay) === dueDay)\n .map((t) => ({\n json: {\n phone: String(t.phone).replace(/[^0-9]/g, \"\"),\n tenant: t.tenant,\n unit: t.unit,\n rent: t.rent,\n due_date: due.toISOString().slice(0, 10),\n },\n }));"
},
"id": "47157a09-cc7b-46e4-a14f-bed2240b4e25",
"name": "Rent due in 3 days",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
0
]
},
{
"parameters": {
"operation": "sendTemplate",
"phoneNumberId": "YOUR_PHONE_NUMBER_ID",
"recipientPhoneNumber": "={{ $json.phone }}",
"template": "YOUR_RENT_REMINDER_TEMPLATE|ar",
"components": {
"component": [
{
"type": "body",
"bodyParameters": {
"parameter": [
{
"type": "text",
"text": "={{ $json.tenant }}"
},
{
"type": "text",
"text": "={{ $json.unit }}"
},
{
"type": "text",
"text": "={{ $json.rent }}"
},
{
"type": "text",
"text": "={{ $json.due_date }}"
}
]
}
}
]
}
},
"id": "47157a09-cc7b-46e4-a14f-bed2240b4e25",
"name": "Send reminder",
"type": "n8n-nodes-base.whatsApp",
"typeVersion": 1,
"position": [
900,
0
]
}
],
"connections": {
"Every day 10:00": {
"main": [
[
{
"node": "Read tenants",
"type": "main",
"index": 0
}
]
]
},
"Read tenants": {
"main": [
[
{
"node": "Rent due in 3 days",
"type": "main",
"index": 0
}
]
]
},
"Rent due in 3 days": {
"main": [
[
{
"node": "Send reminder",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}In Make, create a new scenario and add these modules in order:
- Schedule the scenario: Every day 10:00
- Google Sheets › Search Rows
- Tools › Set variable / Iterator + Array aggregator (same logic as the Code step)
- WhatsApp Business Cloud › Send a Template Message
- Every module run uses Make operations — the free plan includes a monthly quota.
- Make's built-in functions (map, sum, formatDate…) can replace most Code steps; for complex logic use a code module.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Schedule by Zapier — Every day 10:00
- Google Sheets — Lookup Spreadsheet Rows (or Code by Zapier)
- Code by Zapier — Run JavaScript (paste the code from the Code section)
- WhatsApp — Send Template Message
- Zaps with more than two steps need a paid Zapier plan.
- Webhooks, Filters/Paths and Code by Zapier are premium features on some Zapier plans.
- Code by Zapier runs JavaScript: reuse the code shown above, reading inputs from inputData instead of $json.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Include your payment details (InstaPay, bank transfer) in the template.
Related flows
Send new listings to matching buyers on WhatsApp
When you add a listing, every opted-in buyer whose area, type and budget match gets it on WhatsApp.
Property inquiries straight to your agent's phone
Website and portal inquiries are saved as leads and sent to the agent on Telegram within seconds.
Bosta delivery updates to customers on WhatsApp
Customers get a WhatsApp message when their Bosta shipment is picked up, out for delivery or delivered.