Back to the build library
Any industry
Starter

The Review Engine

Ask every customer for a review at the right moment, route unhappy ones to recovery instead of the public internet, and reply to all of them.

Industry
Any industry
Build effort
Starter
Typical time to launch
2–4 days
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

Most businesses ask for reviews the way they ask for anything they are embarrassed about: rarely, late, and only when someone remembers. The pattern is almost universal: a burst of twelve reviews from the week the owner decided to care, then eight months of silence, then another burst. The public result is a profile that looks abandoned and a rating shaped entirely by self-selection, because the only people who post unprompted are the ones who had an unusually bad time. The business has hundreds of satisfied customers and a star rating built from the dozen angriest.

The operational failure underneath is timing. Goodwill has a half-life measured in hours. The moment a job is finished, a treatment is done, or a problem is solved, the customer feels something specific and is holding their phone. Twenty-four hours later they feel nothing in particular. A week later, asking feels like an imposition and converts at a fraction of the rate. Nobody can hit that window reliably by hand, because hitting it means asking within minutes of a service ending, every single time, for every customer, including the ones who finished at 5:55pm on a Friday.

The money leaks in two directions at once. Upstream, rating and review volume are inputs to local search visibility and to the click-through rate of listings you are already paying to appear in. A weak profile quietly taxes every other channel you run. Downstream, a bad experience that goes straight to a public platform costs far more than the same complaint routed privately, because a private complaint is a fixable service failure while a public one-star is a permanent asset working against you. The gap between those two outcomes is a single branch in a workflow: ask how it went before you ask for a review, and send the two answers down different paths.

02

What gets built

Pipelines and stages

A dedicated Review & Recovery pipeline, so review state is visible and nobody has to guess who was asked:

  1. Service Complete: the job or appointment is done and the record is eligible. Entry point.
  2. Feedback Requested: the private rating question has gone out, no answer yet.
  3. Promoter: rated 4 or 5. Pushed to the public platform.
  4. Review Posted: confirmed live on a platform. Terminal and good.
  5. Detractor: Recovery Open: rated 1 to 3. A named human owns it.
  6. Recovery Resolved: the issue was addressed. Optionally re-asked later.
  7. No Response: the reminder ladder ran out. Not a failure; just not this time.
  8. Suppressed: do not ask this person, now or later.

Custom fields

  • service_completed_at (date/time). The clock the whole build runs on.
  • service_type (dropdown). What they actually had done, so copy can be specific.
  • staff_member (text or dropdown), who delivered it. Essential for recovery and for spotting patterns.
  • feedback_rating (number, 1–5): the private answer.
  • feedback_comment (long text): what they typed.
  • feedback_received_at (date/time).
  • review_request_count (number): asks in the current cycle. Hard cap of 3.
  • last_review_request_at (date/time). The field that stops double-asking.
  • review_platform_target (dropdown), which profile this person should be sent to.
  • review_posted (checkbox) and review_posted_at (date/time).
  • review_public_rating (number). What they actually posted publicly, once known.
  • recovery_owner (text). The named person responsible. Not “the team”.
  • recovery_opened_at and recovery_resolved_at (date/time): these two give you time-to-resolution.
  • recovery_notes (long text).
  • suppress_review_requests (checkbox). The override that beats everything else.
  • review_consent_channel (dropdown): SMS, Email, or None, derived from existing consent.

Tags

review-eligible, review-requested, review-promoter, review-detractor, review-posted, recovery-open, recovery-resolved, review-no-response, review-suppressed, review-ask-cap-hit.

Forms and surveys

  • One-tap rating survey: a single question, five options, no login, no name field, nothing else on the page. “How was your visit?” with 1 to 5. Every extra element halves completion. The rating is captured on tap, before any second page loads, so a drop-off still gives you the number.
  • Private feedback form: shown only to 1–3 raters. Two fields: what went wrong, and the best way to reach you. Explicitly states a person will respond. This page must never contain a link to a public review platform.
  • Promoter handoff page: shown only to 4–5 raters. A thank-you line and one large button straight to the chosen public profile. No second ask, no form, no detour.

The AI assistant

BO handles two jobs here, and only two:

  • Drafting public review replies. Every incoming review gets a draft reply generated in the brand voice. Under 60 words, thanks the person by first name, references something specific from their review, never defensive, never a template. The draft goes to a human for approval before posting, always. For negative reviews the draft never disputes facts and never discusses specifics publicly; it acknowledges, apologizes for the experience, and moves the conversation offline to a named contact.
  • Conversational follow-up on the private thread. If a detractor replies by text, BO acknowledges within seconds, confirms a human is taking it, and does nothing else.

