Fair review follow-up for local businesses by Ever F.Fair review follow-up for local businesses by Ever F.

Fair review follow-up for local businesses

Ever  F.

Ever F.

Completed jobs enter through one validated intake path.
The intake workflow validates each job before the idempotent PostgreSQL upsert.
The intake workflow validates each job before the idempotent PostgreSQL upsert.
BrightFlow asks once when a completed service case closes. Every eligible customer gets the same review link and the same path to a person.
Manual review follow-up is easy to miss, and one fixed delay ignores the difference between a drain cleaning and a larger installation. The system also has to ask fairly. Rating, sentiment, job value, technician, complaint status, and the expected review never decide who receives the link.
I built this demo for BrightFlow, a fictional Austin plumbing company. Eligibility checks completion, contactability, consent, duplication, case closure, and a uniform 90-day frequency limit.
Problem replies reach the owner without retracting the review link.
Problem replies reach the owner without retracting the review link.
PostgreSQL owns timing, leases, weekly caps, sends, suppressions, replies, and idempotency. The longest service line sets the delay. Gmail handled the controlled email test. SMS stays disabled until an approved A2P campaign exists.
Every eligible message uses fixed copy with both the review link and a way to reply to a person. The Cloudflare redirect uses an opaque token and records no IP address or user agent.
All 39 automated checks passed. The controlled allowlisted run delivered the initial request and one final reminder, recorded one tracked click and one redacted problem reply, then sent the owner alert and static acknowledgement. A token-rotation bug surfaced during the click test. I fixed the D1 upsert, added a regression test, deployed the Worker, and repeated the click successfully.
Controlled result: 39/39 tests passed. The initial request and one reminder arrived once each. PostgreSQL recorded one click and one redacted problem-reply event. The owner alert and static recovery acknowledgement both arrived.
Current limits: The Gmail credential can send but cannot read the inbox, so the reply test used a provider-confirmed delivered fixture after automatic ingestion returned 403. I did not run a service restart. SMS, Google Business Profile OAuth, and review totals remain staged. The dashboard totals are synthetic and labeled that way.
BrightFlow is fictional. This is controlled test evidence, not a client result or conversion claim. No Google Business Profile was created.
Like this project

Posted Jul 28, 2026

A controlled demo for a fictional plumbing company. It asks every eligible customer for a review, sends one reminder, and lets them reply to a person.