45 min readIntelligence & insights

Implementation Guide: Monitor online reviews across platforms and summarize sentiment themes

Step-by-step implementation guide for deploying AI to monitor online reviews across platforms and summarize sentiment themes for Restaurants & Food Service clients.

Hardware Procurement

iPad 10th Generation Wi-Fi 64GB

AppleMPQ03LL/A (Silver) or MPQ13LL/A (Blue)Qty: 1

$329 per unit (MSP cost) / $475 suggested resale including MDM enrollment and configuration

Wall-mounted or counter-mounted dashboard display for the restaurant manager's office or kitchen pass area. Displays the real-time review monitoring dashboard, new review alerts, and weekly sentiment summary. Enrolled in MDM for remote management by the MSP.

Tablet Wall Mount - AboveTEK

AboveTEKTS-191BQty: 1

$30 per unit (MSP cost) / $75 suggested resale including installation

Secure locking wall mount bracket for the iPad dashboard display. Anti-theft, adjustable tilt, suitable for back-of-house installation near the manager's station or expo line.

UniFi Access Point U6 Lite

UbiquitiU6-LiteQty: 1

$99 per unit (MSP cost) / $249 suggested resale including configuration and mounting

Business-grade Wi-Fi access point to ensure stable, reliable connectivity for dashboard access, alert delivery, and any WiFi-based guest data capture if Bloom Intelligence CDP is added later. Only required if the restaurant's existing WiFi is consumer-grade or unreliable. Provides PoE-powered deployment with centralized management via UniFi Controller.

Software Procurement

ReviewTrackers

ReviewTrackers (InMoment)SaaS - per location, annual contractQty: per location

$89/month per location (MSP wholesale) / $149/month per location suggested resale. Volume discounts available at 5+ locations.

Primary review aggregation and monitoring platform. Centralizes reviews from Google, Yelp, TripAdvisor, Facebook, DoorDash, UberEats, and 100+ other sites into a single dashboard. Provides native sentiment scoring, response management, competitor tracking, and alert routing. Serves as the data source feeding the custom AI sentiment summarization pipeline.

OpenAI API (GPT-5.4 mini)

OpenAIGPT-5.4 mini

$0.15 per 1M input tokens / $0.60 per 1M output tokens. Estimated $5–$15/month for a single restaurant location processing 100–500 reviews/month. For 10 locations: $30–$80/month.

Powers the custom AI sentiment theme summarization engine. Processes raw review text extracted from ReviewTrackers to generate structured sentiment theme reports, trend analysis, and actionable recommendations that exceed the native analytics of the SaaS platform.

Google Workspace Business Starter

GoogleSaaS - per userQty: 1–2 users (restaurant owner + GM)

$7.20/user/month. MSP cost: $7.20/mo / Resale: included in managed service bundle.

Provides the business email domain used for review platform account creation, alert routing, and Google Business Profile ownership verification. Also provides Google Sheets for lightweight report delivery if the client prefers spreadsheet format over PDF.

Zapier (Professional Plan)

ZapierProfessional PlanQty: 1 account

$29.99/month (MSP cost, covers 750 tasks/month) / included in managed service fee

Integration middleware connecting ReviewTrackers webhooks to the custom OpenAI sentiment analysis pipeline, Slack/email alert routing, and Google Sheets report output. Handles scheduled triggers for weekly report generation without requiring a dedicated server.

Slack (Free or Pro)

Slack Technologies (Salesforce)SaaS - per workspaceQty: 1 workspace

Free tier sufficient for alert channel. Pro plan at $8.75/user/month if client wants full history. MSP cost: $0–$8.75/mo.

Real-time alert delivery channel for restaurant managers. A dedicated #reviews channel receives instant notifications of new negative reviews (1–2 star) and weekly sentiment summary posts. Enables rapid response to critical feedback.

Mosyle Business (MDM)

MosyleMosyle Fuse / Mosyle BusinessQty: per device

$1/device/month for Mosyle Fuse or free for Mosyle Business basic tier. MSP cost: $0–$1/mo per iPad.

Mobile device management for the dashboard iPad. Enables remote configuration, kiosk mode lockdown to the ReviewTrackers dashboard, remote wipe capability, and automatic updates. Allows the MSP to manage the device without on-site visits.

