000
Shahid Afrid
I am

Shahid Afrid

I build software that goes into production — and stays there.

Available for thoughtful work

Software developer in Bengaluru. Shopify themes and custom apps, AI agents on MCP, and the Node services behind them — currently for an industrial distributor in the UAE, across two stores in the UAE and Saudi Arabia.

Vision theme, build 23 · Datum redesign now live on creativeautomation.ae Tap any frame to enlarge
Storefront home page with part-number lookup and distribution index
Vision · part-number lookup
Three-level mega menu with categories, subcategories and brand counts
Three-level mega menu
Sensors collection page with subcategory tiles and part counts
Collection · subcategory tiles
Search results in grid view with metafield filters
Search · filters
Product page with breadcrumb trail, pre-order and pickup availability
Product · pre-order
Cart page with live carrier shipping estimate
Cart · live carrier rates
AI chat agent showing product results as a carousel inside the conversation
AI agent · in-chat results
What's up

About
me.

Based in
Bengaluru, India
12.97° N · 77.59° E
Local time
--:--
Currently
Creative Industrial Automation
since Dec 2025

I'm Shahid — a developer who gets excited about building something real and then keeping it running.

Day to day that's Shopify: 24 theme builds shipped to production on a 200,000-part industrial catalogue. The latest is Datum, a redesign of every customer-facing page that went live in September 2026 — following Vision, the ground-up rebuild before it. Around the theme sit custom Shopify apps I build in the Partner dashboard, Node services on Railway, an MCP-based AI shopping agent that searches the whole catalogue and checks out inside the chat, and the pages the company sells through: four brand landing pages on paid traffic, an AI product search page, and a free engineering toolkit.

I like the whole path — Liquid and front end, the API layer, deployment, and the debugging that only starts once something is live: bot traffic eating a search plan, an app injecting scripts it shouldn't, a proxy that needs fixing on a Friday. On my own time I ship products: an AI study platform, a form builder, a few ML pipelines. BCA from Nitte Meenakshi Institute of Technology, 2022–2025.

  • 01Shopify theme developmentLiquid · OS 2.0 · 24 builds
  • 02Custom Shopify appsPartner dashboard · APIs
  • 03AI agents & MCPClaude · tools · RAG
  • 04Services & deploymentNode · Express · Railway
  • 05Search, filters & trafficSearch & Discovery · bots

Projects

Not demos. Things people in Dubai and Riyadh use every day — plus a few of my own.

NameRoleYearServices
Datum theme redesign New · Live Every customer-facing page redesigned — homepage, mega menu, listing pages, PDP, filters — with every link and integration kept intact 2026 LiquidOS 2.0Search & DiscoveryJavaScript
24theme builds shipped — Datum is the one running nowOpen case study
Vision theme rebuild Shipped Ground-up rebuild of a 200,000-part storefront — new architecture, layout and design system; live until Datum replaced it 2026 LiquidOS 2.0JavaScriptMetafields
23the build that started over — full before and after insideOpen case study
TIA — AI Product Search New · Live A search page where buyers describe the part in plain words — or paste a part number or brand — and the AI matches it to the catalogue 2026 LiquidUI/UXAI agent
AIplain-language search · example prompts · saved parts listsVisit page
Shopify AI chat agent Live MCP architecture on Claude — search, cart and checkout inside the conversation 2026 ClaudeMCPShopify appPrismaRailway
200kproducts searchable in chatOpen case study
OTO shipping estimator Live Live carrier prices in the cart from hundreds of providers, credentials held server-side 2026 Node.jsExpressRailwayOTO API
9+carriers quoted live in the cart — one endpoint, credentials never leave the serverOpen case study
Catalogue architecture Live Metafield-driven category system behind 270+ collection pages, and the filter system now running on 120+ of them 2026 MetafieldsSearch & DiscoveryRapid SearchMatrixify
270+collection pages from one hierarchyOpen case study
Brand landing pages Live Quote-first pages for IFM, Siemens and SMC — including a second, standalone SMC Brand page — built for the company's paid traffic 2026 LiquidGoogle AdsPage templates
4brand pages, four identities — enquiries, not cartsOpen case study
Creative Automation Saudi Live Second regional storefront, launched May 2026 from the UAE theme; a new Saudi theme designed in September, two versions in review 2026 LiquidMatrixifyShopify CDN
2new theme versions in review · UAE redirects removedVisit site
The Toolkit New · Live Free maintenance and spares-planning workbook — seven working sheets, no login, opens in Excel or Google Sheets 2026 LiquidUI/UXExcel
7working sheets · one-click .xlsx downloadVisit page
Hydroair Live Storefront for a second company brand 2026 ShopifyLiquid
2ndcompany brand storefrontVisit site
Internal tooling Internal Custom apps and workflows that take routing, approvals and reporting off people's desks 2026 Shopify appsZohon8n
OpsCRM · Shopify · WhatsApp · SheetsInternal system
Tutorly Personal Multimodal AI study platform, built end to end 2025 ReactPythonAWS S3AssemblyAI
AInotes · flashcards · quizzes · audioVisit site
Forms.io Personal Form builder with a brutalist interface and response collection 2025 ReactTypeScriptSupabase
Formsbrutalist builder · live validationVisit site
ML pipelines Archive Three trained and deployed models from my internship year 2025 Pythonscikit-learn
MLcredit · handwriting · diseaseVisit site
24
Shopify theme builds shipped
200k+
products on the storefront I own
270+
collection pages from one hierarchy
120+
collection pages on the new filter system
4
brand landing pages live
4,974
broken image URLs found & fixed
3
storefronts live · UAE & Saudi
0
secrets exposed to the browser
Process

The work
behind the work

Every system I've shipped followed the same four moves. The last one is the one most portfolios leave out.

01

Understand

What the buyer actually does. Procurement engineers search by part number, not by browsing — so the search has to meet them there.

02

Structure

Put the shape in data, not in templates. A category is a metafield; adding one shouldn't need a deployment — and a redesign shouldn't need a re-tag.

03

Build

Small services with one honest job each. Secrets stay server-side. Everything gets a mock mode so it can be built without touching production.

04

Run

Production is where the real bugs live: token loops, security blocks, broken image URLs, bot traffic draining a search plan. I stay on the thing after it ships.

My toolbox

Tools I reach for

Shopify Liquid Online Store 2.0 Theme architecture Custom Shopify apps Metafields Search & Discovery Rapid Search Storefront API Admin REST API App proxies Theme app extensions Matrixify Third-party app integration TypeScript JavaScript React Next.js Tailwind CSS CSS architecture Responsive UI/UX Accessible UI Node.js Express Python FastAPI REST design OAuth & tokens Webhooks SSE streaming Prisma Caching & rate limiting SQL Claude API MCP servers Agent architecture Tool design Prompt design RAG Claude Design OpenAI Gemini Railway Vercel AWS S3 Docker CI/CD Git Secret management Bot & traffic mitigation robots.txt & rate limits PostgreSQL MongoDB Supabase PostHog Linux
Full track record · Notion

Every project, feature and working day — documented.

The complete, linked record behind this page: projects, every feature shipped with its impact and screenshots, and a dated daily log from December 2025 to now.

6 projects40+ features shippedDaily logUpdated Sep 2026
Track record

What I shipped

Real changes on live systems, with the number attached. Newest first — December 2025 to September 2026.

Datum themeSep 2026
Datum redesign, live in production

New homepage — hero, business stats, brand logos, parent categories, trending products, case studies, customer reviews — plus the mega menu, navbar, footer, subcategories, listing pages and PDP, all redesigned with every existing link and integration kept intact. Tested across desktop and mobile.

now the live theme
24th build
New pageSep 2026
TIA — AI Product Search page

Buyers describe the part in plain words, or enter a part number or brand, and the AI searches the catalogue for a match. Ask-TIA input, example prompts, parts-list saving with login, and a direct line into the chat agent with new and previous chats.

live · /pages/tia
New pageSep 2026
The Toolkit — free maintenance and spares workbook

Content, design and download flow for a seven-sheet Excel workbook: downtime cost calculator, machine risk map, critical spare score, spares register, planned maintenance planner, KPI scorecard and emergency log. No registration, email or login; opens in Excel and Google Sheets.

7 sheets · no login
Filters & searchSep 2026
New collection filtering system

Built on Shopify Search & Discovery — brand, series, dimensions, mounting type, price, accessory type, depth — with a redesigned search-results filter bar, clear active-filter and clear-all states, row and tile product views, and the Rapid Search snippet integration fixed.

120+ collection pages
Traffic & securitySep 2026
Bot traffic cut out of search usage

Rapid Search sessions were running out. Traced it to heavy US bot traffic, worked with the vendor to exclude bots and reset the plan to real traffic only, then added robots.txt rules, rate limits and session timeouts against bot and data-centre traffic.

plan reset
accurate counts
Brand pagesSep 2026
SMC Brand page, and the distributor page refined

A second SMC page with a completely different layout from the distributor page, built in SMC's blue, white and black — hero, product imagery, industry applications, technology highlights, enquiry sections. The distributor page reworked in the same pass; both tuned for mobile, SEO and enquiries.

4th brand page
Saudi storefrontSep 2026
New Saudi theme, two directions

Landing page, header, logo, navigation, category and product-range sections on Shopify CDN imagery; image-loop rendering bugs fixed, and invalid links and UAE redirects removed for products not yet sold in KSA.

2 versions in review
Brand pagesSep 2026
Siemens page redesigned and redeployed

Layout rebuilt, sections removed and added, product images and Enquiry buttons integrated, mobile and desktop tuned, pushed live.

live · enquiry-led
Cart · shippingSep 2026
Shipping calculator restored

The cart's shipping estimate diagnosed and fixed, with updates to the Railway proxy integration and a tidier cart UI in the same pass.

live rates back
Third-party appsSep 2026
Pre-order app injection fixed

Worked with Globo's support team to resolve a JavaScript injection that broke the Pre-Order button, and cleared the Add to Cart and Enquiry glitches around it.

vendor issue closed
Store settingsSep 2026
Pickup moved to Ajman

Store location switched from Al Qusais to Ajman, with pickup availability on the product page configured to match.

Ajman pickup on PDP
Vision theme
Complete storefront rebuild, from scratch

A new theme with its own layout, navigation model, type system and component set — replacing the theme the store had been running on. Reviewed internally, approved and pushed live within days.

23rd build
succeeded by Datum
Vision theme
Part-number-first search and lookup

A dedicated lookup that matches manufacturer part numbers, SKUs and titles across the whole catalogue, with brand narrowing and a filter rail on results.

25,001 indexed parts
Vision theme
Three-level mega menu

Category → subcategory → brand, with live part counts at every level, driven by the same metafield hierarchy that powers breadcrumbs and filters.

9 groups · 451 lines
Cart · shipping
Live carrier rates in the cart

Express service on Railway quoting OTO's carrier network by delivery city, with COD surcharge shown separately and the refresh token never leaving the server.

rates from AED 10.00
Catalogue
Metafield-driven collection hierarchy

Parent–child collections resolved from a custom.parent_collection chain — subcategory cards, breadcrumbs and filtering rendered automatically, no per-collection hardcoding.

270+ collection pages
120+ subcategories
Catalogue
Large-catalogue import and image repair

