Production upgrade: Clerk auth, Stripe billing, analytics, PWA support

Backend & Auth:
- Add @clerk/nextjs for production authentication
- Create src/proxy.ts with clerkMiddleware() for route protection
- Implement multi-tenant auth with role-based access control
- Add Clerk components (Show, UserButton, SignInButton, SignUpButton)

Billing & Payments:
- Full Stripe integration (subscriptions, add-ons, customer portal)
- Plan tiers: Starter 9/mo, Farm 49/mo, Enterprise 99/mo
- Webhook handling for subscription events
- createSubscription(), createAddonSubscription(), createCustomerPortalSession()

API & Security:
- Rate limiting with @upstash/ratelimit (100 req/min API, 20 req/min checkout)
- Zod validation schemas for all endpoints (orders, products, campaigns, etc.)
- Security headers (CSP, HSTS, X-Frame-Options)
- API routes: /api/v1/ with validated, rate-limited endpoints

Monitoring:
- Sentry error tracking with performance monitoring
- PostHog analytics for feature usage, funnels, cohorts
- User activity logging and breadcrumb tracking

Admin Features:
- Analytics dashboard with revenue charts, customer growth, conversion funnel
- Onboarding flow with 6-step interactive tour
- Referral system with share tracking and reward redemption
- Changelog feed with in-app notifications

PWA & SEO:
- Web app manifest with icons and shortcuts
- Service worker for offline support and caching
- Full SEO metadata, OpenGraph, Twitter cards
- Structured data (JSON-LD) for organization and products

Database:
- Add referral_codes, changelogs, onboarding_progress tables
- Add user_activity_logs, api_keys, notification_preferences
- Comprehensive RLS policies for all new tables
- Seed data for demo brands and products
This commit is contained in:
2026-06-02 05:33:42 +00:00
parent b845d69aba
commit 6ab52a2499
32 changed files with 5816 additions and 501 deletions
@@ -0,0 +1,38 @@
// Clerk provider wrapper for Next.js App Router
"use client";
import { ClerkProvider as ClerkProviderBase } from "@clerk/nextjs";
import { usePathname, useRouter } from "next/navigation";
interface ClerkProviderProps {
children: React.ReactNode;
publishableKey: string;
}
export function ClerkProvider({ children, publishableKey }: ClerkProviderProps) {
const router = useRouter();
const pathname = usePathname();
// Determine sign-in URL based on current path
const signInUrl = "/login";
const signUpUrl = "/register";
const afterSignInUrl = pathname || "/admin";
const afterSignUpUrl = "/onboarding";
return (
<ClerkProviderBase
publishableKey={publishableKey}
signInUrl={signInUrl}
signUpUrl={signUpUrl}
afterSignInUrl={afterSignInUrl}
afterSignUpUrl={afterSignUpUrl}
routing={process.env.NEXT_PUBLIC_CLERK_ROUTING || "path"}
>
{children}
</ClerkProviderBase>
);
}
// Hooks for Clerk auth state
export { useUser, useAuth, useClerk } from "@clerk/nextjs";