Systems Library / Customer Service / How to Create Automated Review Request Campaigns
Customer Service review management

How to Create Automated Review Request Campaigns

Ask happy customers for reviews automatically at the right moment.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

When you automate review request campaigns via email and sms, you stop relying on customers to remember. I build these with a key twist: only ask customers who had a positive experience. Sending review requests to everyone is how you get negative reviews you could have avoided.

The system triggers after a successful transaction, filters by satisfaction signal, and sends a personalized request at the optimal time.

What You Need Before Starting

Step 1: Build the Trigger Logic

Only request reviews from happy customers:

def should_request_review(customer_id):
    recent_tickets = get_recent_tickets(customer_id, days=30)
    negative_tickets = [t for t in recent_tickets if t["sentiment"] == "negative"]
    if negative_tickets:
        return False

    csat = get_latest_csat(customer_id)
    if csat and csat < 4:
        return False

    already_requested = check_recent_request(customer_id, days=90)
    if already_requested:
        return False

    return True

Step 2: Generate Personalized Requests

import anthropic

client = anthropic.Anthropic()

def generate_review_request(customer, transaction):
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=200,
        messages=[{
            "role": "user",
            "content": f"""Write a short, personal review request email.

Customer name: {customer['name']}
Service/product: {transaction['description']}
Date: {transaction['date']}
Business name: [Your Business]

Rules:
- Under 80 words
- Reference their specific purchase/service
- Make it easy (include the direct link)
- Do not beg or over-ask
- Casual, grateful tone"""
        }]
    )
    return response.content[0].text

Step 3: Set Up the Review Link Router

Route customers to the platform where you need reviews most:

REVIEW_LINKS = {
    "google": "https://g.page/r/YOUR_PLACE_ID/review",
    "yelp": "https://www.yelp.com/writeareview/biz/YOUR_BIZ_ID",
    "facebook": "https://www.facebook.com/YOUR_PAGE/reviews"
}

def get_review_link(customer_id):
    """Route to the platform with the fewest recent reviews."""
    counts = get_platform_review_counts(days=30)
    lowest = min(counts, key=counts.get)
    return REVIEW_LINKS[lowest]

Step 4: Send via Email and SMS

import smtplib
from email.mime.text import MIMEText
import requests

def send_email_request(email, name, message, review_link):
    full_message = f"{message}\n\nLeave your review here: {review_link}"
    msg = MIMEText(full_message)
    msg["Subject"] = f"How was your experience, {name}?"
    msg["From"] = "[email protected]"
    msg["To"] = email

    with smtplib.SMTP("smtp.gmail.com", 587) as server:
        server.starttls()
        server.login("[email protected]", os.getenv("EMAIL_PASSWORD"))
        server.send_message(msg)

def send_sms_request(phone, name, review_link):
    message = f"Hi {name}, thanks for choosing us! If you have a moment, we would love your feedback: {review_link}"
    # Send via Twilio or your SMS provider
    requests.post("https://api.twilio.com/2010-04-01/Accounts/{sid}/Messages.json",
        auth=(os.getenv("TWILIO_SID"), os.getenv("TWILIO_TOKEN")),
        data={"To": phone, "From": os.getenv("TWILIO_NUMBER"), "Body": message})

Step 5: Schedule and Track

from datetime import datetime, timedelta

def schedule_review_requests():
    """Run daily. Find eligible customers from yesterday's completed transactions."""
    yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
    transactions = get_completed_transactions(yesterday)

    sent = 0
    for txn in transactions:
        customer = get_customer(txn["customer_id"])
        if should_request_review(customer["id"]):
            review_link = get_review_link(customer["id"])
            message = generate_review_request(customer, txn)
            send_email_request(customer["email"], customer["name"], message, review_link)
            log_request(customer["id"], "email", review_link)
            sent += 1

    return {"sent": sent, "eligible": len(transactions)}

What to Build Next

Add A/B testing on request timing. Test sending requests 1 day, 3 days, and 7 days after the transaction. Track which timing generates the highest review completion rate for your specific business.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems