Ecommerce Template
Modern ecommerce template built with Next.js 16, React 19, Drizzle, Better Auth, Supabase, and Stripe.
A mobile-first storefront for creators to sell digital products and grow their email list.
CommerceTypeScript · CSSGitHub @LuweedBinoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
topshop
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A mobile-first link-in-bio storefront for creators. Followers tap the link in a creator's bio, pick a product, pay with Stripe (card, Apple Pay, Google Pay), and get their download instantly. Creators keep 100% of sales: payments go straight to their own Stripe account.
/<handle>: avatar, bio, social links, accent color, and a list of product cards.Later phases: courses, calendar bookings, memberships, Instagram AutoDM, and Pro features (email flows, upsells and order bumps, payment plans, discount codes, affiliates).
Next.js 15 (App Router, server actions) · TypeScript · Tailwind CSS 4 · Postgres + Prisma · Stripe Checkout + Connect (Accounts v2 with the full Stripe Dashboard, direct charges) · S3-compatible storage · Resend.
cp .env.example .env # fill in DATABASE_URL and AUTH_SECRET at minimum
npm install
npx prisma migrate dev
npm run dev
Open http://localhost:3000, create a store, and add products. Without Stripe keys, free products and lead magnets work end to end; paid products show as unavailable.
To test paid checkout locally, set Stripe test keys and forward webhooks:
stripe listen --forward-connect-to localhost:3000/api/stripe/webhook --forward-to localhost:3000/api/stripe/webhook
Put the printed whsec_... in STRIPE_WEBHOOK_SECRET. Either connect a test Stripe account from Dashboard → Payments, or set ALLOW_PLATFORM_CHARGES=true to charge on the platform account.
DATABASE_URL, DATABASE_URL_UNPOOLED, and BLOB_READ_WRITE_TOKEN for you. npm run build applies migrations over the direct (unpooled) connection.AUTH_SECRET, STRIPE_SECRET_KEY, and later STRIPE_WEBHOOK_SECRET under Settings → Environment Variables, then redeploy. To see every creator who signs up, also set ADMIN_EMAILS to the email you log in to TapShop with; an Admin tab then appears in your dashboard. APP_URL defaults to the project's production domain.https://<your-domain>/api/stripe/webhook for events from connected accounts: checkout.session.completed, checkout.session.async_payment_succeeded, account.updated, charge.refunded. If you also use ALLOW_PLATFORM_CHARGES, add a second destination for your account and put both signing secrets in STRIPE_WEBHOOK_SECRET, comma-separated.S3 or Cloudflare R2 also work instead of Blob: set the S3_* variables and allow PUT from your domain in the bucket's CORS settings, since browsers upload straight to the bucket.
PENDING order and a Checkout Session on the creator's Stripe account./thanks/<orderId>?session_id=.... The page verifies the session with Stripe and marks the order paid, so the buyer isn't kept waiting on the webhook. The webhook does the same thing; marking paid is idempotent and the delivery email is sent once./api/download/<token>, which checks the order is paid and serves the file (a short-lived signed URL when S3 is used). Paid files are never publicly reachable.