Case study · Headless Shopify

An ecommerce brand born from a gap in the fan art market

ClientPalette TownMy art brand
RoleDesign Engineer
StackHeadless Shopify · Next.js · GSAP · Vercel · Gelato (print-on-demand) · Firebase · Klaviyo API · Claude (API)
TimelineFounded 2021 · Redesigned summer 2026
Livepalettetown.co

Palette Town is my art brand. I hand-draw vector designs inspired by Pokémon TCG and sell them as prints, canvas, shirts and phone cases, all fulfilled print-on-demand through a headless Shopify storefront.

It started on Twitch, where I streamed Pokémon card pack openings and wanted giant card art as posters on the wall behind me. Nothing like that existed online, so I decided to test my illustrator chops (or lack thereof) and make them myself. After a few rounds, I found my own style and was proud of the art. I bet other people might want it too, and since I love building websites and learning how buyers make decisions, I built the entire business myself.

I also wanted to test my marketing skills and see how far I could grow a business spending $0 on ads, using only organic search and social. Analytics and testing are my idea of fun, so why not see what happens?

Old Palette Town WordPress homepage and cart page mockups shown on a dark gray backdrop

THE PROBLEM

Outgrowing the old store

The store’s first build was a custom WordPress theme I never had time to polish between client projects, so I swapped it for a premade drag-and-drop theme.

UNFAMILIAR CHECKOUT

Buyers had to type their card into a checkout they’d never seen, and for a small fan art shop, that’s often where the sale ends.

SLOW PAGES

The premade theme was bloated, and it showed in every page load. My store depends on organic search, so slow pages cost me rankings and sales.

SLOW EDITING

Each card list post had 100+ images, and the editor got slower as a post grew. My highest-traffic content took the longest to make and was the most error-prone.

PLATFORM

Choosing headless Shopify

  1. Trusted checkout

    As a shopper, I use Shop Pay whenever it’s offered. Moving to Shopify put buyers in a checkout they’ve already used.

  2. Faster pages

    The new storefront is a headless Next.js frontend on Vercel, so every page loads faster, which matters most for a store that depends on search.

  3. Polished emails

    Shopify’s order and shipping emails look professional out of the box. My WooCommerce setup was finicky to style and charged extra to add tracking info.

Palette Town blog post written as structured markdown, with postHero, content, and cardGallery component blocks

TRADEOFF

Skipping the CMS

WHAT I GAVE UP

A CMS entirely, and I miss it. I’m not comfortable writing markdown.

WHY

I’m the only one editing this site, and I wanted an AI workflow that produced content faster than I could by hand. Editing component copy is already familiar to me, so setting up WordPress felt unnecessary.

WHAT REPLACED IT

I defined blog components with clear rules, and Claude writes the structured markdown against them from my description of each post.

BACK OFFICE

Building my own admin

Without a CMS, I built my own panel for the three things my shop needs.

  • Palette Town What's Next voting cards for four Pokémon cards, with an email field to submit a vote

    Poster voting

    Visitors vote for the next poster with their email. Votes land in Firebase and sync to Klaviyo, so every new poster launches with a list of the people who asked for it.

  • Palette Town admin panel showing card vote totals, ballot cards, and pending user-suggested cards

    Card curation

    I review incoming votes and suggested cards, then publish new ballot options to the site.

  • AI blog drafts

    I pick related coverage from trusted news sources, the Claude API drafts an original post with every source tracked, and I design a thumbnail in Figma before publishing.

Being my own client is thefastest feedback loop I’ve ever had.
Palette Town TCG guide page showing a grid of Galarian Gallery GG01–GG70 alternate art cards

CONTENT OPS

Speeding up card lists

Claude Code now renames every image to an SEO naming convention, writes titles and alt text across the catalog, and checks each post against its card set so nothing’s missing.

Posts that used to take days now take minutes.

PRODUCTION

Handling the launch details

  • Palette Town services diagram linking the shop to Vercel, Shopify, Next.js, GoDaddy, Firebase, Resend, Klaviyo, Gelato

    Launch and fulfillment

    I moved DNS to Vercel without breaking the shop’s email routing, and integrated and tested Gelato fulfillment end to end.

  • Google Merchant Center showing approved Palette Town Charizard print listings and 651 valid items over time

    Search and schema

    I fixed a Merchant Center feed rejection, kept product JSON-LD up to Google’s requirements, and wrote SEO packages for all 23 prints from Search Console data.

  • Palette Town vote pipeline: Firebase voter records syncing into a Klaviyo Card Voting segment

    Email and CRM

    I patched Shopify’s transactional emails to show the right store details, and set up Klaviyo to segment subscribers by the posters they voted for.

IMPACT

Growing without ads

Blog posts take minutes instead of days, and faster pages and structured data put my products in Google Shopping results. The voting feature has also grown an email list of people waiting for new posters.

Ad spend, lifetime$0
Search impressions196KMay–Aug 2026
First 83 daysClicks +32% · impressions +23%Post-migration
Ranking queries1,100+ · 99% non-branded
Search reach169 countries
Catalog23 designs · 5 formats

Reflection

  1. Having access to every data point has taught me a lot, and it gives me the confidence to collaborate with other marketers.

  2. Now that blog posts are streamlined, my new bottleneck is creating products in Shopify and Gelato. I may build a Claude pipeline that writes listings from set guidelines and creates them for me to review.

    Update, Oct 2026: I started with audits instead. Claude Code checks every listing and shows me anything unusual, like mismatched names or prices. Once I confirm, it updates the pages for me through the Claude in Chrome extension, which has saved me from a lot of errors.

  3. Next time I build a portal for a site, I’ll separate the styling layer from the start, so every part of the site uses consistent components.

    Update, Oct 2026: I’m testing this now. Heartcore Studio and Clever Keeper should share one design system, so I’m building every component in Storybook with Claude Code and reviewing each one for consistency. Next, I’ll bring the updates into Clever Keeper locally to see how much it cleans up the app.

Next case study

Harland WeHo

Scroll-driven motion that turned a static listing into an interactive house tour

Take the tour