~40,000 products imported file by file; broken imagery traced to unstable Google PageSpeed URLs in the CSV, 4,974 corrected and re-imported via Matrixify.

4,974 URLs fixed
AI chat agent
Storefront API token handling rebuilt

A production-only 401 loop with cart failures and domain leakage behind it. Legacy OAuth logic replaced with the official Admin REST flow, with proper refresh and validation.

401 loop cleared
AI chat agent
Production deployment and Shopify security resolution

Shopify blocked the app as a security threat in production. Proxy reconfigured, every error cleared, deployment stabilised across devices.

live 21 Feb 2026
AI chat agent
Product search overhaul

Broad full-catalogue query first, retries on simplified queries, multi-level fallback, SKU exact-match ranking, vendor inference. Redundant layers removed.

fewer zero-result queries
Catalogue
Advanced metafield filters

Filters across collection pages with Rapid Search; resolved filter-definition conflicts with both vendors' support and secured a custom plan sized for 200k products.

200+ collection pages
Vision theme · SEO
Dynamic breadcrumb system

Breadcrumbs auto-generate the deepest category path from chained metafields across every product and collection page. Shipped 30 May 2026.

zero per-product setup
Catalogue
AODD pump catalogue structure

Full range mapped across size (¼″–3″), material and diaphragm variant with mappings, breadcrumbs, mega-menu entries and filters.

60+ collection pages
AI chat agent
Canonical product-URL handling

The agent can only surface canonical Shopify URLs — hallucinated and broken product links removed entirely.

no fabricated links
AI chat agent
In-chat add to cart and checkout

Reliable cart and checkout inside the conversation with token refresh and validation; session state covers new/end chat, history hydration and email capture.

cart + checkout in chat
AI chat agent
Model upgrade and prompt refinement

Upgraded the Claude model and rewrote system prompts — fewer empty or wrong results on multilingual and ambiguous queries.

multilingual queries
Landing pages
IFM, Siemens and SMC distributor pages

Quote-first landing pages for three manufacturer lines, each with its own identity: product families with sub-type chips, part-number-led cards, anchored section navigation on the long IFM page, and an honest "supplied to order" section on Siemens. All three receive Google Ads traffic.

3 brand pages
27 families
Saudi storefront
Saudi launch and IFM distributor landing page

Second regional storefront launched from the UAE theme in May 2026; its IFM page built and optimised by hand to match a required design and content structure.

43 images · 15 sections
Analytics
PostHog integration

Page views, session duration, paid traffic and behaviour across a site that previously had no analytics.

site-wide analytics
SEO
SEO structure work

Single H1 per template, ALT text on every collection image, SEO content on ten IFM collection pages, related products from the deepest collection.

ALT text on 270+ pages
Vision theme
Pre-order system

Dedicated cart page, pre-order buttons with lead times, stock badges and counts, and a warning that fires only on mixed carts.

mixed-cart logic
Vision theme
Product page rebuild

Bigger specifications panel, SKU + brand line linking to the vendor collection, tariffs & fees tab, larger imagery, related products from the same subcategory.

~30% larger imagery
Career

Experience

Dec 2025 — present · Remote, UAE team

Software Developer — Shopify & AI

Creative Industrial Automation
  • Sole developer on a 200,000-product Shopify storefront: 24 theme builds shipped to production — Vision, a ground-up rebuild, then Datum, a full redesign live since September 2026.
  • Own theme architecture, category structure, navigation, filters, search, pre-orders, product and cart templates, and SEO — written in Liquid, JavaScript and CSS. Rebuilt collection filtering on Shopify Search & Discovery across 120+ collection pages.
  • Build custom Shopify apps in the Partner dashboard and the Node services behind them, deployed on Railway.
  • Designed, built and deployed an MCP-based AI shopping agent as a Shopify Dev Dashboard app on Claude — theme app extension, app proxy, Shopify Storefront and Customer MCP servers, Prisma/Postgres, Dockerised on Railway — and the TIA AI Product Search page that fronts it.
  • Built the OTO shipping-estimate proxy so buyers see live carrier prices in the cart, credentials held server-side, and keep it running.
  • Launched a second regional storefront for Saudi Arabia and designed its new theme; built four brand landing pages (IFM, Siemens, SMC Brand, SMC Distributor) and a free engineering toolkit page.
  • Traced bot traffic draining the search plan and shut it out with the vendor, robots.txt, rate limits and session timeouts; resolved third-party app issues directly with vendor support.
  • Deployment, production debugging, PostHog instrumentation, Google Ads audits, and internal automation where it saves the team real time.
2024 — 2025 · Internships

Earlier experience

Machine Learning Engineer · CodeAlphaMar — May 2025
Frontend Developer · CodeAlphaSep — Oct 2024
Full-Stack Developer · SmartED InnovationsMar — Jul 2024
2022 — 2025 · Bengaluru

Bachelor of Computer Applications

Nitte Meenakshi Institute of Technology
All projects
Case study · 01

A second full redesign, live without breaking a link

Vision rebuilt the store from zero. Datum, the build after it, redesigned every surface a customer touches — homepage, mega menu, listing pages, product page, filters — while every existing link, integration and third-party app kept working underneath. It went live on creativeautomation.ae in September 2026.

Role
Sole developer — design, build, test, deploy
Stack
Shopify Liquid, OS 2.0, Search & Discovery, Rapid Search, vanilla JS
Status
Live since September 2026 · build 24
Links
Live · Collection · Search

The constraint: nothing underneath moves

By the time Datum started, the store was carrying a lot that customers never see: the cart's live shipping estimate on its Railway proxy, the AI chat agent's mount point, a pre-order app, Rapid Search on the results page, analytics, and hundreds of links pointing into the mega menu and collection tree. A redesign that broke any of those would have cost more than it delivered.

