# headless-dropshipping-starter: a Next.js storefront wired to Snipcart and Printful

> The Swag Boilerplate is a headless commerce starter built with Next.js, Snipcart for the cart and checkout, Printful for print on demand fulfilment, and Tailwind for styling, deployed on Vercel. The interesting part is that the cart and payments live in Snipcart and the fulfilment lives in Printful, so almost the whole business runs on webhooks.

**notrab/headless-dropshipping-starter** — Sell one off drops, or run your own store with 1000's of products print on demand.

- Repository: https://github.com/notrab/headless-dropshipping-starter
- Website: https://swagboilerplate.com
- Stars: 861 · Forks: 163
- Language: TypeScript
- License: not declared
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/notrab-headless-dropshipping-starter

## Two services do the work you would normally pay a platform for

The Swag Boilerplate builds a headless eCommerce storefront with Next.js and Snipcart, delivering swag powered by Printful, styled with Tailwind CSS and deployed on Vercel. The architecture is worth spelling out because it explains the whole setup guide. Snipcart is the commerce layer: it holds the cart, runs the checkout and processes the payment, and your site embeds it. Printful is the fulfilment layer: it manufactures the product, and it is what takes the order and produces the shipment. Your own application is the storefront itself, a Next.js site that lists products and hands the checkout to Snipcart. There is no database of orders and no payment integration code in this repository, which is why the setup guide is mostly about configuring webhooks on somebody else's dashboard.

## The feature list is short because the services do the work

The features listed are realtime shipping prices, secure payments, automatic fulfilment, the built-with-Next.js and styled-with-Tailwind claims, cart and checkout with Snipcart, fully typed, recover abandoned carts, one click deploy, and a note that more is coming. Read that list against the architecture and the mapping is clear. Realtime shipping prices are a Printful webhook. Secure payments are Snipcart handling the gateway, with the README telling you to enable SCA, strong customer authentication, for purchases. Automatic fulfilment is the order webhook calling Printful. Recover abandoned carts is a Snipcart feature you enable rather than code you write. That is the trade this kind of starter makes, and it is a reasonable one if your catalog is small and static, because you are not building the commerce backend at all.

## Printful setup, and the mockup format detail that matters

The first half of the guide is Printful. You log in or sign up, create a store and select Manual order platform and API from the available methods, and then add products. The product step is the one with a real trap in it: you select from over two hundred products, configure the design by adding your logo and picking colours and sizes, then proceed to mockups to select the image shown in the storefront, choosing between people wearing the product and flat wrinkled mockups, and you must select PNG as the mockup format when creating the product. After that you name the product, set your prices, where you will see both the cost to you and the retail prices you charge, and you can adjust the profit margin, then save. The README notes that shipping and taxes are extra, and that you can optionally create a product template for items you may want to add to other stores later.

## Selling region and VAT are your problem, not the code's

Inside Settings and then Stores, you configure your default selling preferences, and you can either sell worldwide or pick a specific region such as the UK. Then the README drops the part that usually surprises people: depending on where you sell you will be liable to pay or collect and pay VAT, and if you are VAT registered you provide Printful your VAT ID so that orders reflect a zero VAT amount where applicable. The same VAT applies on the Snipcart side, where you are told to enable the Tax API if you need to collect VAT from customers. There is also a billing method to add to Printful, with the explanation that when a customer makes an order Printful will charge you to process the order. That is the cost model in one sentence, and it is worth reading before you launch.

## The webhook URLs are the actual integration

Most of the Snipcart setup is about pointing three webhooks at three paths in your application. The order webhook is triggered throughout the pre and post purchase stages, and when a customer places a successful order it calls a function to add the order to Printful, and the URL is your domain with /api/snipcart/webhook appended. Shipping is enabled unless you want to cover the cost of all shipping, using the Custom Shipping section with Webhooks selected and configured, at the same domain plus /api/snipcart/shipping. Taxes work the same way through a webhook at /api/snipcart/tax, with the taxes you must collect then calculated by Printful. So the integration surface of the whole application is three route handlers, and the print-on-demand pipeline is: customer pays, Snipcart calls your webhook, your webhook calls Printful, Printful prints and ships.

## Snipcart needs LIVE mode and the right domain

