afterbuild/ops
§ S-13/auth-db-integrations

AI app auth and database fix — Supabase RLS,
Clerk, and Stripe webhooks wired up right.

Fixed-fee AI app auth and database fix for Lovable, Bolt, v0, Cursor, and Windsurf apps. We run the Supabase RLS fix, the Clerk auth setup for AI apps, the database migration AI app teams keep deferring, and the idempotent Stripe webhook pass — in 1 to 3 weeks from $799.

price$799+
turnaround1–3 weeks
guaranteeRLS tested, webhooks idempotent, keys out of the browser
Quick verdict

AI app auth and database fix is the fixed-fee engagement that closes the three things AI builders scaffold badly: Supabase RLS, real auth (Clerk or Auth.js), and idempotent Stripe webhooks. Roughly 70% of Lovable apps we audit ship with RLS disabled; the widely-reported 2026 Lovable/Supabase RLS disclosure is the canonical example. Engagements run 1 to 3 weeks from $799 with a 48-hour audit — RLS tested, webhooks idempotent, keys out of the browser.

§ 01/diagnosis

Symptoms the auth and database fix resolves

Eight failure modes we see every week on AI-built apps. Each row is a distinct root cause with a distinct fix — we don't paper over with try/catch.

diagnostic matrix · symptom → root cause → auth-db fix
SymptomRoot cause in AI-built codeHow the fix lands
Anon users can SELECT from any tableLovable shipped with RLS disabled on the table — default is public readSupabase RLS fix · enable RLS, write auth.uid() policies, add non-owner session tests
Service-role key visible in the browser bundleBolt or v0 generated code that imports the secret key client-sideRewire to server-only client · anon key in the browser, service role on the server only
Stripe checkout works, subscription never activatesWebhook handler isn't verifying the signature or isn't idempotent on retryStripe webhook hardening · signature verify, idempotency key, replay queue
Google OAuth 400s on the production domainRedirect URI still registered against the preview URL from the builderOAuth config pass · production redirect URIs registered, Supabase site URL corrected
App is fast at 10 users, crawls at 1,000No indexes on hot queries, no connection pooling, N+1 reads everywhereDatabase migration for AI app · indexes, Supavisor / PgBouncer pooling, query plans reviewed
Password-reset email lands in spam, receipts never arriveMissing DKIM, SPF, DMARC; sending from a shared subdomain with no warm-upDeliverability pass · dedicated sending domain, DKIM/SPF/DMARC wired, bounce handling live
Multi-tenant data leaks across tenantsNo tenant_id constraint, RLS policies missing the tenant scopeRBAC + tenant fix · add tenant_id foreign keys, rewrite RLS to scope by tenant + user
v0 app has no backend at allv0 generates frontend only — no DB, no auth, no paymentsBackend build · Supabase or Neon + Clerk + Stripe wired server-side, deploy pipeline included
§ 02/protocol

Five-phase Supabase RLS fix and Clerk auth setup schedule

Every auth, database, or integration engagement runs the same five phases. Scope is day one; runbook handoff is the final milestone.

  1. D1day 1

    Scope the auth and database gap

    One hour on a call. You describe what's broken — Supabase RLS fix, Clerk auth setup for AI apps, Stripe webhook, a database migration AI app work. We return a fixed-fee quote inside two business hours.

  2. D2day 2

    Audit current wiring

    We read the code, trace each integration, and write a short diagnostic doc: what's in place, what's broken, what's missing. You approve the plan before we touch anything.

  3. D3W1

    Build and test in staging

    Everything is built against a staging environment first. Webhooks are tested with the Stripe CLI or signed test events. RLS is tested with non-owner sessions. OAuth is tested against the production domain before cutover.

  4. D4W2

    Cutover with a safety net

    We deploy behind a feature flag or dual-write where possible. If anything misfires, we revert in under five minutes. Most cutovers are non-events.

  5. D5W2–W3

    Handoff with a runbook

    Each integration gets a runbook — how to rotate secrets, replay webhooks, add roles, extend the schema. Your next engineer inherits something maintainable.

§ 03/server-pattern

The server-side Supabase pattern Lovable and Bolt skip

The fix the AI builder doesn't write: the service-role key never leaves the server, the anon client runs through the session cookie, and RLS is the gatekeeper. Copy-paste this pattern and two of the most common leaks disappear. See Supabase's SSR guide for the full spec.

