You Don't Need to Be a Senior Developer to Build Shopify Themes
If you can write HTML and CSS, you can build a Shopify theme. That's not an exaggeration — Shopify's templating language (Liquid) is deliberately simpler than frameworks like React or Vue, and the tooling has matured to the point where local development, live preview, and deployment are all handled by one CLI command.
Shopify theme development for beginners is one of the most accessible entry points into professional web development in 2026. The demand is real: over 4.8 million active Shopify stores need themes, customizations, and ongoing development. Freelancers charge $50-200/hour for Liquid work, and agencies build entire businesses around theme development.
This guide takes you from zero to building your first custom Shopify theme. We'll cover the development environment setup, Liquid fundamentals, Online Store 2.0 architecture, and practical code examples you can run immediately. Whether you're exploring a career in Shopify development or customizing your own store, these skills compound quickly.
Setting Up Your Development Environment
Before writing any code, you need three things: a Shopify Partner account (free), a development store, and Shopify CLI.
Step 1: Create a Shopify Partner Account
Go to partners.shopify.com and sign up for free. A Partner account gives you:
- Unlimited development stores (free, no trial limits)
- Access to the Shopify CLI and theme development tools
- Revenue share when clients use themes you've built
Step 2: Create a Development Store
From your Partner dashboard: Stores → Add store → Development store. Choose "create a store to test and build" and select the latest Shopify version. This gives you a fully functional store with test data — no credit card required.
Step 3: Install Shopify CLI
Shopify CLI is the command-line tool that powers local theme development:
# Install via npm (requires Node.js 18+)
npm install -g @shopify/cli @shopify/theme
# Verify installation
shopify version
Step 4: Pull a Theme Locally
Clone the Dawn theme (Shopify's reference theme) to start with a proven foundation:
# Initialize with Dawn
shopify theme init my-theme
# Or pull an existing theme from your dev store
shopify theme pull --store your-store.myshopify.com
Step 5: Start the Dev Server
cd my-theme
shopify theme dev --store your-store.myshopify.com
This launches a local development server with hot reload. Every file change reflects instantly in the browser preview. Litos.io's guide to building Shopify themes has excellent screenshots of this workflow in action.
Understanding Shopify Theme Architecture

A Shopify theme is a collection of Liquid templates, JSON configuration files, and assets (CSS, JavaScript, images). Understanding the file structure is the first step to building confidently.
The Theme Directory Structure
my-theme/
├── assets/ # CSS, JS, images, fonts
├── config/ # Theme settings (settings_schema.json, settings_data.json)
├── layout/ # Main layout wrappers (theme.liquid)
├── locales/ # Translation files
├── sections/ # Reusable content sections
├── snippets/ # Reusable code fragments
├── templates/ # Page-type templates (JSON in OS 2.0)
└── blocks/ # App blocks and theme blocks
How a Page Renders
When a customer visits a product page, Shopify renders it in layers:
- `layout/theme.liquid` — the outermost wrapper (HTML head, header, footer)
- `templates/product.json` — defines which sections appear and in what order
- `sections/main-product.liquid` — the actual product section code
- `snippets/` — reusable code included by sections
Understanding this hierarchy is essential. The layout wraps everything, templates define page composition, sections contain the actual content, and snippets are shared utilities.
Online Store 2.0: What Changed
Online Store 2.0 (OS 2.0) was a fundamental upgrade to theme architecture. The key changes for developers:
| Feature | OS 1.0 (Legacy) | OS 2.0 (Current) |
|---|---|---|
| Template format | .liquid files | .json files (referencing sections) |
| Section availability | Homepage only | Every page type |
| Merchant customization | Limited | Full drag-and-drop |
| App integration | Theme code injection | App blocks (no code changes) |
| Metafields | Limited access | Dynamic sources everywhere |
If you're starting fresh, always build on OS 2.0. Legacy themes are still supported but increasingly limited. Shopify's official OS 2.0 guide explains the full rationale behind the architecture changes.
Liquid Fundamentals: The Language of Shopify Themes

Liquid is Shopify's templating language. It's not a full programming language — it's deliberately constrained to prevent security issues and encourage readable, maintainable code. If you know HTML, you can learn Liquid in a weekend.
The Three Building Blocks
1. Objects — output data using double curly braces:
{{ product.title }}
{{ product.price | money }}
{{ shop.name }}
2. Tags — control logic using curly brace + percent:
{% if product.available %}
<button>Add to Cart</button>
{% else %}
<button disabled>Sold Out</button>
{% endif %}
{% for product in collection.products %}
<h3>{{ product.title }}</h3>
{% endfor %}
3. Filters — transform output using the pipe character:
{{ product.title | upcase }}
{{ product.price | money_with_currency }}
{{ product.description | strip_html | truncate: 150 }}
{{ 'now' | date: '%B %d, %Y' }}
Essential Liquid Objects for Theme Development
| Object | What It Contains | Where It's Available |
|---|---|---|
| product | Title, price, variants, images, description | Product templates/sections |
| collection | Products, title, image, sort options | Collection templates |
| cart | Line items, total price, item count | Cart template, globally |
| shop | Store name, URL, currency, email | Everywhere |
| customer | Name, email, orders, addresses | When logged in |
| settings | Theme editor settings | Everywhere |
| section | Current section's settings and blocks | Within sections |
VihaDigitalCommerce's Liquid code guide provides a comprehensive reference for all Liquid objects, filters, and tags — bookmark it as your daily reference.
Building Your First Custom Section
Sections are the building blocks of OS 2.0 themes. Every visible element on a Shopify page is a section — hero banners, product grids, testimonials, CTAs, footers.
Anatomy of a Section File
Every section has two parts: the rendered HTML/Liquid at the top and the schema (JSON) at the bottom that defines settings and blocks.
{%- comment -%} sections/featured-collection.liquid {%- endcomment -%}
<section class="featured-collection padding-y-lg">
{% if section.settings.heading != blank %}
<h2 class="section-heading">{{ section.settings.heading }}</h2>
{% endif %}
<div class="product-grid grid grid--{{ section.settings.columns }}">
{% for product in collections[section.settings.collection].products limit: section.settings.limit %}
<div class="product-card">
{% if product.featured_image %}
<img
src="{{ product.featured_image | image_url: width: 600 }}"
alt="{{ product.featured_image.alt | escape }}"
loading="lazy"
width="600"
height="600"
>
{% endif %}
<h3>{{ product.title }}</h3>
<p>{{ product.price | money }}</p>
<a href="{{ product.url }}">View Product</a>
</div>
{% endfor %}
</div>
</section>
{% schema %}
{
"name": "Featured Collection",
"settings": [
{
"type": "text",
"id": "heading",
"label": "Heading",
"default": "Featured Products"
},
{
"type": "collection",
"id": "collection",
"label": "Collection"
},
{
"type": "range",
"id": "limit",
"min": 2,
"max": 12,
"step": 1,
"default": 4,
"label": "Products to show"
},
{
"type": "select",
"id": "columns",
"label": "Columns",
"options": [
{ "value": "2", "label": "2" },
{ "value": "3", "label": "3" },
{ "value": "4", "label": "4" }
],
"default": "4"
}
],
"presets": [
{
"name": "Featured Collection"
}
]
}
{% endschema %}
Key Schema Concepts
- `settings` — inputs that merchants configure in the theme editor (text, images, colors, collections, ranges)
- `blocks` — repeatable content units inside a section (e.g., individual slides in a carousel, individual FAQ items)
- `presets` — makes the section available in the "Add section" picker in the theme editor
If you're building sections for theme design projects, presets are what make your sections discoverable. Without a preset, the section exists in code but merchants can't add it through the editor.
Working With JSON Templates

In OS 2.0, page templates are JSON files that define which sections appear and in what order. This is what gives merchants the drag-and-drop customization experience.
Example: Product Template
{
"sections": {
"main": {
"type": "main-product",
"settings": {}
},
"recommendations": {
"type": "product-recommendations",
"settings": {
"heading": "You May Also Like",
"limit": 4
}
}
},
"order": ["main", "recommendations"]
}
Creating Alternative Templates
You can create multiple templates for the same page type. For example, a special product template for limited editions:
// templates/product.limited-edition.json
{
"sections": {
"countdown": {
"type": "countdown-timer",
"settings": { "end_date": "" }
},
"main": {
"type": "main-product",
"settings": { "show_quantity": true }
},
"social-proof": {
"type": "testimonials",
"settings": {}
}
},
"order": ["countdown", "main", "social-proof"]
}
Merchants assign templates to specific pages in the Shopify admin. This lets you offer different layouts without duplicating section code.
CSS and JavaScript in Shopify Themes
Shopify themes don't use React, Vue, or a bundler by default. The approach is deliberately simple: vanilla CSS, minimal JavaScript, and browser-native features.
CSS Architecture
Dawn uses a component-based CSS structure where each section has its own CSS file loaded via Liquid:
{{ 'section-featured-collection.css' | asset_url | stylesheet_tag }}
Best practices for theme CSS:
- Use CSS custom properties for theming (colors, fonts, spacing)
- Avoid heavy frameworks — no Bootstrap, no Tailwind (adds unnecessary weight)
- Write mobile-first — base styles for mobile, media queries for larger screens
- Lazy-load section CSS — only load a section's stylesheet when the section is present
JavaScript: Less Is More
Shopify themes should be HTML-first, JavaScript-only-as-needed. The Dawn theme's performance philosophy demonstrates this approach:
- Web Components for interactive elements (cart drawer, product form, media gallery)
- No jQuery — use native DOM APIs
- Defer all non-critical JS — nothing should block the initial render
- Progressive enhancement — the page works without JavaScript, JS adds interactivity
// Example: A simple Web Component for a quantity selector
class QuantityInput extends HTMLElement {
constructor() {
super();
this.input = this.querySelector('input');
this.minus = this.querySelector('[data-minus]');
this.plus = this.querySelector('[data-plus]');
}
connectedCallback() {
this.minus.addEventListener('click', () => this.update(-1));
this.plus.addEventListener('click', () => this.update(1));
}
update(change) {
const newVal = Math.max(1, parseInt(this.input.value) + change);
this.input.value = newVal;
this.input.dispatchEvent(new Event('change', { bubbles: true }));
}
}
customElements.define('quantity-input', QuantityInput);
Performance Optimization: Building Fast Themes

Performance is a competitive advantage. Faster themes rank higher in search results, convert better, and earn more revenue for merchants.
Core Web Vitals Targets
| Metric | Target | What It Measures |
|---|---|---|
| LCP (Largest Contentful Paint) | < 2.5s | How fast the main content loads |
| CLS (Cumulative Layout Shift) | < 0.1 | Visual stability (content jumping) |
| INP (Interaction to Next Paint) | < 200ms | Responsiveness to user input |
Performance Best Practices
- Optimize images — use
image_urlwith explicit width/height,loading="lazy"for below-fold images,fetchpriority="high"for hero images - Minimize render-blocking resources — defer non-critical CSS and JS
- Use `<link rel="preload">` for critical assets — fonts, hero images
- Avoid layout shifts — always set explicit
widthandheighton images and embeds - Limit third-party scripts — every external script (analytics, chat, reviews) impacts performance
{%- comment -%} Preload hero image for faster LCP {%- endcomment -%}
{%- if section.settings.hero_image -%}
<link
rel="preload"
as="image"
href="{{ section.settings.hero_image | image_url: width: 1400 }}"
fetchpriority="high"
>
{%- endif -%}
For deep dives into performance measurement, the analytics and data section of our blog covers Core Web Vitals monitoring and optimization strategies.
Debugging and Testing Your Theme
Shopify Theme Inspector
Install the Shopify Theme Inspector Chrome extension — it shows render times for every Liquid element on the page. This helps you identify slow sections, expensive loops, and unnecessary Liquid processing.
Common Debugging Techniques
{%- comment -%} Output variable contents for debugging {%- endcomment -%}
{{ product | json }}
{%- comment -%} Check if a variable exists {%- endcomment -%}
{% if product.metafields.custom.sizing_chart %}
Metafield exists: {{ product.metafields.custom.sizing_chart }}
{% else %}
Metafield not found
{% endif %}
Testing Checklist Before Launch
- Cross-browser testing — Chrome, Safari, Firefox, Edge
- Mobile testing — real devices, not just responsive mode
- Accessibility — keyboard navigation, screen reader, color contrast
- Performance — PageSpeed Insights score above 90
- Theme editor — verify all settings work as expected for merchants
- Empty states — collections with no products, sections with no content
GemPages' theme development tutorial covers testing workflows in detail, including automated testing approaches for larger projects.
Common Beginner Mistakes (and How to Avoid Them)

Mistake #1: Editing a Live Theme Directly
Always work on an unpublished copy or use shopify theme dev for local development. Editing a live theme risks breaking the store for real customers.
Mistake #2: Hardcoding Content
Never put text, images, or colors directly in section Liquid. Always use section settings so merchants can customize without touching code.
{%- comment -%} Bad: hardcoded {%- endcomment -%}
<h2>Featured Products</h2>
{%- comment -%} Good: customizable via theme editor {%- endcomment -%}
<h2>{{ section.settings.heading }}</h2>
Mistake #3: Ignoring Accessibility
Shopify themes must be usable by everyone. Missing alt text, poor color contrast, and non-keyboard-navigable elements exclude users and hurt SEO.
Mistake #4: Loading Everything on Every Page
Only load section CSS and JavaScript when the section is actually present on the page. Global scripts should be minimal.
Mistake #5: Not Using Version Control
Use Git from day one. Shopify CLI integrates with Git, and version control saves you when things break. The Shopify experts network consistently recommends Git-based workflows for any theme project beyond a simple tweak.
| Best Practice | Beginner Mistake |
|---|---|
| Develop locally with CLI | Edit in Shopify's code editor |
| Use section settings for everything | Hardcode content in Liquid |
| Git commit before every deployment | Work without version control |
| Test on real mobile devices | Only check Chrome responsive mode |
| Lazy-load non-critical resources | Load everything globally |
Your Learning Path: What to Build Next
Shopify theme development for beginners has a clear progression. Here's the path from first section to confident theme developer:
- Week 1-2: Set up CLI, study Dawn's file structure, modify existing sections (change layouts, add settings)
- Week 3-4: Build 2-3 custom sections from scratch (hero banner, testimonials, FAQ accordion)
- Month 2: Create a complete alternative template (custom product page layout, landing page template)
- Month 3: Build a full theme from scratch using Dawn as reference, focusing on performance
- Ongoing: Take on client projects, contribute to open-source themes, explore advanced patterns (metafields, Storefront API, headless)
TechBuzzOnline's step-by-step guide has practical exercises for each of these milestones.
The Shopify theme ecosystem is one of the best places to build a career in web development right now — the demand far exceeds the supply of skilled developers. Every section you build, every template you create, and every performance optimization you implement adds to a portfolio that pays. Share your first theme with the Talk Shop community — we love seeing what beginners build.

About Talk Shop
The Talk Shop team — insights from our community of Shopify developers, merchants, and experts.
Related Insights
The ecommerce newsletter that's actually useful.
Daily trends, teardowns, and tactics from the top 1% of ecommerce brands. Delivered every morning.
