I'm a backend engineer, been shipping production apps for 9 years. The last 8 months ive been auditing apps for friends, freelance clients, and a few small startup teams. 50+ apps now, ranging from one-pager landers to full-stack SaaS with 1000+ users.
The speed is wild. Stuff that used to take me a sprint takes AI an afternoon. But theres a pattern i keep seeing: vibe coded apps work great with 5 users, then something starts breaking around user 50, and by user 500 the founder is in panic mode in my DMs.
Here are the 6 things that almost always break. Plain English, paste-ready fixes.
1. The "Auth Emails Vanish" Problem
The Vibe: You ship signup. People sign up. It works on your machine.
The Reality: Supabase Auth uses its default SMTP for outbound. Default SMTP has terrible deliverability. Half your auth emails go to spam, the other half land in promotions tab.
The Trap: Users sign up, never verify, never come back. Your "1000 signups" is actually 400 verified users and you have no idea because you arent tracking deliverability.
The Fix: Configure custom SMTP with proper SPF / DKIM / DMARC records before launch. In Supabase: Auth → SMTP Settings → use Resend or Postmark with verified domain. Set up DMARC at p=quarantine minimum. Test with "mail-tester.com" before going live.
2. The "Public RLS" Catastrophe
The Vibe: AI says your tables have RLS enabled.
The Reality: RLS being "enabled" means nothing if your policies are wrong. Default-generated policies are often true for everything.
The Trap: Anyone who finds your supabase URL can read your entire database. Your users data, payment info, everything. Theres a researcher who audited 200+ vibe coded apps and found 89% of them had this exact issue.
The Fix: Open Supabase studio → Authentication → Policies for every table. Each policy should reference auth.uid() matched against an owner column. Run this query to find all your tables with permissive policies: SELECT tablename, policyname, qual FROM pg_policies WHERE schemaname = 'public'; and review every row by hand.
- The "Stripe Webhook Wide Open" Mistake
The Vibe: Your app is wired up with Stripe checkout. Users can pay. Money is moving.
The Reality: The webhook endpoint that updates user subscriptions probably isnt verifying the Stripe signature. The agent often skips this step unless explicitly asked.
The Trap: Anyone can POST a fake webhook to your endpoint and upgrade themselves to a paid plan for free. Or worse, downgrade everyone elses subscriptions.
The Fix: In your edge function or webhook handler, verify the signature using stripe.webhooks.constructEvent(rawBody, signature, webhookSecret). The webhook secret is in your Stripe dashboard under Developers → Webhooks → Signing secret. Never log it. Store it as a Supabase secret, not in your code.
- The "Context Rot Cascade"
The Vibe: Youre 4 months in. The agent has been your pair programmer the whole time.
The Reality: After enough back-and-forth, the agent loses track of what your app actually does. It starts "fixing" things by breaking working features.
The Trap: One day you ask for a small change, the agent rewrites your auth flow, breaks 3 unrelated things, and you spend 2 days debugging.
The Fix: Three habits. One, commit to GitHub before every agent run. Two, use Chat Mode to plan before Agent Mode executes (Chat Mode is 1 credit, doesnt write code). Three, when the app gets to about 80 components, start scoping prompts to specific files: "only modify components/Pricing.tsx, dont touch anything else."
- The "Free Tier Abuse" Drain
The Vibe: Your app uses OpenAI / Anthropic / some AI API. Free tier was generous. Costs were predictable.
The Reality: You didnt add rate limiting. The agent gave you a frontend "Generate" button connected to an edge function that hits OpenAI directly.
The Trap: One Twitter mention, one Reddit post, one bot scraping your site, and youll wake up to a $400 OpenAI bill from a few hours of someone hitting your endpoint in a loop.
The Fix: Rate limit at the edge function level. Use Upstash Redis or Supabase's built-in rate limiting. Limit free users to 5 requests per minute, paid users to 30. Set a hard daily cap. Set spending limits on your OpenAI account in their dashboard. This isnt optional, this will happen.
- The "Onboarding Drip Doesnt Exist" Gap
The Vibe: Users sign up. Your job is done. They'll figure it out.
The Reality: Activation rate for vibe coded apps without an onboarding email sequence hovers around 12-18%. With even a basic 3-email sequence, that jumps to 35-50%.
The Trap: You spent 3 months building. Got 200 signups from a launch post. Two weeks later, only 24 of them ever returned to the app. You assume the product is bad. The product might be fine. The retention loop is missing.
The Fix: At minimum: Day 0 welcome email, Day 2 "have you tried [main feature]" email, Day 7 "heres what other users are doing" email. These can be templated. Tools that handle this from your Supabase database directly without code: Loops, "Customer.io", Resend with custom edge functions. Pick one. Set it up before launch, not after.
Most of these took clients of mine multiple painful weeks to figure out. The fixes themselves are usually a few hours of work. Use code review tools such as Vibe Coach to double check your code before launching your app. The lesson is: vibe coding solves the building problem. It does not solve the "running a real product" problem. Thats still on you.
curious which one of these has bit yall the worst. and if theres a 7th i should add to the list.