src/lib/supabase/server.ts
ts
01// src/lib/supabase/server.ts02// The pattern Lovable and Bolt skip: service-role key on the server ONLY.03// The anon key is fine in the browser bundle — it's anonymous by design.04// The service role key MUST NEVER cross the network boundary.05 06import 'server-only'07import { createServerClient } from '@supabase/ssr'08import { cookies } from 'next/headers'09 10// ---------- anon client (safe to call from Server Components) ----------11// Uses the anon key. RLS is the gatekeeper. Reads are scoped by auth.uid().12export async function getServerSupabase() {13  const cookieStore = await cookies()14  return createServerClient(15    process.env.NEXT_PUBLIC_SUPABASE_URL!,16    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,17    {18      cookies: {19        getAll: () => cookieStore.getAll(),20        setAll: (list) => list.forEach((c) => cookieStore.set(c.name, c.value, c.options)),21      },22    },23  )24}25 26// ---------- admin client (server-only, bypasses RLS) ----------27// Use sparingly — webhooks, cron jobs, backfills. NEVER import in a Client Component.28import { createClient } from '@supabase/supabase-js'29 30export function getServiceSupabase() {31  if (typeof window !== 'undefined') {32    throw new Error('getServiceSupabase() must not run in the browser')33  }34  return createClient(35    process.env.SUPABASE_URL!,36    process.env.SUPABASE_SERVICE_ROLE_KEY!,37    { auth: { persistSession: false, autoRefreshToken: false } },38  )39}
server-only Supabase clients. The admin client throws if imported in the browser — a guard rail the AI builder won't add on its own.
§ 04/rls-before-after

Supabase RLS fix — before and after the policy rewrite

The left block is what Lovable shipped on a fintech app we audited last month: RLS off, no policies, anon key in the browser. The right block is what we shipped eleven days later — RLS on, three policies scoped by auth.uid(), a regression test that fails if a non-owner session ever sees another row.

✕ before · ai-shipped
supabase/migrations/__lovable_default.sql
sql
01-- BEFORE — what Lovable shipped02-- Row-Level Security is DISABLED on public.invoices.03-- Anyone with the anon key (i.e. anyone on the internet) can SELECT every row.04 05create table public.invoices (06  id uuid primary key,07  user_id uuid references auth.users,08  amount integer,09  status text10);11 12-- No "alter table ... enable row level security;"13-- No policies. Table is wide open.
RLS disabled · anon clients read every row in the table.
✓ after · afterbuild
supabase/migrations/20260417__rls_on.sql
sql
01-- AFTER — what we ship02-- RLS ENABLED. Policies scoped by auth.uid().03-- Non-owner sessions get zero rows back, not a 401 we have to trust.04 05alter table public.invoices enable row level security;06 07create policy "owner_read"08  on public.invoices09  for select10  using (user_id = auth.uid());11 12create policy "owner_write"13  on public.invoices14  for insert15  with check (user_id = auth.uid());16 17create policy "owner_update"18  on public.invoices19  for update20  using (user_id = auth.uid())21  with check (user_id = auth.uid());22 23-- Verified with a test: a non-owner session returns 0 rows, every time.
RLS enabled · three policies scoped by auth.uid(). Non-owner session returns 0 rows.
§ 05/deliverables

What auth-and-database-fix engagements ship

Twelve deliverables cover the full backend surface. A $799 single-integration fix picks a subset; a $5,000 backend build covers the lot.

§ 06/pricing

Single-integration and backend-build pricing

The 48-hour audit sets the exact number. Single integrations start at $799; a full backend build on a v0 or Bolt app starts at $7,499. All fixed fee.

They ran our Supabase RLS fix on eight tables, replayed 62 stuck Stripe webhooks, and wired Clerk in eleven days. Our January breach wouldn’t have happened if we had started here.
Fintech MVP founder· post-engagement · $4.2k fixed fee
auth-db-integrations
price
$799
turnaround
1–3 weeks
scope
One integration minimum — auth, RLS, Stripe, email, or database migration. Multi-integration bundles scoped up on the audit call.
guarantee
RLS tested, webhooks idempotent, keys out of the browser
Book auth + RLS audit
§ 07/alternatives

Auth and database fix vs hourly contractor vs a rewrite

DimensionHourly contractorFull rewriteAuth and database fix
Cost$8k–$40k open-ended$80k–$200k+From $799, fixed
TimelineUnknown, usually drifts3–6 months1–3 weeks
RLS test coverageRarelySometimesNon-owner session tests, always
Webhook idempotencyDepends on engineerDepends on engineerIdempotency keys + replay tool
Runbook on handoffRareOptionalIncluded
Existing Lovable/Bolt codeUntouched or rewritten silentlyDiscardedPreserved where it works

Pick auth and database fix if

  • Your Lovable or Bolt app has RLS disabled and real user data on the table
  • Your Supabase RLS policies are there but never tested against non-owner sessions
  • Your Stripe checkout completes but the subscription never activates in your database
  • You need Clerk auth setup for an AI app that scaffolded sign-in without middleware
  • You need a database migration AI app teams have been deferring for months
  • Your OAuth redirect still points at the builder preview and 400s on the production domain

