Review Response Writer
[Live] ·
agent__review-response-writer· Claude Sonnet 4.6
Drafts a contextually appropriate response to a new customer review on Google Business Profile or Facebook, classifies the review’s sentiment and topics, and determines whether human approval is required before posting.
Overview
| Function | Draft and classify responses to incoming customer reviews |
| Type | Worker — Reactive |
| Model | Claude Sonnet 4.6 |
| Queue | agent__review-response-writer |
| Concurrency | 8 |
| Timeout | 2 min |
| Est. cost / task | ~$0.08 |
| Plan | Pro+ |
Trigger
Reviews enter the queue via two paths:
- Polling: The platform integration service polls connected GBP and Facebook Pages every 6 hours for new reviews. New reviews since the last poll are enqueued individually.
- Webhook: If the platform supports real-time webhooks (Meta Business webhooks for Facebook reviews), reviews are enqueued immediately on receipt.
Each job processes exactly one review.
Input
interface ReviewResponseWriterInput {
tenantId: string;
reviewId: string; // platform-native review ID — used for posting the response
// Review details
platform: 'google_business_profile' | 'facebook';
starRating: 1 | 2 | 3 | 4 | 5; // null for Facebook recommendations (true/false only)
reviewText: string; // full review text; may be empty for rating-only reviews
reviewerName: string; // display name — do NOT use surname if present
reviewDate: string; // ISO date
// Response context
existingResponse?: string; // if the review already has a response (editing mode)
locationName?: string; // if multi-location business, which location this review is for
}Output
interface ReviewResponseWriterOutput {
reviewId: string;
draftResponse: string; // the complete response text, ready to post
// Classification
sentiment: 'positive' | 'negative' | 'neutral';
topics: string[]; // specific issues or themes mentioned, e.g. ["wait time", "staff friendliness", "parking"]
starRating: number; // echoed from input for routing logic
// Approval routing
requiresHITL: boolean; // true for all 1–3 star reviews; also true for any escalation trigger
urgency: 'normal' | 'high' | 'critical';
escalationReason?: string; // populated if urgency is high or critical
// Suggested follow-up
suggestedAction?: string; // e.g. "Offer to call the reviewer — phone number available in profile"
// Metadata
wordCount: number; // must be 50–150
processingNotes: string; // any constraints or decisions the agent made during drafting
}Sample output excerpt
{
"reviewId": "gbp-review-2026-03-28-001",
"draftResponse": "Thank you for taking the time to share your experience, Sarah. We're really sorry to hear that your visit didn't go as expected — the wait time you mentioned is not the standard we hold ourselves to, and we completely understand how frustrating that must have been. Our manager has been made aware and we're looking into what happened that day. We'd love the chance to make it right — please reach out to us directly at hello@acmecafe.com and we'll take care of you personally.",
"sentiment": "negative",
"topics": ["wait time", "service speed", "customer experience"],
"starRating": 2,
"requiresHITL": true,
"urgency": "high",
"escalationReason": "2-star review mentioning specific service failure — requires human approval before posting and possible follow-up outreach.",
"suggestedAction": "Consider reaching out directly to the reviewer if contact details are available. Offer a resolution (e.g. complimentary visit) — but do NOT commit to this in the response without manager approval.",
"wordCount": 98,
"processingNotes": "Negative review with specific complaint about wait time. Response acknowledges the issue without making specific commitments or admissions. No legal language detected. requiresHITL set to true per 1-3 star policy."
}{
"reviewId": "gbp-review-2026-03-29-002",
"draftResponse": "Thank you so much for the kind words, James! We're thrilled to hear you had a great experience with the team — comments like yours genuinely make our day. We look forward to seeing you again soon!",
"sentiment": "positive",
"topics": ["team", "customer service", "overall experience"],
"starRating": 5,
"requiresHITL": false,
"urgency": "normal",
"suggestedAction": null,
"wordCount": 43,
"processingNotes": "Positive 5-star review. Response is warm and brand-appropriate. No HITL required — eligible for bulk approval. Word count is 43 — within the 50-150 word guideline; brevity is appropriate for a short positive review."
}How It Works
-
Parse the review. Extract star rating, review text, reviewer first name (use first name only if full name is provided — never surname in the public response), platform, and date.
-
Immediate escalation check. Before any RAG or generation, scan the review text for escalation triggers (see Guardrails). If a legal threat, safeguarding concern, or health/safety incident is detected: set
urgency: critical,requiresHITL: true,draftResponse: ""— do NOT draft a response. Return the escalation record immediately without proceeding. -
Classify sentiment and topics. Identify the overall sentiment (positive/negative/neutral) and extract specific topics mentioned (e.g. “wait time”, “staff”, “parking”, “product quality”). These are used for dashboard reporting and trend analysis.
-
RAG: get relevant business context. Query Client Documents for: current offers or promotions that could be relevant to mention; business policies (returns, cancellations, hours) that may be relevant to a complaint; contact information (phone, email) for directing the reviewer. Query Published Content to check if the reviewer references something specific (e.g. a blog post, a product) — avoid directing them to outdated content.
-
Draft the response. Write a response that:
- Acknowledges the review appropriately for the star rating
- Uses the reviewer’s first name once (in the opener)
- Reflects the brand’s tone and voice
- For negative reviews: acknowledges the concern, does not make excuses, invites offline resolution via contact details
- For positive reviews: genuine warmth, brief, does not oversell
- Stays within 50–150 words
- Does not include promises, refunds, replacements, or specific commitments (these require HITL approval)
-
Apply HITL routing rule. Set
requiresHITL: truefor all 1–3 star reviews, regardless of content. Set to false for 4–5 star reviews unless an escalation trigger fired. -
Return output. The output is saved to the
review_responsestable. IfrequiresHITL: false(4–5 star), the response enters the bulk approval queue in the dashboard. IfrequiresHITL: true, a notification is sent to the assigned reviewer.
System Prompt
You are a professional customer communications specialist writing review responses for a
local or online business. Your job is to draft a genuine, brand-appropriate response to
a customer review on {{PLATFORM}}.
CLIENT CONTEXT:
{{CLIENT_CONTEXT}}
KNOWLEDGE BASE CONTEXT:
{{RAG_CONTEXT}}
Review details:
- Reviewer: {{REVIEWER_FIRST_NAME}}
- Star rating: {{STAR_RATING}}/5
- Date: {{REVIEW_DATE}}
- Review text: "{{REVIEW_TEXT}}"
Write a response that:
1. Opens with the reviewer's first name
2. Matches the star rating tone: warm and grateful for 4–5 stars; empathetic and
solution-oriented for 1–3 stars
3. Is genuine — avoid corporate boilerplate phrases like "we value your feedback"
4. For negative reviews: acknowledge the specific issue mentioned, do NOT make excuses
or defensive statements, invite the reviewer to contact you offline to resolve it
5. For positive reviews: be warm and brief — 2–4 sentences is appropriate
6. Use contact details from the client context if directing the reviewer to follow up
7. Reflects the client's brand voice throughout
Hard constraints:
- Response must be 50–150 words
- Do NOT make any promises: no refunds, no free items, no replacements — these require
human approval before they can be offered
- Do NOT make admissions of liability (e.g. "you're right, we were negligent")
- Do NOT use the reviewer's surname in the response
- If the review mentions a legal threat, personal injury, or health/safety incident:
do NOT draft a response — return an empty draftResponse and set urgency to critical
After writing the response, classify:
- sentiment: positive / negative / neutral
- topics: array of specific subjects mentioned in the review
- suggestedAction: any recommended follow-up beyond the public response (optional)
- processingNotes: any decisions or constraints you applied
Output as valid JSON matching the ReviewResponseWriterOutput schema.Skills Injected
| Skill file | Purpose |
|---|---|
client-context-file.md | Company, brand, audience — always injected |
review-response-guide.md | Response tone by star rating, escalation triggers, banned phrases, response formulas for common complaint types |
review-response-guide.md — content
# Review Response Guide
## Response Tone by Star Rating
### 5-Star Reviews
Tone: Warm, genuine, brief. The reviewer did you a favour — thank them without being
over-the-top. 2–3 sentences is ideal. Avoid hollow phrases.
- Good opener: "Thank you so much for the kind words, [Name]!"
- Avoid: "We are deeply grateful for your valued feedback at this juncture."
- Always: Invite them back with a genuine, natural-sounding closing.
### 4-Star Reviews
Tone: Appreciative but attentive. A 4-star means something was slightly off. Acknowledge
the positive, note that you're always working to improve, invite them back.
- Avoid: Asking what the missing star was for (looks needy and can invite a more negative reply).
- Good approach: "Glad to hear you enjoyed [X] — we're always working to make things even better."
### 3-Star Reviews
Tone: Empathetic, professional, solution-oriented. A 3-star is a soft complaint.
Acknowledge the experience, don't be defensive, invite them to reach out directly.
- Do NOT: Quote back their complaint verbatim (makes the response feel scripted)
- Do NOT: Be defensive or explain away their experience
- Always: Provide a way to contact you offline (email or phone)
### 1–2 Star Reviews
Tone: Calm, empathetic, accountable without admission of liability. The reviewer may be
angry — do not match their energy. Do not apologise for something that may be disputed.
Use language like "this is not the experience we want for our customers" rather than
"you're right, we messed up."
- Always requires HITL before posting
- Always include a direct contact method
- Never promise specific remedies (refunds, replacements, free items) in the public response
## Banned Phrases
These phrases sound robotic, condescending, or corporate — never use them:
- "We value your feedback"
- "Thank you for bringing this to our attention"
- "As per our policy"
- "We take all feedback very seriously"
- "Rest assured"
- "Dear valued customer"
- "At [Company], customer satisfaction is our top priority"
## Escalation Triggers — Do NOT Draft a Response
If ANY of the following are present in the review text, set urgency = critical,
requiresHITL = true, and return an empty draftResponse:
- Mentions of a personal injury or accident ("I was hurt", "I fell", "I got sick after")
- Explicit legal threats ("I'm contacting my lawyer", "I will sue", "legal action")
- Food safety incidents ("food poisoning", "I got sick from the food")
- Safeguarding or child welfare concerns
- Allegations of fraud or criminal behaviour
## Common Response Formulas
### Wait time complaint
"[Name], thanks for your patience and for taking the time to leave a review. We're sorry the
wait was longer than expected — that's not the experience we aim to deliver. We'd love to make
it right — please reach out to us at [contact] and we'll take care of you."
### Staff behaviour complaint
"[Name], we're really sorry to hear about your experience. The behaviour you've described
is not how our team is trained to work, and we take this seriously. Please reach out to us
directly at [contact] so we can look into this properly."
### Positive review (product or service compliment)
"Thank you so much, [Name]! We're thrilled to hear that [specific thing they mentioned]
hit the mark — that's exactly what we're going for. See you next time!"
## Word Count Guidance
- 5-star: 25–50 words (brief warmth)
- 4-star: 40–70 words
- 3-star: 60–100 words
- 1–2 star: 80–150 words (needs more care)RAG Usage
| Dataset | Query | When |
|---|---|---|
| Client Documents | "contact information phone email business hours policies" | Step 4 — to find the correct contact details to include in negative review responses |
| Client Documents | "current offers promotions [review topic]" | Step 4 — if a reviewer mentions a product or service, check for a relevant current offer to mention |
| Published Content | "[topic mentioned in review] blog post resource" | Step 4 — to avoid directing reviewers to outdated or irrelevant content |
| Website Content | "[product or service mentioned in review]" | Step 4 — to confirm product details or find the correct page to reference in a response |
| Competitor Research | Not queried | Not relevant to review responses |
RAG query strategy: Query Client Documents first — the contact information query is the most consistently needed. For short, simple reviews (especially positive ones), a single RAG call is sufficient. For negative reviews with specific product or service complaints, run a second targeted query on the topic mentioned. Keep queries narrow and specific — the agent’s response should be 50–150 words, so only immediately actionable context is needed.
Tools Required
| Tool | Method | Purpose | Required? |
|---|---|---|---|
rag_search | search | Query client contact info, policies, and relevant content | Yes |
Note: The response is NOT posted automatically by this agent. Posting is handled by a separate review-response-poster job dispatched after HITL approval. This agent only drafts and classifies.
HITL Gates
1–3 Star Reviews (mandatory review)
- All low-star reviews require human approval before posting — no exceptions.
- Review type:
review_response_approval - Urgency:
highfor 1–2 star;normalfor 3 star unless escalation trigger fired. - Reviewer sees: The original review, the draft response, sentiment classification, topics, and any suggested action.
- Reviewer actions: Approve (posts the response), Edit + Approve, Reject (triggers regeneration with feedback), or Mark as escalated.
- Timeout: If a critical-urgency review is not actioned within 24 hours, a reminder is sent via Slack.
4–5 Star Reviews (bulk approval queue)
- 4–5 star reviews with
requiresHITL: falsego into the bulk approval queue. - Reviewer can bulk-approve all pending positive reviews with one click.
- Reviewer can also individual-edit any positive review before approving.
Escalated Reviews (critical urgency)
urgency: criticalreviews have no draft response.- The HITL record shows the review text with the detected escalation trigger highlighted.
- The reviewer is notified immediately via Slack and email.
- No response is posted until a human explicitly writes one after consulting the appropriate stakeholder (manager, legal, etc.).
Guardrails
| Rule | Enforcement |
|---|---|
| Response word count 50–150 words | Hard check on wordCount; outside range → regenerate with explicit instruction |
| No legal admissions | Post-generation scan for phrases indicating liability admission; detected phrases → regenerate with explicit prohibition reinforced |
| No specific promises (refunds, replacements, free items) | Keyword scan for “refund”, “replace”, “free”, “compensate”, “reimburse” — if found in response, set requiresHITL: true and add note in escalationReason |
| Legal threat → no response drafted | Pre-generation trigger scan; if triggered, skip LLM call entirely and return escalation record |
| Reviewer surname must not appear in response | Check that response does not contain any word > 4 chars that appears in the reviewerName field beyond the first word |
| Response must not quote the review verbatim | Similarity check between response and review text; > 60% token overlap triggers regeneration |
Tenant Settings Used
| Setting | How it’s used |
|---|---|
brandVoice | Applied to the response tone — a formal brand gets measured, professional language; a casual/friendly brand gets warmer, more conversational responses |
tone | Fine-tunes the warmth level in positive responses and the empathy level in negative ones |
industry | Informs common complaint patterns — restaurant reviews differ from SaaS reviews; the system prompt context includes industry-specific guidance |
targetAudience | Helps calibrate the language level and references in the response |
Cost Profile
| Avg input tokens | ~2,000 (review + client context + RAG results + skills) |
| Avg output tokens | ~500 (JSON output with response) |
| Est. cost / task | ~$0.08 |
Note: Reviews are short — the high concurrency (8) and low per-task cost reflect the burst nature of this agent. A business receiving 10 reviews overnight will have all 10 drafted within minutes of the 6-hour polling run.
Error Handling
| Error | Response |
|---|---|
| Review text is empty (rating-only review) | Draft a brief generic response appropriate to the star rating; note “rating-only review — no specific content to reference” in processingNotes |
| reviewerName is empty | Use “there” as the opener: “Thank you for the review!” — do not use a placeholder |
| RAG returns no Client Documents results | Proceed without contact details in response; use generic “please reach out to us directly” without specifying channel |
| Response fails word count check after 2 retries | Return the closest valid response with a processingNotes warning; do not fail the job over word count alone |
| Response fails admissions check after 2 retries | Flag for manual review; set requiresHITL = true; include the detected phrase in escalationReason |
| Platform API unavailable for posting | This agent does not post — the downstream poster job handles this. This agent always succeeds if it can draft. |