Google Sheets to Gmail, listing follow ups sent
Your listings don’t usually “die.” They just go quiet, and then they slip off the radar. Next thing you know, 30 days turned into 60, and you’re staring at a spreadsheet wondering who to message, what to say, and how many you missed.
This is where Sheets Gmail followups automation earns its keep. Real estate agents feel it first, but broker team leads and marketing coordinators end up doing the cleanup too. You get consistent re-engagement emails going out automatically, without spending your morning sorting rows and rewriting the same “checking in” draft.
Below, you’ll see exactly how the workflow runs in n8n, what it produces, and what you need to set it up so follow-ups happen on schedule (even when you’re busy).
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Gmail, listing follow ups sent
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Get Listings", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check 30 Days", pos: "b", h: 48 }
n2@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "OpenAI", pos: "b", h: 48 }
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3 --> n2
n0 --> n1
n1 --> n3
n4 --> n0
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n4 trigger
class n3 ai
class n1 decision
class n0 database
The Problem: Inactive listings don’t follow themselves up
When listing activity slows down, the right follow-up can revive it. The problem is that “right follow-up” usually lives in someone’s head, or in a half-finished Gmail draft, or in a spreadsheet column you meant to update last week. You end up doing a manual scan for last_activity dates, then copying emails into Gmail one by one, then rewriting the same message so it sounds personal. It’s not hard work. It’s exhausting work, and it’s easy to get wrong when you’re rushing.
The friction compounds. Here’s where it breaks down most often.
- You notice inactive listings too late, which means the owner has already mentally moved on.
- Each “quick email” turns into 10 minutes of editing, because you want it to feel tailored.
- Manual filtering in Google Sheets invites mistakes, especially when multiple people touch the same file.
- There’s no consistent follow-up standard, so owners get different experiences depending on who had time that day.
The Solution: Auto-detect inactivity and send a personalized email
This n8n workflow watches your listings sheet and handles the follow-up loop for you. On a schedule you choose, it reads rows from Google Sheets, checks each listing’s last_activity date, and filters down to the ones that have gone quiet for 30+ days. For each inactive listing, it uses OpenAI (GPT-4) to draft a message that includes the owner’s name, the property type, and the location, so it doesn’t read like a template. Then it sends that email via Gmail to the owner’s address. If you want, you can also update the row status in Google Sheets after sending, so you have a clean audit trail of who was contacted and when.
The workflow starts with a scheduled trigger, then pulls listing records from Google Sheets. Next, an IF check validates the 30-day lapse and routes only the inactive rows into the AI email composer. Finally, Gmail dispatches the finished follow-up email to the owner automatically.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your sheet tracks 60 active and recently active listings, and about 15 go quiet each week. Manually, you might spend 5 minutes per listing to filter dates, open Gmail, write something personal, and send it, which is about an hour and a half. With this workflow, you spend maybe 10 minutes double-checking the sheet and letting the schedule run, then the emails go out after the AI drafts are generated. That’s roughly an hour back weekly, plus fewer missed re-engagement opportunities.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store listing rows and activity dates
- Gmail to send follow-up emails from your account
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Beginner. You’ll connect accounts, map a few fields, and test with sample rows.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled check starts the workflow. You decide how often it runs (daily is common, weekly also works if volume is lower). Once it fires, n8n immediately pulls your latest listing data.
Listing rows are retrieved from Google Sheets. The workflow reads each row with fields like title, owner_name, email, property_type, location, and last_activity, so every decision is based on your source of truth.
Inactive listings get filtered automatically. An IF check validates that last_activity is older than 30 days, which keeps active owners from getting annoying “just checking in” messages.
OpenAI drafts, then Gmail sends. For each inactive row, the AI email composer generates a message that uses the owner and listing details, and the Gmail step dispatches it to the right address from your account.
You can easily modify the 30-day threshold to 14 days (or 45) based on your market and sales cycle. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run automatically every 30 days to check for inactive listings.
- Add the Scheduled Automation Start node as your trigger.
- Set Interval to
Every 30 daysby configuring Rule → Interval → Days Interval to30. - Connect Scheduled Automation Start to Retrieve Listing Records.
Step 2: Connect Google Sheets
Pull listing records from your Google Sheet to evaluate inactivity.
- Select the Retrieve Listing Records node.
- Choose the Document and Sheet Name for your listing data (both are currently blank and must be set).
- Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Ensure your sheet includes fields like
owner_name,title,location,property_type, andlast_activity.
Step 3: Set Up Listing Inactivity Logic
Filter for listings that have been inactive for more than 30 days.
- Open the Validate 30-Day Lapse node.
- Set the condition to compare Value 1 as
{{ Date.now() - new Date($json["last_activity"]).getTime() }}and Value 2 to2592000000. - Set the Operation to
>so only listings older than 30 days pass. - Connect Retrieve Listing Records to Validate 30-Day Lapse, then connect the true output to AI Email Composer.
⚠️ Common Pitfall: Ensure last_activity is in a valid date format. Invalid dates will cause the time comparison to fail and no emails will be sent.
Step 4: Set Up AI Email Generation
Use AI to craft a personalized re-engagement email for each inactive listing.
- Select the AI Email Composer node.
- Choose your Model from the Model ID dropdown (currently blank).
- Verify the message content includes the expression-based prompt, including
{{$json["title"]}},{{$json["owner_name"]}},{{$json["property_type"]}},{{$json["location"]}}, and{{$json["last_activity"]}}. - Credential Required: Connect your openAiApi credentials.
- Connect AI Email Composer to Dispatch Owner Email.
Step 5: Configure Email Delivery
Send the AI-generated or template email to the property owner via Gmail.
- Open the Dispatch Owner Email node.
- Set Subject to
Your Property Listing Is About to Expire. - Set Message to the provided template, which uses expressions like
{{$json["owner_name"]}},{{$json["title"]}},{{$json["location"]}},{{$json["last_activity"]}}, and{{$json["property_type"]}}. - Credential Required: Connect your gmailOAuth2 credentials.
Step 6: Test and Activate Your Workflow
Validate the workflow with a manual run before turning it on for scheduled use.
- Click Execute Workflow to run the flow manually.
- Confirm that Retrieve Listing Records pulls rows and Validate 30-Day Lapse filters correctly.
- Verify that AI Email Composer generates a complete email and Dispatch Owner Email sends it successfully.
- Once verified, switch the workflow status to Active to enable the 30-day scheduled runs.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection in n8n credentials first, then verify the sheet is shared with the right Google account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Sheet columns are already in place.
No. You’ll mainly connect Google accounts and map fields from your Sheet into the email prompt.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs, which are usually a few cents per email depending on your prompt size.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the easiest tweaks. Change the “Validate 30-Day Lapse” IF condition to 14 days for more aggressive follow-up, or 45+ days if you want fewer touches. You can also adjust the AI Email Composer prompt to match your tone, add a second message for “90+ days inactive,” or route high-value listings to a different template. If you track status in the sheet, updating a “followed_up” column is a simple add-on too.
Most of the time it’s an expired Google authorization in n8n. Reconnect your Gmail credential, then confirm the sending account still has permission to send mail (especially if it’s a shared inbox). If the workflow runs but no emails arrive, double-check the email column in Google Sheets and test with a single known-good address. Occasionally, Google will temporarily block sending if you trigger a burst of messages too quickly, so spacing runs out can help.
A few hundred listings per run is normal, and scaling up mostly depends on how many emails you send in one batch.
It depends, but n8n is usually a better fit when you want control over filtering logic and AI prompting in the same workflow. Zapier and Make can do the basics, yet complex branching and looping can get pricey or awkward as volume grows. With n8n, you can self-host for unlimited executions and keep everything in one place, which is handy when your sheet has lots of rows. If you only need a simple “if older than 30 days then send email” and your volume is tiny, Zapier may be faster to click together. Talk to an automation expert if you want a quick recommendation based on your weekly listing count.
Once this is running, inactive listings stop being a nagging spreadsheet task and start becoming a steady, automatic touchpoint. Set it up, let it work, and spend your follow-up energy where it actually matters.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.