So the brief I set was narrow on one side and wide on the other: change every surface, keep every connection. The metafield hierarchy, the collection tree and every URL stayed exactly where they were; the design on top of them was redone from the homepage down.

A redesign is only safe when the thing underneath it doesn't move.

Filters first

Before touching the look of anything, I rebuilt how buyers narrow a catalogue this size. The new collection filtering runs on Shopify Search & Discovery — brand, series, dimensions, mounting type, price, accessory type and depth — and now sits on 120+ collection pages, for example Electrical Automation Cables.

The search-results filter bar was redesigned alongside it: tighter spacing and alignment, visible active-filter states, a working clear-all, and the same layout on desktop and mobile. Product grids got two modes — horizontal rows for scanning SKUs, tiles for browsing — and I explored several layout concepts in Claude Design before committing any of them to Liquid. A broken Rapid Search JavaScript snippet on the results page was fixed in the same stretch.

Every surface, redesigned

  • Homepage. A new hero with key business stats, a brand-logo band, parent categories with their own navigation, and redesigned Trending Products, Case Studies and Customer Reviews sections.
  • Mega menu. Redesigned for spacing, hierarchy and click behaviour, with every existing link and the navigation structure left intact — then its logic and hierarchy fixed again after launch.
  • Navbar and footer. The Datum visual style, same links, same integrations.
  • Collection subcategories. Clearer visual hierarchy, product counts, alignment and responsive behaviour.
  • Listing pages and PDP. Product layouts, specifications, breadcrumbs, descriptions and related products refined; image overflow, Pre-Order button placement, and Add to Cart and Enquiry glitches caused by app injection all fixed.

How the month went

  • Days 1–3New filter system, search-results filter bar and product grid concepts; UI/UX fixes across collection, search, listing and product pages; mobile and desktop validation.
  • Days 4–5SMC Brand page built and SMC Distributor refined; Siemens page redesigned and deployed; Globo Pre-Order injection resolved with their support team.
  • Days 6–7Mega menu, navbar, footer, subcategories, listing pages and PDP redesigned in Datum; homepage rebuilt section by section and put up for review.
  • Day 8Cross-device testing and bug fixing; Saudi redesign begins.
  • Days 9–17Saudi theme in two versions; cart shipping calculator fixed; pickup moved to Ajman; bot traffic traced and shut out; post-launch fixes to templates, mega menu logic and hierarchy.
  • Day 18TIA AI Product Search and The Toolkit pages designed, written and launched.

Running it

The redesign went live, and then the unglamorous part started. Rapid Search began reporting that the plan's session limit had been exceeded. The traffic analysis showed why: a large volume of bot traffic from the USA, each bot visit counted as a search session. I took it to Rapid Search's support and technical team, had bot traffic excluded and the plan reset to count real visitors only, and then closed the door on the site's side with robots.txt rules, rate limits and session timeouts aimed at bot and data-centre traffic. Filters and search results now show accurate counts again.

  • Cart shipping calculator. Broke, was traced and fixed — including updates to the Railway proxy integration and a cleaner cart UI.
  • Third-party app conflicts. Globo Pre-Order's script injection was misplacing and breaking the Pre-Order button; resolved together with their support team.
  • Pickup location. Switched from Al Qusais to Ajman, with pickup availability on the product page configured to match.
  • Template and rendering bugs. Product-page template issues and product rendering bugs cleared as they surfaced after launch.

Shipped alongside

TIA — AI Product Search gives the chat agent a page of its own: a buyer describes the part in their own words, or types a part number or brand, and the AI searches the catalogue for a match. Example prompts — proximity sensors, safety switches, Bonfiglioli gearboxes — show what it's good at; parts lists save with a login, and the linked chat keeps new and previous conversations.

The Toolkit is a free Excel workbook for maintenance and spares planning — downtime cost calculator, machine risk map, critical spare score, spares register, planned maintenance and spares planner, KPI scorecard and emergency log. No registration, email or login; it opens in Excel and Google Sheets. It gives an engineer a reason to come to the site that isn't a purchase yet.

Next case study
Vision theme rebuild — the build before it
All projects
Case study · 02

A storefront rebuilt from zero, live in days

Twenty-two theme builds in, I stopped patching and started over: new architecture, new layout, new design language. The company saw it and asked for it live as soon as possible. It ran as creativeautomation.ae's theme until Datum, the next build, replaced it in September 2026.

Role
Sole developer — design, build, deploy, maintain
Stack
Shopify Liquid, OS 2.0, vanilla JS, metafields
Theme
shxhid-theme-23-New-Vision — succeeded by Datum
Links
Live store (now Datum) · Pre-Vision theme

Why rebuild instead of iterate

The store had been through twenty-two theme builds — mine, all of them — and each one made the previous layout a little more capable and a little more crowded. The catalogue had grown past 200,000 parts and 450 product lines, and the interface was still shaped around a much smaller store: a menu that didn't scale to three levels, collection pages that treated subcategories as an afterthought, a product page that buried the specification a procurement engineer came for.

So the twenty-third build was not an iteration. New grid, new type scale, new component set, a different information hierarchy, and a visual language of its own — monospaced technical labels against a heavy display face, orange as the only accent, hard edges instead of soft cards. Industrial, not e-commerce-generic.

The theme it replaced

Here is what the store looked like before. It isn't a bad storefront — it's a general-purpose e-commerce layout doing its best with an industrial catalogue. Hero panel with a slogan, a tabbed category picker, a "Trendy Products" carousel, and collection pages that lead with a marketing paragraph before anything you can click.

