Shopify developer - custom stores, headless checkout, and app integrations

Shopify developer - custom stores, headless checkout, and app integrations

5.00/5 - (17 votes)
11 min read
Guide

Who: I am Mariusz Szatkowski, a senior developer building websites and shops since 2006, mostly on WooCommerce and Shopify. I work alone: the person who reads your brief writes the Liquid and the integration code.

What: Liquid themes on Online Store 2.0, headless storefronts on the Storefront API and Hydrogen, checkout customisation through Shopify Functions and checkout UI extensions where your plan allows them, ERP and carrier integrations, migrations, and cleaning up stores weighed down by apps.

Where: Remotely from Gdynia, Poland, for merchants in the UK, Ireland and the EU. I communicate by email, written documents and the repository.

How much: every project gets an individual quote after a written brief. Fixed price for a defined scope, time and materials for ongoing work. Prices are on the pricing page, not here.

Shopify developer for UK and Irish merchants

Shopify is hosted commerce: no PHP server to patch, but a theme, a set of apps and a checkout with firm rules. My work sits in that layer. I keep Liquid readable, make webhook consumers safe against duplicates and stop the checkout from breaking when marketing adds another tag.

You bring the graphic design and the wireframes, as a Figma file or a filled-in template showing which element goes where. I build them into a responsive Online Store 2.0 theme. If your content lives in WordPress, I can keep WordPress for editorial and Shopify for the catalogue, with one source of truth for products.

What to settle before building a Shopify store

Shopify ties catalogue, locations, markets, taxes, payments and fulfilment together. That works until someone tries to push a wholesaler’s logistics into Liquid. A sound project starts with a written list of markets, currencies, warehouses and returns rules.

For UK shops the usual stack is Shopify Payments (available in the UK and Ireland), PayPal, and a pay-later option such as Klarna or Clearpay, with Royal Mail, Evri or DPD for delivery. Selling across the Irish Sea is a VAT question since Brexit: for low-value goods sent from outside the UK, VAT is charged at the point of sale rather than at import (HMRC guidance). I configure the markets and price display; the classification itself comes from your accountant.

Before adding an app I check whether native sections, metaobjects or Shopify Flow already cover the need. Every app adds JavaScript, scopes and another thing that can break after a theme update.

What I do on a Shopify project

  • Metafields and metaobjects for size charts, spec sheets and compatibility tables, with validated CSV imports.
  • Online Store 2.0 sections that merchandisers can configure without touching templates that decide LCP.
  • Storefront API operations with cursor pagination and error handling for traffic spikes from campaigns.
  • Integrations that move orders to an ERP or warehouse through a queue with logs.
  • Checkout rules through Shopify Functions and checkout UI extensions, within what your plan allows.
  • Measurement of collection and product templates on the devices that feed CrUX, not only on a desktop.

The theme lives in a Git repository with history, and changes go to a development theme before the live one.

Liquid, GraphQL and webhook code examples

The patterns below are the ones I use: section settings merchandisers can edit safely, a bounded GraphQL read for collection grids, and a webhook handler that tolerates duplicate delivery.

Section schema (Online Store 2.0)

{% schema %}
{
  "name": "Featured collection",
  "tag": "section",
  "class": "section-featured-collection",
  "settings": [
    {
      "type": "collection",
      "id": "collection",
      "label": "Collection"
    },
    {
      "type": "range",
      "id": "products_to_show",
      "min": 2,
      "max": 12,
      "step": 1,
      "default": 4,
      "label": "Products to show"
    }
  ],
  "presets": [{ "name": "Featured collection" }]
}
{% endschema %}

Storefront API query with cursor pagination

Variables: handle (collection), first (page size), after (cursor).

query CollectionProducts($handle: String!, $first: Int!, $after: String) {
  collection(handle: $handle) {
    id
    title
    products(first: $first, after: $after) {
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        cursor
        node {
          id
          handle
          title
        }
      }
    }
  }
}

