Work with me

Case study · Live SaaS · 2026

Every branch's Google rating, in one dashboard.

I designed, built and run SemuaCabang, a multi-tenant web app for businesses with many locations. It tracks the Google rating and reviews of every branch, flags the branches that are slipping, and sends every 1–3 star review to the team's Telegram group.

Livein production at semuacabang.com
SaaSeach client has its own dashboard
~5 callsGoogle API per branch per month
All branchesaverage 4.84 · target 4.90
12Safe ≥ 4.9
4At risk
2Danger
  • Downtown4.95
  • Riverside4.90
  • Airport Road4.80
  • North Mall4.70
  • Station Square4.60
Telegram alert · Monday 07:00Station Square ★★☆☆☆
“Long queue, only one cashier open.”

Illustration with sample data. Real client data is private.

The problem

Owners can't check 20 Google Maps pages every week.

Businesses with many branches (pharmacies, clinics, restaurants, laundries) live on their Google rating. A drop from 4.9 to 4.6 at one branch costs customers, but nobody notices until it's too late, because checking every branch by hand doesn't scale.

  • Bad reviews sit unanswered for days.
  • Head office can't see which branch is slipping.
  • Branch managers find out last.

What I built

A complete product, not just a script.

Branch dashboard

Every branch on one screen, colour-coded Safe, At risk or Danger against the owner's own targets. Rating trends over time and a permanent archive of every 1–3 star review.

Telegram alerts

New 1–3 star reviews go straight to the team's group with the branch name and review text. A weekly summary shows which branches went up or down, and an honest "all clear" when nothing bad came in.

Multi-tenant SaaS

Each client gets a private dashboard link, owner and manager logins, and its own Telegram group. Clients can self-register for a free trial.

Admin panel

One place to manage clients: packages, branch limits, billing status (Running, Hold, Stop), custom pricing per client, and an estimate of the Google API cost.

Automatic setup

Add a branch by name and city. The system finds its Google Place ID and pulls the first data on its own, so onboarding a 20-branch client takes minutes.

Billing lifecycle

Renewal reminders 7, 3 and 1 day before expiry, a hold when payment is late, and automatic data clean-up after the grace period.

How it works

Simple architecture, low running cost.

CollectA scheduled GitHub Actions job pulls every branch from the Google Places API: new branches right away, then once a week.
StoreRatings and reviews are merged into Firestore, keeping history and every low review even after Google stops showing it.
AlertA Node.js job compares with what was already sent and posts only new 1–3 star reviews to each client's Telegram group.
ShowA fast static dashboard on Cloudflare Pages, with server functions that keep the API keys off the client.
JavaScriptNode.jsFirebase AuthCloud FirestoreFirestore security rulesCloudflare Pages + FunctionsGitHub ActionsGoogle Places API (New)Telegram Bot APIPlaywrightPWA

Engineering details

Built to run unattended.

  • Cost control: branch search asks Google for IDs only (a free request), photos are never fetched, and the pull schedule is configurable. A branch costs about 5 Google calls a month.
  • Security: Firestore rules give each client access to its own data only, with a separate developer role. The rules have their own automated tests.
  • Reliability: retries for Telegram, partial failures don't stop the run, and the report says which branches couldn't be refreshed instead of hiding it.
  • Testing: unit tests for the data and message logic, emulator tests for the database rules, and end-to-end browser tests with Playwright.

Work with me

Want this for your locations or your agency's clients?

I can set up review monitoring with alerts to Telegram, Slack or email for your business, white-label it for your agency, or build a similar dashboard on top of any API. I'm Yoga, a developer based in Indonesia, working remotely with clients in any time zone.