Hi all, sharing a workflow I use in my freelance business.
What it does
- Schedule trigger every day at 11:00
- Reads a “Projects” Google Sheet
- Picks rows with status = Completed, completed 2+ days ago, and no review requested yet
- Sends a short, personal thank-you email with your Google review link
- Writes today’s date back to the row, so nobody is asked twice
One gotcha I hit: new Date('2026-10-25') is UTC midnight, so for anyone east of UTC (I’m in India) the date shifts back a day and the 2-day filter silently fails. The Code node parses YYYY-MM-DD as a local date to avoid that.
Workflow JSON + sheet template (free): Free n8n Review-Request Workflow
It’s part of a larger set I built (lead scoring, follow-ups, proposals, invoice reminders, weekly report, content repurposing). Happy to share details if useful. Feedback very welcome.
Nice workflow, Vivek! The timezone issue is an important catch, especially when filtering date-only values in n8n.
One additional safeguard worth considering is idempotency around the email step. If Gmail sends the message successfully but the workflow fails before updating the Sheet, the next scheduled run could send the same request again. A persistent request status or unique key, along with a clear sent timestamp, can help make retries safer.
It may also help to define the business timezone explicitly and test the 2-day boundary around midnight, rather than relying on the server’s default timezone.
Thanks for sharing the workflow!
1 個讚
Thanks Shital, really good catch. You’re right, if Gmail sends and the Sheet write fails, the next run would ask the same client again. I’ll change it to mark the row ‘sending’ before the Gmail node and ‘sent’ + timestamp after, so a retry skips anything already in flight. Agree on the timezone too, I’ll set it in the workflow settings instead of trusting the server default. Will update the template and post here once it’s done.
You’re welcome, Vivek! That sounds like a useful improvement.
One small consideration: marking a row as sending before Gmail helps prevent overlapping runs, but if the email succeeds and the final Sheet update fails, that row may remain stuck in sending. A retry or reconciliation mechanism could help handle that case safely.
Setting the workflow timezone explicitly is also a good step. Thanks for considering the suggestions and sharing the workflow with the community!
Good point, Shital. I’d rather a row get stuck in ‘sending’ than risk emailing a client twice, so the safer fix is to put the claim time in the status and have a small check flag rows stuck for more than an hour, then confirm in Gmail’s Sent folder before clearing them by hand rather than resending automatically.