Guardrails: never offer, hint at, or discuss any discount, refund, credit, gift, or compensation in exchange for a review. This is the one line that can get a profile penalized and a business reputation damaged. Never ask a detractor to post publicly. Never post a reply without human approval. Never argue with a reviewer. Never reference a specific service, treatment, condition, or account detail in a public reply. Escalate immediately on any mention of legal action, safety, discrimination, or a regulator.

Numbers and channels

  • The same business number used for everything else, so the ask arrives in an existing thread rather than from a stranger.
  • Email as the fallback for anyone without SMS consent, and as a parallel track for high-value customers.
  • Review platform connections for every profile that matters to you, so incoming reviews land in one inbox and replies post from one place.
  • Social posting connected, so approved five-star reviews can be queued as content instead of dying in a dashboard.
03

How it runs, step by step

One customer, end to end

  1. 2:40pm, Tuesday. A customer’s appointment is marked complete. service_completed_at is stamped, service_type and staff_member are written, and the record enters the pipeline at Service Complete.
  2. Eligibility check. The workflow confirms this is not a duplicate ask: last_review_request_at is empty or more than 180 days old, suppress_review_requests is false, review_posted is false, and there is a usable consented channel. If any check fails, the record moves to Suppressed and nothing is sent.
  3. 3:40pm. One hour after completion, the ask goes out by text: a thank-you naming the service, then a single question with a one-tap link. The record moves to Feedback Requested, review_request_count becomes 1, last_review_request_at is stamped.
  4. 3:44pm. She taps 5. The rating is captured the moment she taps. feedback_rating = 5, feedback_received_at is stamped, the record moves to Promoter, and the reminder ladder is canceled.
  5. Same instant. She lands on the promoter page: one line of thanks and one button to the public profile. No form, no second ask, nothing between the tap and the review box.
  6. 3:46pm. A nudge text follows with the direct platform link, because roughly half of promoters intend to post and get interrupted. “Thank you. That genuinely helps. If you have 30 seconds, here’s the link: {{review_link}}.”
  7. 4:10pm. She posts a five-star review. The monitoring workflow sees it, matches it to her record, sets review_posted = true and review_public_rating = 5, moves the record to Review Posted, and cancels every remaining nudge.
  8. 4:11pm. BO drafts a reply. The owner approves it on their phone, and it posts. Average time from review to reply: minutes, not weeks.
  9. 4:12pm. Because the review is five stars and contains a usable sentence, it is queued to the social planner as a graphic for next week, pending approval.
  10. The other branch. Had she tapped 2, nothing public would have been offered. She would have landed on the private feedback form, the record would have moved to Detractor: Recovery Open, recovery_owner would have been set to a named person, and that person would have been notified by push and SMS within a minute with a 4-hour clock to make personal contact. No review request would ever be sent to her again unless the recovery was resolved and a human explicitly re-enabled it.
  11. The silent branch. Had she not tapped at all, the ladder would have sent one email at 24 hours and one final text at 72 hours, then stopped. Three asks, maximum, then No Response and silence for 180 days.
04

Automations in detail

WF-R1 · Eligibility and Review Request

Trigger: Appointment marked complete, invoice marked paid, or opportunity moved to a closing stage. Whichever event genuinely means “the service is finished” in your business. Pick one and only one, or you will double-ask.

Entry conditions (all must be true):

  • suppress_review_requests = false
  • review_posted = false
  • last_review_request_at is empty or more than 180 days ago
  • review_request_count < 3
  • contact does not have do-not-contact, sms-stop, recovery-open, or review-suppressed
  • a consented channel exists: SMS consent, or a valid email on an engaged address

Actions, in order:

  1. Set service_completed_at = now if empty. Write service_type and staff_member from the appointment record.
  2. Add tag review-eligible. Create or move the record to Service Complete.
  3. Wait 1 hour. This is the single most important number in the build. Immediately is too soon. They are still in the parking lot. The next day is too late. The feeling is gone. One to two hours after completion is the window. For services with a delayed result, move it to 24 hours and no further.
  4. Branch on quiet hours. If the send would land outside 09:00–19:00 local, hold until 09:00 the next day. Nobody rates a business well at 11pm.
  5. Branch on channel. SMS consent present → send SMS. Otherwise → send email.
  6. Send SMS: “Hi {{first_name}}, thanks for coming in today: {{staff_member}} enjoyed looking after you. One quick question, takes 10 seconds: how was it? {{rating_link}}”
  7. Send email variant: subject “Quick question about your visit”, three lines, the five rating buttons inline so the tap happens from the inbox.
  8. Set last_review_request_at = now; increment review_request_count; add tag review-requested; move record to Feedback Requested.

