Vouch — User Guide

A practical walkthrough of the Vouch reputation platform, from platform setup to running your first AI-assisted review campaign. Written for marketing and operations users — no engineering background required.

Heads up: This guide describes the admin web app at https://vouch-admin-web.<your-environment>.azurecontainerapps.io. Sign in with your Azure AD / corporate credentials, or with the email + password your platform admin set up for you.


Table of Contents

  1. What Vouch Does
  2. Roles & Who Does What
  3. Day-One Setup (Platform Admin)
  4. Inside a Tenant: Brand Setup
  5. Adding Locations
  6. Importing Contacts
  7. Compliance & Sending Policy
  8. Templates: What Your Recipients Will See
  9. Token Reference
  10. Campaigns: How Sends Are Organised
  11. Sending a Review Request
  12. Reading the History Tab
  13. Inbox: Replies, Reviews, & Triage
  14. The AI Assistant
  15. Approvals, Automation, Recommendations, Experiments
  16. Settings Reference
  17. Common Questions & Troubleshooting

What Vouch Does

Vouch helps multi-location businesses (restaurants, healthcare practices, home services, retail, etc.) collect more reviews on Google / Yelp / Facebook — and respond to them faster — without violating review-platform terms or anti-spam laws.

The big-picture flow:

  1. You add your locations and customer contacts.
  2. You build (or AI-generate) a friendly review-request template.
  3. You launch a campaign. Vouch sends the request via email, SMS, or WhatsApp at the right time, in the right channel, with the right personal greeting.
  4. Customers click through to leave a review on Google or Yelp.
  5. Vouch pulls those reviews back in, scores your reputation, and surfaces the AI Inbox so you can respond from one place.
  6. The AI Assistant suggests next steps — draft responses, flag negative feedback, recommend follow-ups, run experiments.

The platform handles the parts that are easy to get wrong: quiet-hours, frequency caps, opt-out compliance, contact suppression, template token rendering, link tracking, and audit logging.


Roles & Who Does What

Role Typical user What they can do
Platform Admin Vouch staff or the customer's IT Create tenants, add the first user, view all tenants, set platform-wide email/SMS provider config.
Tenant Admin Marketing director / regional manager Manage the tenant: brand, locations, users, compliance settings, campaigns, templates, integrations.
Tenant User Marketing coordinator / location manager Run campaigns, edit templates, work the inbox, respond to reviews. Can't change tenant-wide settings or invite users.
Approver (optional) Compliance / legal reviewer Approves templates before they can be used in live campaigns. Useful in regulated industries.

Throughout this guide, anything marked 🔒 Platform Admin is only visible to platform-admin accounts. Everything else is available to tenant admins (and most things to tenant users too).


Day-One Setup (Platform Admin)

🔒 Platform Admin

Create the tenant

  1. Sign in and click Tenants in the left sidebar (under the Admin group).
  2. Click + New Tenant.
  3. Fill out:
    • Name — what you'll call the customer (e.g. "Acme Restaurants").
    • Slug — a short URL-safe handle (lowercase, hyphens). Used in internal URLs and exports — cannot be changed later.
    • Planstarter, growth, or enterprise. Drives some feature gating but not enforcement at the API level.
    • Initial brand — every tenant needs at least one brand. Provide a brand name and slug. You can add more brands later.
    • First admin (optional) — email address of the person who'll run the tenant day-to-day. We'll resolve their account in your directory and grant them tenant-admin.
  4. Click Create. You'll be taken to the tenant detail page.

Tenant detail page tour

The tenant page (/admin/tenants/<id>) is the operational dashboard for one customer. It has, top to bottom:

Pause vs Delete

There is intentionally no "Delete tenant" button. To stop a customer's activity, Pause them. The tenant stays in the database (for audit + GDPR retention), all sends stop immediately, and users get a friendly "tenant suspended" notice on next login. Resume just flips the status back.

Hard deletion is reserved for compliance contexts and runs as a separate operator script.


Inside a Tenant: Brand Setup

Each tenant has at least one brand. Most customers have one. Multi- brand customers (e.g. a hospitality group with 3 distinct restaurant concepts) can spin up several. Brand-level fields are inherited by locations that don't override them.

What lives at the brand level