How to handle Shopify webhooks without duplicates

Shopify’s documentation says to use X-Shopify-Webhook-Id to deduplicate individual deliveries. Shopify allows five seconds for the request, so the handler only records the ID and enqueues the ERP export.

// Pseudocode: Node-style handler; answer within 5 s, do the ERP work in a queue
async function handleOrderCreate(payload, headers) {
  const webhookId = headers["x-shopify-webhook-id"];
  const orderId = payload?.id?.toString();
  if (!webhookId || !orderId) return { status: 400 };

  const dedupeKey = `orders/create:${webhookId}`;
  if (await cache.has(dedupeKey)) {
    return { status: 200, body: "duplicate ignored" };
  }

  await enqueueErpExport(orderId);
  await cache.set(dedupeKey, "1", { ttlSeconds: 86400 });
  return { status: 200 };
}

Bounded Liquid loop for collection grids

A hard limit and fixed image_url widths stop large catalogues from turning into heavy loops and oversized downloads on mobile.

{% assign cap = section.settings.products_to_show | default: 8 %}
{% assign collection = section.settings.collection %}
<ul class="product-grid" role="list">
  {% for product in collection.products limit: cap %}
    <li>
      <a href="{{ product.url }}">
        {{
          product.featured_image
          | image_url: width: 640
          | image_tag: loading: 'lazy', widths: '320,640,960'
        }}
      </a>
    </li>
  {% endfor %}
</ul>

How to add cart lines with the Storefront API

When your threat model calls for it, run the mutation from a server route or a React Router action in Hydrogen, so the storefront token does not ship in arbitrary browser bundles.

mutation cartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
  cartLinesAdd(cartId: $cartId, lines: $lines) {
    cart {
      id
      totalQuantity
    }
    userErrors {
      field
      message
    }
  }
}

Example variables:

{
  "cartId": "gid://shopify/Cart/YOUR_CART_ID",
  "lines": [
    {
      "merchandiseId": "gid://shopify/ProductVariant/YOUR_VARIANT_ID",
      "quantity": 1
    }
  ]
}

Liquid themes and Online Store 2.0

Online Store 2.0 replaced fixed templates with JSON templates built from sections, so merchandisers can rearrange pages in the theme editor. Stores still on older themes usually stay there because their layouts were built inside a page-builder app. I treat the move as a refactor: remove duplicate snippets, cap collection loops and give images fixed aspect ratios so dynamic merchandising does not cause layout shift.

Accessibility is part of the Liquid work: focus handling in the cart drawer, contrast on buttons, and announced stock messages. I work with the Shopify CLI against a development theme and keep the theme in Git, so every change has a history and a way back.

Hydrogen, Liquid or your own frontend

The Storefront API exposes the catalogue and cart through GraphQL, so a frontend can render products and change carts without Liquid. Hydrogen is Shopify’s React stack for that; its current template uses React Router 7 in framework mode and deploys to Oxygen, Shopify’s hosting for Hydrogen. Teams already on Next.js or Astro can call the Storefront API directly instead.

Headless is not faster by default. A React bundle carrying a dozen tracking tags loses to a lean Liquid theme. Before any rewrite I compare LCP on the same collection and product URLs, JavaScript weight, hosting cost and how editors will preview changes. If headless does not clear that bar, I improve the theme and cut apps instead.

Checkout customisation and plan limits

Shopify keeps checkout closed to arbitrary merchant JavaScript. Changes go through Shopify Functions (discounts, delivery and payment customisations) and checkout UI extensions. Two plan rules decide a lot of scoping, both from Shopify’s developer documentation:

  • Checkout UI extensions on the information, shipping and payment steps are available only to stores on Shopify Plus.
  • Custom apps that contain Shopify Function APIs need Shopify Plus; public App Store apps that include functions work on any plan.

So on a non-Plus store, a custom shipping rule usually means finding a public app built on Functions, or accepting the limit. I state this in the quote, before any code.

