Ominvo beta launches July 23, 2026 — only 10 spots remain Join the waitlist →

Notes from the build.

Founder notes from building Ominvo, field research from the small business review trenches, and tactical playbooks for owners who want better reviews without spending their evenings on Google.

Building Ominvo

I found 26 dead links in production while trying to fix a security bug that didn't exist

Set out to fix a MEDIUM CORS finding from Day 74's blackbox audit. It turned out not to exist. Then E2E dogfooding on what actually shipped uncovered 26 dead links across the Content Library that had been silently 404-ing since Day 70. Verify-before-fix at both ends.

Jul 8, 20265 min read
Building Ominvo

31% of consumers now ignore businesses below 4.5 stars. Last year it was 17%.

BrightLocal's 2026 Local Consumer Review Survey came out in April. The 4.5-star cliff nearly doubled in a single year. Here's what that means if you're sitting at 4.3.

Jul 7, 20265 min read
Building Ominvo

Google says review appeals take 5 days. Plan for 6 weeks.

Google's official documentation says appeal reviews take up to 5 business days. Practitioners report real-world backlogs of 4 to 6+ weeks. If a review disappears, plan around the reality, not the SLA.

Jul 6, 20265 min read
Building Ominvo

Google banned the review tablet on your front desk

The April 2026 Google policy update banned in-store review tablets — and AI is removing what they collected. If you have a tablet at your counter, unplug it today.

Jul 5, 20265 min read
Building Ominvo

The honest answer to 'how many reviews do I need' is not a number

Every SEO blog answers with a number. 40. 100. 250. They're guessing or selling. The real answer is a framework — which is worse for SEO and better for the actual person reading it.

Jul 4, 20265 min read
Building Ominvo

Three stats, three sources — and the one I had to change

The Day 70 Content Library article shipped with three external stats. All three sourced from primary documents before writing. One of them isn't the number I originally asked for — because the original number couldn't be verified. Here's what verification-as-a-feature actually means, and the small catches from Day 70's session.

Jul 3, 20265 min read
Building Ominvo

The library had no door yet

Day 69 shipped a /resources hub, 5 content stubs, and a homepage teaser that had to be re-tailored the moment it went live.

Jul 2, 20265 min read
Building Ominvo

A cookie banner for the analytics I don't run

Section 6 of the Privacy Policy said Ominvo doesn't use analytics. That was accurate — and also a way to duck the question of what happens when I add them. Day 68 builds the consent machinery before the first analytics script lands.

Jul 1, 20265 min read
Building Ominvo

TypeScript clean isn't the only kind of green

Yesterday's deliberate test trigger caught two real Errors tab rendering bugs this morning — including a timestamp showing '20634d ago' because Sentry returned null for a freshly-ingested event. DKIM deliverability scored 9.7/10 on the first real test. And a duplicate Privacy Policy link only visible when you scroll the actual rendered footer. Three catches, none from CI.

Jun 30, 20265 min read
Building Ominvo

Day 65: My health dashboard hid its own outage for four days

How the Day 60 rewrite of /api/health silently dropped the database write, why the admin tab kept showing green for 96 hours, and the stale-data banner that should have existed in the first place.

Jun 29, 20266 min read
Building Ominvo

Day 66: What 'shipped' actually means

Three commits today: a Sentry Errors tab for the admin, a hotfix for the statsPeriod whitelist, and a price that had been invisible on /lifetime for nine days. Two of the three were caught by actually using the feature after it deployed.

Jun 29, 20266 min read
Building Ominvo

Day 64: When one person signs up ten times to dodge your rate limit

Building per-IP rate limiting on top of per-business tier caps, the admin tab that actually surfaces decision-quality context, and the validation bug we caught by clicking our own button.

Jun 28, 20266 min read
Building Ominvo

Day 63: How we handle the same person signing up 5 times in an hour

Closing the signup abuse loop end-to-end — silent backend logging, a soft-warning modal, and an admin tab that surfaces patterns without false-positiving real users.

Jun 27, 20268 min read
Building OminvoDay 62

Day 62: What your users see when Anthropic goes down

Day 61 built auto-rollback so our code recovers from outages. Day 62 fixed what users actually see during one — and uncovered a bug where our own billing button was lying to them.

Jun 26, 20265 min read
Building OminvoDay 61

Day 61: Why your auto-rollback should ignore Stripe outages

We built self-healing for our own bugs, not for somebody else's. It took three versions to get right — and the bug we almost shipped was the kind that wakes you up at 3 AM.