Two configuration steps on the Snipcart side are load bearing. The first is the API key: you go to Account and then API Keys to get your Public API Key, and you want to switch to LIVE mode, keeping a copy for use later when deploying or running locally. The second is the website domain, where the README says it is important you configure the Default Website Domain so Snipcart can successfully validate product prices, and that you may also want to add other domains and subdomains if you are working locally. You also configure a Redirect URL, set to the root domain of the store. The reason the domain matters is that price validation happens against your site, so a mismatch does not produce a price error at checkout, it produces prices that cannot be validated.

## The stack is a snapshot, and the README points elsewhere

The package manifest is a good record of what this codebase is. The runtime dependencies are next at 12.1.0, react and react-dom at 17.0.2, next-seo at 4.28.1, printful-request at 2.0.0, classcat and lodash.shuffle, and the Tailwind forms plugin. The dev dependencies are Tailwind at 3.3.2 with the typography plugin, PostCSS, autoprefixer, TypeScript at 4.5.5, ESLint and Prettier. The scripts are the four Next.js ones, dev, build, start and lint. The repository root has next.config.js, tailwind.config.js, postcss.config.js, prettier.config.js, next-seo.config.js, an .env.local.example and a renovate.json for dependency updates. The Next.js 12 and React 17 versions date the codebase, and the README links to swagboilerplate.com and headlessdropshipping.com for the current documentation, which is where you should look before adopting this as-is.

## Where this starter is the wrong choice

Four limits apply. The storefront is a presentation layer over two hosted services, so your margin, your catalogue and your customer records live on Printful and Snipcart, and a pricing change or a plan change there is not something your repository controls. The dependency versions are old enough that a fresh Next.js install will differ substantially, and the README points at a commercial site rather than documenting the current setup, so treat the repository as a reference rather than as a starting point to copy unchanged. The commercial arrangement is the second limit: the licence field on the repository carries no standard identifier, the README links to swagboilerplate.com, and a hosted account on both services is a recurring cost that the boilerplate does not remove. And the abstraction is thin: the cart is Snipcart's, the fulfilment is Printful's, the pricing rules are Printful's, and the tax handling is configured on two dashboards at once.

## Conclusion

Use headless-dropshipping-starter if you want a print on demand store running on two third-party services rather than a commerce platform you have to configure yourself, since the cart, the payments and the fulfilment are already wired together by webhook. Do not expect a production storefront out of the box, because the dependency versions in the package manifest are from the Next.js 12 era and the README points at a commercial site for the current version. Verify first which account settings the two services need, since Snipcart has to be in LIVE mode with your domain configured and a webhook URL, and Printful needs a private token plus a billing method, that the abandoned cart recovery actually matches your email setup, and what the current licensing and terms are, since the repository records no standard licence and the README points at swagboilerplate.com.

## FAQ

### What does the headless-dropshipping-starter project do?

It builds a headless eCommerce storefront with Next.js and Snipcart, delivering swag powered by Printful, styled with Tailwind CSS and deployed on Vercel. The cart, checkout and payments run through Snipcart and the fulfilment runs through Printful.

### What do I have to set up before running the storefront locally?

Snipcart and Printful. You need a Printful store created with the Manual order platform and API method, products added with PNG selected as the mockup format, a private token used as PRINTFUL_API_KEY, a billing method, and on Snipcart a Public API Key in LIVE mode, your Default Website Domain configured, and the three webhook URLs set.

### Which webhook endpoints does the storefront expose?

Three, each your domain with a path appended: /api/snipcart/webhook for orders, /api/snipcart/shipping for shipping rates, and /api/snipcart/tax for taxes. The order webhook is what calls Printful to create the fulfilment order.

### Why does the mockup format have to be PNG?

The README instructs you to select PNG as the mockup format when creating the product in Printful, because the mockup image is the one that will be shown in the storefront. Getting this wrong means the storefront displays the wrong asset.

### Which framework and versions does the starter use?

Next.js at 12.1.0 with React and React DOM at 17.0.2, TypeScript at 4.5.5, Tailwind CSS at 3.3.2 and next-seo, plus printful-request for the Printful API calls. The scripts are the standard next dev, next build, next start and next lint, and a renovate.json keeps the dependencies updated.

## Sources

- [Issues](https://github.com/notrab/headless-dropshipping-starter/issues)
- [notrab/headless-dropshipping-starter on GitHub](https://github.com/notrab/headless-dropshipping-starter)
- [Project website](https://swagboilerplate.com)
- [README](https://github.com/notrab/headless-dropshipping-starter/blob/main/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/notrab-headless-dropshipping-starter
