The Definitive Marketplace Tech Stack Guide for 2025
Choose the right tech stack for your marketplace. Learn proven architectures from Next.js to PostgreSQL, when to use each technology, and how to scale from MVP to 1M+ users with real cost projections.
Who Is This For?
This guide is specifically designed for:
Startup Stage:
Building your minimum viable product and preparing for market launch.
Best For Role:
Technical implementation guides and code examples for developers.
Expected Impact:
Medium-term initiatives that build competitive advantages.
What You'll Learn
- Select the optimal tech stack for marketplace development
- Understand when to use Next.js vs other frameworks
- Choose between PostgreSQL, MongoDB, and other databases
- Plan infrastructure costs from MVP to scale
- Implement search solutions based on listing volume
- Make informed technology decisions with clear tradeoffs
Prerequisites
- •Basic understanding of web architecture
- •Familiarity with frontend and backend concepts
- •Experience with at least one web framework
- •Understanding of database fundamentals
Choosing the right tech stack is critical for marketplace success. The wrong choice leads to slow development, high costs, or inability to scale.
This guide provides the exact tech stack used successfully for 200+ marketplaces, with clear decision frameworks for when to deviate based on your specific needs.
The Recommended Default Stack
Here's the stack that works for 90% of marketplace businesses:
Frontend
- •Next.js 15 (App Router)
- •TypeScript
- •Tailwind CSS + shadcn/ui
- •Vercel (hosting)
Backend
- •Node.js + Express/NestJS
- •PostgreSQL (Supabase or Railway)
- •Redis (Upstash)
- •Stripe Connect (payments)
Infrastructure
- •Vercel Edge Network (CDN)
- •Cloudflare (DNS + security)
- •Sentry (monitoring)
- •Resend (transactional email)
Cost & Timeline
- •MVP Cost: $200-500/month
- •Time to Production: 6-8 weeks
- •Scales to: 100K+ active users before major changes needed
Why This Stack?
- •Speed to market beats perfect architecture
- •Developer availability - finding Next.js/Node developers is 10x easier
- •Cost efficiency - linear scaling without surprise $10K AWS bills
Frontend: Why Next.js Dominates
The Question: Next.js vs React (Vite) vs Vue vs Svelte vs [insert framework]
The Answer: Next.js 15 with App Router, 95% of the time.
Why Next.js for Marketplaces
Marketplaces are SEO businesses. Every listing page needs to:
- •Render instantly for Google
- •Load fast for users (Core Web Vitals)
- •Handle thousands of dynamic routes
- •Support multi-language/multi-region
Next.js 15 provides this out of the box:
// Dynamic marketplace listing page
// app/listings/[slug]/page.tsx
import { Metadata } from 'next'
export async function generateMetadata({
params,
}: {
params: { slug: string }
}): Promise<Metadata> {
const listing = await db.listing.findUnique({
where: { slug: params.slug },
})
return {
title: `${listing.title} | Your Marketplace`,
description: listing.description.slice(0, 160),
openGraph: {
images: [listing.mainImage],
},
}
}
export default async function ListingPage({
params,
}: {
params: { slug: string }
}) {
const listing = await db.listing.findUnique({
where: { slug: params.slug },
include: { seller: true, reviews: true },
})
return <ListingDetail listing={listing} />
}
What You Get:
- •Server-side rendering for SEO
- •Automatic code splitting
- •Built-in image optimization
- •Edge runtime for global speed
- •ISR (Incremental Static Regeneration) for listing pages
Real Performance Numbers:
- •Lighthouse SEO score: 100/100
- •Time to First Byte: <200ms (Edge)
- •Largest Contentful Paint: <1.5s
- •Conversion lift: 15-25% vs client-rendered
When NOT to Use Next.js
Scenario 1: Native App Only
If you're building iOS/Android apps with no web presence, use React Native with Expo. Note: Most marketplaces need both web and mobile.
Scenario 2: Extreme Real-Time Requirements
If your marketplace requires sub-100ms updates (like trading platforms), use Vite + React with WebSocket connections. This is <5% of projects.
Scenario 3: Existing Team Expertise
If your team has 5 Rails developers and zero JavaScript experience, use Rails. But expect 2-3x development time and harder hiring.
Backend: The Node.js Decision
The Question: Node.js vs Python (Django/FastAPI) vs Ruby (Rails) vs Go
The Answer: Node.js + TypeScript, with framework choice based on team size.
Framework Decision Tree
For teams of 1-3 developers → Express.js
Minimal overhead, maximum flexibility. Perfect for MVPs:
// Simple, predictable API structure
import express from "express";
import { z } from "zod";
const app = express();
const createListingSchema = z.object({
title: z.string().min(10).max(100),
price: z.number().positive(),
categoryId: z.string().uuid(),
});
app.post("/api/listings", async (req, res) => {
const validated = createListingSchema.parse(req.body);
const listing = await db.listing.create({
data: {
...validated,
sellerId: req.user.id,
status: "pending",
},
});
res.json({ success: true, listing });
});
For teams of 4+ developers → NestJS
Enterprise patterns, dependency injection, testability:
// Maintainable, scalable architecture
@Injectable()
export class ListingsService {
constructor(
private prisma: PrismaService,
private stripe: StripeService,
private notifications: NotificationsService,
) {}
async createListing(dto: CreateListingDto, userId: string) {
return await this.prisma.$transaction(async (tx) => {
const listing = await tx.listing.create({
data: { ...dto, sellerId: userId },
});
await this.notifications.notifyAdmins("new_listing", listing);
return listing;
});
}
}
Alternative Backend Technologies
Python (Django/FastAPI):
- •Pros: Great for ML/AI features, strong typing with FastAPI
- •Cons: Async support still immature, smaller marketplace ecosystem
- •When to use: Marketplaces with heavy ML (recommendation engines, fraud detection)
Ruby (Rails):
- •Pros: Rapid development, mature marketplace gems
- •Cons: Hiring pool shrinking, slower runtime
- •When to use: Client has existing Rails team, or needs specific Rails gems
Go:
- •Pros: Superior performance, great concurrency
- •Cons: Slower development, smaller ecosystem
- •When to use: Microservices needing extreme performance (payment processing, real-time matching)
Real Talk: Node.js with TypeScript gives you 90% of the benefits at 50% of the complexity. Other options shine in specific scenarios but slow down most marketplace builds.
Database: PostgreSQL Dominates
The Question: PostgreSQL vs MongoDB vs MySQL vs [exotic database]
The Answer: PostgreSQL, specifically through Supabase or Railway.
Why PostgreSQL for Marketplaces
Marketplaces are relational by nature:
- •Users have many listings
- •Listings belong to categories
- •Transactions connect buyers and sellers
- •Reviews link to both users and listings
PostgreSQL handles this elegantly:
-- Marketplace core schema
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
role VARCHAR(20) CHECK (role IN ('buyer', 'seller', 'admin')),
stripe_account_id VARCHAR(255),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE listings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
seller_id UUID REFERENCES users(id) ON DELETE CASCADE,
title VARCHAR(255) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
price_cents INTEGER NOT NULL,
category_id UUID REFERENCES categories(id),
attributes JSONB DEFAULT '{}', -- Flexible attributes per category
status VARCHAR(20) DEFAULT 'draft',
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE transactions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
listing_id UUID REFERENCES listings(id),
buyer_id UUID REFERENCES users(id),
seller_id UUID REFERENCES users(id),
amount_cents INTEGER NOT NULL,
platform_fee_cents INTEGER NOT NULL,
stripe_payment_intent_id VARCHAR(255),
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Indexes for common queries
CREATE INDEX idx_listings_seller ON listings(seller_id);
CREATE INDEX idx_listings_category ON listings(category_id);
CREATE INDEX idx_listings_status ON listings(status) WHERE status = 'active';
CREATE INDEX idx_transactions_buyer ON transactions(buyer_id);
CREATE INDEX idx_transactions_seller ON transactions(seller_id);
The Magic: JSONB for Flexibility
Different categories can have different attributes using the same schema:
// Furniture listing
const furniture = await db.listing.create({
data: {
title: "Mid-Century Modern Sofa",
attributes: {
dimensions: { width: 84, depth: 36, height: 32 },
material: "Velvet",
color: "Navy Blue",
condition: "Like New",
},
},
});
// Service listing
const service = await db.listing.create({
data: {
title: "Logo Design Service",
attributes: {
deliveryTime: "3 days",
revisions: 3,
formats: ["PNG", "SVG", "PDF"],
expertise: ["Tech Startups", "E-commerce"],
},
},
});
// Query with JSONB operators
const blueFurniture = await db.listing.findMany({
where: {
categoryId: furnitureCategoryId,
attributes: {
path: ["color"],
equals: "Navy Blue",
},
},
});
When to Use NoSQL (Rarely)
MongoDB makes sense when:
- •Your data model changes weekly (early-stage B2B with custom fields per client)
- •You need document-level atomicity (complex nested structures)
- •You're doing heavy analytics workloads (though ClickHouse is better)
Real Numbers from 200+ Marketplace Builds:
- •185 use PostgreSQL
- •12 use MongoDB (all B2B with extreme customization needs)
- •3 use both (Postgres for transactional, Mongo for analytics)
Database Hosting: Supabase vs Railway vs AWS RDS
Supabase ($25-200/month):
- •Pros: Managed Postgres, built-in auth, real-time subscriptions, edge functions
- •Best for: MVPs, solo founders, teams <10
- •Scales to: ~50K active users before needing dedicated
Railway ($20-500/month):
- •Pros: Dead simple deploys, Redis included, better performance at scale
- •Best for: Post-PMF marketplaces, teams that need Redis
- •Scales to: 500K+ users
AWS RDS ($100-5K+/month):
- •Pros: Full control, compliance needs, predictable costs at scale
- •Best for: Series A+, enterprise customers, regulated industries
- •Complexity: 10x more DevOps work
Recommendation: Start with Supabase for speed. Migrate to Railway at 50K users. Move to RDS at Series A or when you need SOC 2.
Payments: Stripe Connect (No Debate)
The Question: Stripe vs PayPal vs [regional processor]
The Answer: Stripe Connect, unless your market literally doesn't support it.
Why Stripe Connect for Marketplaces
Marketplaces need:
- •Split payments (platform fee + seller payout)
- •Escrow/hold funds until delivery
- •Connect seller bank accounts
- •Handle disputes and refunds
- •Manage compliance (KYC/AML)
Stripe Connect handles all of this:
// Create connected account for seller
const account = await stripe.accounts.create({
type: "express", // or 'standard' for more control
country: "US",
email: seller.email,
capabilities: {
card_payments: { requested: true },
transfers: { requested: true },
},
});
// Onboard seller (Stripe handles compliance)
const accountLink = await stripe.accountLinks.create({
account: account.id,
refresh_url: "https://yourmarketplace.com/onboarding/refresh",
return_url: "https://yourmarketplace.com/onboarding/complete",
type: "account_onboarding",
});
// Process payment with split
const paymentIntent = await stripe.paymentIntents.create({
amount: 10000, // $100.00
currency: "usd",
application_fee_amount: 1000, // $10.00 platform fee (10%)
transfer_data: {
destination: sellerStripeAccountId,
},
});
// Or use separate charge + transfer for escrow
const charge = await stripe.charges.create({
amount: 10000,
currency: "usd",
source: buyerCardToken,
// Hold funds, transfer later
});
// After delivery confirmed
const transfer = await stripe.transfers.create({
amount: 9000, // $100 - $10 fee
currency: "usd",
destination: sellerStripeAccountId,
source_transaction: charge.id,
});
Real Costs:
- •Stripe fees: 2.9% + 30¢ per transaction
- •Connected account fee: 0.25% (on top of base rate)
- •Total marketplace cost: ~3.15% + 30¢
When to Use Alternatives:
- •PayPal: Only if your sellers demand it (integrate both)
- •Adyen: Enterprise only ($500K+ monthly volume)
- •Regional processors: Required in some countries (Pagseguro in Brazil, Razorpay in India)
Infrastructure: Vercel + Railway Pattern
The Winning Pattern:
- •Next.js frontend on Vercel
- •API/background jobs on Railway
- •Redis on Upstash
- •Storage on Cloudflare R2
Why This Split?
Vercel excels at:
- •Global edge distribution
- •Automatic deployment
- •Zero-config scaling
- •Perfect Next.js integration
But Vercel serverless has limits:
- •10-second function timeout
- •No WebSocket support
- •Expensive for background jobs
Railway handles:
- •Long-running processes
- •Scheduled jobs (cron)
- •WebSocket servers
- •Database-heavy operations
Example Architecture
// app/api/listings/route.ts (Vercel - fast reads)
export async function GET(request: Request) {
const listings = await db.listing.findMany({
where: { status: "active" },
orderBy: { createdAt: "desc" },
take: 20,
});
return Response.json({ listings });
}
// Railway background worker (long-running tasks)
// workers/image-processing.ts
import { Queue, Worker } from "bullmq";
import sharp from "sharp";
const imageQueue = new Queue("image-processing", {
connection: redis,
});
new Worker("image-processing", async (job) => {
const { listingId, imageUrl } = job.data;
// Download image
const response = await fetch(imageUrl);
const buffer = await response.arrayBuffer();
// Generate sizes (30 seconds, would timeout on Vercel)
const [thumbnail, medium, large] = await Promise.all([
sharp(buffer).resize(200, 200).webp().toBuffer(),
sharp(buffer).resize(800, 800).webp().toBuffer(),
sharp(buffer).resize(1600, 1600).webp().toBuffer(),
]);
// Upload to R2 and update database
// ...
});
Monthly Cost Projections by Scale
0-1K users:
- •Vercel: $20 (Pro)
- •Railway: $20 (1 service)
- •Upstash Redis: $10
- •R2 Storage: $5
- •Total: $55/month
10K users:
- •Vercel: $20
- •Railway: $80 (3 services)
- •Upstash: $40
- •R2: $20
- •Total: $160/month
100K users:
- •Vercel: $20-50 (bandwidth)
- •Railway: $300 (scaled services)
- •Upstash: $150
- •R2: $100
- •Total: $570-620/month
Compare to AWS (100K users):
- •EC2: $200+
- •RDS: $300+
- •ElastiCache: $100+
- •CloudFront: $150+
- •S3: $50+
- •Load balancers, etc: $200+
- •Total: $1,000-1,500/month (+ DevOps salary)
Search: The Trickiest Decision
The Question: PostgreSQL full-text vs Algolia vs Elasticsearch vs Typesense
The Answer: It depends on your scale and budget.
Search Decision Framework
<10K listings: PostgreSQL Full-Text Search
-- Add full-text search
ALTER TABLE listings ADD COLUMN search_vector tsvector;
CREATE INDEX idx_listings_search ON listings USING gin(search_vector);
-- Auto-update trigger
CREATE TRIGGER listings_search_update
BEFORE INSERT OR UPDATE ON listings
FOR EACH ROW EXECUTE FUNCTION
tsvector_update_trigger(search_vector, 'pg_catalog.english', title, description);
-- Search query
SELECT * FROM listings
WHERE search_vector @@ to_tsquery('english', 'vintage:* & furniture:*')
ORDER BY ts_rank(search_vector, to_tsquery('english', 'vintage:* & furniture:*')) DESC;
- •Cost: $0 (included with PostgreSQL)
- •Performance: Fine for <10K listings, <1K searches/minute
10K-100K listings: Typesense ($0-50/month)
Self-hosted or cloud, blazing fast, typo-tolerant:
const typesense = new Typesense.Client({
nodes: [
{ host: "typesense.yourmarketplace.com", port: 443, protocol: "https" },
],
apiKey: process.env.TYPESENSE_API_KEY!,
});
// Index listings
await typesense.collections("listings").documents().create({
id: listing.id,
title: listing.title,
description: listing.description,
price: listing.priceCents,
category: listing.category.name,
});
// Search with facets
const results = await typesense.collections("listings").documents().search({
q: "modern desk",
query_by: "title,description",
filter_by: "price:<50000 && category:=[Furniture]",
facet_by: "category,price",
sort_by: "relevance:desc,price:asc",
});
- •Cost: $0 (self-host on Railway) or $50/month (cloud)
- •Performance: <50ms for complex queries, handles 10K+ searches/minute
100K+ listings: Algolia ($1-500+/month)
Purpose-built for marketplaces, instant results, powerful dashboard:
const algolia = algoliasearch(
process.env.ALGOLIA_APP_ID!,
process.env.ALGOLIA_API_KEY!,
);
const index = algolia.initIndex("listings");
// Index with facets
await index.saveObjects([
{
objectID: listing.id,
title: listing.title,
description: listing.description,
price: listing.priceCents,
_tags: [listing.category.name],
_geoloc: { lat: listing.lat, lng: listing.lng },
},
]);
// Search with geo + facets
const { hits } = await index.search("coffee shop", {
aroundLatLng: "40.71,-74.01",
aroundRadius: 10000, // 10km
facetFilters: [["category:Food & Beverage"]],
numericFilters: ["price<5000"],
});
- •Cost: $1/month (free tier) to $500+ at scale
- •Performance: <10ms globally, unlimited scale
Recommendation: Start with PostgreSQL. Add Typesense when search becomes a complaint. Upgrade to Algolia when you raise funding or hit 100K listings.
Complete Starter Architecture
Here's the exact setup for new marketplace builds:
# Frontend (Vercel)
/app # Next.js 15 App Router
/api # Edge API routes (light operations)
/listings
/sellers
/...
/components # UI components
/lib
/prisma # Database client
/stripe # Payment utilities
/redis # Cache utilities
# Backend (Railway)
/services
/api # Express/NestJS API server
/workers # Background job processors
/image-processor
/email-sender
/notification-dispatcher
/webhooks # Stripe, etc.
Deployment Flow
- •Developer pushes to GitHub
- •Vercel auto-deploys frontend (30 seconds)
- •Railway auto-deploys services (60 seconds)
- •Database migrations run automatically
- •Sentry tracks any errors
- •Full deployment: <2 minutes
When to Deviate (Decision Framework)
Use this stack IF:
- •Building a two-sided marketplace
- •Need to launch in <12 weeks
- •Budget is <$50K for development
- •No specialized compliance needs
- •Target market uses modern browsers
- •Team size <15 developers
Consider alternatives IF:
- •Heavy ML/AI requirements → Add Python microservices
- •Real-time trading/bidding → Add Elixir/Phoenix for WebSockets
- •Blockchain integration → Add Web3 stack
- •Regulated industry (banking) → AWS with SOC 2 from day one
- •China market → Different stack entirely (Alibaba Cloud, WeChat Pay)
- •Team has deep expertise in another stack → Use what they know (but expect slower development)
Real Project Examples
Case Study 1: B2B Service Marketplace
- •Scale: 5K businesses, $2M monthly GMV
- •Stack: Next.js, Node.js, PostgreSQL (Supabase), Stripe Connect
- •Timeline: 8 weeks MVP, 6 months to $1M GMV
- •Costs: $200/month (launch) → $800/month (scale)
Case Study 2: Equipment Rental Platform
- •Scale: 50K listings, 100K users
- •Stack: Next.js, NestJS, PostgreSQL (Railway), Typesense, Stripe
- •Timeline: 12 weeks MVP, 12 months to 100K users
- •Costs: $500/month (launch) → $2,500/month (scale)
Case Study 3: Professional Services Network
- •Scale: 1K vetted professionals, $500K monthly GMV
- •Stack: Next.js, Express, PostgreSQL (RDS), Algolia, Stripe Connect
- •Timeline: 10 weeks MVP, 9 months to profitability
- •Costs: $300/month (launch) → $1,800/month (scale)
What This Stack Can't Do (And What to Add)
Don't add these on day one. Add them when the lack of the feature blocks growth:
- •Real-time collaboration: Add Liveblocks or PartyKit
- •Video calls: Add Daily.co or Agora
- •Complex workflows: Add Temporal or Inngest
- •Advanced analytics: Add PostHog or Mixpanel
- •A/B testing: Add GrowthBook or Statsig
- •CMS: Add Sanity or Payload CMS
The Bottom Line
After 200+ marketplace builds, this stack works because:
- •Speed: Launch in 6-8 weeks, not 6 months
- •Cost: $200-500/month to start, scales linearly
- •Hiring: Easy to find developers
- •Reliability: Battle-tested at scale
- •Flexibility: Easy to extend when needed
The Mistake Founders Make: Spending 6 months choosing the "perfect" stack instead of launching and learning from real users.
The Truth: Your tech stack is not your competitive advantage. Your speed to market is.
Build with this stack, launch fast, find product-market fit, then optimize.
Technology Comparison Matrix
Frontend Frameworks
| Framework | SEO | Dev Speed | Hiring | Learning Curve | Best For |
|---|---|---|---|---|---|
| Next.js | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Marketplaces |
| React (Vite) | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | SPAs |
| Vue/Nuxt | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | European markets |
| Svelte/SvelteKit | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | Smaller teams |
Backend Technologies
| Language | Performance | Ecosystem | Hiring | Best For |
|---|---|---|---|---|
| Node.js | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Full-stack JS teams |
| Python | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ML/AI features |
| Ruby | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | Rapid prototyping |
| Go | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | High-performance services |
Databases
| Database | Relations | Scale | Flexibility | Cost | Best For |
|---|---|---|---|---|---|
| PostgreSQL | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Most marketplaces |
| MongoDB | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | B2B customization |
| MySQL | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Legacy systems |
Conclusion
The best tech stack is the one that gets you to market fastest while maintaining ability to scale.
For 90% of marketplaces, that means:
- •Frontend: Next.js 15 on Vercel
- •Backend: Node.js + TypeScript on Railway
- •Database: PostgreSQL (Supabase → Railway → RDS)
- •Payments: Stripe Connect
- •Search: PostgreSQL → Typesense → Algolia
Start here. Launch fast. Scale as needed.
Additional Resources
How much should your build actually cost?
Get a personalized investment estimate based on your platform type, scope, and timeline.
Open the Investment CalculatorAbout the Author

Chris Mask
Founder & CEO
Serial entrepreneur, marketplace architect, and AI-assisted development pioneer with 7+ years building two-sided platforms. Founded Directorism after launching and exiting two successful marketplace businesses. Has personally architected and consulted on 200+ marketplace and directory projects. Recognized authority on cold-start problems, platform economics, marketplace SEO, and leveraging AI tools for rapid development. Early adopter of AI-powered coding workflows, integrating Claude, Cursor, and agentic development patterns into production systems.
Related Resources
Building Scalable Architecture: Technical Framework for Marketplaces
Learn how to architect marketplace platforms that scale to millions of users. Includes microservices patterns, database sharding, caching strategies, and deployment checklists.
Database Architecture Patterns for Marketplaces
Learn how to design scalable marketplace database schemas. Includes battle-tested patterns for users, listings, transactions, reviews, and messaging systems.
Marketplace Tech Stack Comparison: WordPress vs Bubble vs Custom
WordPress? Bubble? Custom code? We've built on all three. Here's the honest comparison of costs, capabilities, and when to choose each.