[{"data":1,"prerenderedAt":740},["ShallowReactive",2],{"work-commerce":3},[4,120,208,321,411,505,575,665],{"id":5,"title":6,"anonymised":7,"architecture":8,"body":30,"client":90,"description":85,"extension":91,"featured":92,"headline":93,"industry":94,"meta":95,"metrics":96,"navigation":92,"order":106,"path":107,"practice":108,"role":109,"screens":110,"seo":111,"stack":112,"status":116,"stem":117,"url":116,"year":118,"__hash__":119},"work\u002Fwork\u002Fstarbucks.md","Starbucks' first Shopify store",false,[9,15,20,24],{"name":10,"items":11},"Storefront",[12,13,14],"Liquid foundation","Rewards experience","Account",{"name":16,"items":17},"Commerce",[18,19],"Shopify","Shopify Subscriptions",{"name":21,"items":22},"Apps",[23],"Custom rewards login app",{"name":25,"items":26},"Integrations",[27,28,29],"Third-party rewards system","External identity provider","Vendor integrations",{"type":31,"value":32,"toc":84},"minimark",[33,38,42,46,49],[34,35,37],"h2",{"id":36},"the-brief","The brief",[39,40,41],"p",{},"Starbucks was building on Shopify for the first time, with Inviqa as delivery partner. The team had no in-house Shopify experience, and the store needed to work with a third-party rewards system and offer coffee subscriptions.",[34,43,45],{"id":44},"what-we-did","What we did",[39,47,48],{},"Mark joined as Principal Tech Lead, owning the technical architecture and acting as the team's Shopify lead.",[50,51,52,60,66,72,78],"ul",{},[53,54,55,59],"li",{},[56,57,58],"strong",{},"Architecture and integration strategy."," Worked with Inviqa's CTO, product managers and the client's leadership team to scope requirements and define the integration approach for each third-party vendor.",[53,61,62,65],{},[56,63,64],{},"Design feasibility."," Reviewed design proposals against what Shopify can and can't do, so issues were found before build rather than during it.",[53,67,68,71],{},[56,69,70],{},"Foundations."," Built the initial project foundation in Shopify Liquid and helped the dev team get up to speed on the platform.",[53,73,74,77],{},[56,75,76],{},"Rewards."," Integrated a third-party rewards system into the storefront and built a custom rewards login app, coordinating with the external provider.",[53,79,80,83],{},[56,81,82],{},"Subscriptions."," Implemented a coffee subscription service using Shopify Subscriptions.",{"title":85,"searchDepth":86,"depth":86,"links":87},"",2,[88,89],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"Starbucks","md",true,"Technical architecture and Shopify leadership for the brand's first Shopify ecommerce build, including rewards and coffee subscriptions.","Food & Drink",{},[97,100,103],{"value":98,"label":99},"1st","Shopify build for the brand",{"value":101,"label":102},"Rewards","Third-party integration and custom login app",{"value":104,"label":105},"Subscriptions","Coffee subscriptions on Shopify Subscriptions",1,"\u002Fwork\u002Fstarbucks","commerce","Principal Tech Lead, via Inviqa (Havas)",[],{"title":6,"description":85},[18,113,19,114,115],"Liquid","Shopify Apps","TypeScript",null,"work\u002Fstarbucks","Dec 2024 – Nov 2025","PBkbt98CovAiwngqBXLS99qzUQeiaLyVZBZC2PENmTE",{"id":121,"title":122,"anonymised":7,"architecture":123,"body":143,"client":185,"description":85,"extension":91,"featured":92,"headline":186,"industry":187,"meta":188,"metrics":189,"navigation":92,"order":86,"path":199,"practice":108,"role":200,"screens":201,"seo":202,"stack":203,"status":116,"stem":205,"url":116,"year":206,"__hash__":207},"work\u002Fwork\u002Fgood-beams.md","In-store and online retail for Good Beams",[124,129,133,138],{"name":125,"items":126},"Channels",[127,128],"Online store","Physical store",{"name":16,"items":130},[18,131,132],"Supplements","drinks and merch",{"name":134,"items":135},"Services",[136,137],"Custom Shopify app","Backend middleware",{"name":139,"items":140},"Clinical",[141,142],"Prescription portal (Script Assist)","Consultations",{"type":31,"value":144,"toc":181},[145,147,150,152,155],[34,146,37],{"id":36},[39,148,149],{},"Good Beams is building a lifestyle brand for a UK pharmacy, aiming to normalise medical cannabis while meeting full regulatory compliance. Alongside a physical store, the brand needed an online shop for supplements, drinks and merchandise, and a clear path into a separate, regulated prescription journey.",[34,151,45],{"id":44},[39,153,154],{},"Working with Midnight, Stack Studio led the technical delivery.",[50,156,157,163,169,175],{},[53,158,159,162],{},[56,160,161],{},"Technical discovery."," Mapped the customer journey from landing page and eligibility check through to consultation and ongoing purchases, and set out which parts belonged in Shopify and which didn't.",[53,164,165,168],{},[56,166,167],{},"Keeping the flows apart."," Shopify handles retail products only; prescriptions run through a separate portal. That keeps the store within Shopify Payments' rules and keeps the regulated side where it belongs.",[53,170,171,174],{},[56,172,173],{},"Custom app and middleware."," Built a custom Shopify app and backend middleware so the store, the physical shop and the systems behind them work as one experience.",[53,176,177,180],{},[56,178,179],{},"In-store and online."," Planned the build so the physical store and the website share the same products and customers.",{"title":85,"searchDepth":86,"depth":86,"links":182},[183,184],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"Good Beams","Technical delivery for a medicinal cannabis brand's Shopify build, with a custom app and backend middleware connecting the shop floor and the website.","Health & Wellbeing",{},[190,193,196],{"value":191,"label":192},"2","Channels: physical store and online",{"value":194,"label":195},"Custom","Shopify app and backend middleware",{"value":197,"label":198},"Separate","Retail and prescription journeys kept apart","\u002Fwork\u002Fgood-beams","Technical delivery, via Midnight",[],{"title":122,"description":85},[18,136,137,204],"Script Assist","work\u002Fgood-beams","2025 – 2026","dJZ-RoWrgfqSJZPUWnK2_TiS8B308Yb1aZW_OwZLUSE",{"id":209,"title":210,"anonymised":7,"architecture":211,"body":240,"client":297,"description":85,"extension":91,"featured":92,"headline":298,"industry":299,"meta":300,"metrics":301,"navigation":92,"order":311,"path":312,"practice":108,"role":313,"screens":314,"seo":315,"stack":316,"status":116,"stem":318,"url":116,"year":319,"__hash__":320},"work\u002Fwork\u002Fhebtroco.md","Moving HebTroCo from WooCommerce to Shopify",[212,217,221,227,234],{"name":10,"items":213},[214,215,216],"Premium theme","Pre-order messaging","Delivery dates in basket",{"name":16,"items":218},[18,219,220],"Shopify POS Pro","Click & collect",{"name":222,"items":223},"Post-purchase",[224,225,226],"Loop Returns","Store credit","Exchanges",{"name":228,"items":229},"Operations",[230,231,232,233],"ShipStation","Metorik","Zendesk","Xero",{"name":235,"items":236},"Migration",[237,238,239],"Matrixify imports","301 redirects","Customer re-activation",{"type":31,"value":241,"toc":293},[242,244,247,249],[34,243,37],{"id":36},[39,245,246],{},"HebTroCo, a British clothing brand, had outgrown WooCommerce. A lot of its range is made to order, so the new store needed to handle pre-orders properly, alongside returns, point of sale and the tools the team already relies on.",[34,248,45],{"id":44},[50,250,251,257,263,269,275,281,287],{},[53,252,253,256],{},[56,254,255],{},"Discovery and data audit."," Reviewed the WooCommerce site and data, checked POS hardware compatibility and mapped every integration before building anything.",[53,258,259,262],{},[56,260,261],{},"Data migration."," Products, variants, categories, customers and recent orders moved across with Matrixify, including page-builder content rebuilt as Shopify metaobjects.",[53,264,265,268],{},[56,266,267],{},"Pre-purchase flow."," Variant-level pre-orders across three stock scenarios, production and delivery dates shown in the basket, and pre-order items kept separate from in-stock items at checkout.",[53,270,271,274],{},[56,272,273],{},"Returns with Loop."," A returns and exchange portal that can refund to store credit, so more returns turn into new orders.",[53,276,277,280],{},[56,278,279],{},"Operations connected."," ShipStation for fulfilment, Metorik for reporting, Zendesk for customer service and Xero for accounts.",[53,282,283,286],{},[56,284,285],{},"Point of sale."," Shopify POS Pro set up on the existing hardware, with staff training.",[53,288,289,292],{},[56,290,291],{},"A careful launch."," 301 redirects, a launch-day runbook with a 14-point go \u002F no-go gate, real-money smoke tests and a rollback plan.",{"title":85,"searchDepth":86,"depth":86,"links":294},[295,296],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"HebTroCo","A full migration from WooCommerce to Shopify, with pre-orders, returns and the brand's operations tools connected from day one.","Fashion, British-made clothing",{},[302,305,308],{"value":303,"label":304},"3","Pre-order stock scenarios handled at variant level",{"value":306,"label":307},"5","Operations tools connected: Loop, Metorik, ShipStation, Zendesk, Xero",{"value":309,"label":310},"14-point","Go \u002F no-go gate before launch",3,"\u002Fwork\u002Fhebtroco","Lead, Stack Studio",[],{"title":210,"description":85},[18,219,224,231,230,232,233,317],"Matrixify","work\u002Fhebtroco","2026","eceJb2c5nnFBWevHLrKrJi-zJz_NZ-enzcYNP_i3YwA",{"id":322,"title":323,"anonymised":7,"architecture":324,"body":343,"client":385,"description":85,"extension":91,"featured":92,"headline":386,"industry":387,"meta":388,"metrics":389,"navigation":92,"order":398,"path":399,"practice":108,"role":400,"screens":401,"seo":402,"stack":403,"status":116,"stem":407,"url":408,"year":409,"__hash__":410},"work\u002Fwork\u002Fbrimm.md","Membership, store credit and a Planet Fund for BRiMM",[325,330,335,339],{"name":10,"items":326},[327,328,329],"Membership tiers","Credit balance","Planet Fund messaging",{"name":331,"items":332},"Automation",[333,334],"Shopify Flow","Regios Discounts",{"name":21,"items":336},[337,338],"Store Credit app","Planet Fund app",{"name":340,"items":341},"Marketplace",[342],"ShipTurtle multi-vendor",{"type":31,"value":344,"toc":381},[345,347,350,352,355],[34,346,37],{"id":36},[39,348,349],{},"BRiMM is an environmental marketplace working with ethical brands, helping shoppers change how they buy. The store needed to connect multiple vendors, reward loyal members and show the impact of each order.",[34,351,45],{"id":44},[39,353,354],{},"Mark was responsible for the overall project and tech stack.",[50,356,357,363,369,375],{},[53,358,359,362],{},[56,360,361],{},"A pragmatic marketplace decision."," After trying a custom vendor integration, we moved to ShipTurtle for the multi-vendor layer. That freed the budget for the features that make BRiMM different.",[53,364,365,368],{},[56,366,367],{},"Tiered membership."," Built with Shopify Flow and Regios Discounts, so offers respond to what's in the cart and the team can adjust rules themselves.",[53,370,371,374],{},[56,372,373],{},"Store Credit app."," A custom Shopify app that accrues store credit, giving members in certain tiers extra benefits on repeat purchases.",[53,376,377,380],{},[56,378,379],{},"Planet Fund app."," Takes a set percentage of each order and contributes it to Planet Fund operations, helping brands build more sustainable businesses.",{"title":85,"searchDepth":86,"depth":86,"links":382},[383,384],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"BRiMM","A Shopify marketplace for ethical brands, with tiered membership and two custom apps for store credit and a sustainability fund.","Sustainable marketplace",{},[390,392,395],{"value":303,"label":391},"Core features: membership, store credit, Planet Fund",{"value":393,"label":394},"% \u002F order","Contributed to Planet Fund operations",{"value":396,"label":397},"Buy, not build","Marketplace layer via ShipTurtle",4,"\u002Fwork\u002Fbrimm","Tech Lead",[],{"title":323,"description":85},[18,114,333,334,404,405,406],"ShipTurtle","Node.js","GCP","work\u002Fbrimm","https:\u002F\u002Fwearebrimm.com","Feb – Dec 2025","epSQ8ULphyqZqq_dPMkGEnuXpueQqUFK9pFwNbC5WB0",{"id":412,"title":413,"anonymised":7,"architecture":414,"body":437,"client":478,"description":85,"extension":91,"featured":92,"headline":479,"industry":480,"meta":481,"metrics":482,"navigation":92,"order":491,"path":492,"practice":108,"role":493,"screens":494,"seo":495,"stack":496,"status":116,"stem":502,"url":116,"year":503,"__hash__":504},"work\u002Fwork\u002Fdbco.md","Native Shopify loyalty for premium fashion brands",[415,422,428,434],{"name":10,"items":416},[417,418,419,420,421],"Points dashboard","VIP tiers","Referrals","Ways to earn","Rewards carousel",{"name":423,"items":424},"Edge",[425,426,427],"Shopify App Proxy","HMAC verification","Endpoint allow-list",{"name":429,"items":430},"Runtime",[431,432,433],"Remix v2 + Prisma","Express","Cloudflare Worker",{"name":134,"items":435},[436],"Yotpo Loyalty & Referrals API v2",{"type":31,"value":438,"toc":473},[439,441,444,446,466,470],[34,440,37],{"id":36},[39,442,443],{},"DBCO is a Shopify-focused agency working with premium fashion and lifestyle brands. A client's loyalty programme ran on Yotpo's embedded widgets, which limited the design and UX the brand wanted.",[34,445,45],{"id":44},[50,447,448,454,460],{},[53,449,450,453],{},[56,451,452],{},"Loyalty as native sections."," Built the programme as 12 Shopify Liquid sections: points dashboard, four VIP tiers, a referral programme with social sharing, ways to earn, a redeemable product carousel, FAQs and member-only content. Customer data renders server-side and the brand controls the design.",[53,455,456,459],{},[56,457,458],{},"A secure App Proxy."," A Remix v2 and Prisma app proxies every Yotpo API call, with HMAC signature verification, endpoint allow-listing and server-side API keys.",[53,461,462,465],{},[56,463,464],{},"A reusable pattern."," The proxy also exists as an Express app and a Cloudflare Worker, so it can be deployed wherever suits the project.",[34,467,469],{"id":468},"also-at-dbco","Also at DBCO",[39,471,472],{},"Active development on Mina Baie's Shopify theme — 123 sections, 137 snippets, 65 templates and 32 locales — including a \"Pairs With\" recommendation system, cart-drawer cross-sells and complex collection filtering.",{"title":85,"searchDepth":86,"depth":86,"links":474},[475,476,477],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},{"id":468,"depth":86,"text":469},"DBCO","A Yotpo loyalty and referrals programme rebuilt as native Shopify sections, with a secure App Proxy for the API calls.","Fashion & Lifestyle",{},[483,486,489],{"value":484,"label":485},"12","Bespoke loyalty sections replacing widgets",{"value":487,"label":488},"4","VIP reward tiers",{"value":303,"label":490},"Proxy implementations: Remix, Express, Workers",5,"\u002Fwork\u002Fdbco","Tech Lead, Ecommerce",[],{"title":413,"description":85},[18,113,497,498,499,432,500,501],"App Proxy","Remix","Prisma","Cloudflare Workers","Yotpo API","work\u002Fdbco","Ongoing","LVVzVoNIedbVWDqkAhJc7ni5PucYvtPXa0XjVLKd1aM",{"id":506,"title":507,"anonymised":7,"architecture":508,"body":518,"client":551,"description":85,"extension":91,"featured":92,"headline":552,"industry":553,"meta":554,"metrics":555,"navigation":92,"order":565,"path":566,"practice":108,"role":400,"screens":567,"seo":568,"stack":569,"status":116,"stem":572,"url":573,"year":116,"__hash__":574},"work\u002Fwork\u002Fmyom.md","AI search visibility for MYOM Oat Drinks",[509,513],{"name":10,"items":510},[511,512],"Crawler-visible product data","Incremental theme edits",{"name":514,"items":515},"Insight",[516,517],"AI visibility dashboard","Phrase scoring",{"type":31,"value":519,"toc":547},[520,522,525,527],[34,521,37],{"id":36},[39,523,524],{},"MYOM delivers oat milk drinks in letterbox-sized packs. Their brand was disappearing behind competitors in AI-driven search.",[34,526,45],{"id":44},[50,528,529,535,541],{},[53,530,531,534],{},[56,532,533],{},"Measured it first."," Built a monitoring dashboard so the team could score phrases and words in AI search and see what was and wasn't working.",[53,536,537,540],{},[56,538,539],{},"Small, safe changes."," Made incremental edits to the Shopify store so the right data was visible to AI crawlers.",[53,542,543,546],{},[56,544,545],{},"An ongoing relationship."," MYOM were happy with the outcome and we continue to work together on improving the store.",{"title":85,"searchDepth":86,"depth":86,"links":548},[549,550],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"MYOM","Making a DTC Shopify store visible to AI search, with a dashboard to track which phrases perform.","Food & Drink, DTC",{},[556,559,562],{"value":557,"label":558},"AI","Visibility score improved",{"value":560,"label":561},"1","Monitoring dashboard for AI search phrases",{"value":563,"label":564},"Incremental","Store changes for AI crawlers",6,"\u002Fwork\u002Fmyom",[],{"title":507,"description":85},[18,113,570,571],"Structured data","Monitoring dashboard","work\u002Fmyom","https:\u002F\u002Fmyom.shop","ENJ78yk7r8QTqqnKwGlpYplgaoPW6KKOT4bwyA1FbKA",{"id":576,"title":577,"anonymised":7,"architecture":578,"body":596,"client":637,"description":85,"extension":91,"featured":7,"headline":638,"industry":639,"meta":640,"metrics":641,"navigation":92,"order":651,"path":652,"practice":108,"role":653,"screens":654,"seo":655,"stack":656,"status":116,"stem":661,"url":662,"year":663,"__hash__":664},"work\u002Fwork\u002Fbleach-london.md","Platform build for Bleach London",[579,584,588,592],{"name":580,"items":581},"Frontend",[582,583],"Vue storefront","Customer service tools",{"name":585,"items":586},"Content",[587,18],"Contentful",{"name":589,"items":590},"API",[591],"Rails + GraphQL services",{"name":134,"items":593},[594,595],"Twilio chat","AWS Cognito",{"type":31,"value":597,"toc":632},[598,600,603,605,625,629],[34,599,37],{"id":36},[39,601,602],{},"Bleach London was growing quickly and needed its ecommerce and customer platform to keep up.",[34,604,45],{"id":44},[50,606,607,613,619],{},[53,608,609,612],{},[56,610,611],{},"Ecommerce integration"," across Contentful, Shopify and a Vue front end, sitting on a Ruby on Rails API that exposed data through GraphQL.",[53,614,615,618],{},[56,616,617],{},"Customer service platform."," A chat interface using Twilio and a custom Vue UI for customers and agents.",[53,620,621,624],{},[56,622,623],{},"Authentication."," Rolled out customer authentication with AWS Cognito, keeping the user database separate from the application code.",[34,626,628],{"id":627},"outcome","Outcome",[39,630,631],{},"The team's work supported Bleach London's growth from under £1m to over £4m turnover within 18 months.",{"title":85,"searchDepth":86,"depth":86,"links":633},[634,635,636],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},{"id":627,"depth":86,"text":628},"Bleach London","Shopify, Contentful and Vue on a Rails GraphQL API, plus customer chat and authentication, during a period of fast growth.","Beauty",{},[642,645,648],{"value":643,"label":644},"\u003C£1m → >£4m","Turnover growth in 18 months",{"value":646,"label":647},"Chat","Twilio-based customer service tool",{"value":649,"label":650},"Cognito","Customer authentication rollout",7,"\u002Fwork\u002Fbleach-london","Senior Engineer",[],{"title":577,"description":85},[18,587,657,658,659,660,595],"Vue","Ruby on Rails","GraphQL","Twilio","work\u002Fbleach-london","https:\u002F\u002Fbleachlondon.com","Mar – Dec 2020","bFZWGEPUjhflvOlnYsCmtn6rsForODMQhD2nD5sinUg",{"id":666,"title":667,"anonymised":7,"architecture":668,"body":684,"client":717,"description":85,"extension":91,"featured":7,"headline":718,"industry":719,"meta":720,"metrics":721,"navigation":92,"order":728,"path":729,"practice":108,"role":730,"screens":731,"seo":732,"stack":733,"status":116,"stem":736,"url":737,"year":738,"__hash__":739},"work\u002Fwork\u002Fviaduct.md","Re-platforming Viaduct Furniture",[669,673,676,680],{"name":10,"items":670},[671,672],"Craft templates","Product content",{"name":16,"items":674},[675],"Craft Commerce",{"name":25,"items":677},[678,679],"FedEx API","DPD API",{"name":681,"items":682},"Infra",[683],"AWS",{"type":31,"value":685,"toc":713},[686,688,691,693],[34,687,37],{"id":36},[39,689,690],{},"Magento wasn't working for Viaduct. They needed a new platform without losing SEO, product data or existing customers.",[34,692,45],{"id":44},[50,694,695,701,707],{},[53,696,697,700],{},[56,698,699],{},"Migration strategy."," Moved all content and products to Craft CMS and Craft Commerce, planned around SEO and customer continuity.",[53,702,703,706],{},[56,704,705],{},"Design partnership."," Brought in a design and UX team for the new site and built the back end alongside them.",[53,708,709,712],{},[56,710,711],{},"Long-term care."," Looked after the platform for six years, hiring and onboarding developers as it grew.",{"title":85,"searchDepth":86,"depth":86,"links":714},[715,716],{"id":36,"depth":86,"text":37},{"id":44,"depth":86,"text":45},"Viaduct Furniture","A migration from Magento to Craft Commerce, then six years looking after the platform.","Furniture",{},[722,725],{"value":723,"label":724},"6 yrs","Looking after the platform",{"value":726,"label":727},"Magento → Craft","Full content and product migration",8,"\u002Fwork\u002Fviaduct","Lead Developer \u002F CTO",[],{"title":667,"description":85},[734,675,735,659,683,678,679],"Craft CMS","PHP","work\u002Fviaduct","https:\u002F\u002Fwww.viaduct.co.uk","2017 – 2023","1r8UGnBOjwWvBHDfZYbD4J71CKtLsgw20kn6r7e8JYE",1790883139390]