Two things in particular pushed the rebuild. The hero advertised 10M+ products and 20+ brands — numbers nobody could reconcile with the catalogue, and a buyer who searches a part number and finds nothing trusts the site less for having claimed them. And the browsing model assumed discovery: tiles, trending, best sellers — with nothing on the page that accepted a part number first.

Previous theme home page with a large hero heading, description, browse button and four statistic cards claiming 10M+ products and 20+ brands
Before · home A slogan, a generic search box and four claim cards. Nothing on this screen accepts a part number as its first move.
Previous theme category picker with a vertical tab list and a nine-tile grid of category images
Before Category tiles, no counts
Previous theme Trendy Products section with best seller badges and view details cards
Before "Trendy Products" carousel
Previous theme IFM Electronic collection page with a read-more marketing paragraph above 8017 products and a filter sidebar
Before Copy above the products
Previous theme Pneumatics collection page with four subcategory tiles and a brand and actuator type filter sidebar
Before Subcategories, sparse rows

What did carry across untouched was the part that lives in data rather than in templates: the metafield hierarchy, the subcategory relationships and the filter definitions. The redesign is a new front end on the same spine — which is exactly why it could ship in days rather than months.

And after

Home page: industrial product categories heading, part number lookup field, and a distribution index panel showing 25,001 parts and 451 collections
After · home The same page in the Vision theme: a part-number field as the primary action, and a distribution index carrying the real indexed count, the stock location and the support hours.
A distributor's home page has one job: get someone with a part number in their hand to that part.

Navigation that survives 451 product lines

The mega menu resolves three levels — category, subcategory, brand — with live part counts at every level, all of it read from the same custom.parent_collection metafield chain that drives breadcrumbs and filters. Nothing in the menu is hardcoded, so a new subcategory appears the moment its collection exists.

Three-panel mega menu: category column, subcategory column, and a brand panel showing photoelectric sensors by manufacturer with counts
Mega menu Category → subcategory → brand, with counts pulled live rather than maintained by hand.

Collection pages that explain themselves

Every collection leads with its subcategories as image tiles with part counts, then a status bar — total parts, in stock, pre-order, no stock — then the products, in a grid or a dense list the buyer can toggle. The list view is the one procurement people actually use: SKU, brand, type and price on one line, add to cart or enquire without leaving the page.

Sensors collection page with seven subcategory tiles each showing a photo and part count
Tiles Subcategories with counts
Product grid with stock rails, SKU, brand, price excluding VAT and add to cart buttons
Grid Stock rail, SKU, price
Dense list view of the same collection with SKU, title, pickup information, type and price per row
List view The dense mode — one part per row, with pickup lead time and the part's type visible before the click.

Product page and cart

The product page opens on the breadcrumb path the metafield chain generated, the SKU and brand as a linked line, and the specification panel enlarged. Pre-order items carry their lead time next to the button rather than in fine print, and pickup availability resolved against the store's pickup location — Al Qusais at the time, since moved to Ajman. Related products come from the deepest collection the part belongs to, not from a generic "you may also like".

Product page for an IFM magnetic-inductive flow meter with pre-order badge, sale price, lead time and pickup availability
Product Pre-order with lead time
More in Flow Sensors section showing eight related products from the same subcategory
Related From the deepest collection

Search built for part numbers

Search states what it did — how many results, across how many indexed part numbers — and offers brand narrowing immediately, which matters when a query like ifm hits four vendor spellings at once. The filter rail is metafield-driven: brand, series, cable length, mounting type, whatever that category actually has. Both result views are available here too.

Search results for ifm in list view, showing narrow-by brand chips and a filter sidebar
Results Narrow-by chips
Same search results in grid view with the brand, series, cable length and mounting type filters
Filters Per-category attributes

Getting it live — and what came next

The theme was shown internally, approved, and pushed to production days later — the company wanted it live as soon as they saw it. The previous build stayed on the store, unpublished, which made the switch reversible on the day and makes the comparison easy to run now: open the pre-Vision theme in preview and put it next to the screenshots above.

Everything downstream came with it: the cart's live shipping estimate, the AI chat agent's mount point, PostHog, the pre-order system, and the breadcrumb and filter architecture that the previous twenty-two builds had grown. That same spine is what let the next build, Datum, redesign every page again in September 2026 without moving a single link.

Next case study
OTO shipping estimator
All projects
Case study · 03

Shipping prices in the cart, without shipping the credentials

Buyers on creativeautomation.ae couldn't see delivery cost until they were inside checkout. Fixing that meant calling a carrier aggregator from a Shopify theme — exactly the thing you cannot safely do.

Role
Sole developer
Stack
Node.js, Express, Railway, OTO API, Liquid
Status
In production · maintained through two theme changes
Links
Live cart · Source

The problem

OTO aggregates delivery providers across the Gulf. Its delivery-fee endpoint authenticates with a long-lived refresh token exchanged for a short-lived access token. A Shopify theme is public JavaScript — anything the cart page can read, a customer can read — so calling OTO from the storefront would have published the account's credentials.

The alternative was what the store was already doing: leave shipping until checkout, and lose the carts that were price-sensitive about it.

The theme should be able to ask one honest question and get one honest answer, without ever holding a secret.

What I built

A small Express service on Railway between the storefront and OTO, exposing one public endpoint: POST /api/shipping-estimate, taking a destination city, a chargeable weight and an optional order total. It returns a flat list of carrier options with price, ETA and logo.

Everything sensitive stays server-side. The refresh token lives only in Railway's environment — never in the repo, a commit, or a log line. The service exchanges it for a one-hour access token, caches it in memory, refreshes proactively around the 55-minute mark, and retries once if OTO returns a 401 or 403 mid-request.

