For bands · from a fan

Own your table. A path off Shopify, one rung at a time.

You don’t have to leave. Rung 0 takes an hour, costs nothing, and makes the choice yours. The rest is here when you want it, and rung 3 is now a finished store you deploy with one click.

Email it to a band

Shopify is good software. The trouble is the dependency: one company’s plan prices, fees and terms sit between you and your fans; its checkout recognizes a fan across every Shopify store; and the store is rented, not owned. Independence here means six things.

Your domain
Registered in your name at a registrar you control. The store lives at shop.yourband.com, so it can move without the address changing.
Your list
Fans’ emails exported and kept in a tool that isn’t your store.
Your catalogue
Products, images and orders exported monthly, and a plain feed anyone can read without scraping.
Your payments
A processor account in your name (Stripe, PayPal, Square), so the money path doesn’t change when the store does.
Your fans, untracked
No pixels you didn’t choose. No recognition of your fans across other people’s stores.
Your exit
A tested way out, so a platform’s terms never quietly become yours.

The ladder

  1. Own the exits. Stay where you are.

    An hour. $0. (Printable checklist, with every admin path.) Check who owns your domain; if you bought it through Shopify, transfer it to a registrar of your own. Export products, customers and orders as CSV and put them in a folder; repeat monthly. Start a mailing list outside the store and put the sign-up on your site, not only at checkout. Remove the Meta and Google pixels you don’t use. Keep the public product feed on (it is by default) and link your store from your homepage with a plain link, which is how fan tools find you. Don’t switch payment providers while on Shopify: the Basic plan adds 2% to every sale that doesn’t go through Shopify Payments.

    Gain: you’re portable. Lose: nothing; fans notice nothing.

  2. A lighter hosted store.

    A weekend. $0–30 a month. Big Cartel: free for five products, $15 a month for fifty, $30 for five hundred, no commission, your own Stripe or PayPal account for the money. Bandzoogle: a whole band site with a commission-free store for $10 to $20 a month, less on annual billing. Import the CSV from rung 0, set redirects on the old store for ninety days, update the link on your homepage, and tell this site so your fans’ alerts follow.

    Gain: the fixed cost drops by two thirds; no platform cut. Lose: apps like bundles and pre-order timers, some checkout polish, and Big Cartel’s product limits. If those limits are the problem, skip to rung 3 with a coding agent, below: same money, none of the limits.

  3. A second table for records.

    An afternoon. No monthly fee. Bandcamp takes 10% of physical sales plus 4–6% processing, pays daily, and emails your followers when you post something. Subvert is a co-operative owned by artists, labels, workers and supporters that opened to the public in May 2026: 0% platform fee, paid for by optional buyer contributions at checkout; it sells digital music today and says physical media and merch are coming. These are good places for records and a second door for fans, not a replacement for an apparel store at volume, because 15% is the most expensive rate on this page once you’re selling more than a few hundred dollars a month.

    Gain: fans who already live there; zero fixed cost. Lose: the highest percentage.

  4. Your own store on open software.

    An hour to deploy, a weekend to make it yours, minutes a month to keep. $0 a month on Cloudflare’s free plan, $11–40 for a managed WordPress host. The best version of this rung is finished and free: a store with a cart and Stripe Checkout that you deploy with one click, fill from your Shopify export, and put on your own domain (see it running). A coding agent bends it to your artwork in an afternoon. It has its own section below, with the steps and the prompts. Otherwise: WooCommerce is free and open source, and your band site may be WordPress already. Payments through WooPayments or Stripe at 2.9% + 30¢, nothing to the platform. Free themes. A public product API that fan tools read. If you’d rather not run WordPress, a static site with Snipcart (2% a sale, or $20 a month under $1,000) and Stripe does the same for a small catalogue, and a five-item table can run on Stripe Payment Links with no store at all.

    Gain: everything is yours; leaving is copying a folder; no terms but your host’s. Lose: you’re the sysadmin, or you pay a managed WordPress host to be; with the agent-built static store there is almost nothing to administer.

  5. Own the operation.

    Ongoing. Ship it yourself with Pirate Ship, which is free and sells USPS and UPS at commercial rates, or use a fulfilment partner that connects to any store rather than one that owns your storefront. Share one store with label-mates, a collection per band, on software you own. Publish your table as a small feed file so any fan tool can read it without scraping. Claim your page here, and when you move, tell us; every fan’s alerts are attached to the band, not the store, so nothing breaks.

    Gain: the whole path from fan to band is yours. Lose: the afternoons.