ERP and warehouse integration through webhooks

Orders often have to reach a central warehouse or a 3PL. Topics such as orders/create and inventory_levels/update need idempotent consumers, because a duplicate delivery or a bad SKU should not create a second pick or freeze a record in the ERP. I put a queue between Shopify and the ERP (Cloudflare Queues or AWS SQS, for example), keep a view of pending and failed events, and add a reconciliation job that compares stock in Shopify with the warehouse.

If you run WooCommerce today, the move can happen in stages: catalogue and payments on Shopify first, the old checkout switched off once webhooks are stable.

Performance and Core Web Vitals

Shopify serves the storefront from its own network, but the theme and the tags decide the field metrics. INP on phones is usually damaged by mega-menus, product carousels and review widgets loading too early. I profile the templates, defer or remove third-party scripts, and move tags server-side only where your privacy policy allows it.

I do not promise a conversion uplift. You get a measurement protocol and a list of the bottlenecks I removed, with before and after traces on the same throttling profile.

Migrations without losing search visibility

Moving platforms without a redirect map shows up as a wall of 404s in Search Console. I export old URLs, map each to its new handle with a 301, and check crawl errors after launch. Technical attributes move to metafields so collection filters survive. Product and Organization structured data match what the page actually offers.

How I work

  • Contract and invoice: B2B contract under Polish law with your company, invoiced under reverse charge with my EU VAT ID PL7393037445 where your business is VAT-registered in the EU. On request, an NDA and a data processing agreement under Art. 28 GDPR before I get access to customer data.
  • Communication: by email, written documents and the repository, so every decision can be read later. If you need a call, ask.
  • Review: each change goes to a development theme or staging store first, with a written note of what changed.
  • Design: you supply graphic design and wireframes; I implement them.

Tools and integrations

CategoryWhat I connect
PaymentsShopify Payments where your country is supported (UK, Ireland and most of the EU), PayPal, Klarna or Clearpay through Shopify’s payment settings.
DeliveryRoyal Mail, Evri, DPD or your 3PL through their APIs or Shopify apps.
ERP and stockAdmin API and webhooks, idempotent workers, inventory reconciliation.
AnalyticsGA4 and consent tools configured so nothing non-essential loads before consent.
Email marketingKlaviyo or a similar tool, loaded without blocking the storefront.
ContentWordPress or a headless CMS next to Shopify, with products held in one place.

If you are building a Shopify app and need help with its App Store listing, onboarding measurement and follow-up, that work is go-to-market engineering.

Experience and Shopify certificates

I have built websites since 2006. Next to WordPress and WooCommerce work, I have connected WordPress and WooCommerce stores with Shopify for clients in Poland and the UK. My Shopify Partner Academy course certificates, including Liquid Storefronts for Theme Developers and the Conversion Rate Optimization path, are published on Credly; the badges above link to them. These are course certificates, not a Shopify Partner agency status. Recommendations from clients are on LinkedIn and on the about page.

Shopify Academy credentials

How to start a Shopify project

Send me your store URL, the list of apps and integrations, and when your busy periods are. You get written questions where something is unclear, then a quote with the scope and the assumptions it rests on.

Explore other WordPress services and knowledge base

Strengthen your business with professional technical support in key areas of the WordPress ecosystem.

Recommendations from LinkedIn

Recommendations and reviews of working with WPPoland

Selected recommendations from WordPress, WordCamp and e-commerce leaders - with a focus on delivery on time, technical depth, and a business-driven approach to WordPress development.

Karolina Czapla

Karolina Czapla

Marketing Strategist, Performance & Digital Strategy

“Working with Mariusz on WordCamp has shown me how rare it is to combine deep technical skill with genuine leadership. He plans, coordinates and delivers with precision, while giving the team space to grow and contribute....”

Co‑organiser, WordCamp Gdynia 2024 & 2025

Anna Kamińska

Anna Kamińska

