GoShipOrSkip scans thousands of real user reviews from Product Hunt, Google Play, App Store, Reddit, and Shopify — then delivers a data-backed Ship It, Proceed with Caution, or Skip It verdict.
No surveys. No guesswork. Just honest signals from people already using competing products.
Most founders spend months building before discovering nobody wants their product. GoShipOrSkip replaces guesswork with data — real complaints, real feature gaps, and real market signals extracted from thousands of user reviews across the competitive landscape.
Built for indie hackers, solo founders, and early-stage teams who'd rather spend 30 seconds validating than 6 months building the wrong thing.
Every analysis returns a comprehensive report with 10 structured sections:
| Section | What It Tells You |
|---|---|
| Verdict & Score | Ship It / Proceed with Caution / Skip It — with a viability score and reasoning |
| Repeating Complaints | What users consistently hate, with frequency counts and actual quotes |
| Missing Features | What users want but competitors haven't built, ranked by demand |
| Competitor Landscape | Identified and ranked competitor apps with strengths/weaknesses |
| Market Strengths | Positive signals and opportunities in the space |
| Opportunity Analysis | Key risk vs. key opportunity breakdown |
| Timing Signals | Market timing, traction trends, and window of opportunity |
| Financial Overview | Pricing strategies, revenue models, and monetization signals |
| MVP Roadmap | Prioritized feature list with suggested implementation timeline |
| Shareable Report | Public link you can send to co-founders or investors |
Plus PDF & JSON export, competitor discovery, and category detection.
GoShipOrSkip supports two analysis modes depending on your product type:
- Mobile App Analysis — Scans Product Hunt, Google Play, App Store, and Reddit
- Shopify App Analysis — Scans Shopify App Store and Reddit
You describe your idea
↓
AI extracts keywords & detects category
↓
Reviews fetched in parallel from 5 sources (cache-first, 7-day TTL)
↓
LLM analyzes with automatic model fallback
↓
Guardrails validate output & filter hallucinated quotes
↓
Structured report delivered in ~30 seconds
Pipeline deep dive
- Validate & authorize — Zod checks the query (3–200 chars), session is verified, credits consumed in a transaction with advisory lock
- Extract keywords — LLM extracts 2–4 search keywords and detects the app category
- Fetch reviews — All scrapers run in parallel with cache-first strategy (7-day TTL, max 200 reviews per source)
- Filter competitors — LLM pass identifies and ranks only relevant competitors from review metadata
- Analyze — Reviews chunked (~16K chars) and sent to OpenRouter with automatic model fallback (Claude Sonnet 4 → Gemini 2.0 Flash → Llama 3.1 70B)
- Guardrails — Zod validates structured output; hallucination detection removes quotes not found in source reviews
- Retry — If validation fails, one retry fires with a stricter prompt
- Store — Result saved with timing metrics; failed analyses auto-refund credits
| Free | Starter | Pro | |
|---|---|---|---|
| Price | $0 | $4.99 one-time | $14.99/mo |
| Credits | 3 | 20 | 200/mo |
| Cost per analysis | — | ~$0.25 | ~$0.07 |
| Expiration | — | Never | Monthly renewal |
| Full report | ✓ | ✓ | ✓ |
| Real user quotes | ✓ | ✓ | ✓ |
| Viability score | ✓ | ✓ | ✓ |
| Early access to new features | ✓ |
No credit card for Free. Credits never expire on Starter. Cancel Pro anytime. Failed analyses auto-refund credits.
flowchart TB
subgraph Client
A[Next.js App Router]
end
subgraph Auth & Payments
B[better-auth]
C[Polar.sh]
end
subgraph AI Pipeline
D[Keyword Extraction]
E[Review Fetcher]
F[Competitor Filter]
G[LLM Analyzer]
H[Guardrails]
I[Financial Overview]
J[MVP Roadmap]
end
subgraph Data Sources
K[Product Hunt]
L[Google Play]
M[App Store]
N[Reddit]
O[Shopify]
end
subgraph Storage
P[(PostgreSQL)]
Q[(Review Cache)]
end
A -->|submit query| D
D -->|keywords| E
E --> K & L & M & N & O
K & L & M & N & O -->|reviews| Q
Q -->|cached reviews| F
F -->|filtered competitors| G
G -->|structured JSON| H
H -->|validated result| P
H -->|on demand| I & J
P -->|poll result| A
A --> B
A --> C
B --> P
C --> P
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, TypeScript, React 19) |
| Styling | Tailwind CSS 4, Geist font, glassmorphism dark theme |
| Database | PostgreSQL 16 + Drizzle ORM |
| Auth | better-auth (Google OAuth, database sessions) |
| AI | OpenRouter SDK with 3-model fallback chain |
| Payments | Polar.sh (checkout, subscriptions, customer portal) |
| Data Sources | Product Hunt GraphQL, google-play-scraper, app-store-scraper, Reddit JSON, Shopify scraper |
| Validation | Zod |
| State | TanStack React Query v5 |
| Export | jsPDF (PDF), JSON |
| Linting | Biome |
| Logging | Pino |
| Analytics | Vercel Analytics |
| Deployment | Docker (multi-stage standalone build) |
Full-featured admin panel with 12 pages:
- Overview — Key metrics (users, analyses, purchases, sessions) with 14-day trend charts
- Analyses — Browse all analyses with pagination, status filters
- Users — User management with detail view and package assignment
- Purchases — Purchase history and status tracking
- Packages — Create, edit, and delete pricing packages
- Sessions — Active user sessions
- Costs — AI operation cost tracking by model and operation type
- Feedbacks — User ratings, average score, distribution chart
- Reviews — Cached reviews browser with search/filter by app name and source
- Scraping — Cache hit rate, duration metrics, source performance breakdown
- Settings — AI model configuration and feature flags
src/
├── app/
│ ├── (marketing)/ # Landing, login, pricing, terms, privacy
│ ├── (app)/ # Protected routes
│ │ ├── analyze/ # Analysis form (Mobile App / Shopify modes)
│ │ ├── history/ # Past analyses with time-based grouping
│ │ ├── profile/ # Profile, settings, billing, purchase history
│ │ └── admin/ # Admin dashboard (12 pages)
│ ├── api/
│ │ ├── analysis/ # POST create, GET poll result
│ │ ├── auth/[...all]/ # better-auth handler
│ │ └── share/[token]/ # Share token endpoint
│ └── share/[token]/ # Public shareable analysis pages
├── components/
│ ├── admin/ # Sidebar, charts, package CRUD, model settings
│ ├── analysis/ # 16 result components (verdict, complaints, features,
│ │ # competitors, strengths, opportunity, timing,
│ │ # financial overview, MVP roadmap, export, share)
│ ├── billing/ # Checkout, portal, success banner
│ ├── marketing/ # Pricing section
│ ├── layout/ # Header, Footer
│ ├── profile/ # Profile sidebar
│ └── ui/ # Reusable primitives (Radix-based)
├── lib/
│ ├── ai/ # OpenRouter client, prompts, analyzer, guardrails,
│ │ # keywords, competitors, model config, categories
│ ├── data/ # Scrapers (PH, Play, App Store, Reddit, Shopify), cache
│ ├── db/ # Drizzle schema (12 tables) + connection
│ ├── actions/ # Server functions (checkout, analysis, feedback, admin)
│ ├── queries/ # React Query hooks
│ ├── utils/ # Rate limiter, credits, user plan, admin guard
│ ├── auth.ts # better-auth server + Polar plugin
│ └── auth-client.ts # better-auth React client
└── middleware.ts # Route protection via session cookies
drizzle/ # Migration files
- Node.js 20+
- PostgreSQL 16+
- API keys: OpenRouter, Google OAuth, Product Hunt, Polar.sh
Copy .env.example and fill in your keys:
cp .env.example .envKey variables:
DATABASE_URL=postgresql://shiporskip:shiporskip@localhost:5432/shiporskip
BETTER_AUTH_URL=http://localhost:3000
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
OPENROUTER_API_KEY=sk-or-...
PRODUCT_HUNT_CLIENT_ID=
PRODUCT_HUNT_CLIENT_SECRET=
POLAR_ACCESS_TOKEN=
POLAR_PRODUCT_ID=
POLAR_WEBHOOK_SECRET=docker-compose up
# App: http://localhost:3000
# PostgreSQL: localhost:5432npm install
npm run db:push # push schema to database
npm run dev # http://localhost:3000npm run build
npm start| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Production build |
npm run start |
Start production server |
npm run lint |
Run Biome linter |
npm run lint:fix |
Auto-fix lint issues |
npm run format |
Format code with Biome |
npm run format:check |
Check formatting |
npm run db:generate |
Generate Drizzle migrations |
npm run db:push |
Push schema to database |
npm run db:studio |
Open Drizzle Studio (database GUI) |
npm run db:reset |
Drop and re-push schema |
Private