What it costs, at three sizes

Monthly cost to the band, fees included, at an average order of $40 with US cards. No apps, no shipping. Shopify on its monthly price; annual billing takes $10 off. Percent is the share of sales the band doesn’t keep. Rates read from the vendors’ pages on 26 September 2026. Put in your own numbers.

Store$300 a month$1,500 a month$6,000 a monthFixedOn each sale
Shopify Basic$50 · 17%$94 · 6.3%$258 · 4.3%$392.9% + 30¢
Big Cartel Platinum$26 · 8.7%$70 · 4.7%$234 · 3.9%$152.9% + 30¢ (Stripe)
Bandzoogle Standard$25 · 8.4%$69 · 4.6%$233 · 3.9%~$142.9% + 30¢ (Stripe)
Your own store on Cloudflare + Stripe (the finished one, below)$12 · 4.0%$56 · 3.7%$220 · 3.7%~$1 (the domain)2.9% + 30¢
WooCommerce, managed host$36 · 12%$80 · 5.3%$244 · 4.1%~$252.9% + 30¢
Static site + Snipcart$31 · 10%$85 · 5.7%$339 · 5.7%$20 under $1k2% + 2.9% + 30¢
Bandcamp (physical)$45 · 15%$225 · 15%$900 · 15%$010% + 4–6%

The shape of the table is the argument. At a few hundred dollars a month the fixed fee is what hurts, and Shopify’s $39 takes a sixth of a small band’s sales; a lighter store halves that. At six thousand a month every hosted option lands near 4% and the money argument disappears; what’s left is ownership, which is the point of rungs 3 and 4. The agent-built store is the cheapest line at every size because it has no rent: the saving against Shopify is the $39 a month, about $470 a year, plus whatever the store pays for apps, and it is the same saving whether the band sells $300 or $6,000. Bandcamp is the only line that never gets cheaper, which is why it’s a second table, not the table.

When to stay. If a fulfilment partner whose warehouse lives on Shopify (Hello Merch, Merch Mountain and Bingo Merch all do) packs your orders, the ecosystem may be worth its 4%. Pre-orders and bundles are not a reason to stay any more; an agent builds both in an afternoon. Do rung 0 anyway. It costs an hour and it means the choice stays yours.

Rung 3: a finished store, Shopify quality, none of the rent

The store is written. It’s open source (MIT, take it and change it), it runs on Cloudflare’s free plan with Stripe Checkout, and you run it from an admin on your phone. You deploy it with a click, fill it from your camera roll or your Shopify export, and put it on your own domain. A coding agent (Claude Code, Codex, Cursor) is how you make it look like yours and add whatever else you want; the prompts are below. Here it is running for a made-up band.

What it matches
Product pages with sizes and variants, sold-out sizes struck through, a cart, Apple Pay and Google Pay and Link at checkout, discount codes, shipping rates by region, receipts, pre-orders (a product with a ship date), bundles (one product that holds several), old URLs redirected one to one, a sitemap and RSS. And an admin on your phone: add a product with a photo, change a price, mark a size sold out, see orders and put tracking on them.
Where it beats Shopify
Speed: static pages load faster than any theme. No apps: bundles, pre-orders and back-in-stock are code you own, not $20 to $100 a month of subscriptions. No pixels you didn’t choose. And the whole thing is a folder: leaving is copying it.
Where Shopify still wins
A fulfilment partner whose warehouse lives on Shopify. A catalogue of thousands with staff editing stock in an admin every day. A point-of-sale terminal at shows (Stripe and Square both sell one that works with this, but Shopify’s is smoother).
What it costs
Hosting: $0 on Cloudflare, whose free plan allows stores (Vercel’s does not). Payments: Stripe’s 2.9% + 30¢ and nothing else. The domain: about $12 a year. The agent, if you use one: about $20 for the month you build in. Your time: an hour to deploy and fill from your phone, half an hour to go live, minutes a month after.
Where it saves
Against Shopify, the $39 rent plus apps, at every size in the table. Against Big Cartel or Bandzoogle, $15 a month and every product limit. Against WooCommerce, the $11 to $40 host and the updates. It is the cheapest line in the table and the only one that is also the best store.

