Ovation 👏
Hackathon: H0: The Hackathon Zero
Live Demo: ovationai.vercel.app
Inspiration
Local businesses live or die by the next twenty reviews. A restaurant with 4.6 stars and a steady stream of replies from the owner gets a 5%+ revenue lift over an identical restaurant at 4.4 stars with silent reviews — the data on this is unambiguous. And yet most independent restaurants, dental practices, and home-service shops can't keep up with replying across Google, Yelp, and TripAdvisor. The unanswered reviews compound: rating drifts down, the algorithm deprioritizes the listing, foot traffic dips, owner notices three weeks too late.
The blocker isn't desire — every owner wants to reply. It's the channel fragmentation. Google sends review notifications to one email. Yelp sends them to another. TripAdvisor sends them via the Management Center inbox. To reply to a 1-star review at 11 PM after closing the kitchen, the owner has to log into three different dashboards on a phone keyboard. Most don't bother.
The bet: a single dashboard that ingests reviews across every channel, classifies sentiment + intent in real time, drafts a reply in the owner's own brand voice, and lets them ship it back to the source platform in one tap — or auto-sends per-channel based on the owner's confidence in the drafts. Claude is now reliable enough at brand-voice mimicry that the "draft" step doesn't need a human after the first few approved replies.
What It Does
A local business owner connects their Google Business Profile, Yelp listing, and TripAdvisor listing once. Every 15 minutes, Ovation polls each channel for new reviews, classifies each one, and drafts a tailored reply in the owner's voice — sitting in the inbox ready to ship.
- Multi-channel monitoring — polls Google Business Profile, Yelp Fusion, and TripAdvisor Content API for new reviews; surfaces each one in a unified inbox
- Sentiment + intent classification — Claude tags every review by sentiment (
praising / mixed / disappointed / angry), intent (recommendation / complaint / question / spam), and escalation flag (compliance-sensitive, regulatory-risk, defamation-risk) - Brand-voice replies — using the owner's voice samples + brand-voice profile + 4-5 example past replies, Claude drafts each reply to read like the owner wrote it — punctuation, sign-off, signature phrases included
- Auto-escalation — angry reviews, 1-star reviews below the owner's threshold, and compliance-sensitive reviews never auto-send; they bubble to the top of the inbox with an "owner attention required" flag
- Per-channel auto-send — pick per-channel: Google + 4-or-5-star reviews can auto-send; Yelp always needs approval; TripAdvisor escalates anything mentioning the menu. Owner controls the dial.
- Stripe subscriptions — $99/mo Standard or $249/mo Enterprise, managed through Stripe Billing
Beyond the single review reply, Ovation gives you:
- A unified inbox of every review across every connected channel, ranked by recency, sentiment, and escalation flag
- Voice samples library — upload 5-10 past replies you've written, Ovation learns your voice from them and the next 50 drafts read like you wrote them
- Brand voice profile — explicit
do say / don't saylists the owner sets once and Claude honors on every draft - Per-channel posting — once approved, the reply posts back to the original channel via that channel's reply API (Google Business Profile's
replyendpoint when API access is approved; manual paste for Yelp + TripAdvisor where third-party reply APIs don't exist) - Escalation routing — angry or compliance-sensitive reviews CC the owner's email so they catch the worst stuff even when not logged in
The promise: the 4.4-star drift becomes a 4.6-star floor, the unanswered-review backlog goes to zero, and the owner spends 5 minutes a day approving drafts instead of 45 minutes typing replies on a phone.
How I Built It
Architecture
Review channels (Google Business Profile / Yelp Fusion / TripAdvisor)
│ per-tenant polling (Vercel Cron, every 15 min)
▼
/api/reviews/poll → per-channel sync workers
│
▼
Claude Sonnet 4.6 (per review)
- sentiment + intent classifier
- voice-profile-grounded reply drafter
- escalation flag detector
│
▼
Amazon Aurora DSQL (Postgres-compatible, multi-region strong consistency)
├── ovation_businesses — owner profile + brand voice + voice samples
├── ovation_channels — per-channel auth + auto_send + external_ref + config (JSONB)
├── ovation_reviews — every incoming review across channels
├── ovation_replies — drafted, approved, sent replies
└── ovation_voice_samples — past replies that train the voice
│
▼
Channel reply APIs (Google) / manual-paste workflow (Yelp + TripAdvisor)
+ Resend escalation email to owner for sensitive reviews
The architectural bet is per-channel auth abstraction. Each review channel has a different auth shape: Google Business Profile is OAuth 2.0 with refresh tokens; Yelp Fusion is a static API key + business ID; TripAdvisor Content API is an API key + location ID. Each merchant connects each channel separately, and the per-channel config (token, refresh token, expires_at, OR static API key, OR external_ref location ID) lives in ovation_channels.config as JSONB. The sync worker dispatches on the channel type, fetches with the right credential, and writes back to the same ovation_reviews schema regardless of source.
The reply post-back is honest about platform constraints. Google Business Profile has a public reply API → Ovation posts directly. Yelp and TripAdvisor have no third-party reply API as of 2026 — so Ovation surfaces the drafted reply with a one-click "Copy + open Yelp" flow that drops the user into the Yelp reply console with the draft already on the clipboard. Not auto-magic, but it's the honest truth about the platform ecosystem and it's still 30x faster than typing on a phone.
Voice mimicry is where Claude earns its keep. The system prompt for the draft step takes the owner's brand_voice description, their voice_profile.do_say + do_not_say arrays, 5 example past replies, and the new review's text. Claude generates 1 draft. The owner edits or approves. Approved replies feed back into the voice samples — the corpus gets better with use.
Tech Stack
| Layer | Technology |
|---|---|
| AI Model | Anthropic Claude Sonnet 4.6 |
| Review Sources | Google Business Profile API (pending access approval), Yelp Fusion API, TripAdvisor Content API → Terra |
| Database | Amazon Aurora DSQL (ovation_* tables) |
| Backend | Next.js 16 API Routes + Vercel Cron |
| Auth | Supabase Auth + Google OAuth |
| Payments | Stripe (subscriptions + webhooks) |
| Resend (templata.org) for escalation notifications | |
| Frontend | Next.js 16, React 19, Tailwind CSS, shadcn/ui |
| Deployment | Vercel (Fluid Compute, us-east-1) |
Challenges
- Channel auth heterogeneity — Google Business Profile uses OAuth 2.0 with refresh tokens, Yelp uses a static API key + per-business ID, TripAdvisor uses an API key + per-location ID. Forcing all three into a "one-OAuth-fits-all" abstraction would have been a mess. The fix was the
ovation_channels.configJSONB column that holds whatever shape each channel needs, with a typedgetFreshAccessTokenhelper that only kicks in for OAuth-based channels. - No third-party reply API on Yelp / TripAdvisor — discovered mid-build that neither platform exposes a reply-post endpoint to anyone except their own owner-dashboard UI. Had to redesign the "auto-send" flow to be channel-aware: Google gets full auto-send, Yelp and TripAdvisor get a "copy draft + open platform" shortcut that drops the reply on the clipboard and links the owner straight to their reply console. Honest, not magic, but it ships.
- Brand-voice drift over time — early drafts read like Claude. After feeding 5+ approved replies back into the voice samples, drafts read like the owner. The loop only works if approved replies get fed back — built that ingestion as a side-effect of the approve action, no manual training step.
- The Apple Maps red herring — initial scope included Apple Maps reviews. Discovered (after wiring the schema and most of the UI) that Apple has no public review API for any third party. Stripped Apple Maps from the codebase entirely rather than ship a stubbed integration; the schema, dashboard, README, and ingestion route were all cleaned in one pass.
What's Next
- Owner-voice fine-tune — beyond samples, build a lightweight LoRA per business once they have 50+ approved replies
- Sentiment trend dashboard — show the owner their rolling-7-day sentiment delta so they catch dips before the algorithm does
- Review-source expansion — Facebook Reviews + OpenTable for restaurants; Booking + Expedia for hotels
- Multi-location support — a regional restaurant group with 12 locations sees per-location inboxes and a roll-up dashboard
- AI suggested service recovery — when a review mentions a specific problem (cold soup, late table), Claude suggests an in-house followup the owner can offer the reviewer
- Reply benchmarking — show the owner how their reply rate + average response time compares to their category's top quartile
Sample Review Workflow
Ovation ships with a sample-review ingestion mode at /api/reviews/ingest that accepts a raw review payload (channel, rating, body, reviewer name) and runs the full Claude pipeline: classification → draft → escalation flag. Judges can POST a sample review to see the entire reply-drafting flow without connecting a real Google Business Profile or Yelp account. The seeded sample brand (Brookline Bakehouse in Brookline, MA) ships with 8 past reply samples, a brand-voice profile, and do say / don't say rules — so the drafted replies show the voice mimicry working from cold.
Team
Built solo by @kyisaiah47 for the H0 Hackathon.
Built With
- amazon-web-services
- anthropic
- aurora-dsql
- claude
- google-business-profile
- nextjs
- react
- resend
- shadcn-ui
- stripe
- supabase
- tailwindcss
- tripadvisor
- typescript
- vercel
- yelp-fusion

Log in or sign up for Devpost to join the conversation.