These act as fallbacks for locations. If a particular location doesn't set its own Google URL, the brand's URL is used.

How to edit

  1. Open the tenant detail page → scroll to Brands.
  2. Each brand has an editor card. Update the fields you want and click Save Brand.
  3. The card stays expanded so you can keep tweaking without losing context.

Tip: A clear, specific Brand description dramatically improves the quality of AI-generated templates and responses. "Family-owned bakery in Brooklyn, known for sourdough and warm-but-direct service" beats "a bakery" every time.


Adding Locations

Locations are the units customers think about when leaving a review: "the Austin outpost", "the Cherry Creek clinic". Every campaign sends from a location, every review attaches to a location, every score breaks down by location.

You'll find the Locations section inside the tenant detail page.

Four ways to add a location

1. Auto-Find Locations (AI Discovery)

The fastest way to get started. Click Auto-Find Locations in the Brand section (tenant detail page for platform admins, or Settings → Brand Profile for tenant users).

What it does:

Best for:

How it works:

  1. Fill in your brand name, website URL, and corporate address in the Brand section.
  2. Click Auto-Find Locations.
  3. Wait 10–30 seconds while the AI searches the web.
  4. Navigate to Recommendations to review discovered locations.
  5. Approve the ones that look right; reject or edit any that need correction.
  6. Approved locations are created automatically.

Tip: The AI cross-checks addresses against your brand info to avoid returning the wrong "Joe's Pizza" in a different city. If discovery returns fewer locations than expected, try adding a more complete corporate address or use bulk upload for full coverage.

2. One at a time

Click Add Location. Fill in:

Tick Auto-fill missing details after create (default on) and Vouch's AI agent will research your business on the web — Google profile, Yelp, Facebook, place ID — and fill in anything you left blank. Existing values are never overwritten.

3. Bulk CSV upload

Click Bulk Upload CSV. Drop in a spreadsheet with one location per row.