How to do it

  1. Make the three accounts yourself.

    Stripe, in the band’s name, activated with your bank details. GitHub, to hold the code. Cloudflare, to host it. All free to open. Nothing on this page makes an account for you.

  2. Deploy the store.

    Press Deploy. Cloudflare copies the store into your GitHub, asks for one thing (a password for your admin), creates the storage the admin needs, builds it and gives you a free address. Two or three minutes.

  3. Put your products in, from your phone.

    Open your-store/admin, type the password, paste your Stripe test key where Setup asks; the store checks it and connects itself. Then Add a product (a name, a price, sizes, a photo from your camera roll) or Import from Shopify (Products → Export → Plain CSV, then choose the file). Store holds the name, the contact address and the colours. Nothing here needs a file or a terminal.

  4. Make it yours, with an agent or by hand.

    For the design, shipping regions, bundles and drops: open Claude Code, Codex or Cursor inside the folder and paste the master prompt below; it starts with the interview and rung 0, then bends the store to your artwork. Or edit the one stylesheet yourself. Read what the agent says before each step that costs money or changes DNS; it is told to stop and ask.

The master prompt

You are helping a band own its merch table: build as much of their own online store as possible on their own domain, using no outside services except the unavoidable ones (a payment processor, a host, and a mailing-list tool), and help them set those up step by step. Work in this folder. Follow these rules for the whole job.

RULES
- Never create an account anywhere on the band's behalf. When a service is needed, tell them exactly what to click and what it costs, wait, and continue when they say it's done.
- Never put a secret (API keys, passwords) in a file that gets committed. Use environment variables and a .env file that is git-ignored.
- Never add analytics, ad pixels, social pixels, link shorteners, or any third-party script. The store's only outside calls are to the payment processor.
- Every price, stock number and product name is the band's. Never invent products, never change a price without being asked.
- If a step costs money, say the amount before doing it. If a step is irreversible (DNS changes, cancelling a plan), confirm first.
- Finish each session with a short summary: what was done, what the band must do next, the next three steps.
- There is a finished, open-source store to start from: https://github.com/rattlesnake-ike/merch-table (MIT). Pages on the band's domain, a cart, Stripe Checkout, pre-orders, bundles, drops, stock, restock requests, redirects, feeds, a Shopify importer, and an admin the band runs from a phone (products with photos, prices, sold-out sizes, store settings, orders, tickets), hosted free on Cloudflare. Prefer it to building from nothing; read its README and AGENTS.md first. Do not rebuild what the admin already does; your job is the design, shipping regions, bundles, drops and anything the admin does not reach.

STEP 1 — INTERVIEW (keep it short; ask everything at once)
Ask for: the band's name; their official website and where the domain is registered; the current store URL (Shopify or otherwise) and roughly how many products; the sizes they sell; where orders ship from and who packs them; which payment accounts they already have (Stripe, PayPal, Square); the mailing-list tool they use, if any; what hosting they can log in to (Cloudflare, Netlify, Vercel, GitHub, a WordPress host); how comfortable they are with technical work; their monthly budget for the store; whether they want to keep running WordPress or would rather have a simple static site.