Don't pick auth and database fix if

  • Your app is still on the builder and you haven't decided on a target stack — start with migration
  • You need a ground-up rewrite with new features — that's Finish My MVP
  • Your only issue is a white screen on deploy — that's Deployment & Launch
  • You want the fastest possible single-bug fix — use Emergency Triage ($299)
  • You need real SOC2 paperwork — pair this with Vanta/Drata, not a replacement
  • You want us to own the integrations forever — that's Retainer Support
§ 08/when-to-engage

When a Supabase RLS fix or Clerk auth setup pays off

Your Lovable, Bolt, or Cursor app logs you in but 500s on everyone else in production. Classic OAuth redirect URI or RLS policy miss. We fix it in a week with tests so the same failure mode can't recur silently. The widely-reported 2026 Lovable/Supabase RLS disclosure captured exactly this pattern — the fix is well-understood.

Your Stripe checkout works once, then subscriptions silently fail to update or customers get double-charged. We add webhook signature verification, idempotency on every event handler, and a replay tool for stuck events per Stripe's own best-practices guide. Most Stripe fixes ship in 3 to 7 business days.

Your builder generated a database but didn't configure pooling, indexes, or migrations. The app is fine at 10 users and crawls at 1,000. We add the indexes, enable PgBouncer or Supavisor, reconstruct a clean migration history, and verify under load — a database migration AI app teams can then extend.

Your v0 app has no backend at all. We add Supabase or Neon with schema, auth, RLS, and server-side query patterns that never leak the service-role key into the browser. That's a 1-to-2-week engagement, fixed price, and ends with a backend your next engineer can extend.

§ 10/faq

Auth, database, and integration questions we hear weekly

Can you run a Supabase RLS fix on our Lovable or Bolt app?

Yes — this is our most common engagement. Missing RLS, overly permissive policies, and wrong foreign-key setups are the most common issues we fix on Lovable, Bolt, and Cursor apps. Roughly 70% of Lovable apps we audit ship with RLS disabled on at least one table. We enable it, rewrite policies to use auth.uid() correctly, and add a test harness that verifies a non-owner session returns zero rows. The widely-reported 2026 Lovable/Supabase RLS disclosure captured exactly that surface — we close it.

Do you do Clerk auth setup for AI apps, or only Supabase Auth?

Both, plus Auth.js and Firebase Auth. We wire Clerk or Auth.js onto Lovable, Bolt, v0, Cursor, Windsurf, and Replit apps — sessions, middleware, password reset, email verification, SSO, magic links. Clerk is our default when the app needs SAML SSO or organizations; Supabase Auth is our default when the app needs tight RLS integration. We'll recommend which one in the 48-hour audit.

Can you do a database migration for an AI app already in production?

Yes, with a documented migration plan and zero data loss. Supabase-to-Neon, Replit DB to managed Postgres, Firebase to Supabase, or Postgres-to-Postgres across providers — all done with two staging dry-runs, integrity checks on every table, and the old stack kept live for 30 days as rollback. We've done these migrations several dozen times and haven't lost a row.

Do you handle SOC2 or HIPAA compliance prep?

We handle the engineering side — audit logs, encryption at rest and in transit, RBAC, data retention, secret rotation, and the documentation auditors need. For the paperwork, control mapping, and auditor coordination, we partner with Vanta, Drata, or Secureframe. Most Afterbuild Labs clients get through SOC2 Type I in 60 to 90 days with that combination.

Can you finish a Stripe integration that's half-wired by Lovable or Bolt?

Yes. The common gaps: missing webhook signature verification, non-idempotent event handlers, no failed-payment retry logic, subscription state drift between Stripe and the database. Stripe's own benchmark showed AI agents struggle on exactly these edges. Fixed price, typically $799 to $3,500 depending on complexity, delivered in 3 to 10 business days.

How much does AI app auth and database fix work cost?

Single-integration fixes (one auth flow, one webhook, one OAuth redirect) run $799 and take 5 business days. Multi-integration engagements (auth + Stripe + RLS + email) run $2,500 to $5,000 and take 2 to 3 weeks. Full backend builds on v0 or Bolt apps (adding a backend from scratch) start at $7,499. All fixed fee, audit in 48 hours.

Why do Lovable and Bolt generate RLS-disabled tables so often?

Because the builder optimizes for 'it works in the preview.' Enabling RLS means every query needs a policy, and the policy needs the right session — that's friction the builder skips. Same reason Bolt wires the service-role key into the client bundle: it works on the preview server with no auth context, so it works. We close both gaps.

Will the fix break our existing Lovable or Bolt logins?

No. We migrate sessions through by preserving the Supabase JWT signing keys (or mirroring Clerk sessions), so existing users stay logged in. If we need to rotate keys for a security reason, we coordinate a scheduled re-auth at a low-traffic window and notify users in advance — not a surprise logout.

Next step

Backend a mess? Let's fix it.

Free 30-minute diagnostic, or go straight to the $799 Integration Fix if you already know what's broken.