Guides · October 2, 2023
Template vs Starter vs Boilerplate: What You're Actually Buying
Template, starter, and boilerplate get used interchangeably, but they describe three different products with three different maintenance burdens. Here's how to tell them apart before you buy one for a Next.js or headless commerce build.
By Polo Themes
Template, starter, and boilerplate are used almost interchangeably in marketing copy, but they describe three different products with three different obligations attached. A template is a finished, styled surface you configure. A starter is a working application skeleton with real architecture decisions already made, meant to be extended. A boilerplate is raw scaffolding — folder structure and config with little to no opinion about your actual product. If you buy a template expecting starter-level architecture, or a boilerplate expecting starter-level completeness, you'll spend the first month of a project fighting a mismatch instead of building. This guide draws the lines precisely, so you can match the category to what you're actually building — with a specific look at what this means for Next.js and headless commerce projects.
The confusion isn't accidental. Sellers have an incentive to call anything a "starter kit" because it sounds more substantial than "template," and to call a thin scaffold a "boilerplate" because it sounds honest about being unopinionated when really it's just unfinished. Once you know what to check for, though, telling them apart takes about five minutes of looking at the repository — not the marketing page.
The Three Categories, Defined by What They Decide For You
The cleanest way to separate these three is by asking: how many irreversible architecture decisions has this product already made on my behalf, and were they made well?
Template: a finished surface, minimal architecture
A template is a themeable, mostly-finished frontend. Think of a Shopify theme, a WordPress theme, or a static site template — you install it, swap in your logo and copy, adjust some settings, and you have a working site. The architecture decisions (routing, data layer, build tooling) are baked in and largely invisible to you, which is the point: templates optimize for time to a finished-looking result, not for how the code underneath is organized. You rarely fork a template's internals; you configure it through a theme editor or a settings file.
Templates make sense when your product *is* the template's use case with only surface customization needed — a marketing site, a standard e-commerce storefront, a documentation site. Our own Shopify theme catalog and Figma UI kits sit squarely in this category: they're built to be configured and restyled fast, not forked and re-architected.
Starter: real architecture, meant to be extended
A starter is source code you clone and build on top of. It comes with the hard, easy-to-get-wrong decisions already made — auth flow, data fetching strategy, folder structure, environment configuration, deployment pipeline, testing setup — but the actual product surface (your pages, your features, your business logic) is yours to build. A good Next.js starter, for example, will have already decided: where server components end and client components begin, how environment variables are validated at boot instead of failing silently at runtime, how a cart or session persists across a headless commerce backend, and how the build is configured for the hosting target you're going to use.
The value of a starter is concentrated almost entirely in the decisions you *don't* have to make from scratch, and in how defensible those decisions are once your product has grown past a weekend project. A starter that got the data-fetching layer wrong, or skipped environment validation, doesn't save you time — it just moves the cost from week one to month six, when the shortcut finally breaks under real traffic or a new engineer's confusion.
Boilerplate: scaffolding, no product opinion
A boilerplate is the thinnest of the three. It's a repository structure, a build config, maybe a linter setup and a CI file — the parts of a project that are tedious to set up but don't encode any opinion about what the product does.
Boilerplates are useful when you have strong opinions of your own and just want to skip the setup ceremony — the empty config files, the linter rules, the initial commit. They're a poor fit when what you actually need is architectural guidance — a boilerplate won't tell you how to structure headless commerce data fetching, and it won't stop you from making the same mistakes a hundred other teams have already made and fixed in a mature starter. The risk with a boilerplate isn't that it's low quality; it's that it's honest about doing almost nothing, which means every hard decision still lands on your team's plate, just with slightly less typing to get there.
It's worth noting that none of these three categories is inherently "better" — they're matched to different situations, and the real failure mode is picking the wrong one for your constraints. A well-funded team with in-house platform engineers and a genuinely novel product might rationally choose a boilerplate: they don't want anyone else's architecture opinions baked in, and they have the time to make their own. A small team on a deadline building a fairly standard product is usually better served by a starter, because reinventing auth and data-fetching patterns that a hundred other teams have already solved is rarely where the differentiated value of the product lives. And a team that just needs a professional-looking site up this week, with no unusual product requirements, should almost always reach for a template rather than either of the other two.
A Side-by-Side Comparison
- What's decided for you — Template: presentation and configuration. Starter: architecture, tooling, and key integrations. Boilerplate: almost nothing beyond folder layout and build config.
- What you build — Template: content and settings. Starter: features and business logic on a real foundation. Boilerplate: everything, including foundational decisions.
- Time to first result — Template: hours. Starter: days. Boilerplate: weeks, because you're making the starter's decisions yourself first.
- Time to production-ready at scale — Template: depends entirely on how much you outgrow the theme's assumptions. Starter: fast, if the architecture was sound. Boilerplate: slowest, since production concerns (auth, caching, error boundaries, observability) are your responsibility from scratch.
- Maintenance burden — Template: low, usually just theme updates. Starter: moderate — you own everything built on top, but the foundation was validated before you got it. Boilerplate: highest, since you also own the foundation.
- Best fit — Template: your product matches the template's built-in use case. Starter: you're building a custom product but don't want to re-litigate infrastructure decisions. Boilerplate: you have in-house architectural conviction and just want the ceremony removed.
Where Next.js Muddies the Category Lines
Next.js is unusual in how much it blurs template, starter, and boilerplate together, and that's a large part of why the category confusion is worse in this ecosystem than in, say, Shopify's theme marketplace. A "Next.js starter" can mean a barely-configured create-next-app output (functionally a boilerplate), or it can mean a fully wired headless commerce frontend with checkout, cart persistence, product data fetching, and payment integration already implemented against a specific backend (a genuine starter, sometimes even template-adjacent in how finished the UI is). The word "starter" tells you almost nothing about which one you're getting — you have to look at the actual repository.
This matters more for headless commerce specifically because the hard parts aren't visual — they're structural. Getting product data fetching right across static generation, revalidation, and search means understanding your commerce backend's caching model, not just wiring up an API call. Cart and checkout state has to survive page navigations, tab closures, and webhook-driven updates from the backend without going stale or double-charging. A storefront needs to render correctly whether product data changes once a day or once a minute, without a developer manually tuning revalidation windows per page. None of that is solved by a boilerplate, and a lot of "Next.js commerce starters" on the market solve only the easy 80% and leave the remaining 20% — the part that actually determines whether checkout is reliable — as an exercise for the buyer.
A Checklist for Evaluating Any Next.js or Headless Commerce Starter
Before paying for (or committing engineering time to) a starter, open the repository and check these specifically. Marketing pages will tell you it's "production-ready"; the code will tell you the truth.
- Server/client component boundary: is data fetching pushed to server components with client components reserved for genuine interactivity, or is everything a client component with a "use client" directive slapped on the top of the tree (a strong signal of a rushed port from an older React pattern)?
- Environment variable validation: does the app fail fast at boot with a clear error when a required env var is missing, or does it fail silently at runtime deep inside a request handler?
- Revalidation strategy for commerce data: is there an explicit, documented approach to keeping product/inventory data fresh (tag-based revalidation, webhook-triggered invalidation), or does every page just fetch on every request and hope caching sorts itself out?
- Cart/session persistence: does the cart survive a closed tab, a slow network, and a webhook-driven price or inventory change from the backend without silent data loss?
- Error boundaries and loading states: are these implemented per-route with real fallback UI, or is the entire app one top-level error boundary away from a blank white screen?
- Type safety at the commerce-API boundary: are responses from the backend typed and validated, or does the frontend trust raw JSON shape all the way down to the checkout form?
- Recency of dependencies and patterns: does it use current framework conventions, or does it carry over patterns from an earlier major version that the framework itself has since deprecated?
- Test and CI coverage on checkout-critical paths: is there any automated coverage on cart and checkout logic, or is "production-ready" resting entirely on manual QA that happened once?
Where Polo Themes Fits Into This
Today, Polo Themes' catalog covers the template end of this spectrum well — our Shopify theme catalog and Figma UI kits are finished, configurable surfaces built for specific verticals (optics, medical, courses, electronics, and more), the same category discipline described above for templates.
We're building toward the starter category next: production-grade Next.js and headless commerce starters, built with the checklist above in mind rather than around it — real architecture decisions made deliberately, not left as gaps for the buyer to discover after launch. That means treating the server/client component boundary, environment validation, revalidation strategy, and cart durability as first-class design work up front, rather than as issues to patch once a beta customer hits them. That work is in progress and not yet available to purchase; when it ships, it'll be built to satisfy the same bar we're describing here, not just to claim the label.
In the meantime, if you're evaluating any Next.js or headless commerce starter — ours eventually included, once it exists — run it through the checklist above before you commit engineering time to it. A few hours spent reading the actual repository, rather than the landing page describing it, is the difference between inheriting a solid foundation and inheriting someone else's unfinished homework with better marketing. For Shopify or Figma-based projects that fit the template category today, our full catalog is the place to start, and we cover more buyer-education ground like this on the blog.
Frequently Asked Questions
Is a "starter kit" always more work than a template?
To get a finished-looking result, yes — a template gets you there faster because presentation is already solved. But a starter gets you to a *correct, extensible* custom product faster, because it front-loads architecture decisions a template never has to make. Which one is "more work" depends on whether your product needs to diverge from a fixed shape.
Can a boilerplate become a starter over time?
Yes — that's effectively how most starters are born. A team builds a product on a boilerplate, extracts the parts that turned out to be genuinely reusable (auth, data layer, config validation), and strips out the product-specific logic to publish it as a starter. The difference is that a mature starter has already been through that validation; a fresh boilerplate hasn't.
How do I tell if a "production-ready" Next.js starter actually is?
Don't take the label at face value — run it through the checklist above. Specifically check environment validation, revalidation strategy for commerce data, and whether error boundaries exist per-route. Those three alone catch most starters that are production-ready in name only.
Does Polo Themes sell a Next.js starter today?
Not yet. Our current catalog is Shopify themes and Figma UI kits. Production-grade Next.js and headless commerce starters are a direction we're actively building toward, not a shipped product — we'll update this space when that changes.