The parts that matter in production

  • CORS allow-list so only the store's own domains can call the endpoint.
  • Two layers of rate limiting — 30 estimate requests a minute, plus a 120/min baseline across all routes, health check exempt.
  • Short response cache, because ten shoppers in Riyadh with a two-kilo cart should not be ten calls to OTO.
  • Timeouts and bounded retries upstream, so a slow carrier API degrades into a missing estimate rather than a hanging cart.
  • Weight ceiling validated before the upstream call.
  • Mock mode returning canned carrier data with no token, so the widget can be built locally without touching production credentials.
  • Kept alive after launch. When the calculator broke in September 2026, I traced and fixed it — updating the Railway proxy integration and refining the cart UI in the same pass.

The cart side

The widget renders from the cart footer section. It reads /cart.js, converts line-item grams into a chargeable weight in kilograms, and posts that with the selected city. Carrier rows render with price, estimated window and — deliberately — the cash-on-delivery surcharge as a separate note rather than folded into the headline number.

Cart page with a line item, an estimate shipping panel with country and city selectors, and a list of carriers with prices in AED
In the cart Country, city and an optional postal code; the estimate sits beside the order summary rather than after it.
Carrier list showing Redbox, Aramex PUDO, J and T Express, Aramex, AJEX, Skynet, SMSA and Quiqup with prices, delivery windows and separate COD surcharges
Carrier rows Sorted by price, with the delivery window and the COD surcharge kept out of the headline number.

Where it stops

The estimate is display-only and labelled that way — rates are quoted by delivery city, the postal code is ignored, and Shopify still calculates and charges its own rate at checkout. This shows an indicative cost early, at the moment it decides whether the cart survives.

Next case study
Shopify AI chat agent
All projects
Case study · 04

An AI agent that can actually find one part in 200,000

A shopping agent is easy to demo and hard to keep alive. This one has been answering, searching and checking out on a live industrial catalogue since February 2026 — and since September it has its own search page.

Role
Sole developer — design, build, deploy, maintain
Stack
Shopify Dev Dashboard app, Claude, MCP, React Router, Prisma/Postgres, Railway
Live since
21 February 2026
Links
Live site · TIA page · Source

Architecture

It's a Shopify Dev Dashboard app, not a legacy custom app — OAuth session tokens, a theme app extension and an app proxy, with no permanent admin token anywhere in the system. The storefront half is a Liquid block plus chat.js injected into the theme; it posts to /apps/shop-chat/chat, Shopify's edge forwards that through the app proxy to a Dockerised React Router backend on Railway.

The backend opens two of Shopify's own MCP servers per session over JSON-RPC: Storefront MCP for catalogue search and cart, and Customer MCP for order history and returns behind a customer PKCE OAuth flow. Tools are discovered with tools/list and handed to Claude as available tools; when Claude calls one, the backend dispatches to the right MCP server and streams the result back over SSE as a typed event — product_results, cart_updated, end_turn. Postgres via Prisma holds sessions, conversations, messages, visitors, leads and analytics.

Chat agent opening panel with four suggested prompts including search by SKU or model number
Opening state Four suggestions written for how this catalogue is actually searched — application, category, and straight SKU lookup.
Everything the shopper sees is a theme app extension. Everything that holds a secret is on Railway. The app proxy is the only door between them.

Search on a catalogue this size

The first version asked the model to guess — which fails the moment a buyer types a partial SKU shared by four hundred other parts. I rebuilt search to query the Storefront API directly with a strategy: broad full-catalogue query first, an intelligent retry on a simplified query, then a multi-level fallback. SKU-shaped input is detected and ranked by exact match; a brand name in the query infers a vendor filter. The same pass deleted a redundant search layer and unnecessary API calls that were adding latency to every message.

Chat agent showing a horizontal carousel of AODD pump results with prices, a summary message, and the session menu open with new chat, previous chats and end chat
Results A scrollable carousel across body material and size, and a follow-up that offers to narrow rather than dumping the whole range.
The agent can no longer invent a product link. It only returns canonical Shopify handles — so a wrong answer became a missing answer instead of a broken page.

The production-only failures

  • A Storefront token 401 loop. Token logic had been written against a legacy OAuth flow. Rebuilt on the official Admin REST flow with proper refresh and validation, which also cleared the cart failures and domain leakage behind it.
  • Shopify blocking the app as a security threat. Reconfiguring the app proxy and correcting the request path cleared every security error.
  • Cart operations failing silently. Add to cart and checkout now run inside the chat, against the Storefront GraphQL API directly — cartCreate and cartLinesAdd — with validation on each call.
  • Shop domain resolution. App-proxy requests are same-origin, so there is no Origin header to read, and the MCP endpoints only accept the *.myshopify.com domain — a custom domain fails outright. The backend resolves the shop from the proxy's own ?shop= parameter first, then falls back to the header and an environment variable.

Conversation and interface

Session handling covers new chat, end chat, history hydration without duplicate threads, and email capture so a conversation that doesn't convert still becomes a lead — leads are stored per shop and visitors carry a fingerprint and UTM trail. Product results render as a carousel with a modal detail view; the input auto-expands; a multi-phase indicator shows what the agent is doing rather than spinning at the user.

Product detail modal inside the chat showing a Schmersal proximity sensor with price, description, view on store and add to cart buttons
Detail modal Opened from a result card — full title, price, description, and the two things a buyer wants next: the canonical product page, or the cart.

Later I upgraded the Claude model and rewrote the system prompts for cleaner tool queries and better instruction-following, which noticeably reduced empty and incorrect results on multilingual and ambiguous questions — a real requirement for a Gulf storefront.

A front door: the TIA page

A chat bubble in the corner only helps the people who notice it. In September 2026 I built TIA — AI Product Search, a full page that puts the agent's capability up front. A buyer describes what they need in plain words, or enters a part number or brand, and the AI searches the catalogue to match parts to the application. The Ask-TIA input comes with example prompts — proximity sensors, safety switches, Bonfiglioli gearboxes — parts lists save against a login, and the linked chat keeps new and previous conversations.

