GBP Review Velocity & Sentiment Monitor
AGENT ROLE: Autonomous reputation-monitoring agent. Pull reviews per location, compute velocity/sentiment/response metrics, and emit the JSON in references/output.schema.json.
OBJECTIVE
Quantify each location's review health — how fast reviews arrive, the star trend, sentiment and recurring themes, and how many reviews go unanswered — and flag deteriorations that need attention.
INPUTS
account_id+location_ids(REQUIRED): GBP resources (accounts/{a}/locations/{l}).window_days(OPTIONAL, default 90): velocity + trend window.sentiment_backend(OPTIONAL enumlexicon|openai): defaultlexicon(keyless);openaiifOPENAI_API_KEYset.benchmark(OPTIONAL): prior run's aggregates for trend deltas.
AUTHENTICATION (Google Business Profile API)
- REQUIRE OAuth token, scope
https://www.googleapis.com/auth/business.manage(GBP_OAUTH_TOKENor delegated SA).- IF absent THEN STOP
error.code="AUTH_MISSING_TOKEN";401→ STOPerror.code="AUTH_EXPIRED".
- IF absent THEN STOP
- Requires Google-approved Business Profile API access.
403 SERVICE_DISABLED/PERMISSION_DENIED→ STOPerror.code="API_ACCESS_NOT_APPROVED". - Reviews live on the v4 endpoint:
GET https://mybusiness.googleapis.com/v4/{account_id}/locations/{loc}/reviews(paged viapageToken). openaisentiment backend:POST https://api.openai.com/v1/chat/completionswithOPENAI_API_KEY.
EXPECTED TOOL CALLS
- Run
scripts/gbp_reviews.py --account accounts/1 --locations loc1,loc2 --window 90. - Per location: page all reviews in the window; each review has
starRating(ONE..FIVE),comment,createTime, andreviewReply(present iff answered).
PROCEDURE (deterministic, per location)
STEP 1 — FETCH reviews within window_days (page until createTime older than the window).
STEP 2 — VELOCITY: reviews_per_week = count / (window_days/7); compare first-half vs second-half of the window to detect acceleration/deceleration.
STEP 3 — STAR TREND: mean star of older half vs recent half; star_delta.
STEP 4 — SENTIMENT: map starRating to polarity, refine with text sentiment (lexicon or openai); extract recurring THEMES from negative reviews (top noun phrases / lexicon categories: service, wait, price, cleanliness, staff).
STEP 5 — RESPONSE RATE: answered / total; unanswered_recent = unanswered reviews in the last 14 days (highest priority).
STEP 6 — FLAGS: velocity_drop (recent < 0.5× earlier), sentiment_decline (star_delta <= -0.4), low_response_rate (< 0.5). EMIT per-location metrics + flags, sorted worst-first.
RATE LIMITS & ERROR HANDLING
- GBP v4 strict QPM.
429→ backoff2^attempt(max 5) then STOPerror.code="RATE_LIMITED"withpartial. openaisentiment429→ backoff (max 4); on persistent failure fall back tolexiconand setsentiment_backend="lexicon".- Per-location failure → mark
status="fetch_error", continue.
MISSING / INSUFFICIENT DATA
- IF a location has < 5 reviews in the window THEN report raw counts but mark trend metrics
low_confidence(too few to trend). - Star rating is authoritative for polarity; if a review has no
comment, sentiment = star-derived only (notetext_available=false). - Never invent themes; if no negative reviews, themes = [].
OUTPUT
One JSON object per references/output.schema.json. No prose.
FILES
scripts/gbp_reviews.py— GBP v4 reviews client, velocity/star/response metrics, sentiment + theme extraction.references/output.schema.json— output contract.
