10. Review Request
The leak this closes
Happy customers never get asked for the review. The job went well, the invoice got paid, everyone moved on to the next job, and the five stars that customer would gladly have left never get written, because asking feels awkward and there is always something more urgent. Meanwhile the one unhappy customer finds your review page all by themselves. This loop fires the moment a job is marked done or an invoice is paid, writes a personal ask that references the actual work, hands you the email and SMS as drafts with your Google review link inside, and follows up exactly once after 7 days if no review has appeared. The ask happens while the customer is still glowing, and it never happens twice.
The pattern
A webhook fires when a job is marked done or an invoice is paid, the AI writes a personal review ask that references the job, and the action is a Gmail draft plus a copy-ready SMS with your Google review link, logged to the CRM, with one polite reminder drafted after 7 days if no review is detected. Drafts only, never sends.
Import (n8n)
How long this really takes. The import itself is seconds. If you already run n8n with these credentials attached, you are done in a minute. If this is your first n8n workflow, budget an evening: an account to create, a credential to connect, a test that fails once. That is normal and it happens only on the first blueprint. Not sure this is the right one to start with? Read the start-here page first.
- In n8n, go to Workflows, click the three-dot menu, choose Import from File, and select
workflow.n8n.json. - Open the Settings (Edit Me) node first. This is where
airtableBaseId,airtableTableId,businessContextandgoogleReviewLinklive, and every other node reads from it. If you skip this node the Airtable calls hitYOUR_AIRTABLE_BASE_IDand 404. - Open the Job Done / Invoice Paid webhook node and copy the production URL. Call it from your job tracker or invoicing tool (Jobber, ServiceM8, your CRM automation, or a simple Make/Zapier webhook step) whenever a job is marked done or an invoice is paid. Send
customer_name,customer_email,customer_phone,job_description, andinvoice_numberin the POST body. - Open the Business Brain Context node and the Prep Reminder + Context node. In both, paste your business brain into the
businessContextvalue (use templates 01 and 02 from the AI Brain Templates in this kit) and put your Google review link intogoogleReviewLink. You get that link from Google Business Profile under Ask for reviews. - Open Write Review Ask (AI) and Write Polite Reminder (AI) and attach your OpenAI credential to both.
- Open Create Email Draft and Create Reminder Draft and attach your Gmail OAuth credential to both.
- Open Log Review Request (CRM), Find Unreviewed Asks (CRM), and Mark Reminder Drafted (CRM). Attach your Airtable credential and point all three at a Review Requests table with these fields: Customer Name, Customer Email, Customer Phone, Job Summary, Invoice Number, Ask Date, Status, Review Received (checkbox), Reminder Date.
- Open Ping Owner: Ask Ready and Ping Owner: Reminder Ready, attach your Slack credential, and set the channel (or define the
YOUR_SLACK_CHANNELenvironment variable on your n8n instance). - Fire one test POST at the webhook URL, confirm a draft appears in Gmail and a row appears in Airtable, then activate the workflow. When a review lands on Google, tick Review Received on the record. That is what stops the reminder.
One extra step for this loop: its trigger is a public URL, so it ships with Header Auth switched on. In the webhook node, create a Header Auth credential (name it X-Kratt-Token, value a long random string you invent), then send that same header from whatever system calls the URL. Without this, anyone who guesses the URL can fire your loop and spend your credits.
Build it in Make.com instead
- Create a new scenario for the ask. Add Webhooks > Custom webhook as the trigger and call its URL from your job tracker or invoicing tool when a job is marked done or an invoice is paid.
- Add Tools > Set multiple variables with two variables:
businessContext(paste your business brain) andgoogleReviewLink(your Google review link). - Add OpenAI (ChatGPT, Whisper, DALL-E) > Generate a Completion. In the prompt, include the CONTEXT block from your variables, the job details mapped from the webhook, the review link, and the explicit rules: draft only, never claim it was sent, reference the actual job, ask for an honest review, never offer anything in exchange. Tell it to return JSON with
subject,email_body, andsms_body. - Add JSON > Parse JSON on the completion output.
- Add Gmail > Create a Draft Email, mapping the recipient from the webhook email and the subject and body from the parsed JSON.
- Add Airtable > Create a Record in your Review Requests table with Status set to Asked and Ask Date set to now.
- Add Slack > Create a Message to your owner channel with the customer, the job, the SMS text ready to copy into your phone, and a note that the email draft is waiting in Gmail.
- Create a second scenario for the reminder, scheduled once a day at 09:00. Add Airtable > Search Records with the formula
AND({Status} = 'Asked', NOT({Review Received}), DATETIME_DIFF(NOW(), {Ask Date}, 'days') >= 7). - Add OpenAI (ChatGPT, Whisper, DALL-E) > Generate a Completion with the reminder prompt: one polite reminder, under 70 words, reference the job, restate the link, give an easy out, no pressure, draft only.
- Add Gmail > Create a Draft Email for the reminder.
- Add Airtable > Update a Record to set Status to Reminded and stamp Reminder Date, so the reminder can never fire twice.
- Add Slack > Create a Message to tell the owner the reminder draft is waiting.
- Turn both scenarios on.
Safety: drafts, not sends
Nothing in this loop sends a message to a customer. The AI writes the ask, the Gmail node saves it as a draft, and the SMS arrives in your Slack as text you copy into your own phone. The 7-day reminder is also a draft. Every message a customer sees was sent by a human who read it first, which means a wrong name or a misremembered job detail gets caught in your Drafts folder, not in your customer's inbox. There is a second reason to keep it this way: Google prohibits incentivized reviews and review gating, the prompts forbid both, and your read-before-send is the backstop. If you ever switch a Gmail step from draft to send, you have removed both protections. Keep it on drafts.
The one metric
Reviews per ten completed jobs. Count completed jobs and new Google reviews each month and watch the ratio. If asks are going out and the number does not move, the problem is timing or link friction, not the customer.