Jun 25, 20264 min read
Building OminvoDay 60

Day 60: We wired up error monitoring before anyone could find a bug

Sentry now catches every runtime error in the app and emails us the exact file and line. Plus a health endpoint that tells us if Supabase or Stripe is degraded — before a customer does.

Jun 24, 20263 min read
Building OminvoDay 59

We built loading skeletons before anyone paid us a dollar

Three skeletons shipped today — dashboard, reviews, settings. Why pre-launch is the right time to fix loading states, not later.

Jun 23, 20264 min read
Building OminvoDay 57

Why we built a lifetime deal — and why it's capped

A one-time $79 deal that funds the next leg of growth. Here's the math, the caps, and why we think it's fair.

Jun 22, 20263 min read
Building OminvoDay 58

We replaced a flat toggle with a 3D globe — here's why it took three tries

The billing toggle on our pricing page now shows a small globe rolling between Monthly and Annual. Here's the decision, the iterations, and what we shipped.

Jun 22, 20263 min read
Building OminvoDay 53

Day 53: Competitor Tracking page ships without the data. FAQ grows from 27 to 62.

Shipped the Competitor Tracking feature page even though the GBP API isn't live yet, cleaned up two stale SOON badges, and expanded the FAQ from 27 to 62 questions across all seven categories. Also: the Day 46–52 frontmatter bug that was silently dropping posts from the blog index got fixed at the top of the session.

Jun 20, 20265 min read
Building OminvoDay 55

Why we don't refund — and built an appeals system anyway

We don't refund Ominvo subscriptions. Not monthly, not annual, not partial periods. Here's the reasoning, the problem it creates, and the appeals system we built for the case where we get it wrong.

Jun 20, 20265 min read
Building Ominvo

Day 52: A real support funnel, and a playbook for replies that actually move revenue.

Today's plan was a full QA pass. Instead we fixed a duplicate dead-end in the footer and shipped a 3,000-word playbook on writing review replies that protect revenue, with industry-specific examples for all seven verticals Ominvo serves.

Jun 19, 20263 min read
Building OminvoDay 54

Day 54: Built the block system before we had anyone to block.

Risk levels, a Block tab in admin, Stripe-cancel-on-block, audit-logged unblocks, and a TOS amendment to make it all legal. Built for problems we don't have yet — because the day we do, we won't have time.

Jun 19, 20264 min read
Building Ominvo

Day 51: Install Ominvo on your home screen. And a page about the reviews you're not getting.

Two Day 51 ships: a real install button for Ominvo on Android and desktop, and a new page explaining why review generation is the GigaChad tier's actual differentiator.

Jun 18, 20264 min read
Building Ominvo

Day 50: Offline-ready and finally hearing from people who use it.

Two Day 50 ships users will actually see: the site now works offline with a proper fallback page, and logged-in customers can submit testimonials for the first time.

Jun 17, 20263 min read
Building Ominvo

PWA manifest groundwork shipped, ReviewTrackers comparison live

Two Day 49 ships: the PWA manifest is now install-ready with a full icon set and home-screen metadata, and the /vs/reviewtrackers comparison page is live with the final CompetitorTabs tab unlocked.

Jun 16, 20263 min read
Building Ominvo

Day 46: The Page Your QR Code Was Waiting For

We shipped the public review landing page — the destination behind every Ominvo QR code. Scan, tap, done.

Jun 15, 20263 min read
Building Ominvo

Your monthly review snapshot, now in your inbox

The monthly report card email is live for GigaChad. Four numbers, once a month, delivered where business owners actually read things.

Jun 15, 20264 min read
Building Ominvo

Why we gated email alerts to paid plans (and what Noob users get instead)

Most SaaS tools give you everything on the free tier and hope you forget to cancel. We didn't. Here's what Noob gets, what Chad unlocks, and why the gate is where it is.

Jun 15, 20263 min read
Building OminvoDay 45

Day 45: QR codes, competitor tabs, and the pricing truth we had to face

We shipped QR code generation for GigaChad users, built a tabbed competitor section on the homepage, launched /vs/birdeye, and had a hard conversation about which /pricing promises were actually built.

Jun 14, 20263 min read
Building OminvoDay 44

Team invites shipped — and the database trigger that almost killed them

Built the full team invite flow for GigaChad, watched it fail in production five different ways, and tracked the bug down to a Postgres trigger I forgot existed. Day 44.