Exit conditions: rating submitted; review_posted becomes true; any opt-out tag applied; suppress_review_requests set true; review_request_count reaches 3.

WF-R2 · Rating Capture and Branch

Trigger: Rating survey submitted, or a rating link tapped.

Actions:

  1. Write feedback_rating and feedback_received_at. Capture on tap, not on form submit, so an abandonment still records the number.
  2. Cancel every pending step in WF-R5, the reminder ladder.
  3. Branch on feedback_rating:
    • 4 or 5 → add review-promoter, move to Promoter, continue to WF-R3.
    • 1, 2 or 3 → add review-detractor and recovery-open, set suppress_review_requests = true, move to Detractor: Recovery Open, continue to WF-R4.

The rule that makes this build legitimate: the branch decides which page someone sees, not whether they are allowed to review you. Anyone can find your public profile; the private route is offered first because it is a better outcome for both sides. Never block, delay, or filter access to a public platform, never make a public review conditional on a rating, and never offer anything of value in exchange for one.

WF-R3 · Promoter Path

Trigger: Tag review-promoter added.

  1. Redirect immediately to the promoter handoff page: thanks, one button, nothing else.
  2. Wait 2 minutes. Send SMS: “Thank you {{first_name}}, that genuinely helps a small business. If you have 30 seconds, this is the link: {{review_link}}”
  3. Wait 24 hours. Condition: review_posted is still false. Send one reminder: “No pressure at all. Just leaving this here in case you meant to and got busy: {{review_link}}”
  4. Wait 3 days. Condition: still not posted. Send email with the link and stop. Two nudges is the limit; a third makes you the business that pesters people.
  5. If review_posted becomes true at any point, cancel all remaining steps and move to Review Posted.
  6. If still unposted after the email, move to No Response and leave them alone for 180 days.

Platform routing: use review_platform_target to spread requests across the profiles you need, rather than sending everyone to one. Route by location, by service, or on a rotation, but never send the same person to two platforms in one cycle.

WF-R4 · Detractor Recovery

Trigger: Tag review-detractor added.

  1. Redirect to the private feedback form: two fields, a clear statement that a person will be in touch, and no link to any public platform anywhere on the page.
  2. Set recovery_owner to a named individual by round-robin or by staff_member escalation path. Never to a shared inbox; shared ownership is no ownership.
  3. Set recovery_opened_at = now.
  4. Immediately: notify the recovery owner by push and SMS: “Recovery needed: {{first_name}} rated {{feedback_rating}} after {{service_type}} with {{staff_member}}. Comment: {{feedback_comment}}. Call within 4 hours.” Notify the manager in parallel on any rating of 1.
  5. Send the customer an acknowledgement within 2 minutes: “{{first_name}}, thank you for being honest: that’s not the experience we want you to have. {{recovery_owner_first_name}} is going to call you personally today. If now is a bad time, reply with when suits.”
  6. Create a task for the recovery owner due in 4 hours: “Call {{first_name}}, service recovery”.
  7. Wait 4 hours. If the task is still open, escalate to the manager by SMS. Wait a further 4 hours: escalate to the owner. An unworked recovery is worse than no recovery process, because you asked and then ignored the answer.
  8. When the owner marks it resolved: set recovery_resolved_at, write recovery_notes, swap recovery-open for recovery-resolved, move to Recovery Resolved.
  9. Optional, human-gated only. Thirty days after resolution, create a task asking the owner whether this customer is now worth re-asking. If and only if a human says yes, clear suppress_review_requests and reset review_request_count to 0. This step must never be fully automatic.

Exit: resolved and closed by a human; customer requests no further contact; record moved to Suppressed.

WF-R5 · Reminder Ladder for Non-Responders

Trigger: Record has been in Feedback Requested for 24 hours with feedback_rating empty.

  1. Wait until 10:00 local. Send email: subject “How did we do?”. The five rating buttons, one line of context, nothing else. Increment review_request_count; update last_review_request_at.
  2. Wait 48 hours. Condition: still no rating and review_request_count < 3. Send final SMS: “Last one from me, {{first_name}}, if you have 10 seconds to rate your visit it really does help: {{rating_link}}. If not, no problem at all.”
  3. Wait 24 hours. Add tags review-no-response and review-ask-cap-hit; move to No Response; set a re-eligibility date 180 days out.