Prerequisites

  • Stable internet connection at each restaurant location with minimum 25 Mbps download speed and business-grade reliability (not shared residential service)
  • Google Business Profile claimed and verified for every restaurant location — owner must have admin access with login credentials available
  • Yelp Business account claimed for every location — owner must have access to Yelp for Business portal
  • TripAdvisor Management Center account claimed (if restaurant receives TripAdvisor reviews)
  • DoorDash Merchant Portal active account with login credentials (if restaurant uses DoorDash)
  • UberEats Restaurant Manager portal active account with login credentials (if restaurant uses UberEats)
  • Grubhub for Restaurants portal active account with login credentials (if restaurant uses Grubhub)
  • Facebook Business Page with admin access for each location
  • Valid business email address (preferably on the restaurant's own domain) for account creation and alert routing
  • Credit card or payment method authorized for SaaS subscription billing
  • Restaurant owner or authorized decision-maker available for platform access authorization and Terms of Service acceptance
  • List of top 3–5 local competitors (name and address) for competitive benchmarking configuration
  • Restaurant menu categories documented (e.g., appetizers, entrees, desserts, drinks, brunch) for sentiment theme customization
  • Contact information for all managers who should receive review alerts (name, email, phone number, preferred notification method)
  • If installing dashboard tablet: available wall space near manager's station or kitchen pass with access to a power outlet within 6 feet

Installation Steps

Step 1: Audit Existing Review Presence and Gather Credentials

Before any technical work begins, conduct a comprehensive audit of the restaurant's online presence across all review platforms. Document every location's profile URL, login credentials, ownership status, and current review volume. This prevents configuration delays and identifies unclaimed profiles that must be resolved before the monitoring platform can connect.

Create audit spreadsheet with the following columns: Location Name | Platform | Profile URL | Claimed (Y/N) | Admin Email | Login Available (Y/N) | Current Rating | Review Count | Notes

1
Google Maps — search restaurant name + address, click 'Own this business?' if unclaimed
2
Yelp — https://biz.yelp.com/ — search and claim
3
TripAdvisor — https://www.tripadvisor.com/Owners — search and claim
4
Facebook — check business page admin access under Settings > Page Roles
5
DoorDash — https://merchants.doordash.com/ — verify login
6
UberEats — https://merchants.ubereats.com/ — verify login
7
Grubhub — https://restaurant.grubhub.com/ — verify login
Note

This step often takes the longest due to lost credentials and unclaimed profiles. Google Business Profile verification can take 5–14 days via postcard. Start this immediately. If the client has a marketing agency managing social media, coordinate with them to avoid access conflicts. Document everything in a shared spreadsheet accessible to both the MSP team and the restaurant owner.

Step 2: Claim and Verify All Unclaimed Business Profiles

For any review platform where the restaurant's profile is unclaimed, initiate the claiming and verification process. This is a prerequisite for ReviewTrackers to pull reviews and for the client to respond to reviews through the platform. Each platform has its own verification method.

Google Business Profile Verification

1
Go to https://business.google.com/
2
Sign in with the restaurant's Google account
3
Search for the business name and address
4
Click 'Manage now' or 'Claim this business'
5
Choose verification method (postcard, phone, or email — phone is fastest)
6
Complete verification within 30 days

Yelp Business Claim

1
Go to https://biz.yelp.com/
2
Search for business
3
Click 'Claim your Business'
4
Verify via phone call or email to the number/email listed on the Yelp page

TripAdvisor Claim

1
Go to https://www.tripadvisor.com/Owners
2
Search for the restaurant
3
Click 'Claim Your Listing'
4
Verify via credit card statement charge or phone
Note

IMPORTANT: Use the restaurant owner's business email for all profile claims, NOT the MSP's email. The client must own these profiles. Document all credentials in a password manager (e.g., IT Glue, Hudu) shared with the client. Google postcard verification is the slowest — request phone verification if available for the location.

Step 3: Provision ReviewTrackers Account and Connect Review Sources

Create the ReviewTrackers account, add all restaurant locations, and connect each review source platform. ReviewTrackers uses direct API integrations with major platforms and web monitoring for others. This is the core configuration step that establishes the review data pipeline.

1
Go to https://www.reviewtrackers.com/ and request MSP/agency pricing
2
Complete account provisioning with MSP as the managing partner
3
In the ReviewTrackers admin dashboard: (a) Click 'Add Location' for each restaurant location, (b) Enter business name, address, phone number exactly as it appears on Google, (c) ReviewTrackers will auto-discover matching profiles on connected platforms
4
Connect Google Business Profile: (a) Go to Settings > Integrations > Google, (b) Authenticate with the Google account that owns the Business Profile, (c) Grant ReviewTrackers read access to reviews
5
Connect Yelp: (a) ReviewTrackers monitors Yelp via its partnership — enter the Yelp business URL, (b) No additional authentication typically required
6
Connect TripAdvisor: (a) Enter TripAdvisor listing URL, (b) ReviewTrackers monitors via content partnership
7
Connect Facebook: (a) Settings > Integrations > Facebook, (b) Authenticate with Facebook admin account, (c) Select the business page(s)
8
For DoorDash/UberEats/Grubhub: (a) Enter the merchant profile URLs, (b) ReviewTrackers monitors these via web monitoring, (c) Delivery platform reviews may have 24-48 hour delay
9
Verify initial review pull — confirm reviews from past 12 months are loading
Note

ReviewTrackers typically takes 24–72 hours to complete the initial historical review import. The Google integration requires the account that has ownership of the Google Business Profile — not just manager access. If the client has multiple Google accounts with different locations, you'll need credentials for each. Save integration status in your project tracker. Delivery platform review monitoring may require manual URL entry and periodic validation as these platforms change their URL structures.

Step 4: Configure Alert Rules and Notification Routing

Set up automated alert rules in ReviewTrackers to ensure restaurant managers are immediately notified of critical reviews and receive regular digests of all activity. Proper alert configuration is what makes this system actionable rather than just informational.

1
Navigate to Settings > Notifications
2
Create Alert Rule: 'Critical Negative Review' — Trigger: New review with 1 or 2 stars | Recipients: GM email, owner email | Channel: Email + SMS (if available) | Frequency: Immediate (real-time)
3
Create Alert Rule: 'New Review Notification' — Trigger: Any new review (all star ratings) | Recipients: GM email | Channel: Email | Frequency: Daily digest (morning, 7:00 AM local time)
4
Create Alert Rule: 'Weekly Summary' — Trigger: Weekly schedule | Recipients: Owner email, GM email | Channel: Email | Frequency: Every Monday at 8:00 AM local time
5
Configure competitor monitoring — Add 3-5 local competitors by name and address | Enable monthly competitor comparison report
Note

Alert fatigue is real — do NOT set all reviews to immediate notification for busy restaurants that receive 20+ reviews per week. Only 1-2 star reviews should trigger immediate alerts. Set the daily digest for the morning so the GM reviews feedback before the lunch rush. If the restaurant has multiple managers (e.g., AM and PM shift leads), create role-based alert rules. Test all alert deliverability before handoff.

Step 5: Set Up OpenAI API Account and Configure Sentiment Analysis Pipeline

Create an OpenAI API account, generate API keys, and set up the custom sentiment summarization pipeline that will process reviews exported from ReviewTrackers and generate structured theme-based sentiment reports. This is the custom AI layer that differentiates the MSP's offering from basic SaaS functionality.

1
Create OpenAI API account at https://platform.openai.com/signup
2
Add payment method (credit card) under Billing
3
Set usage limits: $25/month soft limit, $50/month hard limit (adjust per client volume)
4
Generate API key: a. Go to https://platform.openai.com/api-keys b. Click 'Create new secret key' c. Name it: 'ReviewSentiment-[ClientName]-Production' d. Copy and store securely in password manager
5
Create a dedicated project in OpenAI dashboard for cost tracking

Install Python environment (on MSP management workstation or cloud VM):

Create and activate Python virtual environment, then install dependencies
bash
python3 -m venv review-sentiment-env
source review-sentiment-env/bin/activate
pip install openai pandas python-dotenv requests jinja2

Create project directory structure:

Set up project folder structure
bash
mkdir -p ~/review-sentiment/{config,data,output,templates,logs}
cd ~/review-sentiment

Create .env file for API key:

Initialize .env file with required API credentials
bash
echo 'OPENAI_API_KEY=sk-your-api-key-here' > .env
echo 'CLIENT_NAME=Restaurant_Name' >> .env
echo 'REVIEWTRACKERS_API_KEY=your-rt-key-here' >> .env
Note

SECURITY: Never commit the .env file to version control. Add it to .gitignore immediately. The OpenAI API usage limits are critical — set them conservatively and monitor for the first month. GPT-5.4 mini is the recommended model for cost efficiency; GPT-5.4 can be used for higher-quality analysis at 17x the cost. For restaurants with fewer than 200 reviews/month, total OpenAI costs will be under $10/month.

Step 6: Deploy the Custom Sentiment Theme Summarization Script

Deploy the Python-based sentiment analysis pipeline that fetches reviews from ReviewTrackers via API (or processes CSV exports), sends batches to GPT-5.4 mini for structured sentiment theme extraction, and generates formatted reports. This script runs on a weekly schedule to produce the managed-service deliverable.

1
Create the main analysis script:
Main sentiment analysis script
bash
# writes analyze_reviews.py to the review-sentiment directory

cat > ~/review-sentiment/analyze_reviews.py << 'SCRIPT_EOF'
import os, json, csv, datetime, logging
from pathlib import Path
from openai import OpenAI
from dotenv import load_dotenv
from jinja2 import Template

load_dotenv()
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

logging.basicConfig(
    filename='logs/sentiment_analysis.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

SENTIMENT_SYSTEM_PROMPT = open('config/system_prompt.txt').read()

def load_reviews_from_csv(filepath):
    reviews = []
    with open(filepath, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            reviews.append({
                'source': row.get('source', 'Unknown'),
                'rating': row.get('rating', 'N/A'),
                'date': row.get('date', ''),
                'text': row.get('review_text', row.get('content', ''))
            })
    return reviews

def chunk_reviews(reviews, chunk_size=25):
    for i in range(0, len(reviews), chunk_size):
        yield reviews[i:i + chunk_size]

def analyze_chunk(reviews_chunk, location_name):
    reviews_text = ''
    for i, r in enumerate(reviews_chunk, 1):
        reviews_text += f"Review {i} [{r['source']}, {r['rating']} stars, {r['date']}]:\n{r['text']}\n\n"
    response = client.chat.completions.create(
        model='gpt-5.4-mini',
        messages=[
            {'role': 'system', 'content': SENTIMENT_SYSTEM_PROMPT},
            {'role': 'user', 'content': f'Location: {location_name}\n\nReviews to analyze:\n\n{reviews_text}'}
        ],
        response_format={'type': 'json_object'},
        temperature=0.3,
        max_tokens=2000
    )
    return json.loads(response.choices[0].message.content)

def generate_report(all_results, location_name, period):
    template = Template(open('templates/report_template.html').read())
    html = template.render(
        location=location_name,
        period=period,
        results=all_results,
        generated_at=datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
    )
    output_path = f"output/{location_name.replace(' ', '_')}_{period}.html"
    with open(output_path, 'w') as f:
        f.write(html)
    logging.info(f'Report generated: {output_path}')
    return output_path

if __name__ == '__main__':
    import sys
    csv_path = sys.argv[1] if len(sys.argv) > 1 else 'data/reviews_export.csv'
    location = os.getenv('CLIENT_NAME', 'Restaurant')
    period = datetime.date.today().strftime('%Y-W%U')
    reviews = load_reviews_from_csv(csv_path)
    logging.info(f'Loaded {len(reviews)} reviews for {location}')
    all_results = []
    for chunk in chunk_reviews(reviews, 25):
        result = analyze_chunk(chunk, location)
        all_results.append(result)
        logging.info(f'Analyzed chunk of {len(chunk)} reviews')
    report_path = generate_report(all_results, location, period)
    print(f'Report saved to: {report_path}')
SCRIPT_EOF
Note

The script processes reviews in batches of 25 to stay within token limits and provide granular analysis. CSV export from ReviewTrackers is the simplest integration method — export weekly via the RT dashboard or use their API if available on your plan. For multi-location deployments, parameterize the location name and run the script once per location. The JSON response format ensures structured output from GPT-5.4 mini.

Step 7: Configure the AI System Prompt for Restaurant Sentiment Analysis

Create the specialized system prompt that instructs GPT-5.4 mini to analyze restaurant reviews according to industry-specific sentiment themes. This prompt is the intellectual core of the custom AI component and must be tuned to the restaurant vertical.

Write the restaurant sentiment analysis system prompt to disk
bash
cat > ~/review-sentiment/config/system_prompt.txt << 'PROMPT_EOF'
You are a restaurant review sentiment analyst working for a restaurant management consulting firm. Analyze the provided customer reviews and extract structured sentiment insights.

For each batch of reviews, return a JSON object with the following structure:

{
  "summary": "2-3 sentence executive summary of overall sentiment in this batch",
  "total_reviews_analyzed": <number>,
  "average_sentiment_score": <float from -1.0 to 1.0>,
  "themes": [
    {
      "theme_name": "<category name>",
      "sentiment": "positive|negative|mixed",
      "mention_count": <number of reviews mentioning this theme>,
      "score": <float from -1.0 to 1.0>,
      "representative_quotes": ["<direct quote 1>", "<direct quote 2>"],
      "actionable_insight": "<specific, actionable recommendation for the restaurant>"
    }
  ],
  "urgent_issues": [
    {
      "issue": "<description of urgent issue>",
      "severity": "critical|high|medium",
      "source_review_numbers": [<review numbers>],
      "recommended_action": "<immediate action to take>"
    }
  ],
  "trending": {
    "improving": ["<themes showing improvement>"],
    "declining": ["<themes showing decline>"],
    "new_this_period": ["<themes not previously seen>"]
  },
  "platform_comparison": {
    "<platform_name>": {
      "avg_rating": <float>,
      "primary_sentiment": "<summary>"
    }
  }
}

Categorize mentions into these restaurant-specific themes:
- Food Quality (taste, freshness, temperature, presentation, portion size)
- Service Speed (wait times, seating time, food delivery time, order accuracy timing)
- Staff Friendliness (hospitality, attentiveness, professionalism, knowledge)
- Ambiance (decor, noise level, cleanliness, comfort, music, lighting)
- Value/Pricing (value for money, portion-to-price ratio, specials, happy hour)
- Menu Variety (options, dietary accommodations, specials, seasonal items)
- Cleanliness/Hygiene (restrooms, dining area, visible kitchen, utensils)
- Delivery Experience (packaging, temperature on arrival, order accuracy, delivery time)
- Online Ordering (app/website usability, order accuracy, payment issues)
- Reservations/Seating (booking process, wait times, host interaction)
- Management Response (how restaurant handles complaints, recovery efforts)

Rules:
1. Only include themes that are actually mentioned in the reviews — do not fabricate themes with zero mentions
2. Extract EXACT quotes from reviews — do not paraphrase
3. Sentiment scores: -1.0 = extremely negative, 0 = neutral, 1.0 = extremely positive
4. Flag any mention of food safety, illness, allergen issues, or discrimination as CRITICAL urgent issues
5. If reviews mention specific dishes, staff names, or time periods, include those details
6. Compare sentiment across platforms if multiple sources are present
PROMPT_EOF
Note

This system prompt has been specifically tuned for restaurant vertical analysis. Customize the theme categories if the client has specific focus areas (e.g., a bar might want a 'Cocktails/Drinks' category). The prompt instructs the model to return structured JSON, which makes downstream report generation reliable. Review and refine this prompt after the first 2-3 weekly runs based on output quality.

Step 8: Create the HTML Report Template

Deploy the Jinja2 HTML report template that transforms the structured JSON output from GPT-5.4 mini into a professional, client-facing weekly sentiment report. This report is the primary managed-service deliverable that justifies the recurring revenue.

Create the Jinja2 HTML report template file
bash
cat > ~/review-sentiment/templates/report_template.html << 'TPL_EOF'
<!DOCTYPE html>
<html><head><meta charset='utf-8'><title>Weekly Sentiment Report - {{ location }}</title>
<style>
body{font-family:'Segoe UI',Arial,sans-serif;max-width:900px;margin:0 auto;padding:20px;color:#333}
h1{color:#1a5276;border-bottom:3px solid #2e86c1;padding-bottom:10px}
h2{color:#2e86c1;margin-top:30px}
.summary{background:#eaf2f8;padding:15px;border-radius:8px;margin:20px 0;border-left:4px solid #2e86c1}
.theme-card{background:#fff;border:1px solid #ddd;border-radius:8px;padding:15px;margin:10px 0;box-shadow:0 2px 4px rgba(0,0,0,0.1)}
.positive{border-left:4px solid #27ae60}.negative{border-left:4px solid #e74c3c}.mixed{border-left:4px solid #f39c12}
.urgent{background:#fdedec;border:2px solid #e74c3c;border-radius:8px;padding:15px;margin:10px 0}
.score{font-size:24px;font-weight:bold;float:right}
.quote{font-style:italic;color:#666;margin:5px 0;padding-left:15px;border-left:2px solid #ccc}
.insight{background:#eafaf1;padding:10px;border-radius:5px;margin-top:10px}
.meta{color:#999;font-size:12px;text-align:right;margin-top:40px}
table{width:100%;border-collapse:collapse}td,th{padding:8px;border:1px solid #ddd;text-align:left}th{background:#f5f5f5}
</style></head><body>
<h1>📊 Weekly Review Sentiment Report</h1>
<p><strong>Location:</strong> {{ location }} | <strong>Period:</strong> {{ period }}</p>
{% for result in results %}
<div class='summary'><h3>Summary</h3><p>{{ result.summary }}</p>
<p>Reviews Analyzed: {{ result.total_reviews_analyzed }} | Average Sentiment: {{ '%.2f'|format(result.average_sentiment_score) }}</p></div>
{% if result.urgent_issues %}<h2>🚨 Urgent Issues</h2>
{% for issue in result.urgent_issues %}<div class='urgent'><strong>[{{ issue.severity|upper }}]</strong> {{ issue.issue }}<br><em>Action: {{ issue.recommended_action }}</em></div>{% endfor %}{% endif %}
<h2>📋 Sentiment Themes</h2>
{% for theme in result.themes|sort(attribute='score', reverse=true) %}
<div class='theme-card {{ theme.sentiment }}'><span class='score'>{{ '%.1f'|format(theme.score) }}</span>
<h3>{{ theme.theme_name }}</h3><p>Mentions: {{ theme.mention_count }} | Sentiment: {{ theme.sentiment }}</p>
{% for q in theme.representative_quotes %}<p class='quote'>"{{ q }}"</p>{% endfor %}
<div class='insight'>💡 {{ theme.actionable_insight }}</div></div>{% endfor %}
{% if result.platform_comparison %}<h2>📱 Platform Comparison</h2><table><tr><th>Platform</th><th>Avg Rating</th><th>Primary Sentiment</th></tr>
{% for platform, data in result.platform_comparison.items() %}<tr><td>{{ platform }}</td><td>{{ data.avg_rating }}</td><td>{{ data.primary_sentiment }}</td></tr>{% endfor %}</table>{% endif %}
{% endfor %}
<p class='meta'>Generated: {{ generated_at }} | Powered by AI Sentiment Analysis</p>
</body></html>
TPL_EOF
Note

This template produces a clean, professional HTML report that can be emailed directly to the client or converted to PDF. Customize the header color and branding with the MSP's logo for white-label delivery. The template auto-sorts themes by sentiment score (most positive first) and highlights urgent issues at the top. For multi-location clients, generate one report per location and one rollup summary report.

Step 9: Configure Zapier Integration for Automated Weekly Pipeline

Set up the Zapier automation that connects ReviewTrackers to the sentiment analysis pipeline and routes reports and alerts to the appropriate channels. This eliminates manual intervention for the weekly report cycle.

Zapier Workflow 1: Weekly Review Export + Analysis

  • Trigger: Schedule — Every Monday at 6:00 AM (client's local time)
  • Step 1: Webhooks by Zapier — GET request to ReviewTrackers API
  • Step 2: Code by Zapier (Python) — Format reviews into CSV
  • Step 3: Webhooks by Zapier — POST to your analysis endpoint (or use Code by Zapier to call OpenAI API directly)
  • Step 4: Email by Zapier — Send HTML report to client
ReviewTrackers API request — Step 1 of Workflow 1
http
GET https://api.reviewtrackers.com/v2/reviews
Authorization: Bearer {RT_API_KEY}
Params: filter[created_after]={7 days ago ISO date}
Email by Zapier configuration — Step 4 of Workflow 1
text
To: owner@restaurant.com, gm@restaurant.com
Subject: Weekly Review Sentiment Report - {Location} - Week of {date}
Body: {HTML report content}

Zapier Workflow 2: Real-Time Negative Review Alert to Slack

  • Trigger: Webhooks by Zapier — Catch Hook (ReviewTrackers webhook)
  • Filter: Only continue if rating <= 2
  • Step 1: Slack — Send Channel Message to #review-alerts
Slack message configuration — Workflow 2
text
Channel: #review-alerts
Message: 🚨 *New {rating}-star review on {source}*
         "{review_text_preview}..."
         <{review_url}|Respond Now>

Zapier Workflow 3: Monthly Competitor Comparison

  • Trigger: Schedule — 1st of each month at 8:00 AM
  • Steps: Similar to Workflow 1 but includes competitor data

Alternative to Zapier: Cron on a Cloud VM

Cron job to run weekly sentiment analysis — alternative to Zapier
bash
crontab -e
0 6 * * 1 cd /home/user/review-sentiment && python analyze_reviews.py data/weekly_export.csv 2>&1 >> logs/cron.log
Note

If the ReviewTrackers plan does not include API access, use the manual CSV export workflow instead: export reviews from the RT dashboard weekly and upload to the data/ directory. Zapier's free tier (100 tasks/month) may suffice for single-location clients with low review volume. For multi-location deployments, the Professional plan ($29.99/mo) is recommended. The cron-based alternative requires a persistent cloud VM but eliminates Zapier costs.

Step 10: Configure Dashboard iPad in Kiosk Mode

Set up the optional wall-mounted iPad as a dedicated review monitoring dashboard display. Enroll it in MDM, configure kiosk mode to lock it to the ReviewTrackers web dashboard, and mount it in the restaurant's back-of-house area.

1
Unbox and power on the iPad
2
Connect to restaurant WiFi network
3
Enroll in Mosyle MDM: On the iPad: Settings > General > VPN & Device Management. Navigate to your Mosyle enrollment URL (provided during Mosyle setup). Install the MDM profile and trust it.
4
In Mosyle admin console (https://business.mosyle.com): Navigate to Management > Profiles. Create new profile: 'Review Dashboard Kiosk'. Under Restrictions: enable Single App Mode. Set allowed app: Safari. Under Web Content Filter: allow only reviewtrackers.com domain. Set auto-lock: Never. Disable: camera, Siri, app installation, settings changes. Push profile to the iPad.
5
On the iPad: Open Safari. Navigate to ReviewTrackers dashboard URL. Log in with the client's ReviewTrackers credentials. Bookmark the dashboard page. Configure Safari to open to bookmark on launch.
6
Mount the iPad: Install AboveTEK wall mount at eye level near manager's desk. Route power cable along wall to nearest outlet. Use cable management clips for clean installation. Secure iPad in mount and lock.
Note

If the client declines the iPad option, skip this step entirely — the ReviewTrackers dashboard is accessible from any device with a web browser. Ensure the iPad is on a separate VLAN from guest WiFi and POS systems for security. Set the display brightness to a comfortable level for the back-of-house environment. The kiosk mode prevents staff from using the iPad for personal browsing or accidentally navigating away from the dashboard.

Step 11: Verify FTC Compliance and Configure Review Solicitation

Audit and configure the client's review solicitation practices to ensure full compliance with the FTC Consumer Review Rule effective October 2024. This step protects the client from civil penalties and the MSP from liability.

FTC Consumer Review Rule Compliance Checklist

1. Review Gating

Verify ReviewTrackers is NOT configured to only solicit reviews from customers who indicate a positive experience, filter or suppress negative reviews from being published, or route satisfied customers to public review sites and dissatisfied customers to private feedback.

1
CHECK: Review any existing review solicitation emails/texts
2
ACTION: If gating exists, disable immediately

2. Fake Reviews

Confirm the client has never purchased fake reviews, is not using AI to generate fake reviews, and does not incentivize employees to write reviews.

1
ACTION: Get written acknowledgment from client

3. Incentivized Reviews

If using review solicitation, ensure all incentive programs follow FTC guidelines. The following examples illustrate what is and is not permitted:

1
ACTION: Audit all current incentive programs

4. Review Response Policy

  • Positive reviews: Thank within 24–48 hours
  • Negative reviews: Acknowledge, apologize, offer offline resolution within 4 hours
  • Never threaten legal action against reviewers
  • Never demand review removal as a condition of resolving a complaint

Create template responses for both positive and negative reviews following the policy above.

5. Configure ReviewTrackers Review Request Feature

  • Template: neutral, non-gating solicitation message
  • Timing: 2–4 hours after dining experience
  • Method: Email or SMS (with proper opt-in under TCPA)
Critical

This step is CRITICAL and non-negotiable. The FTC began enforcement of the Consumer Review Rule in December 2025 with penalties up to $51,744 per violation. Document all compliance configurations and get the client's written acknowledgment of review solicitation policies. If the client has an existing practice of review gating or incentivized positive reviews, these must be stopped immediately regardless of the impact on review volume. The MSP should include a compliance disclaimer in the managed service agreement.

Step 12: Run Initial Full Analysis and Generate Baseline Report

Execute the full sentiment analysis pipeline on the client's historical reviews (past 90 days minimum) to establish a sentiment baseline. This baseline report is the first deliverable to the client and sets expectations for the ongoing service.

1
Export historical reviews from ReviewTrackers: In RT dashboard: Reports > Reviews > Export CSV
2
Set date range: Past 90 days
3
Include all sources and all locations
4
Download to ~/review-sentiment/data/baseline_export.csv
Activate environment and run analysis
bash
cd ~/review-sentiment
source review-sentiment-env/bin/activate
python analyze_reviews.py data/baseline_export.csv
Verify output — should see: Restaurant_Name_2025-W{XX}.html
bash
ls -la output/
Open and review the report
bash
open output/Restaurant_Name_*.html  # macOS
# or: xdg-open output/Restaurant_Name_*.html  # Linux
1
Verify all themes are populated with real quotes
2
Verify sentiment scores align with star ratings
3
Verify urgent issues are correctly flagged
4
Verify platform comparison is accurate
5
Verify no hallucinated content or fabricated quotes
  • If adjustments are needed, edit config/system_prompt.txt and re-run
Generate a PDF version for email delivery
bash
pip install weasyprint
python -c "from weasyprint import HTML; HTML('output/Restaurant_Name_2025-WXX.html').write_pdf('output/baseline_report.pdf')"
Note

The baseline report is your sales tool — it demonstrates the value of the service to the restaurant owner by revealing patterns they didn't know existed. Review the report thoroughly before sending to the client. Look for any hallucinated quotes (quotes not actually present in the reviews) and remove them. The first report often reveals significant themes: common ones for restaurants include 'wait times during weekend brunch', 'inconsistent food quality across shifts', and 'delivery packaging issues'. Use these findings in the handoff meeting to demonstrate ROI.

Custom AI Components

Restaurant Review Sentiment Analyzer

Type: prompt A specialized GPT-5.4 mini system prompt engineered for restaurant-vertical review analysis. It extracts structured sentiment themes from customer reviews across multiple platforms (Google, Yelp, TripAdvisor, delivery apps), categorizes feedback into restaurant-specific operational areas, identifies urgent food safety or service issues, compares sentiment across platforms, and generates actionable recommendations for restaurant operators. The prompt enforces JSON output for reliable downstream processing.

Implementation

System Prompt (save as config/system_prompt.txt)
json
You are a restaurant review sentiment analyst working for a restaurant management consulting firm. Analyze the provided customer reviews and extract structured sentiment insights.

For each batch of reviews, return a JSON object with the following structure:

{
  "summary": "2-3 sentence executive summary of overall sentiment in this batch",
  "total_reviews_analyzed": <number>,
  "average_sentiment_score": <float from -1.0 to 1.0>,
  "themes": [
    {
      "theme_name": "<category name>",
      "sentiment": "positive|negative|mixed",
      "mention_count": <number of reviews mentioning this theme>,
      "score": <float from -1.0 to 1.0>,
      "representative_quotes": ["<direct quote 1>", "<direct quote 2>"],
      "actionable_insight": "<specific, actionable recommendation for the restaurant>"
    }
  ],
  "urgent_issues": [
    {
      "issue": "<description of urgent issue>",
      "severity": "critical|high|medium",
      "source_review_numbers": [<review numbers>],
      "recommended_action": "<immediate action to take>"
    }
  ],
  "trending": {
    "improving": ["<themes showing improvement>"],
    "declining": ["<themes showing decline>"],
    "new_this_period": ["<themes not previously seen>"]
  },
  "platform_comparison": {
    "<platform_name>": {
      "avg_rating": <float>,
      "primary_sentiment": "<summary>"
    }
  }
}

Categorize mentions into these restaurant-specific themes:

  • Food Quality (taste, freshness, temperature, presentation, portion size)
  • Service Speed (wait times, seating time, food delivery time, order accuracy timing)
  • Staff Friendliness (hospitality, attentiveness, professionalism, knowledge)
  • Ambiance (decor, noise level, cleanliness, comfort, music, lighting)
  • Value/Pricing (value for money, portion-to-price ratio, specials, happy hour)
  • Menu Variety (options, dietary accommodations, specials, seasonal items)
  • Cleanliness/Hygiene (restrooms, dining area, visible kitchen, utensils)
  • Delivery Experience (packaging, temperature on arrival, order accuracy, delivery time)
  • Online Ordering (app/website usability, order accuracy, payment issues)
  • Reservations/Seating (booking process, wait times, host interaction)
  • Management Response (how restaurant handles complaints, recovery efforts)

Rules:

1
Only include themes that are actually mentioned in the reviews — do not fabricate themes
2
Extract EXACT quotes from reviews — do not paraphrase
3
Sentiment scores: -1.0 = extremely negative, 0 = neutral, 1.0 = extremely positive
4
Flag any mention of food safety, illness, allergen issues, or discrimination as CRITICAL urgent issues
5
If reviews mention specific dishes, staff names, or time periods, include those details
6
Compare sentiment across platforms if multiple sources are present
7
Provide actionable insights that a restaurant GM can implement within 1 week

Model Configuration:

  • Model: gpt-5.4-mini
  • Temperature: 0.3 (low creativity, high consistency)
  • Max tokens: 2000 per batch
  • Response format: json_object
  • Batch size: 25 reviews per API call

Negative Review Auto-Response Drafter

Type: agent

An AI agent that automatically drafts professional, empathetic response templates for negative reviews (1-2 stars) detected by ReviewTrackers. The agent generates a response tailored to the specific complaints mentioned in the review, following restaurant industry best practices for review recovery. Responses are drafted for human approval — never auto-published. The agent is triggered via Zapier webhook when a low-rating review is detected.

Implementation

Add to analyze_reviews.py or create as response_drafter.py
python
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

RESPONSE_SYSTEM_PROMPT = """You are a professional restaurant manager drafting a public response to a negative customer review. Your tone must be:
- Empathetic and apologetic (never defensive)
- Professional and warm
- Specific to the issues raised (reference their exact complaints)
- Brief (3-5 sentences maximum)
- Ending with an invitation to return and a way to reach management directly

Format your response as JSON:
{
  "response_text": "<the draft response>",
  "key_issues_addressed": ["<issue 1>", "<issue 2>"],
  "suggested_recovery_action": "<internal action for the GM, not included in public response>",
  "urgency": "immediate|within_24h|standard"
}

Rules:
1. Never admit legal liability or specific fault for food safety issues
2. Never offer specific compensation in the public response (handle offline)
3. Always include a direct contact method (email or phone)
4. Use the restaurant name naturally if provided
5. Never be sarcastic, dismissive, or confrontational
6. If the review mentions a specific employee by name, do NOT name them in the response
7. Keep under 150 words for the public response"""

def draft_response(review_text, rating, source_platform, restaurant_name, manager_name='Management', contact_email=''):
    user_prompt = f"""Restaurant: {restaurant_name}
Manager Name: {manager_name}
Contact Email: {contact_email}
Platform: {source_platform}
Rating: {rating} stars
Review Text: {review_text}

Draft a professional response to this review."""
    
    response = client.chat.completions.create(
        model='gpt-5.4-mini',
        messages=[
            {'role': 'system', 'content': RESPONSE_SYSTEM_PROMPT},
            {'role': 'user', 'content': user_prompt}
        ],
        response_format={'type': 'json_object'},
        temperature=0.4,
        max_tokens=500
    )
    return json.loads(response.choices[0].message.content)

# Usage example:
# result = draft_response(
#     review_text='Waited 45 minutes for cold food. Server never checked on us.',
#     rating=1,
#     source_platform='Google',
#     restaurant_name='Bella Cucina',
#     manager_name='Maria',
#     contact_email='maria@bellacucina.com'
# )
# print(result['response_text'])

Zapier Integration

1
ReviewTrackers webhook fires on new review
2
Zapier filter: only continue if rating <= 2
3
Zapier Code step: call draft_response() via OpenAI API directly in Zapier
4
Zapier Slack step: post draft to #review-responses channel
5
Manager reviews draft, edits if needed, copies to ReviewTrackers response field
6
Manager clicks 'Publish Response' in ReviewTrackers
Note

Cost: ~$0.001 per response (GPT-5.4 mini)

Weekly Sentiment Trend Comparator

Type: workflow

A workflow component that compares the current week's sentiment analysis results against the previous 4 weeks to identify statistically meaningful trends. This transforms point-in-time sentiment data into longitudinal trend insights, enabling the restaurant to see whether operational changes are improving or degrading customer satisfaction over time.

Implementation

trend_comparator.py
python
# core module for loading historical results and calling GPT for
# longitudinal trend analysis

import json
import os
from pathlib import Path
from datetime import datetime, timedelta
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

def load_historical_results(output_dir='output', weeks=4):
    """Load the JSON analysis results from the past N weeks."""
    results = []
    json_files = sorted(Path(output_dir).glob('*_analysis.json'), reverse=True)
    for f in json_files[:weeks]:
        with open(f) as fh:
            data = json.load(fh)
            data['_filename'] = f.name
            results.append(data)
    return results

def compare_trends(current_results, historical_results, location_name):
    """Use GPT-5.4 mini to compare current week vs historical trend."""
    prompt = f"""You are analyzing sentiment trends for {location_name} restaurant.

Current week analysis:
{json.dumps(current_results, indent=2)}

Previous {len(historical_results)} weeks (most recent first):
{json.dumps(historical_results, indent=2)}

Provide a trend analysis as JSON:
{{
  "overall_trend": "improving|stable|declining",
  "overall_trend_explanation": "<2-3 sentences explaining the overall trajectory>",
  "theme_trends": [
    {{
      "theme": "<theme name>",
      "direction": "improving|stable|declining|new",
      "current_score": <float>,
      "previous_avg_score": <float>,
      "change": <float>,
      "explanation": "<why this theme is trending this way>",
      "action_needed": true|false
    }}
  ],
  "notable_changes": ["<significant changes worth highlighting to the owner>"],
  "predicted_next_week": "<brief prediction based on trends>"
}}"""
    
    response = client.chat.completions.create(
        model='gpt-5.4-mini',
        messages=[
            {'role': 'system', 'content': 'You are a restaurant analytics expert providing trend analysis. Return valid JSON only.'},
            {'role': 'user', 'content': prompt}
        ],
        response_format={'type': 'json_object'},
        temperature=0.3,
        max_tokens=1500
    )
    return json.loads(response.choices[0].message.content)

Workflow Execution Order

1
Weekly cron/Zapier trigger fires Monday 6:00 AM
2
New reviews are fetched and analyzed by analyze_reviews.py
3
Current week's raw JSON results are saved to output/{location}_{week}_analysis.json
4
trend_comparator.py loads current + past 4 weeks of JSON results
5
compare_trends() sends both to GPT-5.4 mini for longitudinal analysis
6
Trend data is injected into the weekly HTML report template (add a 'Trends' section)
7
Complete report (themes + trends) is emailed to client

Save Raw JSON Alongside HTML

Modify the analyze_reviews.py main block to save raw JSON output:

Add to analyze_reviews.py main block to persist raw JSON results for trend comparison
python
json_output_path = f"output/{location.replace(' ', '_')}_{period}_analysis.json"
with open(json_output_path, 'w') as jf:
    json.dump({'period': period, 'results': all_results}, jf, indent=2)

Competitive Benchmarking Analyzer

Type: skill A skill that analyzes the client restaurant's sentiment themes against 3-5 local competitors, using publicly available review data from ReviewTrackers' competitor tracking feature. Produces a monthly competitive positioning report showing where the client excels and where competitors outperform them.

Implementation

competitor_analysis.py
python
# Core competitive benchmarking function

import json
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))

COMPETITOR_PROMPT = """You are a competitive intelligence analyst for restaurants. Given review sentiment data for a client restaurant and its local competitors, produce a competitive benchmarking report.

Return JSON:
{
  "competitive_position": "leader|competitive|lagging",
  "executive_summary": "<3-4 sentences on competitive standing>",
  "advantages": [
    {
      "theme": "<theme where client outperforms>",
      "client_score": <float>,
      "competitor_avg_score": <float>,
      "gap": <float>,
      "recommendation": "<how to leverage this advantage in marketing>"
    }
  ],
  "vulnerabilities": [
    {
      "theme": "<theme where competitors outperform>",
      "client_score": <float>,
      "competitor_avg_score": <float>,
      "gap": <float>,
      "recommendation": "<specific action to close the gap>"
    }
  ],
  "competitor_highlights": [
    {
      "competitor_name": "<name>",
      "strongest_theme": "<their best area>",
      "weakest_theme": "<their worst area>",
      "opportunity": "<how client can capitalize on competitor weakness>"
    }
  ],
  "market_trends": ["<trends observed across all restaurants in the local market>"]
}"""

def analyze_competitive_landscape(client_data, competitor_data_list, client_name):
    user_prompt = f"""Client Restaurant: {client_name}
Client Sentiment Data (past 30 days):
{json.dumps(client_data, indent=2)}

Competitor Data:
{json.dumps(competitor_data_list, indent=2)}

Produce a competitive benchmarking analysis."""
    
    response = client.chat.completions.create(
        model='gpt-5.4-mini',
        messages=[
            {'role': 'system', 'content': COMPETITOR_PROMPT},
            {'role': 'user', 'content': user_prompt}
        ],
        response_format={'type': 'json_object'},
        temperature=0.3,
        max_tokens=2000
    )
    return json.loads(response.choices[0].message.content)

Data Source

1
ReviewTrackers competitor tracking exports competitor review data in the same CSV format as client reviews
2
Export competitor reviews monthly from RT dashboard: Reports > Competitors > Export
3
Run each competitor's reviews through the main analyze_reviews.py to get structured sentiment JSON
4
Feed all structured JSONs into analyze_competitive_landscape()
  • Schedule: Monthly (1st of each month)
  • Cost: ~$0.01-0.03 per competitor analysis (GPT-5.4 mini)
  • Delivery: Append competitive section to monthly report or deliver as standalone PDF

Slack Alert Formatter

Type: integration A Zapier-compatible integration that formats incoming ReviewTrackers webhook data into rich Slack messages with contextual information, sentiment indicators, and action buttons. Provides instant visibility to restaurant managers for all new reviews, with enhanced formatting for critical negative reviews.

Implementation

Zapier Code Step (JavaScript) for Slack message formatting
javascript
// Input: ReviewTrackers webhook payload via Zapier
const review = inputData;

// Determine emoji and color based on rating
const ratingEmojis = { 1: '🔴', 2: '🟠', 3: '🟡', 4: '🟢', 5: '🌟' };
const ratingColors = { 1: '#e74c3c', 2: '#e67e22', 3: '#f1c40f', 4: '#27ae60', 5: '#2ecc71' };
const rating = parseInt(review.rating) || 3;
const emoji = ratingEmojis[rating] || '⚪';

// Truncate review text for Slack
const maxLength = 300;
const reviewText = review.review_text || review.content || 'No text provided';
const truncated = reviewText.length > maxLength ? reviewText.substring(0, maxLength) + '...' : reviewText;

// Build Slack Block Kit message
const isUrgent = rating <= 2;
const headerText = isUrgent 
  ? `🚨 URGENT: New ${rating}-Star Review on ${review.source || 'Unknown Platform'}`
  : `${emoji} New ${rating}-Star Review on ${review.source || 'Unknown Platform'}`;

const slackMessage = {
  text: headerText,
  blocks: [
    {
      type: 'header',
      text: { type: 'plain_text', text: headerText, emoji: true }
    },
    {
      type: 'section',
      fields: [
        { type: 'mrkdwn', text: `*Rating:* ${emoji} ${rating}/5` },
        { type: 'mrkdwn', text: `*Platform:* ${review.source || 'N/A'}` },
        { type: 'mrkdwn', text: `*Date:* ${review.date || new Date().toLocaleDateString()}` },
        { type: 'mrkdwn', text: `*Location:* ${review.location || 'Primary'}` }
      ]
    },
    {
      type: 'section',
      text: { type: 'mrkdwn', text: `>_\"${truncated}\"_` }
    }
  ]
};

if (isUrgent) {
  slackMessage.blocks.push({
    type: 'section',
    text: { type: 'mrkdwn', text: '⏰ *This review requires a response within 4 hours.* Please review and respond promptly.' }
  });
}

if (review.review_url) {
  slackMessage.blocks.push({
    type: 'actions',
    elements: [{
      type: 'button',
      text: { type: 'plain_text', text: '📝 Respond to Review', emoji: true },
      url: review.review_url,
      style: isUrgent ? 'danger' : 'primary'
    }]
  });
}

output = [{ slack_message: JSON.stringify(slackMessage) }];
1
Trigger: Webhooks by Zapier > Catch Hook
2
Configure ReviewTrackers webhook to POST to the Zapier webhook URL
3
Add Code by Zapier step with the JavaScript above
4
Add Slack step: Send Channel Message — Channel: #review-alerts, Message Text: Use {{slack_message}} from code step, Unfurl links: No
5
For urgent reviews (rating <= 2), add a second Slack step: Send Direct Message to GM's Slack user ID, include the same formatted message

Testing & Validation

Validate GPT-5.4 mini JSON output matches expected schema
bash
python -c "import json; json.load(open('output/analysis.json'))"

Client Handoff

Schedule a 90-minute in-person handoff meeting at the restaurant with the owner and all general managers. Cover the following topics:

1
Dashboard Tour (20 min): Walk through the ReviewTrackers dashboard on both desktop and the wall-mounted iPad. Show how to view reviews by platform, filter by date range, see star rating trends, and access competitor comparisons. Show the owner how to log in from their personal phone/tablet.
2
Alert System Demo (15 min): Demonstrate the Slack alert channel and email notifications. Send a test alert live. Explain the difference between immediate alerts (1-2 star), daily digests (all reviews), and weekly summaries. Show managers how to adjust their personal notification preferences.
3
Review Response Training (20 min): Review the AI-drafted response workflow. Show a sample negative review, demonstrate the auto-drafted response in Slack, explain the review-edit-publish workflow. Emphasize that responses are ALWAYS reviewed by a human before publishing. Provide the printed Response Best Practices card (laminated for kitchen posting).
4
Weekly Report Walkthrough (15 min): Present the baseline sentiment report together. Explain each section: executive summary, theme analysis, urgent issues, trend indicators, platform comparison. Identify the top 3 actionable insights from the baseline and discuss specific operational changes the client could make.
5
FTC Compliance Briefing (10 min): Explain the FTC Consumer Review Rule in plain language. Review the do's and don'ts of review solicitation. Get the owner's signature on the MSP's Compliance Acknowledgment form.
6
Ongoing Service Expectations (10 min): Confirm the weekly report delivery schedule (every Monday by 9 AM). Explain the MSP's role: platform monitoring, report generation, system maintenance, and escalation support. Provide the MSP support contact information and SLA terms. Set a 30-day check-in meeting to review initial results and tune the system.

Documentation to Leave Behind

  • Printed ReviewTrackers Quick Start Guide (2-page laminated card)
  • Review Response Best Practices card (laminated, for posting near manager's station)
  • FTC Compliance Do's and Don'ts one-pager
  • Login credentials document (sealed envelope for owner)
  • MSP Support Contact Card with escalation phone number and email
  • First 90-day baseline sentiment report (printed and bound)

Success Criteria to Review at the 30-Day Check-In

Maintenance

Weekly Responsibilities (MSP - 1-2 hours/week per client)

  • Review the automated sentiment analysis output for accuracy before client delivery every Monday morning
  • Spot-check 3-5 AI-generated quotes against source reviews to catch any hallucination
  • Verify all review source integrations are active (Google, Yelp, TripAdvisor, delivery platforms) — sources can disconnect due to password changes or API updates
  • Monitor OpenAI API usage dashboard to ensure costs remain within the budgeted range
  • Review and approve any AI-drafted review responses queued for manager review
  • Check Zapier task usage and error logs for any failed automations

Monthly Responsibilities (MSP - 2-3 hours/month)

  • Generate and deliver the monthly competitive benchmarking report
  • Review and update the sentiment analysis system prompt if new themes emerge (e.g., seasonal menu items, new service offerings)
  • Audit ReviewTrackers subscription — verify all locations are active and no duplicate profiles exist
  • Check for ReviewTrackers platform updates and new features; enable beneficial ones
  • Review OpenAI model availability — if a new model version is released (e.g., GPT-5.4 mini update), test it against the existing prompt and migrate if output quality improves
  • Reconcile billing: ReviewTrackers subscription + OpenAI API usage + Zapier costs vs. client invoice
  • Update the client's review response templates if menu, hours, or management changes occur

Quarterly Responsibilities (MSP - 3-4 hours/quarter)

  • Conduct a comprehensive sentiment trend review with the client (QBR deliverable)
  • Present quarter-over-quarter sentiment score changes for all themes
  • Reassess competitor list — add/remove competitors based on market changes
  • Review FTC compliance posture — re-audit review solicitation practices
  • Test the full pipeline end-to-end (export → analysis → report → delivery) to catch any degradation
  • Update the system prompt based on 3 months of output quality observations
  • Re-evaluate pricing: if review volume has significantly increased, adjust OpenAI budget limits
  • Check for new review platforms the client should monitor (e.g., new delivery app, new social platform)

Annual Responsibilities

  • Full platform review and re-evaluation: assess whether ReviewTrackers is still the best fit or if migration is warranted
  • Renegotiate ReviewTrackers contract for volume discounts if client has expanded locations
  • Update all documentation and training materials
  • Conduct annual FTC compliance training refresher with the client
  • Review iPad MDM profile and update kiosk configuration if the RT dashboard URL has changed

SLA Considerations

  • Review monitoring uptime: 99.5% (dependent on ReviewTrackers SLA)
  • Weekly report delivery: by 9:00 AM Monday, client's local time
  • Critical alert delivery: within 15 minutes of review publication (dependent on RT webhook latency)
  • Incident response: MSP acknowledges platform issues within 4 business hours
  • Escalation path: Level 1 (MSP help desk) → Level 2 (MSP project engineer) → Level 3 (ReviewTrackers support / OpenAI support)

Model Retraining / Prompt Tuning Triggers

  • Client adds new menu categories or service types (e.g., adds catering, opens a bar program)
  • Sentiment analysis output consistently misclassifies a theme (e.g., confusing 'delivery packaging' with 'food quality')
  • New review platform is added that uses different language patterns
  • GPT-5.4 mini model is updated by OpenAI — always regression-test the prompt against 50 known reviews before deploying a new model version
  • Client feedback indicates reports are missing important themes they're seeing in reviews manually

Alternatives

Birdeye All-in-One Platform (No Custom AI)

Replace the ReviewTrackers + custom OpenAI pipeline with Birdeye's all-in-one platform, which includes native AI-powered sentiment analysis, automated review responses, review solicitation, and listings management. This eliminates the need for any custom code, Zapier automations, or OpenAI API integration. The MSP simply configures the Birdeye dashboard and delivers its built-in reports.

White-Label via Vendasta (Maximum MSP Margin)

Instead of reselling ReviewTrackers under its own brand, use Vendasta's white-label reputation management platform. The MSP brands the entire experience — dashboard, reports, emails — under their own company name. Vendasta provides the review aggregation engine, and the MSP layers on the custom OpenAI sentiment analysis for differentiated value. The client never knows they're using Vendasta.

Bloom Intelligence Restaurant CDP (Deep Integration)

Replace ReviewTrackers with Bloom Intelligence, a restaurant-specific customer data platform that combines review sentiment analysis with WiFi-based guest identification, POS integration, and marketing automation. Reviews are correlated with actual guest profiles, linking feedback to visit frequency, spend patterns, and marketing engagement. This is a significantly deeper implementation than review monitoring alone.

Fully Custom Build (Open Source + APIs)

Build the entire solution from scratch using Google Business Profile API, Yelp Fusion API, open-source NLP libraries (VADER, spaCy, Hugging Face), and a custom web dashboard. No SaaS subscription fees — only API usage costs and hosting. The MSP owns the entire codebase and can customize every aspect of the analysis and reporting.

Sprout Social + Manual Reporting (Marketing Agency Approach)

Use Sprout Social's Advanced plan ($279/user/mo) for social listening and review monitoring, combined with manual analysis and report creation by an MSP analyst. No custom AI — the MSP team reads reviews, identifies themes manually, and produces reports in Google Slides or PowerPoint. Sprout Social provides the aggregation and basic sentiment scoring.

Want early access to the full toolkit?