Talent Acquisition Specialist / HR People Partner

“Mariusz's portfolio speaks for itself. It reflects his precision, versatility and sense of responsibility. You can trust him to guide a project from idea to delivery, keep stakeholders informed and make sure things are d...”

Worked on the same team

Sarah‑Luisa Kwolek

Sarah‑Luisa Kwolek

IT Project Management & Product Owner, Web/App

“For over two years I could always rely on Mariusz to handle WordPress tasks calmly and professionally, from styling and templating to third‑party integrations. He brings steadiness to the team and keeps the frontend side...”

Mariusz was her client for WordPress work

Argert Boja

Argert Boja

Senior Full‑Stack Developer

“Mariusz is the teammate everyone hopes for: strong full‑stack WordPress skills, clear explanations and a positive attitude even under pressure. He moves easily between custom plugins, performance work and Gutenberg layou...”

Worked alongside Mariusz on WordPress projects

Varun Patil

Varun Patil

Growth & CRM Lead

“Beyond development, Mariusz understands SEO, analytics and growth. He talks directly with stakeholders, asks the right questions and ships solutions that move business metrics, from AMP to tracking to performance.”

Managed Mariusz on growth initiatives

Rafał Osiński

Rafał Osiński

Founder @ EasyTrips.pl, Senior WordPress Dev

“I've known Mariusz through the WordPress community for many years. He's reliable, deeply involved and consistently shows up, at meetups, WordCamps and in projects. If you care about long‑term collaboration and someone wh...”

WordPress community co‑organiser

Daniel Blossfeld

Daniel Blossfeld

Process Optimization & Digitalization Consultant

“I had the pleasure of working with Mariusz for almost three years. During that time, his WordPress development skills proved invaluable across a range of projects, from website builds to online member areas and even Shop...”

Mariusz was his client for WordPress work

Natalie Wiszczor

Natalie Wiszczor

CRM & E-Mail Marketing Manager

“I had the great pleasure of working with Mariusz for over 4 years in the technical field. During this time, he proved to be a competent and reliable colleague. What stood out in particular was his friendly nature and his...”

Worked with Mariusz on different teams

Mark Chalklen

Mark Chalklen

Head of Design & Build at Itineris Limited

“Mariusz is a great member of the team, always happy to get stuck into any task and happy to learn new things. A great communicator and all round nice guy to work with. Hard to beat on our weekly Strava leader board thoug...”

Managed Mariusz directly

Jessica Di Pasquale

Jessica Di Pasquale

Leading SEO initiatives with data-driven growth strategies.

“Mariusz is a very skilled, patient and expert guy. Always ready to help and to fix errors, I really appreciated working with him. He is such a great colleague!”

Managed Mariusz directly

Biki John

Biki John

Content Marketing Aficionado & SEO Enthusiast

“It was great to work with Mariusz. I really appreciated his extensive knowledge of WordPress and how that came in handy whenever I needed support navigating the CMS. I commend Mariusz totally for his patience, good natur...”

Worked with Mariusz on different teams

Rafal Borowiec

Rafal Borowiec

Software Developer, Consultant, Manager and Lecturer

“I had an opportunity to work with Mariusz for 7 months. He excels in technical optimization for search engines (SEO). Mariusz has also strong expertise in AMP development, GTM, and GA. Mariusz feels very comfortable with...”

Managed Mariusz directly

Belinda Koch

Belinda Koch

Web-Tracking Analyst at TUI

“Mariusz is a great person to work with. He is extremely motivated to learn new things and share his knowledge, and is very knowledgeable on a wide range of topics. We worked together on digital analytics and tracking top...”

Worked with Mariusz on digital analytics and tracking topics

Ali Nezamolmaleki

Ali Nezamolmaleki

Growth, SEO, Analytical thinking, AMP

“Mariusz is an extremely talented person in his field of work. He is always capable of giving a new perspective to solve problems and to think out of the box in situations where everything seems to be locked. Working with...”