Exit: any rating submitted; any opt-out; review_request_count reaches 3.

WF-R6 · Review Monitoring and Reply

Trigger: New review detected on any connected platform.

  1. Attempt to match the reviewer to a contact by name, timing, and recent service. On a match, set review_posted = true, review_posted_at, review_public_rating, move to Review Posted, cancel all pending nudges. On no match, create the contact as a review-only record so the reply still gets handled.
  2. Branch on public rating:
    • 4–5 → BO drafts a reply under 60 words: first name, one specific detail from their review, thanks, no marketing. Route to the owner for approval.
    • 3 → draft an acknowledging reply plus an offline invitation. Route to the manager.
    • 1–2 → no automatic draft is posted under any circumstances. Notify the manager and owner immediately by push and SMS. BO prepares a draft that acknowledges, does not dispute, references no specifics, and gives a named person and direct contact. A human edits and posts it.
  3. Create a reply task with a 24-hour due date. Escalate at 24 hours, again at 48.
  4. On any mention of legal action, discrimination, safety, a regulator, or a privacy breach: suppress all drafting, notify the owner directly, and route to whoever handles those for you. Do not reply publicly until they say so.
  5. Log the reply, who approved it, and when. Over time this is also your record of response time, which is itself a visible signal on most platforms.

WF-R7 · Social Amplification

Trigger: review_public_rating = 5 and the review body is longer than 15 words.

  1. Create an approval task: “Use this review as social content?” with the text attached.
  2. On approval, queue a post to the social planner for the next open slot, with the review text, the first name and last initial only, and no other identifying detail.
  3. Wait 90 days before the same review can be reused.

Hard rule: never publish a reviewer’s full name, photograph, service detail, or any other identifying information without their explicit written permission, and never at all in a regulated setting where the review implies the nature of their care.

WF-R8 · Suppression and Hygiene

Triggers: any of: complaint logged, refund issued, dispute opened, account flagged, contact requests no contact, do-not-contact applied, or a staff member manually ticks suppress_review_requests.

  1. Set suppress_review_requests = true; add review-suppressed; move to Suppressed.
  2. Remove the contact from WF-R1, WF-R3 and WF-R5 immediately.
  3. Log who suppressed and why.

Run a monthly audit workflow that lists anyone asked more than three times in 180 days, anyone asked while suppressed, and any recovery open longer than 72 hours. Each of those is a build fault, not a customer problem: fix the condition, not the record.

05

What changes

What is different afterwards

  • The ask stops being a decision. Every completed service produces a request at the same interval, through the same copy, whether it finished at 9am Monday or 6pm Saturday. Volume becomes a function of how many customers you serve rather than how motivated the owner felt that week.
  • Bad experiences arrive privately first. The branch does not hide anything. It simply puts a named human in front of an unhappy customer before the internet gets there. Most of those conversations end with a fixed problem instead of a permanent one-star.
  • Negative feedback becomes operational data. Because staff_member and service_type ride along with every rating, you stop arguing about whether there is a problem and start seeing which shift, which service, or which person it attaches to.
  • Every review gets a reply. Drafted in minutes, approved by a human, posted the same day. Visible responsiveness is itself part of what prospects judge.
  • Your best reviews become content instead of sitting unread in a platform dashboard.
  • Nobody gets pestered. The three-ask cap, the 180-day cooldown, and the suppression flag mean the system is aggressive about timing and conservative about frequency, which is the only combination that survives contact with real customers.

Metrics to watch

  • Request-to-rating rate: of asks sent, the share that produce a tap. This is almost entirely a function of timing and message length; test the wait duration before you test the copy.
  • Promoter-to-posted conversion: of 4–5 raters, the share whose review actually appears publicly. This is where most review systems silently fail, and it is fixed with fewer clicks between the tap and the review box, not more reminders.
  • Public review volume per month, and, more usefully, the consistency of it. A steady trickle reads as a live business; a burst reads as a campaign.
  • Average public rating trend, measured monthly rather than as a lifetime figure, which hides everything.
  • Detractor share: the proportion of private ratings at 1–3. Rising detractor share with a steady public rating is your early warning system.
  • Time to first contact on recovery: recovery_opened_at to first outbound call. Target is under four hours. This number decides whether recovery works at all.
  • Recovery resolution rate and time to resolution.
  • Share of detractors who later leave a public negative review anyway: the honest measure of whether recovery is real or theatre.
  • Reply coverage and median time to reply across all platforms.
  • Suppression and opt-out rate on review messages. If it climbs, your timing or frequency has drifted.
  • Ratings grouped by staff_member and service_type: reviewed monthly, in private, as a coaching input rather than a league table.
