Documentation
Get ShipAIKit running in ~20 minutes. Everything you need from first clone to live deployment.
Quick Start
Get up and running in ~20 minutes.
- 1
Clone the repo
git clone https://github.com/your-username/shipaikit.git my-app && cd my-app && npm install - 2
Copy the env file
cp .env.example .env.local - 3
Fill in your environment variables
See the Environment Variables section below.
- 4
Push the database schema
npx prisma db push - 5
Run locally
npm run devThen visit http://localhost:3000
- 6
Deploy
Push to GitHub, connect to Vercel, add env vars in Vercel settings.
Environment Variables
Complete .env.local reference. Copy .env.example and fill in each value.
Clerk — Authentication
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYFrom Clerk dashboard → API KeysCLERK_SECRET_KEYFrom Clerk dashboard → API KeysNEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-inSign-in page pathNEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-upSign-up page pathNEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboardRedirect after sign inNEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboardRedirect after sign upCLERK_WEBHOOK_SECRETWebhook signing secret — Clerk Dashboard → Webhooks → Add Endpoint → Signing Secret. Required for user sync.Database — Supabase
DATABASE_URLTransaction pooler URL, port 6543 (Supabase → Settings → Database → Transaction pooler)DIRECT_URLDirect connection URL, port 5432 (Supabase → Settings → Database → Direct connection)NEXT_PUBLIC_SUPABASE_URLOptional — only needed for realtime/storage. Supabase → Settings → API → Project URLNEXT_PUBLIC_SUPABASE_ANON_KEYOptional — only needed for realtime/storage. Supabase → Settings → API → anon public keyPayments — choose one: Lemon Squeezy or Stripe
PAYMENT_PROVIDER=lemonsqueezySet to "lemonsqueezy" or "stripe" — controls which checkout is usedLemon Squeezy (if PAYMENT_PROVIDER=lemonsqueezy)
LEMON_SQUEEZY_WEBHOOK_SECRETFrom Lemon Squeezy → Settings → Webhooks → Signing SecretLEMON_SQUEEZY_PRODUCT_STARTER_VARIANT_IDVariant ID for $97 Starter tierLEMON_SQUEEZY_PRODUCT_PRO_VARIANT_IDVariant ID for $197 Pro tierLEMON_SQUEEZY_PRODUCT_AI_GUIDED_VARIANT_IDVariant ID for $397 AI Guided tierStripe (if PAYMENT_PROVIDER=stripe)
STRIPE_SECRET_KEYSecret key — from Stripe Dashboard → Developers → API Keys (sk_live_... or sk_test_...)NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYPublishable key — from Stripe Dashboard → Developers → API Keys (pk_live_...)STRIPE_WEBHOOK_SECRETWebhook signing secret — from Stripe Dashboard → Webhooks → Add endpoint (whsec_...)STRIPE_PRICE_STARTERPrice ID for $97 Starter — from Stripe Dashboard → Products (price_...)STRIPE_PRICE_PROPrice ID for $197 Pro — from Stripe Dashboard → Products (price_...)STRIPE_PRICE_AI_GUIDEDPrice ID for $397 AI Guided — from Stripe Dashboard → Products (price_...)Email — Resend
RESEND_API_KEYFrom Resend dashboard → API KeysAI — Anthropic or OpenAI
ANTHROPIC_API_KEYFrom console.anthropic.com — use this OR OpenAIOPENAI_API_KEYFrom platform.openai.com — use this OR AnthropicAI_PROVIDERSet to "anthropic" or "openai" to match your keyDiscord — Community Auto-Join
DISCORD_BOT_TOKENBot token from Discord Developer Portal → Bot → Token. Required for Pro + AI Guided buyers.DISCORD_CLIENT_IDApplication/Client ID from Developer Portal (default: 1485266619667054763)DISCORD_CLIENT_SECRETFrom Developer Portal → OAuth2 → Client SecretDISCORD_GUILD_IDYour Discord server ID (right-click server → Copy Server ID)DISCORD_ROLE_PRORole ID for Pro members (right-click role in Server Settings → Copy Role ID)DISCORD_ROLE_AGENCYRole ID for AI Guided members (right-click role in Server Settings → Copy Role ID)DISCORD_REDIRECT_URIhttps://yourdomain.com/api/auth/discord/callback — must match OAuth2 redirect in Developer PortalPayments — Stripe or Lemon Squeezy
ShipAIKit supports both payment providers. Set PAYMENT_PROVIDER in your .env.local to switch between them. You only need to configure one.
Lemon Squeezy
Handles EU VAT automatically. Simpler to set up. Recommended for non-US sellers.
PAYMENT_PROVIDER=lemonsqueezyStripe
Industry standard. Apple Pay + Google Pay included. Best brand recognition with buyers.
PAYMENT_PROVIDER=stripeSetting up Stripe
- 1.Go to dashboard.stripe.com → Create account (or sign in)
- 2.Developers → API Keys → copy Secret Key (
sk_live_...) and Publishable Key (pk_live_...) - 3.Products → Add product → create one product per tier (Starter $97, Pro $197, AI Guided $397) → set price as "One time"
- 4.On each product, copy the Price ID (
price_...) → set asSTRIPE_PRICE_STARTER,STRIPE_PRICE_PRO,STRIPE_PRICE_AI_GUIDED - 5.Developers → Webhooks → Add endpoint → URL:
https://yourdomain.com/api/webhooks/stripe - 6.Select event:
checkout.session.completed→ Add endpoint - 7.Copy the Signing Secret (
whsec_...) → set asSTRIPE_WEBHOOK_SECRET - 8.Set
PAYMENT_PROVIDER=stripein your env vars and redeploy
💡 Test mode first
Use sk_test_... and pk_test_... keys while developing. Stripe test card: 4242 4242 4242 4242, any future expiry, any CVC.
Services Setup
Step-by-step setup for each external service. Free tiers are sufficient to get started on all of them.
Clerk
- 1.Go to clerk.com → Create application
- 2.Choose Email + Google sign-in methods
- 3.Copy Publishable Key and Secret Key to
.env.local - 4.Dashboard → Webhooks → Add Endpoint → URL: https://yourdomain.com/api/webhooks/clerk
- 5.Subscribe to events: user.created and user.deleted
- 6.Copy the Signing Secret → set as
CLERK_WEBHOOK_SECRETin.env.local
Supabase
- 1.Go to supabase.com → New project
- 2.Choose a region close to your users
- 3.Settings → Database → Connection string
- 4.Copy Transaction pooler URL (port 6543) as
DATABASE_URL - 5.Copy Direct connection URL (port 5432) as
DIRECT_URL - 6.Run
npx prisma db pushto create your tables
Lemon Squeezy (if PAYMENT_PROVIDER=lemonsqueezy)
- 1.Go to lemonsqueezy.com → Create a store
- 2.Create your products (Starter $97, Pro $197, AI Guided $397)
- 3.Settings → Webhooks → Create webhook → URL:
https://yourdomain.com/api/webhooks/lemonsqueezy - 4.Copy the webhook signing secret → set as
LEMON_SQUEEZY_WEBHOOK_SECRET - 5.Copy each variant ID → set as
LEMON_SQUEEZY_PRODUCT_STARTER_VARIANT_ID,LEMON_SQUEEZY_PRODUCT_PRO_VARIANT_ID,LEMON_SQUEEZY_PRODUCT_AI_GUIDED_VARIANT_ID - 6.Set
PAYMENT_PROVIDER=lemonsqueezyin your env vars
Resend
- 1.Go to resend.com → Create account
- 2.Add and verify your sending domain
- 3.API Keys → Create API key → paste as
RESEND_API_KEY
AI (Anthropic or OpenAI)
- 1.Go to console.anthropic.com or platform.openai.com
- 2.Create an API key
- 3.Set
ANTHROPIC_API_KEYorOPENAI_API_KEYin your env - 4.Set
AI_PROVIDER=anthropicorAI_PROVIDER=openaito match
Discord Community Auto-Join (Pro + AI Guided)
- 1.Go to discord.com/developers/applications → select your app (or create one)
- 2.OAuth2 → Redirects → Add:
https://yourdomain.com/api/auth/discord/callback - 3.Copy Client ID → set as
DISCORD_CLIENT_ID - 4.OAuth2 → Client Secret → copy → set as
DISCORD_CLIENT_SECRET - 5.Bot → Token → copy → set as
DISCORD_BOT_TOKEN - 6.Right-click your Discord server → Copy Server ID → set as
DISCORD_GUILD_ID - 7.In Server Settings → Roles: right-click your Pro role → Copy Role ID → set as
DISCORD_ROLE_PRO, same for AI Guided role →DISCORD_ROLE_AGENCY - 8.Make sure the bot role is above Pro/AI Guided roles in the role hierarchy (Server Settings → Roles)
Deployment
Vercel is recommended — it works great with Next.js out of the box.
Vercel (recommended)
- 1.Push your repo to GitHub
- 2.Go to vercel.com/new → Import your repository
- 3.Settings → Environment Variables → add every variable from
.env.local(all three environments) - 4.Critical:
DATABASE_URLmust be the transaction pooler URL (port 6543) in production — Vercel uses serverless functions - 5.Deploy — your app goes live at a
.vercel.appURL - 6.Add a custom domain: Settings → Domains
Custom domain
Point your nameservers or a CNAME record to Vercel. SSL is provisioned automatically.
AI Guided Setup
The AI Guided plan includes Kit — an AI agent that walks you through your entire setup step by step. Kit runs inside OpenClaw or Claude Code. Pick whichever you prefer.
Kit — Your AI Setup Agent
Powered by Anthropic Claude · runs in OpenClaw or Claude Code
Kit knows your product, remembers your progress across sessions, and guides you through every step — Vercel, Supabase, Clerk, payments, and DNS. No terminal knowledge required.
Option A — OpenClaw
Best for non-technical founders. Chat interface, persistent memory, works on Mac.
npm install -g openclawFull guide at openclaw.ai
Option B — Claude Code
Best if you're already comfortable in a terminal. Anthropic's official CLI agent.
npm install -g @anthropic-ai/claude-codeRequires an Anthropic API key
Step 2 — Download Kit's config files
These three files activate Kit. For OpenClaw, place them in ~/.openclaw/workspace/. For Claude Code, place them in your project root.
SOUL.mdDownload ↓Kit's personality and operating style
IDENTITY.mdDownload ↓Kit's role, mission, and product context
MEMORY.mdDownload ↓Kit's 3-layer memory system and operating knowledge
Step 3 — Start Kit
OpenClaw
openclaw startClaude Code
claudeKit will introduce herself and ask what you want to set up first. Just talk to her — she'll handle the rest.
💡 Kit remembers your progress
Kit uses a 3-layer memory system — she logs every session, remembers what's been set up, and picks up exactly where you left off if you close and reopen the app.
Troubleshooting
Common issues and how to fix them.
Build fails on Vercel with a Prisma error
Make sure DATABASE_URL and DIRECT_URL are both set in Vercel env vars for all three environments (Production, Preview, Development). The build runs `prisma generate` — it needs the database URL at build time.
Prisma errors when running locally
Run `npx prisma db push` to sync your schema. "Table not found" errors are always fixed by this.
Clerk redirects to homepage after sign in
Add NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard to .env.local and to Vercel env vars for production.
Sign-in / sign-up page appears blank
Your Clerk publishable key is missing. NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY must be set — the NEXT_PUBLIC_ prefix is required for client-side initialization.
AI chat returns an error or doesn't respond
Check ANTHROPIC_API_KEY (or OPENAI_API_KEY) is set and AI_PROVIDER matches: "anthropic" or "openai".
Payments aren't activating subscriptions
Configure a Lemon Squeezy webhook pointing to https://yourdomain.com/api/webhooks/lemonsqueezy and set LEMONSQUEEZY_WEBHOOK_SECRET.
Credits show 0 after signing up
Your Clerk webhook is not configured. Go to Clerk Dashboard → Webhooks, add an endpoint at https://yourdomain.com/api/webhooks/clerk, subscribe to user.created and user.deleted, and set CLERK_WEBHOOK_SECRET in your env vars.
Discord role not assigned after connecting
Make sure the bot's role is higher than Pro/AI Guided roles in Server Settings → Roles. The bot needs Manage Roles permission. Also verify DISCORD_BOT_TOKEN, DISCORD_GUILD_ID, DISCORD_ROLE_PRO, and DISCORD_ROLE_AGENCY are all set correctly in your env vars.
Get Help
Stuck? We respond within 24 hours on business days.
support@shipaikit.com
Response within 24 hours on business days
AI Chat
In your dashboard
Available after purchase
Discord
Private channel
Pro and AI Guided customers get private Discord access
Response time
Within 24 hours
On business days