Worked with Mariusz on the same team

Karol Jakubcewicz

Karol Jakubcewicz

Front-end / JavaScript Developer

“Mariusz is an incredibly experienced WordPress developer and SEO/SEM specialist I've had the pleasure to work with for almost two years. As a pilot of the team responsible for AirHelp's website development, he's been one...”

Worked with Mariusz on the same team

Paweł Lewczuk

Paweł Lewczuk

Front-end developer, WordPress developer

“I collaborated with Mariusz on several projects and our cooperation was always exemplary. I believe there are many more joint projects ahead of us. Highly recommended!”

Mariusz was Paweł's client

Przemek Wroblewski

Przemek Wroblewski

Software Developer with 20+ years of experience

“I found Mariusz as someone with great expertise and profound knowledge of frontend solutions. Powerful, knowledgeable and accountable WordPress developer. Has an easiness to build interpersonal relations with others. He ...”

Worked with Mariusz on different teams

Frequently asked questions

Questions about scope, delivery, pricing, and execution quality.

How much does Shopify development cost?#
I quote every job individually after reading your written brief: catalogue, markets, apps, integrations and busy periods. Tuning an Online Store 2.0 theme and building a headless storefront with an ERP sync are different jobs, so the quote states its assumptions and milestones. Fixed price works for a defined scope, time and materials for open-ended work. Send the brief through the contact page.
Do I need Shopify Plus?#
Often not. Basic, Grow and Advanced cover most theme, app and single-integration work, and Shopify B2B is available on those plans too, with features that depend on the plan. Plus becomes necessary for checkout UI extensions on the information, shipping and payment steps, and for custom apps that contain Shopify Functions. I tell you which of your requirements need Plus before you pay for it.
Can you improve Shopify performance without going headless?#
Usually yes, and it is the cheaper first step. Most of the gain comes from removing overlapping apps, bounding Liquid loops, serving correctly sized images and delaying marketing tags that hurt INP on phones. I measure collection and product templates before and after with the same throttling profile. Headless is worth it only when a measured gap remains after that work.
Should we adopt Hydrogen or stay on Liquid?#
Hydrogen is Shopify's React stack; its current template runs React Router 7 in framework mode and deploys to Oxygen. It fits when your team already works in React and wants Shopify's cart and data-loading patterns. Liquid fits when merchandisers live in the theme editor and the real problem is app weight. A third option is Astro or Next.js on the Storefront API. I decide on measured LCP and INP, preview needs and hosting cost.
How do you handle webhook reliability?#
Shopify can deliver the same webhook more than once, so every consumer I write deduplicates on the X-Shopify-Webhook-Id header and is idempotent on order and inventory keys. Shopify waits five seconds for a response and retries a failed delivery 8 times over 4 hours, then removes an Admin API subscription after 8 consecutive failures. That is why the handler only enqueues work and answers quickly, and failed jobs land in a dead-letter queue you can replay.
Will you take over a theme built by another agency?#
Yes. I start with a read-only audit on a copy of the live theme, list the files that touch cart, pricing and account templates, and put the theme in Git if it is not there yet. Changes go to a development theme first, and you approve them there. I suggest a rebuild only when the audit shows repairs would cost more.
Can you migrate us from WooCommerce to Shopify?#
Yes. Products, customers and orders are exported with attributes mapped to Shopify metafields, so filters and feeds keep their data. Every old URL gets a 301 to its new handle, and I watch Search Console for soft 404s after the DNS switch. Nobody can honestly guarantee rankings through a migration; the redirect map and the checks limit the loss.
Do you offer ongoing Shopify work after launch?#
Yes, billed by effort: theme releases, app reviews before your busy season, checks on connectors when Shopify versions the Admin API. I do not run a 24/7 desk and do not promise response or repair times. Work is reported in writing and in the repository.

Need an FAQ tailored to your industry and market? I can build one aligned with your business goals.

Let’s discuss

Related Articles