06

Before you start

Prerequisites

  • A reliable completion event. The entire build hangs off knowing that a service finished. Decide whether that is an appointment status, a paid invoice, or a pipeline stage. Pick exactly one, and make sure the people who set it actually set it the same day.
  • Named recovery owners, with cover for evenings and weekends. If nobody will pick up a detractor within four hours, do not launch the detractor branch. Asking an unhappy customer for feedback and then not calling them is worse than never asking.
  • An agreed brand voice for replies, including how you respond to an unfair review. Write this down before the first one arrives, not during.
  • Clean contact data. Deduplicate first. Two records for the same person means two asks, which is the fastest way to look careless.
  • Claimed and verified profiles on every platform you intend to route to, with the short review link for each one to hand.

Integrations and provisioning

  • Connect each review platform for both reading new reviews and posting replies. Reading alone leaves you drafting in one place and pasting in another, which fails within two weeks.
  • Use the same business number as the rest of your messaging so the ask arrives in an existing thread. A new number for review requests looks like a scam and gets reported as one.
  • Authenticate the email sending domain (SPF, DKIM, DMARC) before the first send. Review requests go to people who have never opened an email from you, which is exactly the traffic that gets filtered.
  • Shorten rating and review links on a branded domain. Generic shorteners get blocked by carriers and look untrustworthy in a text.
  • Connect the social accounts you intend to post approved reviews to.
  • Pass service_type and staff_member from your scheduling or job system into the contact record, or the copy stays generic and the recovery routing stays blind.

SMS consent, registration and timing

  • Complete A2P 10DLC brand and campaign registration before sending. Register this as a customer-care or notification use case and submit sample messages that match what WF-R1 and WF-R5 actually send, word for word in shape if not in detail.
  • Consent must predate the ask. A completed service is not consent to be texted. Capture SMS consent at intake or booking with an unticked checkbox naming the business, the message types, variable frequency, that rates may apply, and how to stop, and record the timestamp and source.
  • Quiet hours: hold all review messaging to 09:00–19:00 in the contact’s local time. This window is narrower than the legal minimum on purpose; late-evening review requests convert badly and generate complaints.
  • Honor STOP mechanically and make an opt-out set both the messaging flag and suppress_review_requests, so the person is out of this build as well as out of SMS.
  • Cap and cool down. Three asks per cycle, 180 days between cycles, enforced by review_request_count and last_review_request_at rather than by good intentions.
  • Keep email suppression and SMS suppression visible to each other so an opt-out on one does not leave the other running.

Platform rules you must not break

  • Never offer anything of value for a review: no discount, credit, entry into a draw, gift, or priority. Not for a positive review, not for any review. This violates the terms of every major platform and can get a profile stripped or suspended, and it is the single most common way businesses destroy a review profile they spent a year building.
  • Never condition access to a public platform on the private rating. Offering the private route first is fine; blocking, delaying, or filtering the public route is review gating and is prohibited by major platforms. Build it as a routing preference, never as a gate.
  • Never write, edit, or post a review on a customer’s behalf, and never from a staff device or account.
  • Do not bulk-blast your whole historical list on day one. Start with current completions only. A sudden spike of reviews after years of silence is itself a filtering signal on most platforms, and much of it will simply be removed.

Where regulated data is involved

  • In healthcare or any setting handling protected health information, get a signed business associate agreement in place covering the platform before real patient data enters it.
  • Keep the review request clinically silent. Reference the visit and the location, never the service, department, condition, medication or result. “Thanks for coming in today” is appropriate; naming the treatment is not, because the message itself may disclose care to anyone who sees the screen.
  • Never reply publicly in a way that confirms someone is a patient or client, even if they disclosed it themselves in their own review. Acknowledge the experience in general terms and move it offline. A public reply that confirms care is a disclosure, regardless of who raised it first.
  • Never use a review containing clinical detail as marketing content, and never reproduce a review as a testimonial in a regulated context without separate, specific, written authorization.
  • Restrict access to feedback_comment and recovery_notes by role, log access, and set a retention period you can defend.
  • Check your professional body’s advertising and testimonial rules. In several regulated professions, soliciting or displaying testimonials is restricted or prohibited outright regardless of what the platforms allow.
  • None of the above is legal advice. Have counsel review your consent language, your reply policy, and your testimonial use before launch.

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call