PRODUCT UPDATES
Changelog
Every update, fix, and feature shipped — in order.
Day 59June 23, 2026
Loading skeletons on dashboard, reviews, and settings
- ▸Dashboard, reviews, and settings now show a skeleton while data loads — matches each page's layout to prevent content shift on hydration.
- ▸One shared pattern across all three: bg-white/[0.06] placeholder blocks with animate-pulse, no JavaScript, no external library.
- ▸Settings skeleton is tier-agnostic (generic card placeholders) to avoid flashing the wrong tier's UI before the real page loads.
Day 58June 22, 2026
Globe toggle + lifetime E2E verified
- ▸Billing toggle on /pricing and Settings replaced with animated 3D globe — rolls between Monthly and Annual with gold dust particles and Save 20% badge on annual
- ▸GlobeToggle is a shared React component used in all 3 billing toggle locations (pricing page, Settings upgrade section, lifetime → Chad upgrade modal)
- ▸Full E2E test of lifetime deal flow completed — Stripe $79 checkout, webhook tier flip to lifetime, Settings plan card, and lifetime → Chad upgrade all verified clean in production
- ▸GBP profile activated ahead of July 9 API eligibility window — photos, opening date, and business post added
Day 57June 22, 2026
Lifetime Deal launched
- ▸New lifetime tier added — $79 one-time payment, 50 AI replies/month, 1 location, Google only
- ▸Stripe one-time checkout + webhook handler — tier set to lifetime on payment confirmation
- ▸/lifetime landing page live — hero, what's included, why capped, what's not included, FAQ
- ▸Lifetime Deal added to site nav (desktop + mobile)
- ▸Settings page: lifetime buyers see dedicated plan card with upgrade-to-Chad modal
- ▸50 AI replies/month cap enforced server-side in draft-reply route
Day 56June 21, 2026
SMS features marked Coming Soon
- ▸Review generation via SMS is now clearly marked Coming soon across pricing and feature pages.
- ▸SMS replies launch with our Twilio rollout after beta — QR-based review generation remains available on GigaChad.
Day 55June 20, 2026
Customer-facing block flow, appeal system, and Refund Policy page
- ▸Customer-facing block flow: /blocked landing page shows the suspension reason and appeal CTA; /appeal/[token] is a public form for submitting an appeal within a 30-day window
- ▸Four transactional emails sent from notices@ominvo.com: suspension notice (includes appeal link), appeal received confirmation, appeal approved, appeal denied
- ▸Admin Appeals tab: pending appeals queue with message view and a decide modal — approve restores access as a goodwill gesture, deny is final
- ▸Block records are permanent for the account file — when an appeal is approved, the suspension is marked as lifted rather than deleted, preserving the full history
- ▸Approved appeals reinstate the account's prior subscription tier as goodwill (original payment is not refunded; resubscribe via Settings to keep billing aligned)
- ▸/legal/refund-policy: new standalone plain-English page covering monthly plans, annual plans, free tier, terminations for cause, and chargebacks — linked from the /legal hub and from Terms Section 5
Day 54June 19, 2026
Customer block system + TOS Section 14 amendment
- ▸New traffic-light risk_level on every business (green/yellow/red) — manual override via admin Customers tab
- ▸New Blocked tab in admin — pick a business + 5-500 char reason + 7 canned reason templates (each ~70-90 words referencing relevant TOS section)
- ▸Block flow cancels Stripe subscription immediately, no proration, no refund — sets risk_level red, subscription_status canceled, logs tos_violation signal
- ▸Unblock flow available directly from Blocked tab — risk back to green, status to inactive, full audit trail preserved in risk_signals
- ▸Stripe charge.dispute.created webhook auto-flags chargebacks to red and logs the dispute row + high-severity risk signal
- ▸Flagged testimonials write to risk_signals as spam_testimonial signals — auto-accruing audit trail for repeat offenders
- ▸TOS Section 14 rewritten — termination-for-cause covering chargebacks, spam, abuse, billing evasion, and Acceptable Use violations; no refunds; 30-day appeal window
- ▸New Supabase tables: risk_signals, disputes, blocked_businesses, appeals — all RLS-locked, service-role-only writes, security-definer policy for self-read
- ▸Block notice email, /blocked page, /appeal/[token] flow ship Day 55 as one connected unit
Day 53June 20, 2026
Competitor Tracking feature page + FAQ doubled
- ▸New feature page at /features/competitor-tracking — explains rating and review-velocity benchmarking against up to 5 named local competitors, GigaChad only, live once the Google Business Profile API connection goes live (~July 23)
- ▸Header dropdown, mobile menu, and footer Product column now link to the real /features/competitor-tracking page (previously placeholder #)
- ▸Removed stale "SOON" badges from Review Generation and Competitor Tracking in the header and footer — Review Generation has been live since Day 51
- ▸FAQ page expanded from 27 to 62 questions — 5 new Q&As added to each of the 7 categories (pricing, Google Business Profile, AI replies, tiers, launch, security, support)
Day 52June 19, 2026
Support funnel + Review Reply Playbook
- ▸Footer Support link now leads to a real funnel: FAQ → Help Center → a support form, instead of duplicating the Contact mailto link
- ▸New support form at /support — name, email, business name, description, optional screenshot/video link — sends directly to support@ominvo.com via Resend
- ▸New page: /review-reply-playbook — a working guide to writing review replies that protect or grow revenue, with bad/better reply examples for all seven industries Ominvo serves
- ▸Footer "Review Reply Playbook" link fixed — previously a placeholder #, now points to the real page
Day 51June 18, 2026
PWA install prompt + Review Generation feature page
- ▸Install Ominvo to your home screen — a custom install card on Android and desktop Chrome/Edge, with platform-aware fallback instructions for iPhone Safari
- ▸Service worker now checks for updates on tab focus, so deployed fixes reach existing users faster
- ▸New feature page at /features/review-generation — explains where each tier enters the review loop and why review generation is the GigaChad differentiator
- ▸Header dropdown and footer Product column now link to the real /features/review-generation page (previously placeholder #)
- ▸Mobile menu under Product gains a Review Generation entry to match desktop
Day 50June 17, 2026
PWA service worker + customer testimonials + auth redirect fixes
- ▸Service worker live — pages load offline with a dedicated fallback page, network-first when online
- ▸Launched /testimonials — a public page for customer feedback, with a moderated submission flow gated to logged-in users
- ▸Admin: new Testimonials moderation tab for handling flagged testimonial submissions
- ▸Improved auth redirect handling for new signups arriving from feature pages
- ▸obscenity package added for content moderation (replaces hardcoded profanity list)
Day 49June 16, 2026
PWA manifest upgrade + ReviewTrackers comparison page
- ▸PWA manifest upgraded — full icon set (16/32/48/180/192/512), start_url, scope, theme_color metadata
- ▸/vs/reviewtrackers competitor comparison page live — pricing table, feature sections, sitemap updated; ReviewTrackers tab unlocked on homepage CompetitorTabs (final tab)
Day 48June 16, 2026
Notifications gate + digest infrastructure + Early Signals carousel
- ▸Notifications gate: Noob tier sees locked blur overlay on Notifications card — email alerts are Chad & above
- ▸Digest email infrastructure: cron route + email template + preference API built, UI is Coming Soon pending Vercel Pro
- ▸Early Signals carousel: homepage fake testimonials replaced with auto-scrolling carousel of 10 honest beta feedback cards
Day 47June 15, 2026
Monthly report card emails + Podium comparison
- ▸GigaChad: monthly report card email, delivered on the 1st of each month at 9am ET
- ▸Settings: Monthly Report Card toggle card — opt out anytime (GigaChad only)
- ▸Locked upsell card shown to Noob and Chad tiers
- ▸businesses.email_monthly_report column (boolean, default true)
- ▸Cron route /api/cron/monthly-report — Bearer auth, tier filter, toggle filter, Resend send
- ▸Email template: em-dashes for GBP-blocked fields, real AI replies count from ai_responses
- ▸/vs/podium competitor comparison page — pricing table, feature sections, sitemap
- ▸Homepage CompetitorTabs: Podium tab unlocked
- ▸Competitor page: /vs/grade.us — Grade.us comparison page + Grade.us tab unlocked on homepage
Day 46June 15, 2026
Public review landing page (/r/[businessId])
- ▸Shipped /r/[businessId] — mobile-first public page, no site chrome, single CTA
- ▸Three states: 404 (invalid ID), fallback (no Place ID), full CTA (live businesses)
- ▸Added slug column to businesses table with format constraint + unique index
- ▸Added get_public_business_info() SECURITY DEFINER RPC — safe anon reads
- ▸Added src/lib/google-review-url.ts utility
- ▸robots noindex/nofollow on all /r/ pages — not for search engines
Day 45June 14, 2026
QR codes + competitor tabs + /vs/birdeye + pricing audit
- ▸GigaChad: QR code generator in Settings — download PNG, links to /r/[businessId]
- ▸/api/qr route — tier-gated to GigaChad, returns PNG, auth-guarded
- ▸src/lib/qr.ts — server-side QR generation utility (qrcode npm package)
- ▸Homepage: CompetitorTabs section — 4 tabs, Birdeye live, others coming-soon locked
- ▸/vs/birdeye competitor comparison page — pricing table, feature sections, SEO-targeted
- ▸sitemap.ts updated with /vs/birdeye
- ▸Homepage ROI card linked to /roi-calculator
- ▸Replan: all unshipped /pricing features will be built as mock-ready UI pre-GBP, live data swap on July 23
Day 44June 13, 2026
/faq page + full team invite flow + member permission lockdown
- ▸/faq page live with 27 questions across 7 categories — pricing, Google connection, AI replies, tiers, launch, security, support
- ▸JSON-LD FAQPage schema on /faq for Google rich snippets
- ▸/how-it-works and /faq added to sitemap.ts
- ▸Three broken #faq nav links fixed across header (desktop + mobile) and footer
- ▸team_invites Postgres table created with RLS — owner-only read/write, service role for accept-by-token
- ▸Four team API routes shipped — invite, accept, revoke, remove-member — all gated by requireBusinessOwner helper (owner + gigachad)
- ▸Resend invite email template with 1-day token expiry
- ▸/accept-invite page with separate unauthenticated and authenticated states
- ▸SettingsClient Team card rebuilt from stub into real member list with pending invites, revoke buttons, and invite form
- ▸Members RLS policy added on public.users so teammates can read each other's emails (scoped to same business)
- ▸redirectTo threaded through signup flow — signup page, SignupForm, emailRedirectTo, check-email — for invitee email verification redirect
- ▸Dashboard guard now bypasses /onboarding for users with a pending team invite
- ▸handle_new_user Postgres trigger updated to skip business creation when the new user has a pending team invite
- ▸Member permission lockdown — /api/create-checkout-session and /api/create-portal-session now require owner role
- ▸Settings UI hides owner-only controls from members — business info inputs become read-only, billing buttons hidden, team invite/revoke/remove hidden
- ▸Gold banner at top of /settings for members explaining the permission level
Day 43June 12, 2026
/how-it-works full build + framework security bump
- ▸Bumped framework version — closes batch of high/moderate security advisories, full E2E verified
- ▸Built /how-it-works — sticky sidebar, tier mockups (Noob/Chad/GigaChad), SVG trend chart, comparison table
- ▸Header + footer How it works links wired from #how-it-works to /how-it-works
- ▸Footer duplicate Help Center link (Resources column) removed
- ▸nav audit: catalogued all broken # links — FAQ deferred to /faq page, GBP-dependent links stay SOON
Day 42June 12, 2026
Alert Preferences + pre-launch SEO infrastructure
- ▸Shipped /features/alert-preferences — last # placeholder in Product dropdown closed
- ▸Added 6 missing routes to sitemap.xml (5 feature pages + /why-us)
- ▸robots.ts now includes explicit Allow rules for 9 AI crawlers, mirroring existing restrictions
- ▸Verified ominvo.com in Google Search Console — sitemap submitted, 60 URLs discovered
- ▸npm audit: closed 2 of 4 advisories (transitive deps)
Day 41June 11, 2026
Check-email page, server-validated verification, three polish fixes
- ▸/check-email page between signup and verification — email shown, Turnstile-gated resend, back link
- ▸Server-validated verification detection: getUser + email-match + email_confirmed_at guards
- ▸Cross-tab "Email verified" card with auto-redirect to /dashboard
- ▸Homepage Chad annual pricing fix: $288/year save $72, 20% off (was $240/year save $120, 33%)
- ▸Admin Plan Breakdown row math now uses per-tier MRR sums — annual subs no longer mislabeled
- ▸Settings Card 5 gated to noob-only — chad users no longer see duplicate upgrade CTA
Day 40June 10, 2026
Annual billing E2E passes; DKIM + settings rebuild + smart filters
- ▸Fixed Resend DKIM record in Hostinger DNS — email signup unblocked after 29 days of silent failure
- ▸Rebuilt /settings upgrade flow — Monthly/Annual toggle, tier-aware cards (Noob sees Chad+GigaChad, Chad sees GigaChad), real Stripe Checkout
- ▸Annual billing end-to-end test passed: $288 Chad annual → webhook → tier flip noob→chad → MRR $84 → cancel-at-period-end
- ▸Added /features/smart-filters page with static HTML/CSS star-rating filter mock (GigaChad-only positioning)
- ▸Wired Smart Filters in Product dropdown (desktop + mobile) and footer
Day 39June 13, 2026
MRR math fix, analytics dashboard page, /why-us comparison page
- ▸Admin revenue API: all 4 Stripe price IDs moved from hardcoded strings to env vars — no code changes needed at live-mode cutover
- ▸Annual MRR fix: annual subscription amounts now divided by 12 (was counting full $288/$948 as MRR contribution)
- ▸Revenue amounts read directly from Stripe price object (unit_amount / 100) — self-corrects if pricing changes
- ▸Annual subs correctly increment chadCount/gigachadCount instead of falling through to unknownCount
- ▸/features/analytics-dashboard launched — 10 sections: rating trend, response rate, velocity, star distribution, competitor tracking (GigaChad), tier comparison
- ▸/why-us launched — Ominvo GigaChad vs Birdeye Growth positioning, full HTML/CSS dashboard mock, SVG trend chart, donut chart, feature comparison table, bar chart
- ▸SiteHeader + SiteFooter: Analytics Dashboard + Why Ominvo nav links wired desktop, mobile, footer
- ▸Engineering dead-end logged: MDX chart system (BlogCharts.tsx + 5000-word Birdeye blog post) built and reverted — next-mdx-remote/rsc does not reliably evaluate multiline JSX array props during prerender
Day 39June 12, 2026
MRR calculation fixed + analytics dashboard feature page
- ▸Admin revenue API: all 4 Stripe price IDs moved from hardcoded strings to env vars — no code changes needed at live-mode cutover
- ▸Annual MRR fix: annual subscription amounts now divided by 12 for correct MRR contribution (was counting full $288/$948 annual amount)
- ▸Revenue amounts now read from Stripe price object directly — self-corrects if pricing changes
- ▸Annual subs now correctly increment chadCount/gigachadCount instead of falling through to unknownCount
- ▸/features/analytics-dashboard launched — rating trend, response rate, velocity, star distribution, competitor tracking (GigaChad), tier comparison
- ▸SiteHeader + SiteFooter: Analytics Dashboard nav links wired desktop, mobile, and footer
Day 38June 11, 2026
Annual billing wired end to end + AI Replies page
- ▸Annual billing checkout wired — billingInterval param, 4-way price ID map (chad/gigachad × monthly/annual)
- ▸Webhook bug fixed — annual price IDs added to TIER_MAP, prevents incorrect tier assignment on annual subscriptions
- ▸Pricing page CTA buttons converted to onClick handlers — loading state, Stripe redirect, inline error handling
- ▸/features/ai-replies live — hero, 3-step how it works, 6 feature tiles, tier callout, final CTA
- ▸SiteHeader + SiteFooter: AI Replies and Instant Alerts links wired to real destinations
- ▸Copy audit: "AI" replaces brand name references in homepage, FeatureRows, ProductShowcase
Day 37June 10, 2026
Annual billing toggle live + first feature landing page
- ▸Pricing page: Monthly/Annual toggle added, defaults to Annual
- ▸Chad annual: $24/mo (billed $288/yr, save $72) — GigaChad annual: $79/mo (billed $948/yr, save $240)
- ▸Stripe annual price IDs created in test mode: STRIPE_CHAD_ANNUAL_PRICE_ID + STRIPE_GIGACHAD_ANNUAL_PRICE_ID
- ▸Hero badge updated: "Save 20% with annual billing — now available"
- ▸Pricing page FAQ updated with annual billing Q&A and concrete prices
- ▸/features/instant-alerts launched — first Product dropdown item with a real destination
- ▸SiteHeader: Instant Alerts href wired desktop + mobile
Day 36June 10, 2026
Help Center complete — 6 articles, thumbs feedback wired
- ▸6 Help Center articles added: integrations (connecting GBP, Meta roadmap, webhooks & API) + account-and-security (changing password, data deletion, who can see your data)
- ▸HelpIndexClient.tsx renamed to HelpIndex.tsx (naming fix)
- ▸help_feedback table added to Supabase
- ▸New /api/help/feedback endpoint — unauthenticated, rate-limited, persists thumbs y/n votes
- ▸ArticleFooter thumbs buttons now fire-and-forget POST on click
Day 35June 9, 2026
Help Center content expansion and auth redirect sweep
- ▸6 Help Center articles: billing (upgrading, cancelling, invoices) + reviews-and-replies (how AI works, editing replies, negative reviews)
- ▸Auth redirect sweep: /dashboard, /settings, /reviews now redirect to /login?redirectTo=<path>
- ▸All 4 protected routes fully wired with safe redirect
Day 34June 8, 2026
Help Center foundation, open-redirect fix, and health log table
- ▸/api/admin/health-logs endpoint with filters (time range, service, status, limit) + raw log table in admin Health tab
- ▸safe-redirect.ts validator — closes open-redirect attack vector on login redirectTo param
- ▸/admin redirectTo wired: signed-out users return to /admin after login
- ▸Help Center foundation: /help, /help/[category], /help/[category]/[slug] routes live
- ▸3 seed articles in getting-started category
- ▸Help Center footer link added
Day 33June 7, 2026
Monitoring, social links, and bundled fixes
- ▸UptimeRobot external monitoring live on /api/health
- ▸Footer social icons updated: X, Facebook, Instagram, Pinterest with correct profile URLs
- ▸/api/health auth gate removed (public endpoint, no sensitive data)
Day 32June 6, 2026
Status page, admin Health tab, and social batch
- ▸/status public page live with 4 service cards, uptime bars, auto-refresh
- ▸/admin Health tab (6th tab) with lazy fetch and per-service status cards
- ▸28 Canva social designs scheduled June 8–14
Day 31June 5, 2026
Blog system, health monitoring, and revenue tab
- ▸Blog live at /blog with MDX, 5 categories, RSS feed, syntax highlighting
- ▸/api/health worker pings 4 services, logs to service_health_log
- ▸Revenue tab in /admin shows live MRR from Stripe
Day 30June 4, 2026
Heading gradients and last_active_date fix
- ▸Sitewide white-to-gold heading gradient applied
- ▸Hero H1 sizes reduced across all pages
- ▸last_active_date now stamped on every dashboard load (At-Risk tab fix)
Day 29May 31, 2026
ROI Calculator
- ▸/roi-calculator live with industry-specific lift percentages
- ▸Transparent math, no black box
- ▸Wired into header and footer
Day 28May 30, 2026
All 7 industry pages + email logo
- ▸All 7 industry pages live: Salons, Restaurants, Gyms, Dental, Med Spas, Auto Services, Home Services
- ▸Logo PNG added for transactional email templates