# What I Actually Use to Ship a SaaS MVP in a Weekend
Every few months I see a new thread asking "what's the best stack for building a SaaS?" The answers are always the same: Next.js, Tailwind, Postgres, Stripe, Auth.js, Vercel. That's a reasonable answer for the frontend.
But most of those discussions gloss over the backend deployment question, which is where people lose half a weekend.
Here's the full stack I'd use today to ship something real in 48 hours.
The Frontend
Next.js — I'm not going to argue about this one. Server-side rendering, API routes, and React in one package. The ecosystem is mature and Stack Overflow has an answer for everything.
Tailwind CSS — Write styles fast without context switching to a CSS file. Combined with shadcn/ui for components, you have a production-looking UI in hours.
Deploy: PandaStack static site or Vercel. If you're using Next.js, both work. If you're on Vercel already, stay there. If you're putting everything on PandaStack for one dashboard, the static site deploy is one GitHub connection.
The Backend
Node.js with Express or Fastify — for most MVPs, a simple REST API is all you need. GraphQL is overkill until you have a reason. Fastify is faster than Express; Express has more Stack Overflow answers.
Containerized with Docker — the Dockerfile takes 20 minutes to write and means you can deploy anywhere. Don't skip this step even for an MVP.
Deploy: PandaStack container app — push to GitHub, connect the repo, add environment variables, get a public HTTPS URL. Done.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]The Database
PostgreSQL on PandaStack managed database — you get a connection URL, automated backups, and connection pooling without configuring anything. For an MVP, the smallest tier is fine.
Schema migrations with node-postgres-migrate or db-migrate — keep migrations in the repo, run them as part of deploy.
Authentication
JWT tokens with bcrypt — for an MVP with a weekend deadline, just implement it yourself. It's 100 lines of code: hash password on signup, compare on login, issue a token, verify on protected routes.
If you absolutely need OAuth (Google sign-in), add it in week 2.
Payments
Stripe — there's no reason to use anything else. Stripe Checkout handles the entire payment flow. You need:
- A Stripe account (~15 minutes to set up)
- A webhook endpoint (10 minutes with Express)
- A success/cancel URL in your frontend
That's a working payment system.
Mailgun or Resend — both have generous free tiers and dead-simple APIs. Transactional emails (signup confirmation, password reset, payment receipt) are a few API calls.
The Weekend Schedule
Friday evening (3 hours):
- Set up repos, deploy skeleton frontend and backend to PandaStack
- Configure domain (optional, the pandastack.io subdomain works fine)
- Get database connected
Saturday (8 hours):
- Core feature (the thing users actually pay for)
- Auth (signup, login, JWT)
- Basic UI for the core feature
Sunday (6 hours):
- Stripe integration (checkout + webhook)
- Email on signup and payment
- Landing page
- Sign up for monitoring alerts
After the weekend:
- Wait for users, watch logs
- Ship the features users actually ask for
What to Skip
- TypeScript (add in week 2 if the project continues)
- Testing (write tests when you know what you're building)
- Complex deployment pipelines (GitHub → PandaStack auto-deploy is enough)
- Multiple environments (one production environment, iterate fast)
- GraphQL, gRPC, microservices — none of this
The goal of the weekend is learning whether anyone will pay for the thing. Infrastructure perfection comes after you have evidence it's worth perfecting.
Start building. Deploy at [dashboard.pandastack.io](https://dashboard.pandastack.io).