The agent is also still mounted on every page of the live store, bottom right. Open it and ask for a part number.

Next case study
Catalogue architecture
All projects
Case study · 05

Making 200,000 industrial parts findable

Procurement engineers don't browse. They arrive with a part number or a spec and leave if the site can't meet them there. This is the data architecture underneath every theme I've built for this catalogue — including two full redesigns that didn't have to re-tag a single product.

Role
Primary theme and front-end developer
Stack
Shopify Liquid, metafields, Search & Discovery, Rapid Search, Matrixify, PostHog
Since
February 2026, in production
Link
creativeautomation.ae

The structural decision

Two hundred thousand products can't be organised by hand, and a catalogue that grows every month can't be organised by template. So the category structure lives in data: every collection carries a custom.parent_collection metafield, and the theme walks that chain to render subcategory cards, breadcrumbs and filters.

That one decision is why 270 collection pages and 120 new subcategories could be added from a forty-thousand-product file without a new template, why breadcrumbs across the store auto-generate the deepest correct path with zero per-product setup, and why two complete theme redesigns — Vision, then Datum — could be dropped on top of it without re-tagging a single product.

Adding a category should be a metafield, not a deployment.

Finding things

Metafield-based filters first ran across 200+ collection pages with Rapid Search. Getting there meant diagnosing filter-definition conflicts with both Shopify and Rapid Search support, and securing a custom plan sized for a 200k-product limit. The AODD pump range shows what the structure buys: sixty-plus collection pages across size, material and diaphragm variant, all with working filters, breadcrumbs and mega-menu entries.

In September 2026 collection filtering moved to a new system built on Shopify Search & Discovery — brand, series, dimensions, mounting type, price, accessory type and depth — now live across 120+ collection pages, with a redesigned search-results filter bar, clear active-filter states and row or tile product views. Rapid Search still powers the search results page.

Search results with a metafield filter sidebar covering brand, series, cable length and mounting type
Filters Brand, series, cable length, mounting type — each one a metafield definition, not a hardcoded facet.

When the traffic isn't real

Search plans are metered by session, and in September the Rapid Search plan hit its limit. Traffic analysis showed heavy bot traffic from the USA being counted as real sessions. I worked it through with Rapid Search's support and technical team — bots excluded, plan reset to count real visitors only — and added robots.txt rules, rate limits and session timeouts on the store to keep bot and data-centre traffic out. Filter and result counts are accurate again.

The unglamorous half

  • Import. ~40,000 products loaded file by file to avoid duplicates. Broken imagery traced to CSV links pointing at unstable Google PageSpeed URLs — 4,974 corrected and re-imported via Matrixify.
  • Pre-orders. Cart drawer replaced with a dedicated cart page: pre-order buttons with lead times, stock badges and counts, and a warning that fires only on mixed carts. When the Globo Pre-Order app's script injection later broke the button, fixed with their support team.
  • Product pages. Larger specifications panel, SKU + brand line linking to the vendor collection, tariffs & fees tab, bigger imagery, direct route to a specialist, and pickup availability now pointed at the Ajman location.
  • SEO. One H1 per template, ALT text across 270+ collection pages, content on ten IFM collection pages, related products from the deepest assigned collection.
  • Measurement. PostHog across the site where previously there was nothing to look at — and traffic analysis that caught the bots.
Sensors collection page rendering seven subcategory tiles with part counts above the product grid
Rendered from the chain Every tile, count and breadcrumb on this page is resolved from metafields at render time.

What came out of it

A second storefront for Saudi Arabia launched from the same theme in May 2026 with regional details, a dual-office footer, redirects disabled so Saudi clicks stay on the Saudi site, and its own distributor landing page. In September it got a new theme of its own — redesigned landing page, header, logo, navigation, and category and product-range sections on Shopify CDN imagery — delivered as two versions for the company to choose between, with the remaining invalid links and UAE redirects removed for products not yet sold in KSA. A structure built to be reused turned out to be reusable.

Next case study
Brand landing pages
All projects
Case study · 06

Brand pages whose job is an enquiry, not a checkout

IFM, Siemens and SMC are quoted, not carted — part numbers, successor parts, lead times, panel-build BOMs. So the pages that receive the company's Google Ads traffic for those lines work nothing like the storefront they sit inside, and nothing like each other. There are four of them now: IFM, Siemens, and two for SMC.

Role
Sole developer — design and build
Stack
Shopify Liquid, custom page templates, Google Ads
Status
All four live · IFM, Siemens and SMC Distributor on paid traffic
Links
IFM · Siemens · SMC Brand · SMC Distributor

The brief

Someone clicking a Siemens ad is usually holding an MLFB article number. Someone clicking an SMC or IFM ad is usually holding a model string, or a specification they need help turning into one. Neither wants a product grid with add-to-cart buttons, and neither is served by a price that may not survive contact with a distributor quote. So on these pages there are no prices and no cart. Every card ends in an enquiry: Email for quote, WhatsApp, or an Enquiry button.

The storefront's job is a cart. These pages have a different job, and the design should stop pretending otherwise.

Siemens: article number first

Eight numbered product families — SIMATIC controllers, SIRIUS switching, SITOP power, SENTRON protection, command and signalling, industrial communication, motors and drives — each expanded into its own block with series chips underneath (S7-1200 / S7-1500, ET 200SP, 5SL MCBs, PAC3120 / PAC3200). The chips exist because that's the vocabulary the buyer arrives with; the ad keyword and the on-page label match.