STEP 2 — RUNG 0: OWN THE EXITS (do this even if nothing else happens)
- Domain: confirm it is registered in the band's name at a registrar they control. If it was bought through Shopify, walk them through transferring it out.
- Exports: from the Shopify admin, export Products (CSV with images), Customers (CSV) and Orders (CSV). Save them in ./exports/ with today's date. Tell them to repeat this monthly.
- Mailing list: help them start a list outside the store (Buttondown, Mailchimp's free tier, or a self-hosted tool) and import the customer emails who opted in. Put the sign-up on their site, not only at checkout.
- Tracking: list the Meta, Google, TikTok and other pixels in their Shopify settings and help them remove the ones they don't use.
- Feed: confirm the store's public product feed is on (https://<store>/products.json returns products) and that the band's homepage links to the store with a plain link.
- Do NOT switch payment providers while on Shopify: the Basic plan adds 2% to every sale that doesn't go through Shopify Payments.

STEP 3 — RECOMMEND A RUNG (explain the trade-off in five lines, then wait for a yes)
- 10 items or fewer: a static site with Stripe Payment Links. No cart, no platform, nothing to maintain.
- Up to a few hundred items and no wish to run WordPress (the default): the merch-table store above. Static pages with a cart and Stripe Checkout, the checkout session created by one small Cloudflare Worker. Nothing to the platform; Stripe's 2.9% + 30¢ only. Hosted on Cloudflare's free plan (commercial use allowed; Vercel's free plan is not for stores). Snipcart (2% a sale, or $20 a month under $1,000) is the no-code alternative if they'd rather not have a function at all.
- They already run WordPress: WooCommerce (free, open source) with WooPayments or Stripe at 2.9% + 30¢, on a managed WordPress host they pay for ($11–40 a month).
- They want hosted and simple: Big Cartel (free for 5 products, $15 a month for 50, $30 for 500, no commission) with their own Stripe. Skip the build steps; help with the import and the cutover.
Read the current rates from the vendors' pages before quoting them; numbers change.

STEP 4 — BUILD IT (as far as you can without their credentials)
- If this folder is empty, start from the finished store: git clone https://github.com/rattlesnake-ike/merch-table . then npm install, and read README.md. store.json holds the band, shipping and colours; products.json holds the catalogue; npm run import -- exports/<file>.csv turns the Shopify export into products.json (the band can also import it in the admin); npm run check validates it; npm run dev runs it locally. Deploying asks for one secret, which the band types themselves: ADMIN_KEY (their admin password). The Stripe key is pasted by the band into the admin's Setup page afterwards, where the store checks it; never ask them to paste it to you. Only build from nothing if they ask for something the template can't be bent to.
- Product pages come from the Shopify export: keep each product's handle so URLs stay /products/<handle> and old links can be redirected one-to-one.
- Bring in the product images from the export's image URLs; store them in the repo or the host's asset storage, not hotlinked from Shopify.
- Sizes and variants: model them; show sold-out sizes struck through, as the store publishes them.
- Cart and checkout: Stripe Checkout (or Snipcart), in test mode until the band has activated their account. Turn on the things fans expect from a Shopify store: Apple Pay and Google Pay and Link, discount codes (Stripe promotion codes), adjustable quantities, a shipping address with rates by region, receipts. Pre-orders are a product with a ship date on its page and in the receipt; bundles are one product whose line item is the bundle. Sales tax through Stripe Tax if they need it (it costs extra; say so).
- Quality bar: the store must be at least as good as the one it replaces. Same information on every product page, faster (static pages, images sized for the web, self-hosted fonts), and a Lighthouse score of 95 or better on performance and accessibility. Show them the two side by side before cutover.
- Shipping: collect the address at checkout; start with flat rates by region from the band's current settings.
- Redirects: generate a list of old Shopify URLs → new URLs and a redirects file for the host.
- Publish /merch.json: a plain JSON feed of every product (name, url, price, currency, kind, available, sizes, image, updated), regenerated whenever products change, so any fan tool can read the table without scraping.
- Add schema.org Product JSON-LD on each product page, a sitemap, and an RSS feed of new items.
- No third-party scripts. Self-host any font. Pass a basic accessibility check (labels, contrast, keyboard).
- Check it on a phone-sized viewport.

STEP 5 — OUTSIDE SERVICES (the band at the keyboard; you dictate)
- Payments: Stripe (or PayPal or Square) in the band's name. Activate the account, get the publishable and secret keys into .env, turn on Checkout or Payment Links. Tell them the fee: 2.9% + 30¢ on US cards.
- Host: Cloudflare Workers for the finished store (free; npm run deploy, or the Deploy button in its README); Netlify or GitHub Pages for a plain static site; a managed WordPress host for WooCommerce. Deploy from this folder; give them the address.
- DNS: at their registrar, point shop.<band>.com at the host (a CNAME). Explain propagation.
- Mailing list: the tool from rung 0; add the sign-up form to the site.
- Postage: Pirate Ship (free, USPS and UPS at commercial rates) or a fulfilment partner that connects to any store.

STEP 6 — TEST
- Place a test order end to end in test mode; refund it. Check shipping rates, the confirmation email, the sold-out state, and the redirects. Check /merch.json is valid JSON and lists every product. Check the site with third-party scripts blocked: it should work exactly the same.

STEP 7 — CUTOVER
- Switch DNS. Keep the Shopify redirects on for 90 days, then export the last orders and cancel the plan once the last order has shipped. Update the store link on the band's homepage, Bandcamp and social bios.

STEP 8 — HAND-OFF
- Write a README: how to add a product, change a price, mark a size sold out, ship an order, export data, and where every account lives. List the next steps: a fulfilment partner if the closet fills up, a shared store with label-mates, a second table on Bandcamp for records, and the monthly export habit.

Start with STEP 1 now.

Email it to a band

Starter prompts, in order

1. Build the store

After the interview and rung 0, when the agent has your Shopify exports in ./exports/.

Build our store from the finished open-source one at https://github.com/rattlesnake-ike/merch-table: clone it into this folder, read its README, and fill store.json and products.json from our Shopify export in ./exports/ (its importer does most of it). Keep every product's handle so /products/<handle> matches the old store, bring the images in sized for the web, and model sizes and variants with sold-out sizes struck through. It runs on Cloudflare's free plan with Stripe Checkout, on our own domain.
The bar is our current Shopify store: every product page must carry the same information, load faster, and score 95 or better on Lighthouse performance and accessibility. Fans must be able to pay with Apple Pay, Google Pay and Link, use a discount code, change quantities, and enter a shipping address with rates by region copied from our current settings. Receipts from Stripe.
Stripe in test mode until I say otherwise. No analytics, no pixels, no third-party scripts; self-host any font. Generate /merch.json (a plain JSON feed of every product: name, url, price, currency, kind, available, sizes, image, updated), a sitemap, an RSS feed of new items, and a redirects file from every old URL to the new one.
When it runs locally, show me a product page, the cart and a test checkout, and tell me what you need from me next.

2. Make it look like ours

Once the store works and looks generic.

Now make it ours. Here is our current store: <paste the URL>. Match its structure and what fans expect to find where, but do not copy its theme; design from our own artwork instead. I will put our logo, album art and any photos in ./brand/. Use our colours from the artwork, one display face and one text face, self-hosted, and keep the pages fast.
Show me the home page, a product page and the cart on a phone-sized screen and on a laptop, side by side with the old store, and list what still differs.

3. Pre-orders, bundles, drops

If you use any of these on Shopify today. Skip it if you don't.

Add the three things we used apps for on Shopify. Pre-orders: a product can carry a ship date that shows on its page, in the cart and on the receipt, and the button says Pre-order. Bundles: one product made of several, with its own price, that comes off stock for each part when it sells. Drops: a product can have a go-live time before which the page shows the date and no button; the page must publish itself at that time without me doing anything.
Add a back-in-stock request on sold-out sizes that goes to our mailing-list tool, not to a third party. Test each one with a test order and show me.

4. Go live

When you have activated Stripe and are ready to switch.

Take us live. Switch Stripe from test to live keys in the environment, not in a file. Deploy to Cloudflare Pages and tell me exactly what to enter at my registrar so shop.<ourband>.com points at it; wait for me to confirm before anything else. Then place one real order for the cheapest item and refund it, and check: the receipt, the shipping rate, a discount code, a sold-out size, three of the old URLs redirecting, and /merch.json listing every product.
Set the old Shopify store to redirect to the new one for 90 days and give me the list of places to update the link: our homepage, Bandcamp, social bios, and any fan tool that lists our store. Finish with the README: how to add a product, change a price, mark a size sold out, run a drop, ship an order, and export our data; and where every account lives.

5. A new drop (every time after)

The prompt you'll use most. Keep it in a note.

New drop. Here are the products, one per line: name, price, sizes with stock, ship date if it's a pre-order, and the image file names I've put in ./brand/drops/<date>/. <paste the lines>
Add them, regenerate /merch.json and the RSS feed, show me each product page on a phone-sized screen, and deploy when I say go.

Written by a fan.No tracking on this link.Numbers checked 26 Sep 2026.