Required column: name. Optional columns (mix and match — header style doesn't matter, case- and separator-insensitive):

Header (any of these works) What it means
name, Name, LOCATION NAME Display name
addressLine1, address, Address Line 1 Street address
city, state, postalCode / postal_code / zip Address parts
phone, email, websiteUrl / website Contact info
googlePlaceId, googleMyBusinessUrl Google profile
yelpUrl, facebookUrl Other review profiles
brandId Override brand (defaults to tenant's primary)

Limits: 1000 rows / 5 MB per upload. If you need more, split into batches.

Tick Auto-fill missing details after upload and the AI agent researches every newly-created location in the background. The upload returns immediately with a "X enrichments queued" message; refresh the table after a minute to see filled fields.

4. Per-row enrich on existing locations

Click Enrich on any row in the locations table. The AI agent runs 3–6 web searches, cross-checks the address against snippets, and fills in blank fields. A toast appears with what was filled (and what was preserved).

Why we cross-check the address: "Acme Bakery" exists in Austin, Brooklyn, and Portland. Without verification the model could happily return the wrong shop's URL. The agent rejects matches that don't line up on city / address / phone.

Editing a location

Click the location's name (in blue) or the Edit button. The modal groups fields into sections:

How {{review.link}} is resolved

When you use {{review.link}} in a template, Vouch picks the first non-empty URL from this chain:

  1. Per-send override (rarely used)
  2. Location's Google My Business URL
  3. Location's Yelp URL
  4. Location's Facebook URL
  5. Brand's Google URL
  6. Brand's Yelp URL
  7. Brand's Facebook URL
  8. Location's website
  9. Vouch's feedback landing page (last resort)

Set the URL once at the brand level for shared profiles, then override per-location only where it differs.


Importing Contacts

Contacts are the recipients of your campaigns. Each contact belongs to one tenant and can have an email, phone, both, or neither. Without at least one of email or phone they can't receive anything.

Manual entry

Contacts → + New Contact → fill in. Useful for adding individuals mid-campaign.

CSV import

Contacts → Import CSV. Same tolerant-header rules as the locations upload:

Column (any header style works) Notes
email (or emailAddress) Required if no phone
phone (or phoneNumber / mobile) Required if no email
firstName, lastName Optional but strongly recommended
locale, timezone Optional — used for quiet hours and language picks

Limit: 5000 rows per import. Larger lists? Split, or contact support — we can run a one-off bulk import server-side.

Why first/last name matters

Without firstName, your {{contact.firstName}} token renders as empty:

Dear , thanks for visiting...

Three ways to avoid this:

  1. Include firstName / lastName columns in your import.
  2. Use a default in your template: {{contact.firstName | "there"}}Dear there,
  3. Let Vouch derive a name from the email. If a contact has no firstName but has e.g. sathya.krishnamurthy@gmail.com, Vouch auto-greets "Dear Sathya,". Generic mailboxes (info@, noreply@) are skipped. Override by setting an explicit firstName.

Suppression and consent


Compliance & Sending Policy

Even a perfect template will get blocked if you ignore the policy. The defaults are conservative — you can dial them in Settings → Compliance → Sending Policy.

What's enforced on every send

Rule Default Where to change
Contact must not be suppressed Always on n/a
Email channel: valid email format Always on n/a
Email channel: consent on file On (require email consent) Sending Policy → toggle off
SMS channel: valid phone (E.164) Always on n/a
SMS channel: opt-in on file On Sending Policy → toggle off
Quiet hours 21:00–08:00 (recipient's local time) Sending Policy → time pickers
Daily frequency cap 3 messages per recipient / 24h Sending Policy → daily cap
Weekly frequency cap 5 messages per recipient / 7 days Sending Policy → weekly cap

Times are interpreted in the recipient's timezone (or the location's, if the contact has none).

Healthcare Safe Mode

Toggle in Settings → Compliance → Healthcare. When on:

Use this if any tenant operates in a healthcare context. It can be set per-tenant, so a multi-brand customer can mix.

GDPR / CCPA

Both are toggled on by default. Disable if your jurisdiction doesn't require them and you'd rather not expose the buttons.


Templates: What Your Recipients Will See

Templates live in the Templates section. Each template has:

The editor

The HTML body uses a rich-text editor with:

The chip palette at the bottom inserts common tokens with one click.

Live token validation

As you type, the editor scans for unrecognised tokens. If you typo {{contat.firstName}} you'll see an orange warning above the Save button:

⚠ 1 unrecognised token — these will be sent literally in the email. {{contat.firstName}} Tip: provide a fallback for empty values — {{contact.firstName | "there"}} renders there when the contact has no first name.

Preview with sample data

After saving, click Preview with sample data. Vouch renders the template against a sample context (Jane Smith / Downtown Location / Acme Business). What you see in the preview is exactly what a recipient sees — minus the personalization swap. Catches missing tokens, broken HTML, and empty fields.

Versions & approval (optional)

Template translations (multi-language support)

If you serve customers in multiple languages, you can create translation variants of any template. Vouch groups these together so you can manage all locales in one place.

How it works:

  1. Create your primary template (e.g. in English, locale en-US).
  2. Click Add translation below the template name (in the list view or detail view).
  3. Choose your target language from the dropdown — es-MX (Spanish - Mexico), fr-CA (French - Canada), zh-CN (Chinese - Simplified), etc.
  4. Click Translate. Vouch's AI translates the subject, body text, and HTML content while preserving all tokens ({{firstName}} stays exactly as-is).
  5. The new template appears as a translation sibling. You'll see locale badges (e.g. 🇺🇸 en-US, 🇲🇽 es-MX) linking all variants together.
  6. Click any badge to navigate to that locale variant.
  7. Edit the translation if you need to refine the AI's output — adjust tone, fix regional phrasing, etc.

Where translation happens:

Benefits:

Common pattern:

  1. Import contacts with a locale column (en-US, es-MX, fr-CA).
  2. Create your template in English.
  3. Add Spanish and French translations.
  4. Bind all three to a campaign.
  5. Send — Vouch picks the right locale per recipient automatically.

Tip: The AI translator respects your brand voice and tone settings. If your brand is set to casual and playful, the Spanish translation will match that style. Update your brand description for best results.


Token Reference

Tokens are placeholders that get filled in per-recipient at send time. Vouch is generous about how you spell them — case, whitespace, and common variants all work.

Contact

Token What it inserts Empty-state default
{{contact.firstName}}, {{firstName}}, {{first_name}} First name Derived from email if possible
{{contact.lastName}}, {{lastName}}, {{last_name}} Last name Empty
{{contact.name}}, {{name}} First + Last (whichever is set) Empty
{{contact.email}}, {{email}} Email address Empty
{{contact.phone}}, {{phone}} Phone Empty

Location & Brand

Token What it inserts
{{location.name}}, {{locationName}}, {{location}} Location's display name
{{location.city}}, {{city}} City
{{location.state}}, {{state}} State
{{business.name}}, {{businessName}}, {{brand.name}}, {{brand}} Brand name
{{location.custom.<KEY>}} Per-location custom variable (set under Locations → details → Variables)

Links

Token What it inserts
{{review.link}}, {{reviewLink}}, {{review.url}} The chosen review URL (Google / Yelp / Facebook chain — see Adding Locations)
{{feedback.link}}, {{feedbackLink}} Vouch's hosted feedback page (when you want to capture private feedback before public reviews)
{{unsubscribe.link}}, {{unsubscribe.url}}, {{unsubscribe}} One-click unsubscribe URL — always include this in email templates

Other

Token What it inserts
{{employee.name}}, {{employeeName}} The staff member tied to the visit (when set on the solicitation)
{{appointment.date}}, {{appointmentDate}} Appointment date (when passed by an integration)
{{product}} Product / service tag

Defaults — the pipe syntax

Any token can take a fallback for when the underlying field is empty:

Hi {{contact.firstName | "there"}},

Renders as Hi Jane, if firstName = "Jane", else Hi there,.

Quoted ("there"), single-quoted ('there'), and bare-word ({{firstName | friend}}) defaults all work.


Campaigns: How Sends Are Organised

A campaign is a named, reportable container for a sequence of review-request sends. You almost always want one per use case ("Post-visit review request — June 2026") so the History and metrics group cleanly.

Campaign types

Type Purpose
One-time Single blast — most ad-hoc sends
Event-triggered Fired by an integration (e.g. POS sale → review request 2 hours later)
Scheduled batch Runs at a specific time/date
Drip Multi-step sequence over days/weeks
Continuous Always-on for inbound triggers

Sequences

Most campaigns send a single request. Drip and continuous campaigns can have a sequence: step 1 sends day 0, step 2 sends day 3, step 3 sends day 7, etc. Each step has its own channel + template.

Configure under the campaign's Sequence tab.

Template bindings

A campaign needs at least one template bound to it. Bind under Campaign → Templates section → + Bind Template. Choose:

When you hit Send without picking a template explicitly, Vouch picks the active binding for the chosen channel. If multiple bindings exist (A/B testing), it picks the one marked isControl first, then by descending priority.

Strict template policy: Vouch refuses to send without a resolvable template. You'll see one of:

No solicitations are created when validation fails — the operator sees a clear 400 in the Send tab.


Sending a Review Request

Open your campaign → Send tab. There are two paths.

Path A — to existing contacts in your database

Use this when you've already imported / built a contact list in Vouch.

  1. Pick a Location (drives address tokens, review-link resolution, timezone for quiet hours).
  2. Pick a Channelemail, sms, or whatsapp.
  3. Optionally pick a Template. If left blank, Vouch auto-resolves from the campaign's binding.
  4. Click Send now.

The result panel shows:

Path B — Upload & send CSV

Use this for one-off campaigns where contacts aren't already in Vouch or the list is small enough to live in a spreadsheet.

  1. Click Upload & send CSV above the form.
  2. Drop in your file. Same tolerant-header matching as the contacts import. Required:
    • email (for email channel) or phone (for SMS / WhatsApp)
    • firstName (recommended)
  3. Tick Auto-fill missing details if you want AI to fill blanks (rarely needed for sends — mainly useful when uploading new locations, not contacts).
  4. Click Send.

Each row goes through:

What blocks a send

The most common policy refusals you'll see:

Reason on the History tab What it means How to unblock
Contact is on the suppression list Auto-suppressed (spam complaint, unsubscribe) Don't — re-engagement requires fresh consent
No email-consent record on file Imported contact never opted in Either record consent or turn off Require Email Consent in Sending Policy
Recipient previously unsubscribed from email Explicit revocation Don't — re-contact is illegal in most jurisdictions
Send attempted during quiet hours Recipient's local time falls in the configured window Wait, or widen the window
Frequency cap exceeded Too many sends in 24h or 7d Wait, or raise the cap
Email address is missing or invalid Bad data Fix the contact record

These all show up under the BLOCKED row in History with a one-line explanation pointing at the right setting.


Reading the History Tab

Open your campaign → History tab. You'll see:

Status meanings

Status What it means
PENDING Solicitation created, dispatch not yet attempted. Should clear within seconds. If you see PENDING for more than a minute, contact support.
SENT Provider accepted the message (Azure Communication Services / SMS gateway). Doesn't guarantee inbox delivery — that's a DELIVERED later transition when the provider webhooks back.
DELIVERED Provider confirmed delivery (received delivery receipt).
FAILED Provider rejected (bounce, invalid recipient, throttling). The reason is captured in providerStatus.
BLOCKED Policy engine refused to send. Reason is shown inline.
CLICKED Recipient clicked the review/feedback link.
CONVERTED Recipient completed a review (auto-detected via review sync).

Filtering & exporting

History is capped at the latest 200 rows in the UI. For full history or filtered exports use the API: GET /v1/campaigns/<id>/solicitations?limit=500.


Inbox: Replies, Reviews, & Triage

The Inbox is where reviews and customer replies land. It's the single pane of glass for "someone said something — what do I do?"

What flows in

Triage views

Drafting responses

Click into any item. The right-side panel offers:

SLA tracking

Under Settings → SLA Rules you can define response-time targets ("all reviews answered within 24 hours, negatives within 4"). The inbox shows a clock badge next to items approaching their SLA, and escalates via webhook (or email) when one breaches.


The AI Assistant

Top-left of every screen. Click the AI Assistant chip (or press /) to open a sidebar where you can ask questions or kick off multi-step actions. Everything visible to your role is in scope.

What it can do

The Assistant is a coordinator that delegates to specialist agents:

How it picks responses

The Assistant uses Claude (Sonnet 4.6) with a tool palette that includes the Vouch API. Every action goes through the same authorization checks as the UI — the agent can't do anything you can't do as your role.

Web search

The agent has web search built in. Useful for:

Disclaimers


Approvals, Automation, Recommendations, Experiments

Four adjacent surfaces in the sidebar.

Approvals

When Require Approver Sign-off is on, every new template and campaign change goes here. Approvers see a queue with diffs and can approve / request changes. Once approved, the template/campaign goes live.

Automation

Settings → Automation Rules lets you build "when X happens, do Y":

Common rules:

Recommendations

The Recommendations view is the AI's running queue of "things you should consider". Each item has an accept / reject button. Driven by the Optimization agent — pattern-mines your data nightly and surfaces opportunities ("Templates with emoji subject lines have 23% higher click-through — promote 'Summer Review' to control?").

Experiments

A/B testing surface. Bind multiple templates to a campaign with different variantKey values, define a primary metric (open rate, click rate, review-conversion rate), and Vouch:

The Experiment Designer agent can scaffold this from a one-line description.


Settings Reference

Every setting lives under Settings in the sidebar.

Setting What it controls
Team Members Invite users, assign roles, remove access
Brand Brand voice/tone/description, default review profiles
Email & DKIM Sender domain, From address, From name, DKIM/DMARC verification
SMS SMS sender ID, provider config
WhatsApp WABA registration, channel ID
SSO / SAML Enterprise SSO setup (entry point, certificate, callback)
SLA Rules Response-time targets per channel + sentiment
Webhooks Outbound event subscriptions (review.created, solicitation.failed, etc.)
Compliance Healthcare mode, retention, data export/deletion, Sending Policy
Automation Trigger → action rules (see Automation)
Integrations CRM, POS, scheduling tools

Email & DKIM — the one most people get wrong

For high deliverability you need DKIM and DMARC verified on your sender domain.

  1. Settings → Email & DKIM.
  2. Pick a sender domain (e.g. mail.acme.com — a subdomain you control, not acme.com).
  3. Vouch shows you 3 DNS records to add at your domain registrar.
  4. Wait 10–60 minutes; click Verify.
  5. The status badges next to DKIM and DMARC turn green.

Until both are green, your emails will work but may land in spam more often. Don't skip this.


Common Questions & Troubleshooting

"I sent 22 messages and 0 went out — what happened?"

Check the History tab. The status counts will tell you whether they were FAILED, BLOCKED, or never created.

"My template renders {{firstName}} literally"

The token name is wrong. Most likely you typed {{first.name}} or {{first name}} — Vouch is generous about case and whitespace ({{ firstName }} works) but the token has to be one of the recognised aliases. Open the template editor; the orange warning at the top will list the unrecognised tokens.

"My greeting renders as Dear ,"

The contact has no firstName. Three fixes (in order of preference):

  1. Re-import contacts with a firstName column. Header style doesn't matter (First Name / firstName / first_name all work).
  2. Use a default in the template: Dear {{contact.firstName | "there"}},
  3. Rely on the email-name derivation (Vouch turns jane.smith@… into "Jane Smith" automatically). Won't help for generic mailboxes like info@.

"The link in my email points to localhost"

The API was deployed without API_BASE_URL set. Tell your platform admin to redeploy with the env var configured. The fix is one redeploy; existing emails already sent will keep their bad link.

"I clicked Enrich and got No Google Places API key configured"

Two options:

  1. Use the AI agent — it doesn't need a Places key. Make sure your platform admin has set ANTHROPIC_API_KEY on the API service. The Enrich button defaults to AI when the key is set.
  2. Configure Google Places — under Settings → Brand → Review Sync, paste your Google Places API key. Same per-tenant scope as the AI option.

"Customers are getting the same review request twice"

Check:

  1. The campaign's Sequence — if it has reminder steps, that's by design (multi-step sequences send 2–4 messages over a week).
  2. Your Frequency caps under Sending Policy — defaults to 3/day, 5/week. Lower these if you find the cadence too high.
  3. Whether you ran the same campaign send twice manually. The solicitations table treats every Send click as a new attempt; the policy engine relies on the frequency cap to dedupe.

"Reviews aren't syncing back into the inbox"

Three failure modes:

  1. Google Place ID missing on the location. The sync job needs googlePlaceId to query Google's API. Hit Enrich on the location.
  2. Review-sync API key not configured at the brand level. Settings → Brand → Review Sync — paste your Google Places key.
  3. The sync job hasn't run yet. It runs hourly. Click Sync Now on the location's Reviews tab to force-run.

"The AI Assistant says it can't access something"

Two possibilities:

  1. Your role doesn't grant it. A tenant_user can't pause the tenant; a tenant_admin can.
  2. The agent doesn't have a tool for that. Some operations (like directly deleting users) are intentionally not exposed to agents.

If it's the second, ask your platform admin — they can either grant the agent that capability or run the operation directly.

"Auto-Find Locations didn't find any locations"

Possible causes:

  1. Limited online presence — very new business or no website.
  2. Brand name too generic — "Pizza Shop" vs "Joe's Brooklyn Pizza".
  3. Website not accessible — behind a login or construction page.

Solutions:

  1. Add a more complete corporate address in the Brand section.
  2. Try different brand name variations.
  3. Use the per-location Add Location + Enrich workflow instead.
  4. Fall back to bulk CSV upload with your internal location list.

"Auto-Find Locations found wrong/inaccurate locations"

Why it happens:

Solutions:

  1. Review recommendations before approving — that's why locations go through the Recommendations workflow first.
  2. Edit details in the recommendation before approving.
  3. Reject bad recommendations and manually add correct locations.
  4. If a chain has hundreds of locations, Auto-Find is best for finding headquarters — use bulk CSV for the full list.

"My translated template has broken tokens"

Should not happen — the AI translator is designed to preserve all {{tokens}} exactly. If you see this:

  1. Check the original template — was the token malformed there too?
  2. Re-translate — click Add translation again (it won't duplicate if the locale already exists; you'll need to delete the bad translation first).
  3. Manually fix the token in the editor.

Report to support if the AI consistently breaks tokens — that's a bug.

"Translations aren't being used when I send"

Check:

  1. Contact has a locale field — without it, Vouch defaults to en-US.
  2. Translation exists for that locale — if the contact is fr-CA but you only have en-US and es-MX translations, they get the default.
  3. Campaign template binding — if you explicitly picked a template ID when sending (instead of auto-resolve), that overrides locale routing.

Fix:


Where to Get Help

Welcome to Vouch — go ship some reviews.