Every card leads with the article number in monospace, above the name, above a one-line spec. That ordering is deliberate: the number is what gets matched against, so it goes first.

In September 2026 the page was redesigned and redeployed: layout reworked, sections removed and added, real product images and Enquiry buttons integrated throughout, and mobile and desktop tuned again. The screenshots below are from the version before that pass.

Siemens distributor landing page hero in teal with a supplier badge, headline, quote and WhatsApp buttons, and four product tiles labelled with article numbers
Siemens · hero Two contact routes and a line naming exactly what the page is good for: part numbers, BOMs, drawings and bulk enquiries.
SIMATIC controllers and I/O section with series chips and four product cards showing article numbers, names and quote buttons
SIMATIC Article number first
SENTRON protection and metering section with MCB and power monitoring cards
SENTRON Same pattern, per family

Saying what isn't in stock

The strongest section on the Siemens page is the one that admits a limit. Also supplied to order lists the families that aren't held in web stock but get sourced regularly for project and panel-build work — SIMATIC HMI, SINAMICS drives, SITRANS instrumentation, SCALANCE networking, ET 200, SIRIUS safety — each with an Ask for a lead time button rather than a fake availability badge.

Above it sits the part-number check: send an article number and get back availability, current pricing, and the correct successor where the original has been discontinued. Discontinuation is a real problem in this catalogue, and offering to resolve it is a better reason to make contact than a discount would be.

Part number check band with send your part list and browse catalogue buttons, above an also supplied to order grid of six product families each with an ask for a lead time button
Part list and lead times The page converts on a question the buyer already has, instead of on stock it doesn't hold.

SMC Distributor: the same pattern, a different vocabulary

SMC came first and set the template. The structure rhymes — a hero that names the enquiry route, a category strip, then one block per family with sub-type chips and cards ending in a quote action — but the content works at a different level. SMC parts are configured rather than looked up, so the cards describe types: ISO standard, compact, rodless, guided; one-touch, stainless, brass, push-in. The buyer picks the shape of the thing, then talks to a person about the exact model string.

The hero puts the sales address in a box as the primary action, with WhatsApp beside it, and labels it for what it's best at: part numbers, BOMs, drawings and bulk enquiries. Nine icon-led category tiles run across the top so a visitor who landed on a fittings ad can get to fittings without scrolling past cylinders. In September the page's design, content presentation, imagery and CTA sections were refined again alongside the new SMC Brand page.

SMC distributor landing page hero in deep blue with an authorized distributor badge, an email address in a box as the primary call to action, a WhatsApp button, and four product tiles
SMC · hero The enquiry address is the call to action — boxed, oversized, with the WhatsApp route directly beneath it.
SMC category strip of nine icon tiles above a pneumatic cylinders section with eight sub-type chips and four cards
Categories and families Nine tiles across the top, then each family expanded with its own sub-type chips — ISO standard, compact, rodless, guided, mini, stopper, rotary, grippers.
Solenoid valves section with eight sub-type chips and four cards each ending in email for quote and WhatsApp
Valves Type-level cards
Fittings and tubing section with sub-type chips and four cards
Fittings Same block, new content

The page closes on a trust band rather than another product grid — genuine product, distributor pricing, selection support, delivery, the customer base and the ISO certification, with the enquiry address repeated underneath. It's the last thing a visitor sees before deciding whether to write the email.

Closing band in deep blue with five checkmarked claims, a card showing 500+ industrial customers, an ISO 9001:2015 card, and the sales email repeated
Closing band Reasons to trust the supplier, then the address again — no second product grid, no newsletter box.

SMC, twice: the Brand page

The distributor page answers "can you quote this part?". The new SMC Brand page answers the question before it: "what does SMC make, and where does it fit?". So it was built with a completely different layout and visual direction from the distributor page — in SMC's own blue, white and black — leading with product imagery and hero sections, then industry applications and technology highlights, and only then the enquiry and CTA sections.

Both SMC pages were optimised together for responsive behaviour, real product images, enquiry and contact integration, SEO details and mobile layout, and validated after deployment.

IFM: the long one

IFM is the deepest of the brand pages and the page reflects it. Ten anchored sections — sensors, process sensors, IO-Link and communication, condition monitoring, vision and identification, safety, industrial communication, mobile machines, display and illuminate, IIoT, power and accessories — with a sticky anchor nav so a visitor who arrived on a condition-monitoring keyword can jump straight there instead of scrolling forty cards.

Each card carries a category image, an In stock badge, a one-line description and two capability bullets: Up to SIL 3 / PL e, Calorimetric & magnetic types, IP69K rated. That's the level of detail that decides whether a sensor is even a candidate, and putting it on the card saves the enquiry that only exists to ask it.

The enquiry band repeats between sections rather than sitting only at the bottom, because the page is long enough that a visitor may make their decision at section three. It closes on the same offer as Siemens: send a part number, a quantity or an application, get a quotation — with email named as the preferred route for accuracy and WhatsApp as the fast one.

See the IFM page — it's the clearest demonstration of the pattern at scale.

Four identities, on purpose

The storefront has its own look. Siemens is teal with a monospaced technical voice. SMC Distributor is deep blue with soft-cornered cards and a warmer one; SMC Brand is blue, white and black with a product-and-applications story. IFM runs on its own palette with image-led category cards and stock badges. A visitor arriving from an ad for one manufacturer should land somewhere that reads as that manufacturer's corner of the business, and should be in no doubt they've reached a page about that brand specifically rather than a general catalogue that happens to carry it.

All four are page templates inside the same Shopify theme, so the header, cart, chat agent and footer come along unchanged — and they carried straight through the Datum redesign. A new brand is a template and a palette, not a new build; where a brand deserves more, as SMC did, it gets a second page with its own layout.

Next case study
Datum theme redesign