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
| Category | What I connect |
|---|---|
| Payments | Shopify Payments where your country is supported (UK, Ireland and most of the EU), PayPal, Klarna or Clearpay through Shopify’s payment settings. |
| Delivery | Royal Mail, Evri, DPD or your 3PL through their APIs or Shopify apps. |
| ERP and stock | Admin API and webhooks, idempotent workers, inventory reconciliation. |
| Analytics | GA4 and consent tools configured so nothing non-essential loads before consent. |
| Email marketing | Klaviyo or a similar tool, loaded without blocking the storefront. |
| Content | WordPress 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
Conversion Rate Optimization with Shopify Learning PathShopify Academy · 2025-08-05. Verify
CRO Overview and Best PracticesShopify Academy · 2025-08-05. Verify
CRO Analysis and OptimizationShopify Academy · 2025-08-05. Verify
CRO Implementation and TestingShopify Academy · 2025-08-05. Verify
CRO Targeting and PersonalizationShopify Academy · 2025-08-05. Verify
Marketing Your Shopify Services as a PartnerShopify Academy · 2025-08-16. Verify
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.