Jun 13, 20264 min read
Building OminvoDay 42

Day 42: The plumbing day — alert preferences, AI bot rules, and Google's first crawl

Closed the last placeholder in the Product dropdown, told AI crawlers we exist, and got Google looking at ominvo.com for the first time. Shipping a feature isn't the same as making it discoverable. Today was about making sure the work of the past 41 days is actually findable.

Jun 12, 20266 min read
Building OminvoDay 43

Day 43: The page every confused visitor needed — and a framework upgrade that couldn't wait

Built the /how-it-works page from scratch — sticky sidebar, tier-by-tier dashboard mockups, feature comparison table, and honest tier gaps. Also bumped the framework version to close a batch of security advisories. Two very different kinds of work, both overdue.

Jun 12, 20266 min read
Field NotesDay 41

Day 41: Three rounds to ship one check-email page (and a polish bundle that took one)

Three rounds of production debugging to ship one intermediate page. The last bug was a stale localStorage token. Four commits total. ~60 days to launch.

Jun 11, 20265 min read
Building OminvoDay 39

Day 39: fixing the MRR calculation and shipping the analytics dashboard page

Two silent bugs in the revenue API — hardcoded price IDs and annual subscriptions inflating MRR by 12x. Fixed both. Also shipped the analytics dashboard feature page, the longest one yet.

Jun 10, 20264 min read
Building OminvoDay 39

Day 39: MRR math fix, two new pages, and one engineering dead-end

Shipped the MRR fix, the analytics dashboard feature page, and the /why-us comparison page. Also spent two hours building an MDX chart system that did not work and had to be reverted. Honest write-up of all of it.

Jun 10, 20265 min read
Field NotesDay 40

Day 40: Annual billing passes end-to-end (after three bugs nearly blocked it)

Planned a clean annual billing end-to-end test. Found DKIM broken for 29 days and the in-app upgrade flow incomplete. Fixed both. Test passed.

Jun 10, 20266 min read
Building OminvoDay 35

Day 35: Six help articles, zero shortcuts

Day 2 of the Help Center sprint. Six articles shipped across billing and reviews-and-replies — the two categories that either close or kill a paying customer. Plus a one-line fix that now sends every protected route back to where you were.

Jun 9, 20265 min read
Building OminvoDay 37

Day 37: Annual billing, Stripe prices, and the first feature page

Wired the annual billing toggle on pricing, created Stripe price IDs in test mode, and shipped the first dedicated feature landing page — Instant Alerts.

Jun 9, 20265 min read
Building OminvoDay 38

Day 38: Annual billing wired, AI Replies page, and a copy audit

Wired annual billing checkout end to end, shipped the AI Replies feature page, fixed a webhook bug, and audited all user-facing copy to remove brand name references.

Jun 9, 20264 min read
Building OminvoDay 33

Day 33: Five commits, one security call, and what the changelog page taught me

Opened up /api/health to the public internet after thinking it through carefully, shipped a changelog page nobody needs yet, and wrote two blog posts in one day. Notes on pre-launch posture.

Jun 8, 20265 min read
Building OminvoDay 34

Day 34: a security fix, a Help Center, and three scope overrides

Four commits, most productive day so far. Closed the open-redirect hole, built the Help Center foundation, and logged three scope overrides — which is now part of the record.

Jun 8, 20264 min read
Field Notes

What Ominvo actually does — every feature, explained plainly

A plain-English breakdown of every feature Ominvo ships, why each one exists, and which plan it lives on. No marketing fluff — just the product as it is.

Jun 7, 20267 min read
Building OminvoDay 31

The day I shipped monitoring, a blog, and had a security incident — all before lunch

Six commits. A real health monitoring system. The blog you're reading right now. And a token leak I caught, rotated, and logged before it could matter. Day 31 was a lot.

Jun 6, 20265 min read
Building OminvoDay 32

The /status page, the Health tab, and 28 social posts in one Sunday

Day 32 was a Sunday. I shipped a public status page, wired the admin Health tab, wrote the Day 31 retrospective, and scheduled 28 social designs across 4 platforms. Here's how it came together.

Jun 6, 20263 min read
Building OminvoDay 30

Stamping last_active_date — a tiny fix that made admin useful

An At-Risk tab in admin that quietly didn't work for the first 30 days. Here's the fix, the decision tree behind it, and why fire-and-forget is now a pattern in this codebase.

Jun 5, 20265 min read

Showing 46 posts