<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Build eCommerce Websites Blog</title><description>Practical guides on Shopify, WooCommerce, ecommerce UX and AI automation, written by the team that builds the stores.</description><link>https://buildecommercewebsites.com/</link><language>en-gb</language><copyright>© 2026 W3Nuts Ltd</copyright><item><title>Building a support assistant that quotes your real policies</title><link>https://buildecommercewebsites.com/blog/ai-support-assistant-that-quotes-policy/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/ai-support-assistant-that-quotes-policy/</guid><description>A support assistant is only safe when it answers from your actual policy text and refuses everything else. The refusal is the feature, not the limitation.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Support assistants are the most requested automation on our AI enquiries and the one with the widest gap between a good build and a bad one. The difference is not model quality. It is whether the assistant is allowed to answer from what it knows, or restricted to answering from what you wrote.&lt;/p&gt;
&lt;h2 id=&quot;the-failure-that-makes-this-risky&quot;&gt;The failure that makes this risky&lt;/h2&gt;
&lt;p&gt;Ask a general model what your returns policy is and it will tell you. Confidently, in your tone of voice, with a plausible number of days that came from the general shape of ecommerce rather than from your terms.&lt;/p&gt;
&lt;p&gt;The customer has no way to tell the difference. They now believe they have thirty days because your website said so, and the conversation about whether your website really said so is one you will lose in every sense that matters.&lt;/p&gt;
&lt;p&gt;Under the &lt;a href=&quot;https://www.legislation.gov.uk/uksi/2008/1277/contents&quot;&gt;Consumer Protection from Unfair Trading Regulations&lt;/a&gt;, what a business tells a consumer about their rights matters. We are not lawyers and this is not legal advice — the engineering conclusion is simply that an invented answer is not a harmless bug, and the architecture has to make inventing impossible rather than unlikely.&lt;/p&gt;
&lt;h2 id=&quot;grounding-in-plain-terms&quot;&gt;Grounding, in plain terms&lt;/h2&gt;
&lt;p&gt;Grounding means the assistant does not answer from memory. It retrieves the relevant passage from your documents, and its reply is built from that passage or it does not reply at all.&lt;/p&gt;
&lt;p&gt;The mechanism is unglamorous. Your policies, delivery terms, sizing guidance and FAQ answers are indexed. A customer question retrieves the closest passages. The model’s instruction is to answer using only those passages and to decline if they do not contain the answer.&lt;/p&gt;
&lt;p&gt;Two details decide whether it works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quote rather than paraphrase where it counts.&lt;/strong&gt; For anything with a number in it — a returns window, a delivery cost, a warranty term — the reply should carry your wording, not a summary of it. Paraphrase is where numbers drift.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cite what it used.&lt;/strong&gt; A reply that links the policy page it answered from lets the customer verify and lets you audit. It also makes wrong answers debuggable, because you can see which document it read.&lt;/p&gt;
&lt;h2 id=&quot;scope-what-an-assistant-should-and-should-not-answer&quot;&gt;Scope: what an assistant should and should not answer&lt;/h2&gt;
&lt;p&gt;Scope is a design decision, not a capability question, and it is where most of the risk is managed.&lt;/p&gt;


















































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question type&lt;/th&gt;&lt;th&gt;In scope?&lt;/th&gt;&lt;th&gt;Because&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Returns, delivery, warranty terms&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;The source of truth is a document you control&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sizing and fit guidance you published&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Same, provided the guidance actually exists&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stock availability&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Read from the store, not from the model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order status&lt;/td&gt;&lt;td&gt;Only authenticated&lt;/td&gt;&lt;td&gt;Personal data, and identity must be established first&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Product specifications&lt;/td&gt;&lt;td&gt;Only from structured data&lt;/td&gt;&lt;td&gt;Prose descriptions are where invention happens&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Whether a product suits a use case&lt;/td&gt;&lt;td&gt;Judgement call&lt;/td&gt;&lt;td&gt;Fine as opinion, dangerous as fact&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Anything about a competitor&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No source of truth, and nothing to gain&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Discounts or exceptions&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;An assistant that can give a discount will give a discount&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The last row is not hypothetical. An assistant with no rule against it will agree to a goodwill gesture if a customer pushes, because agreeing is what the conversation seems to want.&lt;/p&gt;
&lt;h2 id=&quot;order-status-deserves-its-own-paragraph&quot;&gt;Order status deserves its own paragraph&lt;/h2&gt;
&lt;p&gt;Order status is the most requested capability and the one that turns a support widget into a data-protection question. The rule is simple and non-negotiable: no order information without authentication.&lt;/p&gt;
&lt;p&gt;An assistant that will look up an order from an order number and an email address will do it for anyone who has both, and both appear in forwarded confirmation emails. Read the order from the order system after the customer has signed in, or do not offer the feature. &lt;a href=&quot;https://ico.org.uk/for-organisations/&quot;&gt;ICO guidance for organisations&lt;/a&gt; is the place to start on what your obligations actually are.&lt;/p&gt;
&lt;h2 id=&quot;the-refusal-path-is-the-product&quot;&gt;The refusal path is the product&lt;/h2&gt;
&lt;p&gt;Most builds treat “I don’t know” as a failure state. It is the opposite: the refusal is what makes every other answer trustworthy.&lt;/p&gt;
&lt;p&gt;A refusal that works has three parts. It says plainly that it cannot answer rather than producing something vague. It offers the handover immediately rather than after three more attempts. It carries the conversation to the person taking over, so the customer does not start again.&lt;/p&gt;
&lt;p&gt;That last part is where assistants most often disappoint. A handover that drops context makes the customer explain twice, which is worse than not having offered help — and it is entirely a plumbing problem rather than an AI one.&lt;/p&gt;
&lt;h2 id=&quot;what-the-logs-are-actually-for&quot;&gt;What the logs are actually for&lt;/h2&gt;
&lt;p&gt;Every question the assistant declines is a gap in your documentation, written in a customer’s own words. That log is the most accurate content brief you will ever get.&lt;/p&gt;
&lt;p&gt;In the deployments we have run, the decline log reliably contains the same handful of questions repeated dozens of times — questions the policy pages genuinely do not answer. Writing those answers improves the assistant, the policy pages, and the human support queue at the same time, and the assistant paid for itself by finding them.&lt;/p&gt;
&lt;p&gt;Log the answered questions too, with the passage retrieved. When somebody eventually reports a wrong answer, the only way to fix it is to see what it read.&lt;/p&gt;
&lt;h2 id=&quot;testing-it-before-customers-do&quot;&gt;Testing it before customers do&lt;/h2&gt;
&lt;p&gt;Three test sets, and the second is the one people skip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions it should answer.&lt;/strong&gt; Fifty real questions from your support inbox, with the correct answers written down beforehand. Anything wrong is a retrieval problem, not a model problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions it should refuse.&lt;/strong&gt; Legal advice, competitor comparisons, discount requests, anything about another customer’s order, and questions whose answer is not in any document. A pass here means refusing cleanly, not answering carefully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions designed to break the rules.&lt;/strong&gt; Polite persistence, hypotheticals, instructions embedded in the question, and requests to ignore previous instructions. The &lt;a href=&quot;https://owasp.org/www-project-top-10-for-large-language-model-applications/&quot;&gt;OWASP Top 10 for LLM applications&lt;/a&gt; is the useful reference for what to try, and prompt injection is the entry worth reading twice.&lt;/p&gt;
&lt;p&gt;Re-run all three whenever the model, the prompt or the documents change. Behaviour drifts on model updates, and the only way to know is to test the same questions again.&lt;/p&gt;
&lt;h2 id=&quot;where-automation-genuinely-helps-here&quot;&gt;Where automation genuinely helps here&lt;/h2&gt;
&lt;p&gt;Setting the risks out at length makes this sound discouraging, which is not the conclusion.&lt;/p&gt;
&lt;p&gt;A grounded assistant answering delivery, returns and sizing questions removes a large share of a support queue’s volume, and it removes the most repetitive share. It answers at three in the morning. It is consistent, which humans under pressure are not. It never gets tired of the same question on its fortieth repetition.&lt;/p&gt;
&lt;p&gt;Those are real gains, available today, at a scale that matters for a small team. They arrive on the condition that the assistant is restricted to what you actually wrote — which is a build decision made at the start, not a setting turned on later.&lt;/p&gt;
&lt;h2 id=&quot;what-we-build-and-what-we-decline-to-build&quot;&gt;What we build, and what we decline to build&lt;/h2&gt;
&lt;p&gt;We build grounded assistants scoped to policy, delivery, returns and sizing, with an audited refusal path and a human handover that carries context. We instrument the decline log from day one because it is the most valuable output.&lt;/p&gt;
&lt;p&gt;We decline to build assistants that answer from a general model without retrieval, that discuss orders without authentication, or that are permitted to negotiate. Those are not harder to build. They are easier, which is exactly the problem.&lt;/p&gt;</content:encoded><category>AI &amp; Automation</category><category>ai</category><category>automation</category><category>customer-support</category><category>policy</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>Category and search pages: the funnel nobody audits</title><link>https://buildecommercewebsites.com/blog/category-and-search-pages/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/category-and-search-pages/</guid><description>Between the homepage and the product page sits the part of a store most audits skip — how customers narrow a catalogue down to the thing they will buy.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Conversion work concentrates on two pages: the product page and the checkout. Between them sits the part of the store where a customer decides whether your catalogue contains what they came for, and it is audited about a tenth as often.&lt;/p&gt;
&lt;h2 id=&quot;why-this-part-of-the-funnel-gets-skipped&quot;&gt;Why this part of the funnel gets skipped&lt;/h2&gt;
&lt;p&gt;Category and search pages fall between two owners. Design treats them as templates, merchandising treats them as a listing, and neither treats them as a conversion surface with its own failure modes.&lt;/p&gt;
&lt;p&gt;The result is predictable. In the audits we run, stores can usually quote their checkout abandonment rate to a decimal place and cannot say what proportion of site searches return nothing at all. One of those numbers is being worked on. The other is often larger and entirely unexamined.&lt;/p&gt;
&lt;h2 id=&quot;search-users-are-the-audience-you-are-ignoring&quot;&gt;Search users are the audience you are ignoring&lt;/h2&gt;
&lt;p&gt;Customers who use site search have told you exactly what they want. In every store where we have compared the two groups, searchers convert at a higher rate than browsers — which is unsurprising, because a search is an intent statement, and it makes the neglect harder to justify.&lt;/p&gt;
&lt;p&gt;Three failures account for most of the loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Matching only product titles.&lt;/strong&gt; A customer searching “waterproof jacket” finds nothing when your products are named “Storm Shell II” and the word waterproof lives in the description. Indexing descriptions, attributes, category names and tags fixes this in an afternoon on most platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No tolerance for how people type.&lt;/strong&gt; Plurals, hyphens, misspellings and word order. “mens boots”, “men’s boots” and “boots mens” are one query to a customer and three to a naïve index.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ranking by whatever the database returned.&lt;/strong&gt; Results in database order are not results. Ranking should reflect availability, popularity and relevance, and a product that is out of stock should not be the first thing a searcher sees.&lt;/p&gt;
&lt;h2 id=&quot;the-zero-results-page-is-the-most-expensive-page-you-own&quot;&gt;The zero-results page is the most expensive page you own&lt;/h2&gt;
&lt;p&gt;Nothing in a store wastes higher-intent traffic than an empty result set with no way forward. The visitor arrived, told you what they wanted, and received a blank grid.&lt;/p&gt;
&lt;p&gt;A zero-results page that works does four things: states plainly that nothing matched, keeps the query visible so it can be corrected, offers the nearest alternatives under a looser rule, and provides a route to a person. That is a small amount of work protecting your most motivated visitors.&lt;/p&gt;
&lt;p&gt;Worth saying explicitly: if a customer searches for something you genuinely do not sell, the honest answer is to say so rather than to present unrelated products. A shopper who is told plainly is more likely to come back than one who is shown a grid of things they did not ask for.&lt;/p&gt;
&lt;h2 id=&quot;filters-build-from-questions-not-from-your-database&quot;&gt;Filters: build from questions, not from your database&lt;/h2&gt;
&lt;p&gt;Most filter sets are assembled from whatever attributes the catalogue happens to hold. That is backwards. The right source is what customers ask about — the search log, the emails, the questions your support inbox answers repeatedly.&lt;/p&gt;
&lt;p&gt;A useful test: for each filter, name the customer sentence it answers. “Filter by material” answers “does this come in leather?” and earns its place. “Filter by SKU prefix” answers nothing anybody has ever asked.&lt;/p&gt;
&lt;p&gt;Every filter costs something. Vertical space on mobile, cognitive load on everyone, and a URL combination that may be crawled and indexed. Fewer filters that map to real questions beat a complete reflection of your product data.&lt;/p&gt;
&lt;h2 id=&quot;faceted-navigation-and-the-url-explosion&quot;&gt;Faceted navigation and the URL explosion&lt;/h2&gt;
&lt;p&gt;Filters generate URLs. Four filters with five options each generate over six hundred combinations, most of which contain the same products in a different order, and a crawler will find them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/crawling-managing-faceted-navigation&quot;&gt;Google’s guidance on faceted navigation&lt;/a&gt; is the primary source worth reading before designing filters. The practical rules we apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decide which filter combinations deserve to be indexable pages, and treat only those as real URLs&lt;/li&gt;
&lt;li&gt;Keep everything else out of the index rather than hoping it will be ignored&lt;/li&gt;
&lt;li&gt;Never let filtering create pages that differ only in sort order&lt;/li&gt;
&lt;li&gt;Make the indexable ones genuinely useful — “waterproof walking boots” is a page worth having; “waterproof walking boots sorted by price descending” is not&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get this wrong and a store with two hundred products presents a crawler with fifty thousand near-identical pages. That is the same thin-content problem that a badly built location system creates, arriving through a different door.&lt;/p&gt;
&lt;h2 id=&quot;pagination-that-works-for-people-and-crawlers&quot;&gt;Pagination that works for people and crawlers&lt;/h2&gt;
&lt;p&gt;Real paginated URLs, each linkable and each reachable without JavaScript. Products on page four should be findable by something that does not scroll.&lt;/p&gt;
&lt;p&gt;Infinite scroll is not forbidden, but it should be layered on top of paginated URLs rather than replacing them — the pattern &lt;a href=&quot;https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading&quot;&gt;Google documents for incremental loading&lt;/a&gt;. Replacing pagination entirely breaks the back button, strands the footer permanently out of reach, and hides the deeper catalogue.&lt;/p&gt;
&lt;h2 id=&quot;the-audit-we-run-in-order&quot;&gt;The audit we run, in order&lt;/h2&gt;
&lt;p&gt;Six checks, cheapest first. Most stores find something in the first two.&lt;/p&gt;








































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Check&lt;/th&gt;&lt;th&gt;What you are looking for&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Search log, two weeks&lt;/td&gt;&lt;td&gt;Zero-result rate and no-click rate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Search five real product descriptions&lt;/td&gt;&lt;td&gt;Whether the index covers more than titles&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Zero-results page&lt;/td&gt;&lt;td&gt;Query preserved, alternatives offered, route to a person&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Every filter&lt;/td&gt;&lt;td&gt;The customer question each one answers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Filter URLs&lt;/td&gt;&lt;td&gt;How many combinations exist, and how many are indexable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Category page on a phone&lt;/td&gt;&lt;td&gt;How far you scroll before reaching a product&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Check six catches the failure that surprises people most. On mobile, a category page carrying a banner, a description, a filter bar and a sort control can push the first product entirely below the fold, which means the page is doing everything except showing the catalogue.&lt;/p&gt;
&lt;h2 id=&quot;accessibility-is-not-a-separate-pass&quot;&gt;Accessibility is not a separate pass&lt;/h2&gt;
&lt;p&gt;Filters and search are interactive controls, which makes them the part of a category page most likely to fail an accessibility check. Three things go wrong repeatedly and all three are covered by &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/quickref/&quot;&gt;WCAG 2.2&lt;/a&gt;: filters implemented as clickable divs that a keyboard cannot reach, result counts that update without announcing anything to a screen reader, and a live region that announces every keystroke rather than the settled result.&lt;/p&gt;
&lt;p&gt;Fixing them is not a favour to a minority of users. A filter that works with a keyboard also works with a phone in one hand on a train.&lt;/p&gt;
&lt;h2 id=&quot;what-we-would-change-first&quot;&gt;What we would change first&lt;/h2&gt;
&lt;p&gt;Given one week on a typical store, in this order: index descriptions and attributes as well as titles, then fix the zero-results page, then remove every filter nobody uses.&lt;/p&gt;
&lt;p&gt;None of that is a redesign. All of it is cheaper than one, and in our experience it moves more revenue than the redesign it replaces — because the customers it helps had already decided to buy something.&lt;/p&gt;</content:encoded><category>UX &amp; Conversion</category><category>ux</category><category>conversion</category><category>site-search</category><category>navigation</category><category>seo</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Ecommerce Core Web Vitals: what actually moves the numbers</title><link>https://buildecommercewebsites.com/blog/ecommerce-core-web-vitals/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/ecommerce-core-web-vitals/</guid><description>Three metrics, and on a store each has a usual culprit: the hero image for LCP, third-party scripts for INP, and everything that loads late for CLS.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Core Web Vitals arrive in most stores as a red panel in Search Console and leave as a quote for a rebuild. Between those two events there is usually a week of work that would have fixed it, and the reason it does not happen is that nobody separates the three metrics from each other.&lt;/p&gt;
&lt;h2 id=&quot;the-three-metrics-and-what-each-one-means-on-a-store&quot;&gt;The three metrics, and what each one means on a store&lt;/h2&gt;
&lt;p&gt;Three numbers, each measuring a different kind of failure. The definitions are on &lt;a href=&quot;https://web.dev/articles/vitals&quot;&gt;web.dev&lt;/a&gt;; what follows is what each tends to mean when the site selling something is the one being measured.&lt;/p&gt;





























&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;/th&gt;&lt;th&gt;Measures&lt;/th&gt;&lt;th&gt;Usual ecommerce culprit&lt;/th&gt;&lt;th&gt;Threshold&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;LCP&lt;/td&gt;&lt;td&gt;How long until the main content appears&lt;/td&gt;&lt;td&gt;The first image, unoptimised or discovered late&lt;/td&gt;&lt;td&gt;2.5s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INP&lt;/td&gt;&lt;td&gt;How long the page takes to respond to a tap&lt;/td&gt;&lt;td&gt;Third-party JavaScript from apps and tags&lt;/td&gt;&lt;td&gt;200ms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CLS&lt;/td&gt;&lt;td&gt;How much the layout jumps after drawing&lt;/td&gt;&lt;td&gt;Banners, badges and images without reserved space&lt;/td&gt;&lt;td&gt;0.1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Treating them as one score is the mistake that produces rebuild quotes. They have different causes, different fixes and different costs, and a store usually fails one of them rather than all three.&lt;/p&gt;
&lt;h2 id=&quot;field-data-is-the-only-measurement-that-counts&quot;&gt;Field data is the only measurement that counts&lt;/h2&gt;
&lt;p&gt;Two kinds of measurement exist and only one of them is the thing being assessed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab data&lt;/strong&gt; is a single run on hardware you chose, on a connection you have, with your cache state. Lighthouse produces it. Its value is diagnostic: it tells you what is slow and why.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Field data&lt;/strong&gt; is what real visitors actually experienced, gathered from Chrome and reported through the &lt;a href=&quot;https://developer.chrome.com/docs/crux&quot;&gt;Chrome UX Report&lt;/a&gt; and Search Console. Its value is judicial: it decides whether you have a problem.&lt;/p&gt;
&lt;p&gt;The two will disagree, sometimes dramatically, and the field data is the one that is right. A store whose lab score is 95 on a developer’s laptop and whose field LCP is four seconds has a four-second problem, because visitors are on mid-range phones on mobile networks, and a good number of them are on the other side of the world from the server.&lt;/p&gt;
&lt;p&gt;Test the templates that carry traffic. Field data is grouped by URL pattern precisely because a homepage and a product page are different pages, and the homepage — the one everybody tests — is usually the fastest and least representative page in the store.&lt;/p&gt;
&lt;h2 id=&quot;lcp-it-is-the-image-and-it-is-the-first-one&quot;&gt;LCP: it is the image, and it is the first one&lt;/h2&gt;
&lt;p&gt;On stores, LCP is an image problem almost every time, and there are only three ways it goes wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The image is too large.&lt;/strong&gt; A 2400px hero delivered to a 390px phone is the most common single fault we find. Responsive sources and a modern format fix it, usually cutting the transferred bytes by most of their weight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The image is discovered late.&lt;/strong&gt; If the browser only learns about the hero after parsing CSS or running JavaScript, the download starts late no matter how small the file is. The fix is to make it discoverable in the initial HTML and, where warranted, to preload it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The image is lazy-loaded when it should not be.&lt;/strong&gt; Lazy loading is correct for everything below the fold and actively harmful for the LCP element, because it defers exactly the thing being measured. This is a one-attribute fix that we find on a surprising share of audits.&lt;/p&gt;
&lt;p&gt;There is a fourth case, less common and more expensive: LCP is text, and the text is waiting for a web font. Font display strategy fixes that without a redesign.&lt;/p&gt;
&lt;h2 id=&quot;inp-the-apps-are-doing-it&quot;&gt;INP: the apps are doing it&lt;/h2&gt;
&lt;p&gt;Interaction to Next Paint replaced First Input Delay because it measures every interaction rather than the first one, and it exposed something that stores had been getting away with: &lt;a href=&quot;https://web.dev/articles/inp&quot;&gt;INP&lt;/a&gt; is dominated by third-party JavaScript.&lt;/p&gt;
&lt;p&gt;On a typical store that means the app stack. A review widget, a chat launcher, two analytics tags, a personalisation script and a consent banner each want main-thread time, and a tap on the variant selector waits behind whichever one is busy.&lt;/p&gt;
&lt;p&gt;The fixes, in order of how much they usually return:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove apps nobody uses. This is the largest and cheapest win available on most stores, and it is the one that gets deferred because removing things feels risky.&lt;/li&gt;
&lt;li&gt;Load what remains after interaction becomes possible rather than during page load.&lt;/li&gt;
&lt;li&gt;Move tags behind a consent gate that genuinely defers them until consent, which many implementations do not.&lt;/li&gt;
&lt;li&gt;Break up your own long tasks last, because on most stores your code is not the problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have measured stores where removing three unused apps moved INP more than a fortnight of code optimisation would have.&lt;/p&gt;
&lt;h2 id=&quot;cls-reserve-the-space&quot;&gt;CLS: reserve the space&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/articles/cls&quot;&gt;Cumulative Layout Shift&lt;/a&gt; is the cheapest of the three to fix and the most irritating to a customer, because it is what makes a tap land on the wrong thing.&lt;/p&gt;
&lt;p&gt;Four causes account for nearly all of it: images without width and height attributes, banners injected above existing content, badges and star ratings arriving after the card has drawn, and web fonts swapping to a face with different metrics.&lt;/p&gt;
&lt;p&gt;Every one is fixed by reserving space before the content arrives. Dimensions on images, a fixed height on the announcement bar, a placeholder the size of the review widget, and font metrics that match the fallback.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-first-and-what-it-costs&quot;&gt;What to do first, and what it costs&lt;/h2&gt;
&lt;p&gt;Ordered by return against effort, which is not the order a rebuild quote suggests.&lt;/p&gt;















































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Order&lt;/th&gt;&lt;th&gt;Work&lt;/th&gt;&lt;th&gt;Typical effort&lt;/th&gt;&lt;th&gt;Moves&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Audit and remove unused apps&lt;/td&gt;&lt;td&gt;A day&lt;/td&gt;&lt;td&gt;INP, LCP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Fix image sizing and formats&lt;/td&gt;&lt;td&gt;A day or two&lt;/td&gt;&lt;td&gt;LCP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Add dimensions and reserve space&lt;/td&gt;&lt;td&gt;Half a day&lt;/td&gt;&lt;td&gt;CLS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Correct lazy loading on the LCP element&lt;/td&gt;&lt;td&gt;An hour&lt;/td&gt;&lt;td&gt;LCP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Defer remaining third-party scripts&lt;/td&gt;&lt;td&gt;A day&lt;/td&gt;&lt;td&gt;INP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Theme or template work&lt;/td&gt;&lt;td&gt;Weeks&lt;/td&gt;&lt;td&gt;All three&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Rows one to five are configuration and housekeeping on most platforms. Row six is a project. Quoting row six before trying rows one to five is how performance work gets a reputation for being expensive.&lt;/p&gt;
&lt;h2 id=&quot;the-honest-case-for-doing-this&quot;&gt;The honest case for doing this&lt;/h2&gt;
&lt;p&gt;Core Web Vitals are &lt;a href=&quot;https://developers.google.com/search/docs/appearance/core-web-vitals&quot;&gt;a real ranking signal&lt;/a&gt; and a modest one. A slow page about the right thing still beats a fast page about the wrong thing, and any agency implying otherwise is selling the wrong benefit.&lt;/p&gt;
&lt;p&gt;The better argument is the customer. A visitor who taps a variant and sees nothing happen for half a second does not file a bug; they leave, and they were already interested enough to tap. That loss does not appear in any report — which is precisely why it goes unfixed for years.&lt;/p&gt;
&lt;p&gt;Our stated position, offered as opinion: fix these because the store is unpleasant to use, and take the ranking effect as a bonus. Stores that chase the number tend to optimise the homepage, which is the page the least revenue depends on.&lt;/p&gt;
&lt;h2 id=&quot;measuring-your-own-store-this-week&quot;&gt;Measuring your own store this week&lt;/h2&gt;
&lt;p&gt;Three steps, no tooling to buy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the field data.&lt;/strong&gt; Search Console’s Core Web Vitals report, grouped by URL pattern. Note which template fails and which metric.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reproduce it in the lab.&lt;/strong&gt; Run Lighthouse on that template with mobile throttling — not on your desktop connection, which describes nobody.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix one thing and wait.&lt;/strong&gt; Field data is a 28-day rolling window, so the report will not move tomorrow. Changing five things at once and watching one number is how teams end up unable to say what worked.&lt;/p&gt;</content:encoded><category>Running a Store</category><category>performance</category><category>core-web-vitals</category><category>seo</category><category>measurement</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Shopify theme or custom build: how to decide</title><link>https://buildecommercewebsites.com/blog/shopify-theme-vs-custom-build/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/shopify-theme-vs-custom-build/</guid><description>A premade theme, a customised theme and a custom build solve different problems. The deciding factor is how much of your storefront is genuinely unusual.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most people asking this question have already decided they want a custom build and are looking for permission. The honest answer is that a premade theme is right more often than agencies say, and the deciding factor is not budget or ambition but how unusual your storefront genuinely is.&lt;/p&gt;
&lt;h2 id=&quot;what-the-three-options-actually-are&quot;&gt;What the three options actually are&lt;/h2&gt;
&lt;p&gt;Three distinct routes exist and the middle one gets confused with both of its neighbours. A premade theme is bought and configured. A customised theme is a bought theme with development work on top. A custom theme is built from an empty starting point specifically for you. All three run in Shopify’s theme layer and all three keep the theme editor.&lt;/p&gt;
&lt;p&gt;Headless is a fourth thing entirely, and it is &lt;a href=&quot;/blog/headless-commerce-worth-it/&quot;&gt;a different conversation&lt;/a&gt; with different reasons.&lt;/p&gt;
&lt;h2 id=&quot;the-question-that-decides-it&quot;&gt;The question that decides it&lt;/h2&gt;
&lt;p&gt;Count the things about how you sell that a normal storefront does not do. Not the things that feel special about your brand — every brand feels special — but mechanics a theme would have to be taught. A size chart is not unusual. A configurator that prices a made-to-order item from six dimensions is.&lt;/p&gt;
&lt;p&gt;That count is the decision:&lt;/p&gt;






























&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Genuinely unusual mechanics&lt;/th&gt;&lt;th&gt;Route&lt;/th&gt;&lt;th&gt;Why&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Premade theme&lt;/td&gt;&lt;td&gt;You are paying to rebuild what already exists&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;One or two&lt;/td&gt;&lt;td&gt;Customised theme&lt;/td&gt;&lt;td&gt;Extend the theme at the two points it does not reach&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Three or more&lt;/td&gt;&lt;td&gt;Custom build&lt;/td&gt;&lt;td&gt;You are now fighting the theme more often than using it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Any number, plus multi-brand or a bespoke interface&lt;/td&gt;&lt;td&gt;Consider headless&lt;/td&gt;&lt;td&gt;A theme is no longer the constraint being hit&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The threshold is not a rule handed down from anywhere. It is where, in the builds we have run, the arithmetic flips: below it, customisation is cheaper; above it, the customisations start colliding with each other and a clean build costs less than the collisions.&lt;/p&gt;
&lt;h2 id=&quot;when-a-premade-theme-is-the-right-answer&quot;&gt;When a premade theme is the right answer&lt;/h2&gt;
&lt;p&gt;A bought theme is the correct choice when your storefront works the way storefronts work: a catalogue, variants, a cart, a checkout, some content pages. That describes most first stores and a good number of established ones.&lt;/p&gt;
&lt;p&gt;Buying one is not a compromise, and the reasons are practical. The responsive behaviour has been tested on devices you do not own. The accessibility basics are usually present. The theme’s developer fixes it when Shopify changes something underneath. You get to spend the money you did not spend on development on photography, which will do more for conversion than a bespoke grid.&lt;/p&gt;
&lt;p&gt;The trap is buying a theme for a feature list. Themes advertise dozens of sections and layout options, and the ones that matter are the three you will actually use. A theme with fewer, better-built sections beats one with forty that each add weight to every page.&lt;/p&gt;
&lt;h2 id=&quot;when-customising-is-the-right-answer&quot;&gt;When customising is the right answer&lt;/h2&gt;
&lt;p&gt;Customisation earns its cost when a small number of specific things need to work differently and the rest of the storefront does not. A bought theme extended at two points is a normal, well-behaved store; a bought theme extended at fifteen is a maintenance problem wearing a theme’s name.&lt;/p&gt;
&lt;p&gt;Work that customises well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A product page section the theme does not offer, added as a proper Online Store 2.0 section so the editor can still move it&lt;/li&gt;
&lt;li&gt;Bespoke filtering on a collection, where the catalogue has attributes shoppers actually filter by&lt;/li&gt;
&lt;li&gt;A different variant selector, because yours has three axes and the theme assumed one&lt;/li&gt;
&lt;li&gt;Removing what you do not use, which is the cheapest performance work available on a bought theme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Work that customises badly is anything that requires the theme to change its mind about page structure. Rewriting the cart, restructuring templates, or changing how the theme handles collections means you are now maintaining a fork of somebody else’s code without their release notes.&lt;/p&gt;
&lt;h2 id=&quot;when-a-custom-build-is-genuinely-cheaper&quot;&gt;When a custom build is genuinely cheaper&lt;/h2&gt;
&lt;p&gt;A custom theme wins on total cost when the storefront is unusual enough that customisation becomes continuous. Three signals show up together in the projects where we have recommended it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every new requirement starts with “can the theme do”.&lt;/strong&gt; When that sentence opens most conversations, the theme has stopped being a foundation and become an obstacle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The customisations have started interacting.&lt;/strong&gt; Two independent changes are fine. The sixth change breaking the third is the classic sign, and it gets worse rather than better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nobody can update the theme any more.&lt;/strong&gt; A theme so heavily modified that applying its updates would destroy the work is, in practice, already a custom theme — just one with a worse history and no documentation.&lt;/p&gt;
&lt;p&gt;At that point a clean build is not an indulgence. It is cheaper than continuing, and it produces something a second developer can read.&lt;/p&gt;
&lt;h2 id=&quot;what-a-custom-build-actually-costs-to-own&quot;&gt;What a custom build actually costs to own&lt;/h2&gt;
&lt;p&gt;The build is the part everyone estimates. Ownership is the part that decides whether it was a good idea.&lt;/p&gt;
&lt;p&gt;A custom theme is code that only you have. When Shopify deprecates something, nobody sends you a patch. When a browser changes behaviour, nobody has already fixed it. When the developer who built it moves on, the next person reads the code rather than the documentation of a widely-used theme.&lt;/p&gt;
&lt;p&gt;None of that is an argument against custom builds. It is an argument for budgeting the second year, which most estimates do not. In our experience the projects that regret a custom build are not the ones that spent too much on it — they are the ones that spent everything on it and left nothing for the eighteen months afterwards.&lt;/p&gt;
&lt;h2 id=&quot;what-you-should-build-custom-regardless-of-route&quot;&gt;What you should build custom regardless of route&lt;/h2&gt;
&lt;p&gt;Some things are worth building properly whichever route you take, because they are where money is won and lost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The product page.&lt;/strong&gt; Whatever the rest of the storefront is, the product page carries the conversion. It is worth custom work on a bought theme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anything unique to your sales process.&lt;/strong&gt; A configurator, a bundle builder, an unusual quantity model — if that is why customers choose you, the theme should not be deciding how it behaves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance.&lt;/strong&gt; &lt;a href=&quot;https://web.dev/articles/lcp&quot;&gt;LCP&lt;/a&gt; on a theme is decided mostly by images and apps, not by the theme itself. Both are fixable on any route, and both are usually ignored on all three.&lt;/p&gt;
&lt;h2 id=&quot;how-we-advise-clients&quot;&gt;How we advise clients&lt;/h2&gt;
&lt;p&gt;Two questions, asked before any estimate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First: what specifically can a theme not do for you?&lt;/strong&gt; A concrete list of two or three mechanics means customise. A long list of aesthetic preferences means buy a theme and spend the difference on design work within it. An empty list means buy a theme, and the honest version of that advice sometimes costs us the project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second: who owns this in two years?&lt;/strong&gt; A custom build is a long-term commitment to maintaining code. If the answer is “we would rather not think about that”, a well-chosen theme is the better business decision regardless of what the storefront could theoretically be.&lt;/p&gt;
&lt;h2 id=&quot;starting-with-a-theme-is-not-starting-badly&quot;&gt;Starting with a theme is not starting badly&lt;/h2&gt;
&lt;p&gt;The sequence most stores should follow is: buy a good theme, run it, find out what is actually limiting, then commission the specific work that removes those limits.&lt;/p&gt;
&lt;p&gt;That order produces a brief written from evidence rather than from a wishlist. It also means the money spent on a custom build in year two is spent on things you know matter, rather than on your best guess in month one about how customers would behave.&lt;/p&gt;
&lt;p&gt;We have rebuilt several stores where the second version was smaller than the first, because a year of running the first one showed which half of it nobody used.&lt;/p&gt;</content:encoded><category>Shopify</category><category>shopify</category><category>themes</category><category>custom-development</category><category>budgeting</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Choosing WooCommerce hosting that actually works</title><link>https://buildecommercewebsites.com/blog/woocommerce-hosting-that-works/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/woocommerce-hosting-that-works/</guid><description>WooCommerce hosting is judged on four things most plans never mention: PHP workers, object caching, database performance and who applies the patches.</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hosting is where most WooCommerce performance problems begin and where almost none of them are diagnosed. The plan comparison tables that stores choose from measure disk space and bandwidth, neither of which has much to do with whether a checkout completes under load.&lt;/p&gt;
&lt;h2 id=&quot;why-woocommerce-is-harder-to-host-than-a-website&quot;&gt;Why WooCommerce is harder to host than a website&lt;/h2&gt;
&lt;p&gt;A content site can be served almost entirely from cache. A store cannot. Cart contents, checkout, account pages and anything showing a logged-in customer’s data are generated per request, every request, because two visitors must never see each other’s basket.&lt;/p&gt;
&lt;p&gt;That single constraint changes what good hosting means. Your homepage can be cached to within an inch of its life and it will not help the customer waiting on a checkout page. &lt;strong&gt;A store’s real capacity is its uncached request capacity&lt;/strong&gt;, and that is what the plan comparison table never shows.&lt;/p&gt;
&lt;h2 id=&quot;the-four-things-worth-asking-about&quot;&gt;The four things worth asking about&lt;/h2&gt;
&lt;p&gt;Four questions separate hosting that will hold from hosting that will not. None of them appear on a pricing page.&lt;/p&gt;






























&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Why it decides the outcome&lt;/th&gt;&lt;th&gt;Bad answer&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;How many PHP workers, and what happens at the limit?&lt;/td&gt;&lt;td&gt;Each uncached request holds a worker; exhaustion queues customers&lt;/td&gt;&lt;td&gt;“Unlimited”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Is Redis object caching available?&lt;/td&gt;&lt;td&gt;Removes repeated database queries within a page load&lt;/td&gt;&lt;td&gt;“We have caching” without specifics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;How is the database configured and where does it run?&lt;/td&gt;&lt;td&gt;Query latency dominates uncached response time&lt;/td&gt;&lt;td&gt;Shared database host, no detail&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Who applies security patches, and how quickly?&lt;/td&gt;&lt;td&gt;Decides whether an unpatched service is your problem or theirs&lt;/td&gt;&lt;td&gt;Silence&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Ask all four in one email. The quality of the reply tells you more than the specification does — a host that answers precisely has thought about stores, and a host that answers in adjectives has not.&lt;/p&gt;
&lt;h2 id=&quot;php-workers-and-why-unlimited-is-not-an-answer&quot;&gt;PHP workers, and why “unlimited” is not an answer&lt;/h2&gt;
&lt;p&gt;A PHP worker handles one request at a time. A checkout that takes two seconds of server work occupies a worker for two seconds. Ten simultaneous checkouts on eight workers means two customers wait for a worker before their request starts.&lt;/p&gt;
&lt;p&gt;Bandwidth is irrelevant to this and disk space is irrelevant to it. What matters is the arithmetic of workers against your slowest uncached request, which is why the useful question is not how many workers you get but what happens when they run out. Queuing is survivable. Errors at the checkout are not.&lt;/p&gt;
&lt;p&gt;Reducing the time each request takes is usually cheaper than buying more workers, which is what the next two sections are about.&lt;/p&gt;
&lt;h2 id=&quot;object-caching-is-the-single-biggest-lever&quot;&gt;Object caching is the single biggest lever&lt;/h2&gt;
&lt;p&gt;WooCommerce asks the database a great many questions to render a page — product data, variations, prices, tax rules, cart contents, session state. Without object caching, the same query runs repeatedly within one page load.&lt;/p&gt;
&lt;p&gt;Redis holds those results in memory for the duration, and enabling it is the largest single improvement available on most stores we audit. It is not a tuning detail; it is the difference between a store that feels quick and one that does not, on identical hardware.&lt;/p&gt;
&lt;p&gt;Two things to check rather than assume: that Redis is actually connected rather than merely installed, and that it survives a deployment. We have found stores paying for object caching that had been silently disconnected for months.&lt;/p&gt;
&lt;h2 id=&quot;the-database-is-the-part-nobody-looks-at&quot;&gt;The database is the part nobody looks at&lt;/h2&gt;
&lt;p&gt;Uncached response time is mostly database time. Three things matter and all three are invisible from the outside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where the database runs.&lt;/strong&gt; On the same machine, latency is negligible. On a shared database host in another rack, every query pays a network round trip, hundreds of times per page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whether the tables are indexed for what WooCommerce actually asks.&lt;/strong&gt; WordPress’s post-meta structure makes product queries expensive by nature; on large catalogues the indexes matter enormously, and on small ones they matter not at all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How big the tables have got.&lt;/strong&gt; Sessions, transients, order metadata and abandoned carts accumulate. A store that has never been cleaned down is answering every query against a table full of data from 2023.&lt;/p&gt;
&lt;h2 id=&quot;who-patches-what&quot;&gt;Who patches what&lt;/h2&gt;
&lt;p&gt;Managed hosting and unmanaged hosting differ on one question that has nothing to do with performance: when a vulnerability is announced in PHP, the database, or the web server, who applies the fix?&lt;/p&gt;
&lt;p&gt;On managed hosting, the host does, usually before you have read the announcement. On a VPS, you do, and if nobody has been given that job then nobody is doing it. Running your own &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;supported PHP version&lt;/a&gt; is not optional — an unsupported one stops receiving security fixes entirely, and stores run on them for years without noticing.&lt;/p&gt;
&lt;p&gt;This is the part of the decision that is not about money. A store on unmanaged hosting with no named administrator is carrying a risk it has not priced.&lt;/p&gt;
&lt;h2 id=&quot;staging-is-a-hosting-feature&quot;&gt;Staging is a hosting feature&lt;/h2&gt;
&lt;p&gt;WooCommerce updates need testing against real data, because the failures are rarely in the plugin and usually in the interaction between the plugin, your theme and your catalogue.&lt;/p&gt;
&lt;p&gt;A staging environment that mirrors production — same PHP version, same database contents, same plugin set — turns an update from an act of faith into a fifteen-minute check. Hosting that offers one-click staging is worth more than hosting that offers more disk space, and it is the feature most often traded away to save a few pounds a month.&lt;/p&gt;
&lt;h2 id=&quot;what-we-specify-on-client-projects&quot;&gt;What we specify on client projects&lt;/h2&gt;
&lt;p&gt;Our default requirements, stated so a client can compare quotes on equal terms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A supported PHP version, currently maintained rather than merely working&lt;/li&gt;
&lt;li&gt;Redis object caching, connected and monitored&lt;/li&gt;
&lt;li&gt;A database on the same machine or the same private network&lt;/li&gt;
&lt;li&gt;Automated daily backups held off the server, with a tested restore&lt;/li&gt;
&lt;li&gt;One-click staging that copies production data&lt;/li&gt;
&lt;li&gt;Patching handled by the host, with a stated response time&lt;/li&gt;
&lt;li&gt;HTTP/2 or HTTP/3, TLS, and a CDN for static assets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That list is deliberately unglamorous. None of it is a feature anybody boasts about, and all of it is what separates a store that stays up during a campaign from one that does not.&lt;/p&gt;
&lt;h2 id=&quot;how-to-test-a-host-before-you-commit&quot;&gt;How to test a host before you commit&lt;/h2&gt;
&lt;p&gt;Two checks, both cheap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measure an uncached response.&lt;/strong&gt; Load a cart or account page — never the homepage — and look at &lt;a href=&quot;https://web.dev/articles/ttfb&quot;&gt;time to first byte&lt;/a&gt;. That number is the hosting, stripped of caching and images.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask what happens under load.&lt;/strong&gt; Not “can you handle traffic”, which invites a yes, but “what happens when PHP workers are exhausted”. A host that describes queueing behaviour has thought about it. A host that says it will not happen has not.&lt;/p&gt;
&lt;h2 id=&quot;migrating-without-breaking-things&quot;&gt;Migrating without breaking things&lt;/h2&gt;
&lt;p&gt;Moving hosts is routine and the failures are predictable: DNS moved before the data finished copying, a database dumped while orders were still arriving, or a staging URL left in the database so live pages point at a hostname that no longer exists.&lt;/p&gt;
&lt;p&gt;The safe sequence is to copy, verify, freeze orders briefly, re-sync, then move DNS with a short TTL set a day in advance. Store migrations differ from site migrations in one respect that matters more than any other: an order placed during the move must not be lost, which is why the freeze exists even though it is inconvenient.&lt;/p&gt;</content:encoded><category>WooCommerce</category><category>woocommerce</category><category>hosting</category><category>performance</category><category>infrastructure</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>Agency, freelancer or in-house: how to staff ecommerce work</title><link>https://buildecommercewebsites.com/blog/agency-freelancer-or-in-house/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/agency-freelancer-or-in-house/</guid><description>A comparison of the three ways to resource ecommerce development, including the situations where hiring us would be the wrong decision.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are an agency, so treat this with appropriate suspicion. We have tried to write the version we would want to read if we were buying.&lt;/p&gt;
&lt;h2 id=&quot;the-three-options-honestly&quot;&gt;The three options, honestly&lt;/h2&gt;
&lt;h3 id=&quot;freelancer&quot;&gt;Freelancer&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; a defined task in one discipline with a clear end. A theme customisation, a plugin fix, a set of designs, a performance audit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt; cheapest per hour, often available within days, and you deal directly with the person doing the work. No account management layer, no overhead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt; one skillset. When they are ill, on holiday or busy with another client, work stops. Continuity depends entirely on one person’s availability and continued interest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The hidden cost:&lt;/strong&gt; coordination, once there is more than one. Two freelancers is manageable. Four means you are running a project — briefing each of them, resolving conflicts where their work meets, and holding the context nobody else holds. That management time is real and almost never budgeted.&lt;/p&gt;
&lt;h3 id=&quot;in-house&quot;&gt;In-house&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; one discipline needed full-time, long term, with enough work to keep that person genuinely occupied.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt; deep context on your business that no external party accumulates. Immediately available. Cheaper over years than an equivalent retainer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt; four to twelve weeks to recruit and onboard before producing anything. One skillset again — and most stores need design, frontend, backend and integration work. Four employees to cover that costs considerably more than a retainer.&lt;/p&gt;
&lt;p&gt;Single points of failure are absolute here. When your only developer leaves, your store development stops until you have hired again.&lt;/p&gt;
&lt;h3 id=&quot;agency&quot;&gt;Agency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; work spanning multiple disciplines, or work that must not stop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt; design, development and integration in one team. Continuity when someone is unavailable. Starts in a week or two. Scales up and down without recruitment or redundancy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt; more expensive per hour than a freelancer. Less embedded context than an employee. Quality varies enormously between agencies, and the good ones are not obvious from their websites.&lt;/p&gt;
&lt;h2 id=&quot;the-comparison&quot;&gt;The comparison&lt;/h2&gt;

































































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Freelancer&lt;/th&gt;&lt;th&gt;In-house&lt;/th&gt;&lt;th&gt;Agency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cost per hour&lt;/td&gt;&lt;td&gt;Lowest&lt;/td&gt;&lt;td&gt;Middle&lt;/td&gt;&lt;td&gt;Highest&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Disciplines covered&lt;/td&gt;&lt;td&gt;One per person&lt;/td&gt;&lt;td&gt;One per person&lt;/td&gt;&lt;td&gt;Multiple&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Time to start&lt;/td&gt;&lt;td&gt;Days&lt;/td&gt;&lt;td&gt;4–12 weeks&lt;/td&gt;&lt;td&gt;1–2 weeks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Continuity if unavailable&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Work stops&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Work stops&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Team covers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Context on your business&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;td&gt;Deepest&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Management overhead&lt;/td&gt;&lt;td&gt;Yours&lt;/td&gt;&lt;td&gt;Yours&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scales down&lt;/td&gt;&lt;td&gt;Stop booking&lt;/td&gt;&lt;td&gt;Redundancy&lt;/td&gt;&lt;td&gt;Pause or reduce&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Minimum commitment&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Employment contract&lt;/td&gt;&lt;td&gt;Varies&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Best when&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Defined single tasks&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;One discipline, long term&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Continuous, multi-discipline&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Two of those three columns win their own row. That is the point — this is not a table designed to make agencies look good.&lt;/p&gt;
&lt;h2 id=&quot;when-you-should-not-hire-us&quot;&gt;When you should not hire us&lt;/h2&gt;
&lt;p&gt;Being specific, because vague qualification is not qualification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your project is a theme setup with light customisation.&lt;/strong&gt; Hire a freelancer. You do not need us, and we will tell you so if you ask.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You need one developer full-time for the next three years and can recruit.&lt;/strong&gt; Hire in-house. It is cheaper and they will know your business better than we will.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You need someone physically present&lt;/strong&gt; for product photography, on-site systems testing, or workshops with a large stakeholder group. Hire locally for those parts, whatever you do about the rest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your real problem is traffic quality or product-market fit.&lt;/strong&gt; No amount of development work will fix that, and spending a development budget on it is an expensive way to find out.&lt;/p&gt;
&lt;h2 id=&quot;when-an-agency-genuinely-earns-the-difference&quot;&gt;When an agency genuinely earns the difference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The work spans design, development and integration simultaneously&lt;/li&gt;
&lt;li&gt;The store cannot stop improving because one person is unavailable&lt;/li&gt;
&lt;li&gt;Volume varies month to month and you want to scale without recruiting&lt;/li&gt;
&lt;li&gt;You want one accountable party rather than coordinating several&lt;/li&gt;
&lt;li&gt;You need a discipline occasionally but not enough to employ it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is underrated. Most stores need design work sometimes, backend work sometimes, and automation work occasionally. Employing all three is expensive; hiring three freelancers means managing three relationships.&lt;/p&gt;
&lt;h2 id=&quot;a-hybrid-that-works-well&quot;&gt;A hybrid that works well&lt;/h2&gt;
&lt;p&gt;The arrangement we see succeed most often is one in-house person who knows the business deeply, plus external capacity for the disciplines they do not cover and the peaks they cannot absorb.&lt;/p&gt;
&lt;p&gt;The employee owns context and continuity. The agency or freelancers supply breadth. Neither is asked to be something they are not.&lt;/p&gt;
&lt;h2 id=&quot;how-we-structure-it&quot;&gt;How we structure it&lt;/h2&gt;
&lt;p&gt;Our answer for continuous work is &lt;a href=&quot;/unlimited-services/&quot;&gt;ProNuts&lt;/a&gt; — a fixed monthly amount of capacity across design, frontend, backend and AI, with a dedicated project manager, published at a real price rather than “contact us”, and cancellable at any time.&lt;/p&gt;
&lt;p&gt;For a single defined project with a clear end, we quote it as a project instead. A monthly retainer for finite work is worse value than a fixed quote, and recommending one would be selling you the wrong thing.&lt;/p&gt;
&lt;h2 id=&quot;how-to-evaluate-whichever-you-choose&quot;&gt;How to evaluate whichever you choose&lt;/h2&gt;
&lt;p&gt;The choice matters less than the quality of who you pick. These separate good from plausible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask what they would not do.&lt;/strong&gt; Anyone who says yes to everything is either inexperienced or telling you what you want to hear. A useful partner has opinions about what is a bad idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask about a project that went wrong.&lt;/strong&gt; Not to catch them out — to see whether they can describe a failure honestly and what they changed afterwards. Everyone has one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask who actually does the work.&lt;/strong&gt; Particularly with agencies. If the people in the pitch are not the people on the project, that should be stated openly rather than discovered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask how they hand over.&lt;/strong&gt; What documentation exists at the end, who owns the code, and what happens if you leave. A reluctant answer here is informative.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask for a reference you choose&lt;/strong&gt;, not one from a curated list.&lt;/p&gt;
&lt;h2 id=&quot;setting-the-arrangement-up-to-work&quot;&gt;Setting the arrangement up to work&lt;/h2&gt;
&lt;p&gt;Whichever you pick, the same things determine whether it goes well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Written scope before work starts&lt;/strong&gt;, however brief. Most disputes come from two parties holding different assumptions nobody wrote down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One person on your side who owns the relationship.&lt;/strong&gt; Work routed through three stakeholders with different priorities goes slowly and expensively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Access sorted early.&lt;/strong&gt; Hosting, platform, analytics, the systems being integrated. Waiting on credentials is the most avoidable delay there is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agreement on what “done” means&lt;/strong&gt; for each piece of work, before it starts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A regular short check-in&lt;/strong&gt; rather than a long monthly one. Problems surface earlier and cost less.&lt;/p&gt;
&lt;p&gt;None of that is specific to agencies, freelancers or employees. It is what makes any of the three work, and its absence is what makes all three fail.&lt;/p&gt;
&lt;h2 id=&quot;the-uncomfortable-summary&quot;&gt;The uncomfortable summary&lt;/h2&gt;
&lt;p&gt;Most businesses asking this question have already decided and are looking for confirmation. If that is you, the useful exercise is to argue the opposite case for ten minutes and see whether it holds.&lt;/p&gt;
&lt;p&gt;If you are set on hiring, ask what happens to your store during the three months before they start and the two weeks a year they are on holiday. If you are set on an agency, ask whether one full-time person would cost less for the work you actually have. If you are set on freelancers, count how many hours a week you will spend coordinating them.&lt;/p&gt;
&lt;p&gt;Any of the three can be the right answer. The wrong answer is the one chosen without asking those questions.&lt;/p&gt;</content:encoded><category>Running a Store</category><category>hiring</category><category>agency</category><category>freelance</category><category>operations</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>How to migrate ecommerce platforms without losing search traffic</title><link>https://buildecommercewebsites.com/blog/ecommerce-platform-migration-without-losing-traffic/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/ecommerce-platform-migration-without-losing-traffic/</guid><description>The redirect map is where migrations succeed or fail. Here is how to build one, plus the two things that break on every platform migration regardless of direction.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Migrations lose traffic for one reason above all others: URLs that used to resolve stop resolving. Almost everything else is recoverable. That is not.&lt;/p&gt;
&lt;h2 id=&quot;export-before-you-cant&quot;&gt;Export before you can’t&lt;/h2&gt;
&lt;p&gt;The first task, and the one with a deadline attached, because some of this data disappears with the old site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take these while the old site is still live:&lt;/strong&gt;&lt;/p&gt;








































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Source&lt;/th&gt;&lt;th&gt;What it gives you&lt;/th&gt;&lt;th&gt;Recoverable later?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Search Console — Pages report&lt;/td&gt;&lt;td&gt;Every URL Google has, with impressions&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; — history survives the site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search Console — Queries report&lt;/td&gt;&lt;td&gt;Your ranking baseline&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Live XML sitemap&lt;/td&gt;&lt;td&gt;URLs the platform believes exist&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Full site crawl&lt;/td&gt;&lt;td&gt;Orphaned and unlinked URLs&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Backlink report&lt;/td&gt;&lt;td&gt;Which URLs hold external links&lt;/td&gt;&lt;td&gt;Partially&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Database export&lt;/td&gt;&lt;td&gt;Previously published, now unpublished URLs&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The crawl finds what the other sources miss — old landing pages, paginated archives, attachment pages, campaign URLs. These are exactly the URLs nobody remembers and that quietly hold links.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reconcile all sources into one list.&lt;/strong&gt; That list is the specification for the redirect map, and every URL on it needs an answer.&lt;/p&gt;
&lt;h2 id=&quot;build-the-redirect-map&quot;&gt;Build the redirect map&lt;/h2&gt;
&lt;p&gt;Three possible outcomes per URL, and every URL gets one:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Preserved&lt;/strong&gt; — same path on the new site, no redirect needed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redirected&lt;/strong&gt; — permanent redirect to the closest equivalent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gone&lt;/strong&gt; — deliberately returns 410, for genuinely retired content&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Acceptance criterion: zero URLs unaccounted for.&lt;/strong&gt; Not “the important ones”. All of them.&lt;/p&gt;
&lt;p&gt;Rules that matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redirect to the closest equivalent page&lt;/strong&gt;, not to the home page. Bulk redirects to home are treated as soft 404s and pass nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One hop.&lt;/strong&gt; If the old site already had redirect chains, flatten them. Chains lose value and slow crawling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preserve where you can.&lt;/strong&gt; Every URL that does not change is a URL that cannot break. On our own rebuild we kept &lt;code&gt;/privacy-policy/&lt;/code&gt; and &lt;code&gt;/terms-conditions/&lt;/code&gt; at their exact paths for this reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch the trailing slash.&lt;/strong&gt; Decide a policy, apply it everywhere, and normalise the other form with a redirect.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-breaks-on-every-migration&quot;&gt;What breaks on every migration&lt;/h2&gt;
&lt;p&gt;Two things, regardless of direction.&lt;/p&gt;
&lt;h3 id=&quot;url-structure&quot;&gt;URL structure&lt;/h3&gt;
&lt;p&gt;Platforms enforce their own path conventions. Shopify requires &lt;code&gt;/products/&lt;/code&gt;, &lt;code&gt;/collections/&lt;/code&gt; and &lt;code&gt;/pages/&lt;/code&gt; prefixes. Move to it and essentially every product and category URL changes.&lt;/p&gt;
&lt;p&gt;This is not negotiable and it is not a bug. It simply means the redirect map is mandatory rather than optional, and any migration plan that treats it as a final-week task has the sequencing wrong.&lt;/p&gt;
&lt;h3 id=&quot;customer-passwords&quot;&gt;Customer passwords&lt;/h3&gt;
&lt;p&gt;Password hashes are not portable. Every customer must reset.&lt;/p&gt;
&lt;p&gt;You cannot engineer around this. What you can do is plan it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write the reset communication &lt;strong&gt;before&lt;/strong&gt; launch&lt;/li&gt;
&lt;li&gt;Schedule it to go out with the launch, not days later&lt;/li&gt;
&lt;li&gt;Make sure support knows it is coming&lt;/li&gt;
&lt;li&gt;Expect a spike in “I can’t log in” contacts regardless&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discovering this after launch, from tickets, is a genuinely bad first day for a new store.&lt;/p&gt;
&lt;h2 id=&quot;also-plan-for&quot;&gt;Also plan for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Order history&lt;/strong&gt; — migrate it if the platform allows, or keep the old system readable for returns and support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reviews&lt;/strong&gt; — often tied to product IDs that change; check the export path before committing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transactional emails&lt;/strong&gt; — every template needs rebuilding and testing on the new platform&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured data&lt;/strong&gt; — rebuild it, and validate before launch rather than after&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analytics&lt;/strong&gt; — install and verify on staging, so you do not lose the first days of data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Third-party integrations&lt;/strong&gt; — every system connected to the old store needs repointing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;test-the-redirects&quot;&gt;Test the redirects&lt;/h2&gt;
&lt;p&gt;A redirect map that has never been executed is a hypothesis.&lt;/p&gt;
&lt;p&gt;On staging, run the full URL list and confirm each returns the expected status and lands on the intended page. Automate it — a script over a few hundred URLs takes minutes and catches the typos that a spot-check misses.&lt;/p&gt;
&lt;p&gt;Check specifically for: chains, loops, redirects to 404s, and any URL that quietly falls through to the home page.&lt;/p&gt;
&lt;h2 id=&quot;launch-and-afterwards&quot;&gt;Launch and afterwards&lt;/h2&gt;
&lt;p&gt;Submit the new sitemap immediately. Keep the old sitemap available briefly so crawlers discover the redirects for URLs they already know.&lt;/p&gt;
&lt;p&gt;Then monitor daily for two weeks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;404s in server logs, which is where you find URLs the map missed&lt;/li&gt;
&lt;li&gt;Search Console coverage and crawl errors&lt;/li&gt;
&lt;li&gt;Which redirects are actually being hit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Expect a dip.&lt;/strong&gt; Search engines need to recrawl and reassess, and a few weeks of fluctuation is normal even on a clean migration.&lt;/p&gt;
&lt;p&gt;The mistake that turns a dip into a problem is panicking into further changes mid-recovery. That restarts the reassessment from the beginning. Hold the line, fix genuine errors only, and let it settle.&lt;/p&gt;
&lt;h2 id=&quot;if-you-skip-the-export&quot;&gt;If you skip the export&lt;/h2&gt;
&lt;p&gt;Sometimes a client decides a migration is really a fresh start and the old data is not worth capturing. That is a legitimate call for a small site, and it should be a decision rather than an oversight.&lt;/p&gt;
&lt;p&gt;Be clear about the consequence: any indexed URL not in your map will 404, and you will have no baseline to measure recovery against. At minimum, take the Search Console export. It survives the site being switched off, it costs ten minutes, and it is the single most useful item on the list.&lt;/p&gt;
&lt;h2 id=&quot;a-realistic-timeline&quot;&gt;A realistic timeline&lt;/h2&gt;
&lt;p&gt;Migrations get compressed because the build feels finished. These are the stages that actually need time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 1–2: inventory and mapping.&lt;/strong&gt; Exports taken, URLs reconciled, redirect map drafted. This can run in parallel with the build and should start early, because it is the item most often left too late.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;During the build: data preparation.&lt;/strong&gt; Catalogue cleaning, which is nearly always needed and nearly always underestimated. Inconsistent units, missing attributes, duplicate products.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week before launch: redirect testing.&lt;/strong&gt; The full list, executed and verified on staging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Launch day: sequence matters.&lt;/strong&gt; DNS change, immediate smoke test of the critical paths, sitemap submission, then monitoring. Not a Friday afternoon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks 1–2 after: daily monitoring.&lt;/strong&gt; 404 logs, coverage reports, and the checkout working. Fix genuine errors; resist restructuring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week 4 onwards: assess.&lt;/strong&gt; Enough data has accumulated to tell recovery from a real problem.&lt;/p&gt;
&lt;h2 id=&quot;what-to-tell-stakeholders-beforehand&quot;&gt;What to tell stakeholders beforehand&lt;/h2&gt;
&lt;p&gt;The conversation that prevents a crisis three weeks after launch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traffic will dip.&lt;/strong&gt; Say this before launch, in writing, with an expected shape and duration. A forecast that comes true is reassuring; the same dip unforecast looks like failure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rankings will move around&lt;/strong&gt; before settling. Individual keyword positions during recovery are noise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Some things will break.&lt;/strong&gt; Not because the work was poor, but because no test environment reproduces real traffic on real devices. A defined fix window is normal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The comparison point is month three&lt;/strong&gt;, not week one.&lt;/p&gt;
&lt;p&gt;Having that conversation early costs ten minutes. Not having it costs considerably more in confidence when the expected dip arrives and nobody was warned.&lt;/p&gt;</content:encoded><category>Platform Selection</category><category>migration</category><category>redirects</category><category>seo</category><category>platform-selection</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>AI product descriptions that don&apos;t damage accuracy</title><link>https://buildecommercewebsites.com/blog/ai-product-descriptions/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/ai-product-descriptions/</guid><description>How to generate product copy from real specification data without publishing plausible fiction about physical items you then have to ship.</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is the automation we recommend starting with, for reasons covered in &lt;a href=&quot;/blog/what-to-automate-in-ecommerce-first/&quot;&gt;what to automate first&lt;/a&gt;: it pays back immediately and it fails safely, because mistakes are caught in review rather than by a customer.&lt;/p&gt;
&lt;p&gt;It also fails badly when done carelessly, and the failure mode is worth understanding before you start.&lt;/p&gt;
&lt;h2 id=&quot;the-failure-mode&quot;&gt;The failure mode&lt;/h2&gt;
&lt;p&gt;A language model given a product name will produce a description. It will read well. It will be confident. And a portion of it will be invented, because the model has nothing factual to work from and generating plausible text is exactly what it does.&lt;/p&gt;
&lt;p&gt;On a blog, an invented detail is an embarrassment. On an ecommerce site, it is a claim about a physical object that you then have to ship. “Water resistant to 50 metres” on a watch that is not, or “solid oak” on something veneered, is a consumer-protection problem before it is anything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix is not better prompting. It is better input.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;feed-specifications-not-names&quot;&gt;Feed specifications, not names&lt;/h2&gt;
&lt;p&gt;Output quality tracks input quality almost linearly. Give the model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every factual attribute you hold — dimensions, weight, materials, compatibility, capacity&lt;/li&gt;
&lt;li&gt;What is physically in the box&lt;/li&gt;
&lt;li&gt;Care, washing or maintenance instructions&lt;/li&gt;
&lt;li&gt;Any certifications or standards the product meets&lt;/li&gt;
&lt;li&gt;The supplier’s technical sheet, if you have one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus three or four of your existing descriptions that represent the voice you want, so the model matches your register rather than inventing one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If a fact is not in the input, it must not appear in the output.&lt;/strong&gt; State that explicitly in the instruction, and check for it in review.&lt;/p&gt;
&lt;h2 id=&quot;build-review-into-the-workflow&quot;&gt;Build review into the workflow&lt;/h2&gt;
&lt;p&gt;Not “we’ll check them” — an actual step, with an actual owner, before anything publishes.&lt;/p&gt;
&lt;p&gt;The economics survive this easily. Reviewing thirty drafts is far faster than writing thirty descriptions from scratch, so the time saving remains substantial even with a careful review pass.&lt;/p&gt;
&lt;p&gt;What the reviewer checks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Every factual claim traces to the input data.&lt;/strong&gt; This is the whole point of the step.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No invented certifications, standards or awards.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing about durability, safety or performance that you cannot support.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice matches the rest of the catalogue.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The description answers the questions the &lt;a href=&quot;/blog/ecommerce-product-page-checklist/&quot;&gt;product page checklist&lt;/a&gt; requires&lt;/strong&gt;, particularly what is included.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;where-to-start&quot;&gt;Where to start&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Products with no description at all&lt;/strong&gt;, or with a single line copied from a supplier feed.&lt;/p&gt;
&lt;p&gt;Those pages have the most to gain and least to lose. Many stores have hundreds of them — long-tail products nobody had time to write copy for, which consequently convert poorly and rank for nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not start by rewriting your best-performing products.&lt;/strong&gt; That risks your strongest pages to fix something that is not broken, and it is a surprisingly common instinct.&lt;/p&gt;
&lt;h2 id=&quot;on-search-rankings&quot;&gt;On search rankings&lt;/h2&gt;
&lt;p&gt;Generated copy is not penalised for having been generated. Search engines assess whether content is helpful, original and accurate — not how it was produced.&lt;/p&gt;
&lt;p&gt;What has always been a liability is thin, near-identical copy across many products. Generation tools make producing that failure much faster, which is the real risk. A hundred products with the same three paragraphs and a swapped product name is a duplication problem whether a person or a model wrote it.&lt;/p&gt;
&lt;p&gt;The mitigation is the same as it has always been: each description should contain facts specific to that product. If the only difference between two descriptions is the name, one of them is not earning its page.&lt;/p&gt;
&lt;h2 id=&quot;what-not-to-generate&quot;&gt;What not to generate&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safety claims, certifications, or regulatory statements.&lt;/strong&gt; Ever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything in a regulated category&lt;/strong&gt; — supplements, medical devices, cosmetics claims — without qualified review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparative claims about competitor products.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reviews or testimonials.&lt;/strong&gt; This should not need saying, and it does.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;a-realistic-workflow&quot;&gt;A realistic workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Export products missing descriptions, with all their attribute data&lt;/li&gt;
&lt;li&gt;Generate drafts against a fixed instruction and style examples&lt;/li&gt;
&lt;li&gt;Route drafts into a review queue, never straight to publish&lt;/li&gt;
&lt;li&gt;Reviewer checks against the five points above&lt;/li&gt;
&lt;li&gt;Approved copy publishes; rejected copy returns with a note on why&lt;/li&gt;
&lt;li&gt;Track rejection reasons — patterns tell you what to fix in the instruction&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That sixth step is what makes this improve over time instead of staying at a fixed quality level.&lt;/p&gt;
&lt;h2 id=&quot;measure-it&quot;&gt;Measure it&lt;/h2&gt;
&lt;p&gt;Before starting, record how long writing one description takes and how many products lack one. Afterwards, track drafts produced, drafts rejected, and the rejection reasons.&lt;/p&gt;
&lt;p&gt;If the rejection rate stays high, the input data is insufficient — not the model. That distinction saves a lot of wasted iteration on prompts.&lt;/p&gt;
&lt;h2 id=&quot;handling-variants-and-near-identical-products&quot;&gt;Handling variants and near-identical products&lt;/h2&gt;
&lt;p&gt;The hardest case, and the one most likely to produce duplication.&lt;/p&gt;
&lt;p&gt;A catalogue with forty variations of the same product — sizes, colours, capacities — cannot support forty genuinely distinct descriptions, and pretending otherwise produces exactly the thin near-duplicate content that causes problems.&lt;/p&gt;
&lt;p&gt;The right structure is usually one product page with variants, not forty pages. Where the platform or the business genuinely needs separate pages, the description should focus on &lt;strong&gt;what differs&lt;/strong&gt;, with shared information handled once as structured data rather than repeated as prose.&lt;/p&gt;
&lt;p&gt;If you cannot articulate what makes two products different, that is a signal about the catalogue structure rather than a copywriting problem.&lt;/p&gt;
&lt;h2 id=&quot;keeping-the-house-style-consistent&quot;&gt;Keeping the house style consistent&lt;/h2&gt;
&lt;p&gt;Generated copy drifts toward a generic register unless anchored. Two things keep it consistent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Style examples in the instruction.&lt;/strong&gt; Three or four real descriptions you are happy with, provided every time. This does more than any amount of adjective instruction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An explicit banned list.&lt;/strong&gt; The words your brand does not use. Most brands have them, few write them down. Ours are in our own style guide and the same discipline applies to generated product copy.&lt;/p&gt;
&lt;p&gt;Review the output periodically as a set rather than individually. Drift is invisible one description at a time and obvious across twenty.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-translation&quot;&gt;A note on translation&lt;/h2&gt;
&lt;p&gt;The same principles apply, with one addition: a generated translation needs review by somebody who speaks the language and knows the product category.&lt;/p&gt;
&lt;p&gt;Translation errors in product copy are not merely awkward. Sizing, materials, care instructions and safety information all carry real consequences when mistranslated, and the categories where translation is most commercially attractive are often the categories where errors matter most.&lt;/p&gt;
&lt;h2 id=&quot;who-should-own-this&quot;&gt;Who should own this&lt;/h2&gt;
&lt;p&gt;Not the person who set up the tool. The person who owns product content.&lt;/p&gt;
&lt;p&gt;That distinction matters because the failure mode is editorial rather than technical. The workflow will keep producing drafts indefinitely; what determines whether the output is any good is whether somebody with judgement about your products is reading them before publication, and whether they are feeding rejection patterns back into the instruction.&lt;/p&gt;
&lt;p&gt;In practice that is usually whoever writes product copy today. The automation does not replace them — it removes the blank page and leaves them editing, which is faster and generally more pleasant work.&lt;/p&gt;</content:encoded><category>AI &amp; Automation</category><category>ai</category><category>content</category><category>product-data</category><category>automation</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>Reducing cart abandonment: the changes that actually work</title><link>https://buildecommercewebsites.com/blog/reduce-cart-abandonment/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/reduce-cart-abandonment/</guid><description>The specific changes that reduce cart abandonment, ranked by how reliably they work, and the one cause that dwarfs every other in study after study.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cart abandonment advice is mostly a list of tactics with no ordering. This is the ordering, because the first item matters more than everything after it combined.&lt;/p&gt;
&lt;h2 id=&quot;show-the-delivered-total-before-checkout-begins&quot;&gt;Show the delivered total before checkout begins&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Unexpected extra cost is the most commonly cited abandonment reason in every study of the subject.&lt;/strong&gt; Shipping, taxes and fees appearing at the final step, after the customer has invested time, is the single biggest leak in most stores.&lt;/p&gt;
&lt;p&gt;It is also largely within your control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show delivery cost, or a clear estimate, &lt;strong&gt;on the product page&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Show the full delivered total in the cart, before checkout begins&lt;/li&gt;
&lt;li&gt;If a free-shipping threshold exists, show progress toward it&lt;/li&gt;
&lt;li&gt;If costs genuinely cannot be known before an address is entered, say so explicitly rather than leaving a blank&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is that nothing at the final step is a surprise. A customer who knows the total and proceeds anyway has already accepted it.&lt;/p&gt;
&lt;h2 id=&quot;make-guest-checkout-the-obvious-option&quot;&gt;Make guest checkout the obvious option&lt;/h2&gt;
&lt;p&gt;Forcing account creation sits near the top of every abandonment study, and the accounts you gain that way are largely worthless — created under duress, never used again.&lt;/p&gt;
&lt;p&gt;Offer guest checkout prominently. Not hidden below a login form, not styled as the lesser option. Then invite account creation &lt;strong&gt;after&lt;/strong&gt; the order is placed, when the customer has an actual reason to say yes: order tracking, faster reordering, saved addresses.&lt;/p&gt;
&lt;h2 id=&quot;remove-every-field-you-do-not-use&quot;&gt;Remove every field you do not use&lt;/h2&gt;
&lt;p&gt;Audit what you collect against what anybody actually uses.&lt;/p&gt;
&lt;p&gt;The usual suspects: company name on a consumer store, second address lines, phone numbers nobody calls, “how did you hear about us” on the checkout form rather than after it.&lt;/p&gt;
&lt;p&gt;Each removed field is a small increase in completion, and they compound. This is one of the cheapest changes available and it is skipped because nobody owns the form.&lt;/p&gt;
&lt;h2 id=&quot;fix-the-error-handling&quot;&gt;Fix the error handling&lt;/h2&gt;
&lt;p&gt;Error handling is where checkouts lose people who had every intention of buying.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show errors &lt;strong&gt;inline, beside the field&lt;/strong&gt;, not as a summary at the top&lt;/li&gt;
&lt;li&gt;Say what to do, not that something is invalid: “Enter an email address so we can send your receipt” beats “Invalid input”&lt;/li&gt;
&lt;li&gt;Validate as the customer moves through the form, not only on submit&lt;/li&gt;
&lt;li&gt;Never clear entered data when an error occurs — that is the fastest way to lose someone entirely&lt;/li&gt;
&lt;li&gt;Move focus to the first field with a problem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is both a usability improvement and an accessibility requirement.&lt;/p&gt;
&lt;h2 id=&quot;show-payment-methods-early&quot;&gt;Show payment methods early&lt;/h2&gt;
&lt;p&gt;Customers who intend to pay with a specific method want to know it is available before investing effort. Show accepted cards, digital wallets and any buy-now-pay-later options in the cart, not at the final step.&lt;/p&gt;
&lt;p&gt;If you offer a wallet that skips most of the form, put it at the top of checkout where it can be chosen before someone starts typing.&lt;/p&gt;
&lt;h2 id=&quot;make-it-work-properly-on-a-phone&quot;&gt;Make it work properly on a phone&lt;/h2&gt;
&lt;p&gt;Most abandonment happens on mobile, and a substantial share is mechanical rather than motivational:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Correct input types, so numeric keyboards appear for numeric fields&lt;/li&gt;
&lt;li&gt;&lt;code&gt;autocomplete&lt;/code&gt; attributes so saved details fill in&lt;/li&gt;
&lt;li&gt;Targets large enough to hit accurately&lt;/li&gt;
&lt;li&gt;Forms usable one-handed&lt;/li&gt;
&lt;li&gt;No layout shift as the page settles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is glamorous. All of it is measurable.&lt;/p&gt;
&lt;h2 id=&quot;do-not-oversell-recovery-emails&quot;&gt;Do not oversell recovery emails&lt;/h2&gt;
&lt;p&gt;Abandoned-cart emails work, within limits. They recover some orders, and they are worth having.&lt;/p&gt;
&lt;p&gt;They are not a substitute for fixing why people left. A recovery email for a customer who abandoned over unexpected shipping cost is asking them to accept the thing they already rejected. Fix the cause, then let the email catch genuine distractions.&lt;/p&gt;
&lt;h2 id=&quot;accept-that-some-abandonment-is-healthy&quot;&gt;Accept that some abandonment is healthy&lt;/h2&gt;
&lt;p&gt;A meaningful share of carts are not purchase attempts at all. Customers use carts as wishlists, as price comparison tools, and as a way to check delivery cost before deciding.&lt;/p&gt;
&lt;p&gt;Published abandonment figures around seventy percent include all of that. &lt;strong&gt;Track your own trend rather than benchmarking against an industry average&lt;/strong&gt;, because the composition of your traffic determines what “normal” means for you far more than the sector does.&lt;/p&gt;
&lt;h2 id=&quot;measure-it-properly&quot;&gt;Measure it properly&lt;/h2&gt;
&lt;p&gt;Before changing anything, record checkout completion rate and the step where people leave. Afterwards, compare the same two numbers over a full traffic cycle.&lt;/p&gt;
&lt;p&gt;Checkout is one of the few places on most stores with enough volume for genuine A/B testing. If you are going to test anything rigorously, test here. Elsewhere, as covered in &lt;a href=&quot;/blog/ecommerce-product-page-checklist/&quot;&gt;the product page checklist&lt;/a&gt;, most stores lack the traffic for meaningful results.&lt;/p&gt;
&lt;h2 id=&quot;where-to-start-if-you-can-only-do-three-things&quot;&gt;Where to start if you can only do three things&lt;/h2&gt;
&lt;p&gt;In order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Put delivery cost and estimated arrival on the product page&lt;/strong&gt;, not only at checkout. This is the highest-value change available on most stores and it is a content change rather than a development one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make guest checkout obvious.&lt;/strong&gt; Not present-but-hidden. Obvious.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove every checkout field nobody uses.&lt;/strong&gt; Audit against what your fulfilment process actually needs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of those requires a redesign, and together they address the top three reasons cited in essentially every abandonment study.&lt;/p&gt;
&lt;h2 id=&quot;diagnosing-your-own-funnel&quot;&gt;Diagnosing your own funnel&lt;/h2&gt;
&lt;p&gt;Before applying any of this, find out where your customers actually leave. The pattern differs by store and the fix differs with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;High cart abandonment, low checkout abandonment&lt;/strong&gt; — people are adding to cart and never starting checkout. Usually a pricing or delivery-cost surprise at the cart step, or carts being used as wishlists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low cart abandonment, high checkout abandonment&lt;/strong&gt; — people commit and then stall. Look at form length, required fields, payment method availability and error handling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abandonment concentrated on mobile&lt;/strong&gt; — check the mechanical things first. Input types, autocomplete, target sizes, layout shift. Motivation is rarely the issue when desktop converts fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abandonment concentrated at the payment step&lt;/strong&gt; — a payment method customers expect is missing, or the step is failing for some cards and nobody has noticed. Check your error logs rather than guessing.&lt;/p&gt;
&lt;p&gt;That last case is worth emphasising. Genuine checkout errors are more common than people assume, and they are invisible from the outside because the affected customers simply leave. Reading payment failure logs occasionally is unglamorous and occasionally alarming.&lt;/p&gt;
&lt;h2 id=&quot;what-good-looks-like&quot;&gt;What good looks like&lt;/h2&gt;
&lt;p&gt;A checkout worth having:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The delivered total is known before checkout begins&lt;/li&gt;
&lt;li&gt;Guest checkout is the obvious default&lt;/li&gt;
&lt;li&gt;Every field present is a field that gets used&lt;/li&gt;
&lt;li&gt;Errors appear beside the field, in plain language, without clearing entered data&lt;/li&gt;
&lt;li&gt;Payment methods are visible early, and wallets sit at the top&lt;/li&gt;
&lt;li&gt;It works one-handed on a phone with saved details filling in&lt;/li&gt;
&lt;li&gt;Somebody reads the payment failure logs occasionally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that is novel and most stores fail at least three of them.&lt;/p&gt;
&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing&lt;/h2&gt;
&lt;p&gt;Check that your checkout actually works, on a real phone, on a real network, this week. Not a staging copy — the live one, with a real card, refunded afterwards.&lt;/p&gt;
&lt;p&gt;We have found genuinely broken checkouts on stores whose owners had no idea, because the affected customers simply left and nobody reports a checkout that quietly fails.&lt;/p&gt;</content:encoded><category>UX &amp; Conversion</category><category>ux</category><category>conversion</category><category>checkout</category><category>cart-abandonment</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Custom WooCommerce plugins vs stacking third-party ones</title><link>https://buildecommercewebsites.com/blog/custom-woocommerce-plugin-vs-third-party/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/custom-woocommerce-plugin-vs-third-party/</guid><description>When to write your own WooCommerce plugin and when to install one, plus the test we apply before adding any third-party code to a client&apos;s store.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WooCommerce’s plugin ecosystem is genuinely one of its strengths. It is also the most common route by which a maintainable store becomes an unmaintainable one.&lt;/p&gt;
&lt;h2 id=&quot;the-test-we-apply&quot;&gt;The test we apply&lt;/h2&gt;
&lt;p&gt;Before installing any plugin on a client store, we ask one question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Would fifty lines of custom code do this?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If yes, we write the fifty lines. Not because writing code is inherently better, but because fifty lines we wrote can be read, understood, tested, and removed. A plugin cannot always be any of those things.&lt;/p&gt;
&lt;p&gt;That is the whole heuristic. Everything below is elaboration.&lt;/p&gt;
&lt;h2 id=&quot;what-a-plugin-actually-is&quot;&gt;What a plugin actually is&lt;/h2&gt;
&lt;p&gt;A plugin is code written by somebody else, running inside your store, with full database access and the ability to modify almost anything.&lt;/p&gt;
&lt;p&gt;Most of the time that is fine — the ecosystem contains excellent, well-maintained work. But it is worth being clear about what installing one means, because “just install a plugin” is said far too casually.&lt;/p&gt;
&lt;h2 id=&quot;when-a-third-party-plugin-is-the-right-answer&quot;&gt;When a third-party plugin is the right answer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Install one when the problem is common, well-defined, and solved better than you would solve it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Payment gateway integrations, which need PCI knowledge and ongoing certification work&lt;/li&gt;
&lt;li&gt;Subscription billing, where dunning and failed-payment recovery are genuinely hard&lt;/li&gt;
&lt;li&gt;Established shipping carrier integrations&lt;/li&gt;
&lt;li&gt;Security and backup tooling&lt;/li&gt;
&lt;li&gt;Anything requiring a maintained relationship with an external API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The common thread: these are problems where somebody else’s specialised, continuously-maintained work is genuinely better than yours would be. Writing your own payment gateway would be a poor use of anyone’s budget.&lt;/p&gt;
&lt;h2 id=&quot;when-custom-is-the-right-answer&quot;&gt;When custom is the right answer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Write your own when the requirement is specific to your business.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pricing rules unique to how you trade&lt;/li&gt;
&lt;li&gt;Order routing based on your own operational logic&lt;/li&gt;
&lt;li&gt;Integrations with systems you use that have no existing plugin&lt;/li&gt;
&lt;li&gt;Any requirement where the nearest plugin does 70% of it and you would have to bend your process to fit&lt;/li&gt;
&lt;li&gt;Anything where you would otherwise install three plugins that each do part of it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one matters most. &lt;strong&gt;Three overlapping plugins is worse than one custom plugin&lt;/strong&gt;, because nobody can then say which one owns a given behaviour when it misbehaves.&lt;/p&gt;
&lt;h2 id=&quot;where-custom-code-belongs&quot;&gt;Where custom code belongs&lt;/h2&gt;
&lt;p&gt;In a versioned plugin. Not in the theme’s &lt;code&gt;functions.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is not a stylistic preference. Code in &lt;code&gt;functions.php&lt;/code&gt; dies with the theme — change or update the theme and your business logic vanishes with it. Code in a plugin survives theme changes, can be code-reviewed properly, deployed independently, and rolled back on its own.&lt;/p&gt;
&lt;p&gt;It costs nothing extra to do it correctly and it saves an entire category of incident. We have inherited stores where critical pricing logic lived in a child theme nobody had documented, discovered only when the theme was updated.&lt;/p&gt;
&lt;h2 id=&quot;evaluating-a-plugin-before-installing&quot;&gt;Evaluating a plugin before installing&lt;/h2&gt;
&lt;p&gt;If a third-party plugin is the right call, check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;When was it last updated?&lt;/strong&gt; Six months is fine. Two years is a warning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does the developer answer support threads?&lt;/strong&gt; An unanswered forum is the clearest signal available, and a better indicator than install count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it compatible with your WooCommerce and PHP versions?&lt;/strong&gt; Explicitly stated, not assumed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What does it load on the front end?&lt;/strong&gt; Some plugins add scripts sitewide for admin-only functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What happens if it disappears?&lt;/strong&gt; If the developer stops maintaining it, how hard is it to replace or remove?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That fifth question is the one nobody asks, and it is the one that matters in three years.&lt;/p&gt;
&lt;h2 id=&quot;the-accumulation-problem&quot;&gt;The accumulation problem&lt;/h2&gt;
&lt;p&gt;The failure we see most often is not one bad plugin. It is forty plugins where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Three do broadly the same job&lt;/li&gt;
&lt;li&gt;Two were abandoned by their authors years ago&lt;/li&gt;
&lt;li&gt;Several were installed for something that ended&lt;/li&gt;
&lt;li&gt;Nobody can say which one owns the checkout behaviour that is misbehaving&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those plugins was a bad decision individually. The set is a bad outcome collectively, and it happened because each addition was evaluated alone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Review the whole list periodically, not each addition in isolation.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;a-practical-policy&quot;&gt;A practical policy&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Ask whether fifty lines would do it&lt;/li&gt;
&lt;li&gt;If installing, evaluate against the five questions above&lt;/li&gt;
&lt;li&gt;Put custom logic in a versioned plugin, never the theme&lt;/li&gt;
&lt;li&gt;Delete rather than deactivate&lt;/li&gt;
&lt;li&gt;Review the full plugin list quarterly and remove what is unused&lt;/li&gt;
&lt;li&gt;Document what each remaining plugin is for, so the next person knows&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Unglamorous, and the difference between a store that is still maintainable in five years and one that is rebuilt in three.&lt;/p&gt;
&lt;h2 id=&quot;what-a-well-built-custom-plugin-looks-like&quot;&gt;What a well-built custom plugin looks like&lt;/h2&gt;
&lt;p&gt;If you are commissioning one, these are reasonable expectations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is a plugin&lt;/strong&gt;, with a proper header, activation and deactivation hooks, and an uninstall routine that cleans up after itself. Code that leaves database rows behind on uninstall is part of the accumulation problem, not a solution to it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It does one thing.&lt;/strong&gt; A single plugin containing pricing logic, an integration and three unrelated tweaks is harder to reason about and impossible to remove selectively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It follows WordPress coding standards&lt;/strong&gt;, so any competent WordPress developer can pick it up. Bespoke code written in a house style nobody else recognises is a lock-in of a different kind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is version controlled and deployed&lt;/strong&gt;, not edited on production through the file manager.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It is documented&lt;/strong&gt;, at minimum a README explaining what it does, why it exists, and what depends on it. Six months later this is the difference between a five-minute change and an afternoon of reading code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It handles failure.&lt;/strong&gt; External API down, unexpected data, missing configuration — it should degrade rather than break the store.&lt;/p&gt;
&lt;h2 id=&quot;auditing-what-you-already-have&quot;&gt;Auditing what you already have&lt;/h2&gt;
&lt;p&gt;For an existing store where nobody is sure what is running:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Export the plugin list&lt;/strong&gt; with versions, last-update dates and active status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flag anything not updated in over a year.&lt;/strong&gt; Check whether the developer is still active.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify overlaps.&lt;/strong&gt; Group plugins by what they do; anywhere two appear in the same group, one is probably removable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find the custom code.&lt;/strong&gt; Check the theme’s &lt;code&gt;functions.php&lt;/code&gt;, any child theme, and any plugin with a name matching your business rather than a vendor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test removals on staging&lt;/strong&gt;, one at a time, with a way back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document what survives&lt;/strong&gt; and why.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That process typically removes a third of the list on a store that has been running for a few years, and it makes everything after it easier — updates, debugging, and onboarding whoever maintains it next.&lt;/p&gt;
&lt;h2 id=&quot;the-short-version&quot;&gt;The short version&lt;/h2&gt;
&lt;p&gt;Ask whether fifty lines would do it. Put anything bespoke in a versioned plugin rather than the theme. Check the last update date and the support forum before installing anything. Delete what you are not using rather than deactivating it. Review the whole list quarterly rather than evaluating each addition alone.&lt;/p&gt;
&lt;p&gt;Six rules, and following them is most of the difference between a WooCommerce store that stays maintainable and one that gets rebuilt.&lt;/p&gt;</content:encoded><category>WooCommerce</category><category>woocommerce</category><category>plugins</category><category>custom-development</category><category>maintenance</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>Why your WooCommerce store is slow, and how to fix it</title><link>https://buildecommercewebsites.com/blog/why-woocommerce-is-slow/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/why-woocommerce-is-slow/</guid><description>A diagnostic order for slow WooCommerce stores, starting with the configuration change that usually does more than any amount of frontend work.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Almost every slow WooCommerce store we have taken over was slow for a configuration reason, not a code reason. That is good news: configuration is cheaper to fix than architecture.&lt;/p&gt;
&lt;p&gt;Work through these in order. Do not skip to the interesting ones.&lt;/p&gt;
&lt;h2 id=&quot;1-is-there-a-persistent-object-cache&quot;&gt;1. Is there a persistent object cache?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Check this first. It is the most common cause by a wide margin.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WordPress makes a large number of repeated database queries per request. Without a persistent object cache, every one of them hits the database, every time, for every visitor.&lt;/p&gt;
&lt;p&gt;With Redis or Memcached, repeated query results are held in memory. On the stores we have inherited, enabling this has routinely done more for admin and cart response times than any amount of frontend work.&lt;/p&gt;
&lt;p&gt;Most hosting plans do not enable it by default. Many store owners have never been told it exists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; look for a persistent object cache in your site health information, or ask your host directly whether Redis or Memcached is available and active. “We have caching” usually means page caching, which is a different thing.&lt;/p&gt;
&lt;h2 id=&quot;2-how-many-plugins-are-active-and-what-do-they-do&quot;&gt;2. How many plugins are active, and what do they do?&lt;/h2&gt;
&lt;p&gt;Each active plugin runs code on requests, and some run code on &lt;em&gt;every&lt;/em&gt; request whether or not it is needed.&lt;/p&gt;
&lt;p&gt;The specific things to look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plugins doing work on the front end that only relate to admin functions&lt;/li&gt;
&lt;li&gt;Two or more plugins solving broadly the same problem&lt;/li&gt;
&lt;li&gt;Plugins abandoned by their developers&lt;/li&gt;
&lt;li&gt;Anything installed for a campaign or experiment that ended&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deactivating is not enough — delete what you are not using. Deactivated code still sits on disk and still represents a security surface.&lt;/p&gt;
&lt;h2 id=&quot;3-is-page-caching-configured-correctly&quot;&gt;3. Is page caching configured correctly?&lt;/h2&gt;
&lt;p&gt;Page caching serves a static copy of a page rather than generating it per request. It is enormously effective on catalogue and content pages.&lt;/p&gt;
&lt;p&gt;It must &lt;strong&gt;never&lt;/strong&gt; cache cart, checkout or account pages. If it does, customers see one another’s carts and totals. The resulting bugs appear random and intermittent, which makes them expensive to diagnose unless somebody suspects the cache.&lt;/p&gt;
&lt;p&gt;Correct exclusions are the difference between page caching being a large win and being an incident.&lt;/p&gt;
&lt;h2 id=&quot;4-is-the-store-still-on-legacy-order-storage&quot;&gt;4. Is the store still on legacy order storage?&lt;/h2&gt;
&lt;p&gt;WooCommerce historically stored orders in the WordPress posts table, alongside pages and blog posts. That works until order volume grows, at which point order queries compete with content queries for the same indexes.&lt;/p&gt;
&lt;p&gt;High-Performance Order Storage moves orders into purpose-built tables. If your store predates it and has never migrated, admin and reporting are doing far more work than they need to.&lt;/p&gt;
&lt;p&gt;Migrating is a configuration change with a synchronisation step, not a rebuild. On a store with meaningful order history the difference in admin responsiveness is immediate.&lt;/p&gt;
&lt;h2 id=&quot;5-are-the-images-doing-damage&quot;&gt;5. Are the images doing damage?&lt;/h2&gt;
&lt;p&gt;Common and easily fixed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Originals uploaded at full camera resolution and scaled down in the browser&lt;/li&gt;
&lt;li&gt;No modern formats served&lt;/li&gt;
&lt;li&gt;No explicit width and height, causing layout shift as they load&lt;/li&gt;
&lt;li&gt;Every image loading eagerly, including those far below the fold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Product galleries are usually the worst offender, because they contain the most images on the most commercially important template.&lt;/p&gt;
&lt;h2 id=&quot;6-is-the-database-carrying-dead-weight&quot;&gt;6. Is the database carrying dead weight?&lt;/h2&gt;
&lt;p&gt;Over years, a WooCommerce database accumulates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expired transients that were never cleaned up&lt;/li&gt;
&lt;li&gt;Post revisions, sometimes hundreds per page&lt;/li&gt;
&lt;li&gt;Orphaned metadata from plugins removed long ago&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autoloaded options&lt;/strong&gt; — settings loaded into memory on &lt;em&gt;every&lt;/em&gt; request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one deserves attention because it is invisible. Plugins add autoloaded options freely and rarely clean up on uninstall. The table grows quietly for years, and every page view carries the weight.&lt;/p&gt;
&lt;p&gt;Checking the size of your autoloaded options is quick, and trimming it is one of the safest wins available.&lt;/p&gt;
&lt;h2 id=&quot;7-is-the-hosting-adequate-at-all&quot;&gt;7. Is the hosting adequate at all?&lt;/h2&gt;
&lt;p&gt;If the first six are addressed and the store is still slow, the infrastructure may simply be undersized: insufficient PHP memory, an outdated PHP version, a database server shared with too many neighbours, or no CDN in front of static assets.&lt;/p&gt;
&lt;p&gt;At that point the fix is a hosting move, not more optimisation. Specification detail is in &lt;a href=&quot;/blog/running-woocommerce-properly/&quot;&gt;running WooCommerce properly&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;measure-admin-and-front-end-separately&quot;&gt;Measure admin and front end separately&lt;/h2&gt;
&lt;p&gt;They have different causes and different fixes.&lt;/p&gt;
&lt;p&gt;A fast storefront with a slow admin points at the database, legacy order storage, or plugins doing heavy work on admin screens. Page caching hides frontend problems from you while doing nothing for the people actually running the store.&lt;/p&gt;
&lt;p&gt;If your team complains the site is slow and your monitoring says it is fast, this is usually why.&lt;/p&gt;
&lt;h2 id=&quot;what-this-costs&quot;&gt;What this costs&lt;/h2&gt;
&lt;p&gt;Most of the above is configuration and hosting rather than development. That means the fix is normally faster and cheaper than the rebuild people often assume they need.&lt;/p&gt;
&lt;p&gt;We audit before quoting performance work, because quoting a rebuild for a store that needs an object cache switched on would be charging for the wrong job.&lt;/p&gt;
&lt;h2 id=&quot;a-diagnostic-session-in-order&quot;&gt;A diagnostic session, in order&lt;/h2&gt;
&lt;p&gt;If you are working through this yourself, this is the sequence that finds problems fastest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Measure first, on a real page.&lt;/strong&gt; A product page and a category page, on mobile, throttled. Note Largest Contentful Paint, total transferred bytes and main-thread time. Without a baseline you cannot tell whether anything you do helps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the object cache.&lt;/strong&gt; One question to your host. Five minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Count and identify plugins.&lt;/strong&gt; How many are active, and can somebody name what each does?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check the PHP version and memory limit.&lt;/strong&gt; Both are visible in site health.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check order storage mode.&lt;/strong&gt; Legacy or High-Performance Order Storage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Look at the autoloaded options total.&lt;/strong&gt; Anything unusually large points at plugin residue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test the admin separately.&lt;/strong&gt; Load an order list and a product edit screen. If these are slow while the front end is fast, page caching is hiding a database problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Only then look at the theme and images.&lt;/strong&gt; They matter, and they are rarely the largest contributor.&lt;/p&gt;
&lt;p&gt;That order is deliberate: it goes from cheapest-to-check and highest-impact toward most-effort and lowest-impact. Working the other way round is how people spend a week optimising images on a store with no object cache.&lt;/p&gt;
&lt;h2 id=&quot;when-it-is-genuinely-a-code-problem&quot;&gt;When it is genuinely a code problem&lt;/h2&gt;
&lt;p&gt;Sometimes the configuration is right and the store is still slow. The usual culprits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A plugin running expensive queries on every page load&lt;/strong&gt;, often something that should only run on a single template&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom code in the theme&lt;/strong&gt; doing database work inside a loop&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An external API called synchronously&lt;/strong&gt; during page render, so the store is as slow as somebody else’s server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing database indexes&lt;/strong&gt; on custom tables added by a plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These need profiling to find rather than guessing. But they are the minority, and checking them before the configuration items above wastes the expensive diagnostic effort on the least likely cause.&lt;/p&gt;
&lt;h2 id=&quot;keeping-it-fast&quot;&gt;Keeping it fast&lt;/h2&gt;
&lt;p&gt;Performance is not a one-off project. Stores slow down again, predictably, as plugins are added and the database grows.&lt;/p&gt;
&lt;p&gt;Re-run the diagnostic sequence twice a year, and always before a peak trading period. It takes an hour once you have done it once, and it catches degradation while it is still cheap to reverse.&lt;/p&gt;</content:encoded><category>WooCommerce</category><category>woocommerce</category><category>performance</category><category>caching</category><category>hosting</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>The Shopify apps quietly slowing your store down</title><link>https://buildecommercewebsites.com/blog/shopify-apps-slowing-your-store/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/shopify-apps-slowing-your-store/</guid><description>Most slow Shopify stores are slow because of apps, not code. Here is how to audit what each one costs you, and what to do before optimising a single line of Liquid.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When a store is slow, the instinct is to optimise the theme. On Shopify that is usually the wrong place to start, because the theme is rarely the biggest contributor.&lt;/p&gt;
&lt;h2 id=&quot;the-mechanism&quot;&gt;The mechanism&lt;/h2&gt;
&lt;p&gt;Most apps add frontend functionality by injecting JavaScript. That script is added to your theme, and it loads &lt;strong&gt;on every page&lt;/strong&gt; — not only on the pages where the app is actually used.&lt;/p&gt;
&lt;p&gt;A review widget needed on product pages loads on your home page. An upsell tool needed at cart loads on your privacy policy. A currency converter loads on your blog. Each is small. Twenty of them are not, and they all compete for the same single main thread that also has to respond when a customer taps a variant selector.&lt;/p&gt;
&lt;p&gt;This is why two stores on the same theme can differ enormously in speed.&lt;/p&gt;
&lt;h2 id=&quot;audit-before-you-optimise&quot;&gt;Audit before you optimise&lt;/h2&gt;
&lt;p&gt;Doing theme work on a store carrying twenty apps is treating the symptom. The audit comes first, and it is straightforward.&lt;/p&gt;
&lt;h3 id=&quot;step-1--list-every-app-and-what-it-does&quot;&gt;Step 1 — List every app, and what it does&lt;/h3&gt;
&lt;p&gt;For each installed app, write down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What problem it solves&lt;/li&gt;
&lt;li&gt;When it was last actually used or configured&lt;/li&gt;
&lt;li&gt;Whether the platform has since built the feature in&lt;/li&gt;
&lt;li&gt;Whether another installed app does something similar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That fourth question finds the most. Stores routinely run two apps that both do product recommendations, or three that all touch the cart.&lt;/p&gt;
&lt;h3 id=&quot;step-2--establish-what-each-one-costs&quot;&gt;Step 2 — Establish what each one costs&lt;/h3&gt;
&lt;p&gt;Measure the store with the app active, then in a duplicate theme with it removed. What you are looking for is the change in total JavaScript, in main-thread work, and in interaction responsiveness.&lt;/p&gt;
&lt;p&gt;Some apps cost almost nothing. Others are startling. You cannot tell which is which by reading the app listing.&lt;/p&gt;
&lt;h3 id=&quot;step-3--decide-honestly&quot;&gt;Step 3 — Decide, honestly&lt;/h3&gt;
&lt;p&gt;For each app: does the revenue or time it produces exceed what it costs in subscription &lt;strong&gt;and&lt;/strong&gt; in speed?&lt;/p&gt;
&lt;p&gt;For a genuinely effective upsell tool, often yes. For a currency converter on a single-market store, or a popup nobody has updated in a year, almost never.&lt;/p&gt;
&lt;h3 id=&quot;step-4--check-what-uninstalling-leaves-behind&quot;&gt;Step 4 — Check what uninstalling leaves behind&lt;/h3&gt;
&lt;p&gt;This is the step everyone skips.&lt;/p&gt;
&lt;p&gt;Apps built as theme app extensions remove cleanly. Apps that injected script tags or edited theme files often leave fragments behind. Those fragments then load forever, doing nothing, for an app you no longer pay for.&lt;/p&gt;
&lt;p&gt;After uninstalling, search the theme for the app’s name and any script domains it used. We have found remnants of apps removed years earlier still loading on every page view.&lt;/p&gt;
&lt;h2 id=&quot;what-to-look-for-specifically&quot;&gt;What to look for specifically&lt;/h2&gt;
&lt;p&gt;Categories that most often cost more than they return:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Popup and email capture tools&lt;/strong&gt; — frequently load a large bundle for a modal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review widgets&lt;/strong&gt; — value varies enormously by implementation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Currency and geolocation switchers&lt;/strong&gt; — Shopify Markets handles much of this natively now&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple analytics tools&lt;/strong&gt; — each adds a script, and most stores use one properly and ignore two&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything installed for a campaign that ended&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last category is the most common and the easiest to remove.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-with-what-remains&quot;&gt;What to do with what remains&lt;/h2&gt;
&lt;p&gt;Once the list is genuinely necessary:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prefer apps built as theme app extensions.&lt;/strong&gt; Scoped loading, clean removal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask whether metafields would do it.&lt;/strong&gt; A great deal of what stores install apps for is structured product data, which Shopify handles natively at no monthly cost. See &lt;a href=&quot;/blog/custom-shopify-store-guide/&quot;&gt;the custom Shopify build guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask whether Shopify Functions would do it.&lt;/strong&gt; Discount and shipping logic runs natively rather than through an app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load what remains as late as possible&lt;/strong&gt;, and never let a third-party script block first render.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;then-optimise-the-theme&quot;&gt;Then optimise the theme&lt;/h2&gt;
&lt;p&gt;With the app list honest, theme work becomes worth doing: image sizing and formats, above-the-fold render order, removing unused CSS, deferring non-critical scripts.&lt;/p&gt;
&lt;p&gt;That work matters. It is simply not where the biggest win is on most stores, and doing it first means fixing the small problem while the large one keeps growing.&lt;/p&gt;
&lt;h2 id=&quot;review-it-on-a-schedule&quot;&gt;Review it on a schedule&lt;/h2&gt;
&lt;p&gt;Apps accumulate the way subscriptions do — one at a time, each justified individually, never reviewed as a set. Audit at launch and every six months afterwards.&lt;/p&gt;
&lt;p&gt;It is usually the fastest performance win available, and it saves money at the same time, which is a rare combination.&lt;/p&gt;
&lt;h2 id=&quot;building-the-habit&quot;&gt;Building the habit&lt;/h2&gt;
&lt;p&gt;An app audit is not a one-off task. Apps accumulate the way subscriptions do, and the only defence is a routine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At launch.&lt;/strong&gt; Every app justified, documented, and its performance cost measured. Write down what each does, so the next person is not guessing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every six months.&lt;/strong&gt; Full audit against the four steps above. Half a day, and it reliably finds both money and speed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before every peak trading period.&lt;/strong&gt; The worst time to discover an app is slowing checkout is during your busiest week. A shorter check — measure, compare against last time, remove anything obviously unused — takes an hour.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whenever somebody wants to install one.&lt;/strong&gt; A single question at the point of installation: what problem does this solve, and what happens to it when that problem passes? Most unnecessary apps are installed to solve a temporary problem and never revisited.&lt;/p&gt;
&lt;h2 id=&quot;what-to-measure&quot;&gt;What to measure&lt;/h2&gt;
&lt;p&gt;If you want numbers rather than impressions, measure these before and after each change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total JavaScript transferred&lt;/strong&gt; on a product page and on the home page&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main-thread work&lt;/strong&gt;, which is where app scripts actually cost you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interaction responsiveness&lt;/strong&gt;, because variant selection and cart interactions happen after load&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Largest Contentful Paint&lt;/strong&gt;, on mobile, throttled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test on a duplicate theme rather than live, and test the same page each time so comparisons mean something.&lt;/p&gt;
&lt;p&gt;The reason to measure rather than assume is that app cost varies enormously and unpredictably. A visually simple app can ship a large bundle; a complex-looking one can be well built and nearly free. You cannot tell from the listing, and you cannot tell from the price.&lt;/p&gt;
&lt;h2 id=&quot;the-wider-point&quot;&gt;The wider point&lt;/h2&gt;
&lt;p&gt;Every app is a decision to accept somebody else’s code, running on every page, in exchange for a feature.&lt;/p&gt;
&lt;p&gt;Frequently that is a good trade — the ecosystem contains genuinely excellent work, and building the same functionality yourself would cost far more. The problem is not any individual trade. It is that the trades accumulate, nobody reviews the total, and a store ends up carrying twenty of them when it actively uses six.&lt;/p&gt;
&lt;h2 id=&quot;a-short-version&quot;&gt;A short version&lt;/h2&gt;
&lt;p&gt;If you remember one thing: &lt;strong&gt;audit before you optimise.&lt;/strong&gt; Doing theme work on a store carrying twenty apps is fixing the small problem while the large one keeps growing, and it is how performance budgets get spent for very little return.&lt;/p&gt;
&lt;h2 id=&quot;before-you-start&quot;&gt;Before you start&lt;/h2&gt;
&lt;p&gt;Take a measurement of your product page today, on mobile, throttled, and write the numbers down. Everything in this article is easier to act on when you can see whether it worked, and impossible to justify afterwards when you cannot.&lt;/p&gt;</content:encoded><category>Shopify</category><category>shopify</category><category>performance</category><category>apps</category><category>core-web-vitals</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>Do you need Shopify Plus? The honest threshold</title><link>https://buildecommercewebsites.com/blog/do-you-need-shopify-plus/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/do-you-need-shopify-plus/</guid><description>Shopify Plus is sold on revenue thresholds. The real deciding factor is whether you need to change checkout logic — and that has nothing to do with how much you sell.</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shopify Plus is usually sold on revenue thresholds. That framing is convenient for a sales conversation and unhelpful for a technical decision, because the thing you are actually buying has nothing to do with turnover.&lt;/p&gt;
&lt;h2 id=&quot;what-you-are-actually-buying&quot;&gt;What you are actually buying&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Checkout control.&lt;/strong&gt; That is the honest answer.&lt;/p&gt;
&lt;p&gt;Below Plus, Shopify’s checkout is closed. You can style it — colours, logo, some layout. You cannot change its logic. There is no way to add custom validation, conditional fields, bespoke steps, or business rules Shopify has not anticipated.&lt;/p&gt;
&lt;p&gt;This is a deliberate platform decision and it is why Shopify’s checkout converts as well as it does. It is also an absolute ceiling if your business needs something the standard flow does not offer.&lt;/p&gt;
&lt;h2 id=&quot;the-questions-that-actually-decide-it&quot;&gt;The questions that actually decide it&lt;/h2&gt;
&lt;h3 id=&quot;1-do-you-need-to-change-checkout-logic&quot;&gt;1. Do you need to change checkout logic?&lt;/h3&gt;
&lt;p&gt;Specifically, do you need any of these?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom validation before an order can be placed&lt;/li&gt;
&lt;li&gt;Conditional fields based on cart contents or customer type&lt;/li&gt;
&lt;li&gt;Approval or purchase-order workflows&lt;/li&gt;
&lt;li&gt;Minimum order quantities enforced at checkout&lt;/li&gt;
&lt;li&gt;Bespoke tax or shipping logic beyond the built-in rules&lt;/li&gt;
&lt;li&gt;Age, licence or eligibility verification as a checkout step&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;One yes means Plus&lt;/strong&gt;, if you are staying on Shopify. There is no workaround, and attempting one through apps produces a fragile arrangement that breaks on platform updates.&lt;/p&gt;
&lt;h3 id=&quot;2-do-you-sell-to-businesses-on-account-terms&quot;&gt;2. Do you sell to businesses on account terms?&lt;/h3&gt;
&lt;p&gt;Shopify’s B2B features — company accounts, multiple buyers per company, customer-specific catalogues and price lists, payment terms — are Plus-only.&lt;/p&gt;
&lt;p&gt;Below Plus you can approximate wholesale through apps or a second storefront, but you end up maintaining parallel catalogues or accepting that trade customers check out like retail ones. If wholesale is a meaningful revenue share, that compromise costs more in operational friction than the plan difference.&lt;/p&gt;
&lt;h3 id=&quot;3-do-your-integrations-hit-api-rate-limits&quot;&gt;3. Do your integrations hit API rate limits?&lt;/h3&gt;
&lt;p&gt;Plus raises them substantially. This matters for stores with heavy ERP synchronisation or high order throughput, and for almost nobody else. If you do not currently see rate-limit errors, this is not your reason.&lt;/p&gt;
&lt;h3 id=&quot;4-do-you-need-multiple-storefronts-under-one-organisation&quot;&gt;4. Do you need multiple storefronts under one organisation?&lt;/h3&gt;
&lt;p&gt;Multiple markets with genuinely separate catalogues, or multiple brands, are easier to administer on Plus. Note that multi-currency and multi-region selling alone do &lt;strong&gt;not&lt;/strong&gt; require Plus — Shopify Markets handles that on standard plans, and this is a common misunderstanding.&lt;/p&gt;
&lt;h2 id=&quot;reasons-that-are-not-reasons&quot;&gt;Reasons that are not reasons&lt;/h2&gt;
&lt;p&gt;Being candid about the ones we hear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“We’ve hit the revenue threshold.”&lt;/strong&gt; There is no technical threshold. If nothing above applies, the plan buys you nothing you will use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“We want better support.”&lt;/strong&gt; Real, but rarely worth the difference alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“We want to look established.”&lt;/strong&gt; Nobody outside your business can tell which plan you are on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“We need better performance.”&lt;/strong&gt; Plus does not make your storefront faster. Your theme, your apps and your images do that.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;If you are on Plus and cannot name which Plus-only feature you use, you are paying for a badge.&lt;/strong&gt; That is worth checking — we have found it more than once during audits.&lt;/p&gt;
&lt;h2 id=&quot;a-note-for-existing-plus-customers&quot;&gt;A note for existing Plus customers&lt;/h2&gt;
&lt;p&gt;Shopify replaced the old &lt;code&gt;checkout.liquid&lt;/code&gt; customisation approach with Checkout Extensibility. If your Plus checkout was customised before that transition, those customisations need rebuilding as extensions.&lt;/p&gt;
&lt;p&gt;This is not optional maintenance and it is not a small job on a heavily customised checkout. If nobody has raised it with you, raise it with whoever maintains your store.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-instead-if-the-answer-is-no&quot;&gt;What to do instead, if the answer is no&lt;/h2&gt;
&lt;p&gt;If none of the four questions applies, stay on a standard plan and put the difference into things that actually move revenue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Product photography, which is chronically underinvested in&lt;/li&gt;
&lt;li&gt;Fixing the information gaps on your &lt;a href=&quot;/blog/ecommerce-product-page-checklist/&quot;&gt;product pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Auditing the &lt;a href=&quot;/blog/shopify-apps-slowing-your-store/&quot;&gt;apps slowing your store down&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Content that brings qualified traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any of those will do more for a typical store than a plan upgrade nobody outside the business will notice.&lt;/p&gt;
&lt;h2 id=&quot;what-plus-does-not-fix&quot;&gt;What Plus does not fix&lt;/h2&gt;
&lt;p&gt;Worth naming, because these come up in the sales conversation and none of them is a Plus feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance.&lt;/strong&gt; Plus does not make your storefront faster. Your theme, your apps and your images determine that, on any plan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversion.&lt;/strong&gt; The checkout is the same checkout below Plus unless you change it, and changing it is as likely to hurt as help without measurement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Search rankings.&lt;/strong&gt; No plan tier affects how you rank.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;App costs.&lt;/strong&gt; You still pay for apps, and Plus-tier pricing on some apps is higher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A poorly structured catalogue.&lt;/strong&gt; Plus gives you more control over checkout, not better product data.&lt;/p&gt;
&lt;p&gt;If any of those is your actual problem, the plan upgrade is an expensive way to not solve it.&lt;/p&gt;
&lt;h2 id=&quot;how-the-decision-usually-goes-wrong&quot;&gt;How the decision usually goes wrong&lt;/h2&gt;
&lt;p&gt;Two patterns we see repeatedly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upgrading too early&lt;/strong&gt;, because revenue crossed a threshold somebody mentioned. The business pays materially more for features it does not use, and the money would have done more as photography, content or development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upgrading too late&lt;/strong&gt;, having spent eighteen months and considerable development budget engineering around a checkout limitation that Plus would have removed. This one is more expensive, because the workaround usually has to be unpicked afterwards.&lt;/p&gt;
&lt;p&gt;The way to avoid both is to answer the checkout question honestly at the start of a project rather than at the point of frustration. If the requirement exists, it exists now — it does not appear later.&lt;/p&gt;
&lt;h2 id=&quot;if-you-are-already-on-plus-and-unsure&quot;&gt;If you are already on Plus and unsure&lt;/h2&gt;
&lt;p&gt;Three questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Which Plus-only feature are you actually using?&lt;/strong&gt; Name it specifically. Not “the support” — a feature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When did you last review the checkout customisations?&lt;/strong&gt; If they predate Checkout Extensibility, they need rebuilding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is the B2B functionality genuinely in use&lt;/strong&gt;, or was it set up and abandoned?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the answers are vague, it is worth modelling what a standard plan would cost you and what you would lose. Sometimes the answer is that Plus is well justified. Sometimes it is a legacy decision nobody has revisited.&lt;/p&gt;
&lt;h2 id=&quot;a-summary-you-can-act-on&quot;&gt;A summary you can act on&lt;/h2&gt;
&lt;p&gt;Work through this in order and stop at the first yes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do you need to change checkout logic?&lt;/strong&gt; Yes → Plus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you sell B2B on account terms, at meaningful volume?&lt;/strong&gt; Yes → Plus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Are your integrations hitting API rate limits today?&lt;/strong&gt; Yes → Plus is worth costing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you run multiple genuinely separate storefronts?&lt;/strong&gt; Yes → Plus is easier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;None of the above?&lt;/strong&gt; Stay on a standard plan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you reached five, the money is better spent on photography, product content, or fixing the information gaps on your product pages. None of those are as satisfying to buy as a plan upgrade, and all of them will do more for revenue.&lt;/p&gt;
&lt;h2 id=&quot;why-this-article-exists&quot;&gt;Why this article exists&lt;/h2&gt;
&lt;p&gt;Because we have watched businesses upgrade for reasons that do not survive examination, and watched others spend eighteen months and a great deal of development budget engineering around a limitation that Plus removes in an afternoon.&lt;/p&gt;
&lt;p&gt;Both are expensive, and both come from the same cause: the plan decision being framed around revenue rather than around what the checkout needs to do. Ask the checkout question at the start of a project and the answer is usually obvious.&lt;/p&gt;</content:encoded><category>Shopify</category><category>shopify</category><category>shopify-plus</category><category>b2b</category><category>checkout</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>When headless commerce is worth it — and when it isn&apos;t</title><link>https://buildecommercewebsites.com/blog/headless-commerce-worth-it/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/headless-commerce-worth-it/</guid><description>Headless commerce gives you complete frontend control and the highest performance ceiling. It also removes the theme editor and makes every change a developer task.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Headless is the most requested architecture we talk clients out of. Not because it is bad — it is genuinely excellent for certain situations — but because the reason people ask for it is usually solvable more cheaply.&lt;/p&gt;
&lt;h2 id=&quot;what-headless-actually-is&quot;&gt;What headless actually is&lt;/h2&gt;
&lt;p&gt;Your storefront becomes a separate application. It fetches products, collections and cart state from the commerce platform through an API, and you build and host the frontend yourself. The platform continues handling catalogue, payments, orders and fulfilment behind it.&lt;/p&gt;
&lt;p&gt;You gain complete control over the frontend. You take on responsibility for building and running it.&lt;/p&gt;
&lt;h2 id=&quot;what-you-give-up&quot;&gt;What you give up&lt;/h2&gt;
&lt;p&gt;This half gets discussed less than it should.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The theme editor.&lt;/strong&gt; Your marketing team can no longer drag a section, change a banner or reorder a page. Every visual change becomes a development ticket with a deployment behind it.&lt;/p&gt;
&lt;p&gt;For teams accustomed to making their own changes, this is a bigger day-to-day shift than the build cost. It is also the thing most often glossed over during the decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Most of the app ecosystem’s frontend.&lt;/strong&gt; Apps that add storefront functionality generally do it by injecting into a theme. Without a theme, they have nowhere to inject. Some offer headless-compatible components; many do not. Every app you rely on for frontend behaviour needs checking before committing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simplicity.&lt;/strong&gt; You now have two systems, two deployment pipelines, and a hosting bill for the storefront.&lt;/p&gt;
&lt;h2 id=&quot;what-you-gain&quot;&gt;What you gain&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A higher performance ceiling.&lt;/strong&gt; You control every byte. Nothing loads that you did not choose. Done well, headless storefronts are extremely fast.&lt;/p&gt;
&lt;p&gt;Note the phrasing. &lt;strong&gt;The ceiling is higher; the floor is lower.&lt;/strong&gt; A headless storefront shipping a large JavaScript bundle for a product page is slower than a well-optimised theme. The architecture creates an opportunity, not a guarantee, and we have audited headless builds that were slower than the theme they replaced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complete design freedom.&lt;/strong&gt; No theme constraints, no fighting someone else’s assumptions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One backend, many frontends.&lt;/strong&gt; Several brands or storefronts sharing a catalogue and order pipeline is genuinely much easier headless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deep content integration.&lt;/strong&gt; If commerce and editorial content need to interleave properly — shoppable articles, content-led navigation, campaign microsites sharing the cart — headless removes a lot of friction.&lt;/p&gt;
&lt;h2 id=&quot;good-reasons-to-go-headless&quot;&gt;Good reasons to go headless&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple storefronts on one commerce backend&lt;/strong&gt;, particularly multi-brand&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editorial and commerce genuinely interwoven&lt;/strong&gt;, not just a blog bolted on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A bespoke interface&lt;/strong&gt; the theme layer cannot express — configurators, complex filtering, unusual purchase flows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A technically capable in-house team&lt;/strong&gt; who will own the frontend long term&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance requirements&lt;/strong&gt; where you have measured that a well-built theme cannot meet them&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bad-reasons&quot;&gt;Bad reasons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“We want the site to be faster.”&lt;/strong&gt; Fix the &lt;a href=&quot;/blog/shopify-apps-slowing-your-store/&quot;&gt;apps&lt;/a&gt; and images first. That is cheaper and usually sufficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Our theme feels limiting.”&lt;/strong&gt; A custom theme removes theme limits at half the cost and keeps the editor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“It’s more modern.”&lt;/strong&gt; Architecture fashion is not a business case.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Our developers want to work in React.”&lt;/strong&gt; A real consideration for hiring, and not a reason to double the build cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-honest-cost-picture&quot;&gt;The honest cost picture&lt;/h2&gt;
&lt;p&gt;Roughly double a custom theme build for equivalent scope, and the ongoing cost stays higher permanently, because routine changes that were self-service become developer tasks.&lt;/p&gt;
&lt;p&gt;Add storefront hosting, which the commerce platform no longer provides, and a second deployment pipeline to maintain.&lt;/p&gt;
&lt;p&gt;For an organisation with the team and the reasons, that is money well spent. For a store that wanted a faster site, it is a very expensive route to a problem that had a cheaper solution.&lt;/p&gt;
&lt;h2 id=&quot;how-we-advise&quot;&gt;How we advise&lt;/h2&gt;
&lt;p&gt;We ask two questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First: what specifically can you not do today?&lt;/strong&gt; If the answer is a list of theme frustrations, a custom theme solves it for less. If the answer is genuinely architectural — multi-brand, bespoke interfaces, deep content integration — headless is the honest answer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second: who changes the site day to day?&lt;/strong&gt; If marketing currently edits pages themselves and expects to continue, headless removes that, and that consequence needs accepting before the build rather than discovered after it.&lt;/p&gt;
&lt;h2 id=&quot;what-a-headless-project-actually-involves&quot;&gt;What a headless project actually involves&lt;/h2&gt;
&lt;p&gt;If you have decided the reasons are real, this is the shape of the work, which differs substantially from a theme build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontend framework choice.&lt;/strong&gt; Hydrogen if staying close to Shopify’s tooling, or a framework your team already knows. The deciding factor should be who maintains it long term, not which is technically most interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data layer design.&lt;/strong&gt; What gets fetched at build, what gets fetched per request, and what gets cached where. This is the decision that determines whether the storefront is fast, and it is easy to get wrong in ways that only appear under load.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content management.&lt;/strong&gt; Without the theme editor, marketing needs somewhere to edit content. That usually means adding a content management system, which is a second system to run and a cost that is often omitted from the estimate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cart and checkout.&lt;/strong&gt; The cart is yours to build; checkout usually remains with the platform. The handover between them needs care, and it is where headless builds most often introduce bugs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preview and staging.&lt;/strong&gt; Content editors expect to see changes before they publish. Building that is straightforward with a theme and real work headless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hosting and deployment.&lt;/strong&gt; A pipeline, an environment, monitoring, and somebody who owns it.&lt;/p&gt;
&lt;p&gt;None of that is exotic, and all of it is work that a theme build simply does not have.&lt;/p&gt;
&lt;h2 id=&quot;questions-before-committing&quot;&gt;Questions before committing&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Who maintains the frontend in three years?&lt;/strong&gt; Headless storefronts are ordinary web applications with ordinary maintenance needs — dependency updates, framework upgrades, security patches. If the answer is “the agency who built it”, make sure that arrangement is real and funded.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens to the apps you rely on?&lt;/strong&gt; Check each one for headless support before committing, not after.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How will marketing edit content?&lt;/strong&gt; Answer this concretely. “Through the CMS” needs to mean a specific CMS with a specific cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have you measured what a good theme could achieve?&lt;/strong&gt; If performance is the driver, get a proper measurement first. We have seen headless projects commissioned to solve a problem that an app audit and correct image handling would have solved for a fraction of the cost.&lt;/p&gt;
&lt;h2 id=&quot;our-honest-position&quot;&gt;Our honest position&lt;/h2&gt;
&lt;p&gt;We build headless storefronts, and we recommend against them more often than we recommend them.&lt;/p&gt;
&lt;p&gt;That is not caution for its own sake. It is that the reason people ask is usually performance or design flexibility, and both are more cheaply addressed by a custom theme with a disciplined app stack. The situations where headless genuinely wins — multi-brand, deep content integration, bespoke interfaces — are real and specific, and they are worth naming rather than assuming.&lt;/p&gt;
&lt;p&gt;If you can name yours, headless is a good decision. If you cannot, it is an expensive one.&lt;/p&gt;</content:encoded><category>Platform Selection</category><category>headless</category><category>architecture</category><category>performance</category><category>shopify</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>What it actually costs to run an online store</title><link>https://buildecommercewebsites.com/blog/what-it-costs-to-run-an-online-store/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/what-it-costs-to-run-an-online-store/</guid><description>The recurring costs of running an ecommerce store after launch, including the ones that accumulate quietly and the three most people forget to budget for.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Build cost gets scrutinised. Running cost rarely does, and it is the larger number over any meaningful period. This is the full list, including the parts that accumulate without anyone deciding to let them.&lt;/p&gt;
&lt;h2 id=&quot;the-cost-lines&quot;&gt;The cost lines&lt;/h2&gt;
&lt;h3 id=&quot;platform&quot;&gt;Platform&lt;/h3&gt;
&lt;p&gt;On a hosted platform this is the monthly subscription, and it is the most predictable line on the list. Plan tiers usually change what you can do rather than how much traffic you can take.&lt;/p&gt;
&lt;p&gt;On a self-hosted platform there is no licence, but see hosting below.&lt;/p&gt;
&lt;h3 id=&quot;payment-processing&quot;&gt;Payment processing&lt;/h3&gt;
&lt;p&gt;Usually the largest variable cost, and it scales directly with success. Two components: the processor’s percentage and fixed fee, and on some platforms an additional platform fee unless you use their own payment product.&lt;/p&gt;
&lt;p&gt;That platform fee is worth calculating properly rather than dismissing. On a store doing meaningful volume it is a substantial annual number, and it is the main financial argument for self-hosted platforms.&lt;/p&gt;
&lt;h3 id=&quot;apps-and-extensions&quot;&gt;Apps and extensions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;This is the line that grows quietly&lt;/strong&gt;, and the one we most often find has never been reviewed.&lt;/p&gt;
&lt;p&gt;The pattern is consistent. A store adds an app to solve a real problem. The problem passes, or the feature gets built into the platform, and the app stays. Repeat a dozen times over two years and you have a monthly total nobody chose.&lt;/p&gt;
&lt;p&gt;There is a second cost too. Every app that injects a script adds render-blocking weight to every page, including pages where it does nothing. So the subscription total understates the real cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audit the list twice a year.&lt;/strong&gt; It is routinely the fastest saving available on a store, and it usually improves performance at the same time.&lt;/p&gt;
&lt;h3 id=&quot;hosting&quot;&gt;Hosting&lt;/h3&gt;
&lt;p&gt;Zero on hosted platforms. Real and growing on self-hosted ones, where you need enough capacity for object caching, a staging environment and backups — which rules out the cheapest tiers.&lt;/p&gt;
&lt;p&gt;Budgeting the minimum here is a false economy that produces the slow-store problem covered in &lt;a href=&quot;/blog/running-woocommerce-properly/&quot;&gt;running WooCommerce properly&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;domain-email-and-certificates&quot;&gt;Domain, email and certificates&lt;/h3&gt;
&lt;p&gt;Small, annual, and universally forgotten until renewal. Business email at per-seat pricing adds up on a growing team.&lt;/p&gt;
&lt;h3 id=&quot;transactional-messaging&quot;&gt;Transactional messaging&lt;/h3&gt;
&lt;p&gt;Order confirmations, shipping notices, password resets, abandoned-cart sequences. Free tiers cover early volume, then stop. Stores typically discover this during a busy month, which is the worst time to be reconfiguring an email provider.&lt;/p&gt;
&lt;h3 id=&quot;maintenance&quot;&gt;Maintenance&lt;/h3&gt;
&lt;p&gt;On self-hosted platforms, someone must apply updates, test them, and keep backups. Whether that is a retainer or in-house time, it is a real recurring cost and pretending otherwise is how stores end up unmaintained.&lt;/p&gt;
&lt;h3 id=&quot;development&quot;&gt;Development&lt;/h3&gt;
&lt;p&gt;Stores change. New products, seasonal content, a checkout fix, a campaign landing page, an integration with a system the business just adopted.&lt;/p&gt;
&lt;p&gt;Businesses that budget nothing for this end up with a store frozen at its launch state, slowly diverging from how the business actually trades. &lt;strong&gt;The cost of not changing is invisible and larger than the cost of changing.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-three-year-convergence&quot;&gt;The three-year convergence&lt;/h2&gt;
&lt;p&gt;Hosted platforms are cheaper in year one. The gap narrows every year, because app subscriptions accumulate while self-hosted extension costs are often one-off licences.&lt;/p&gt;
&lt;p&gt;Self-hosted platforms cost more to set up properly and stay flatter, provided somebody owns maintenance. If nobody does, the eventual cost is a security incident, which is not a line item anyone budgets for.&lt;/p&gt;
&lt;p&gt;Over three years the totals land closer together than either camp claims. &lt;strong&gt;Choose on fit and maintenance capacity, not on a cost comparison that only counts one column.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;three-worked-examples&quot;&gt;Three worked examples&lt;/h2&gt;
&lt;p&gt;Illustrative shapes rather than real client figures, to show how the balance shifts as a store grows.&lt;/p&gt;
&lt;h3 id=&quot;a-new-store-first-year&quot;&gt;A new store, first year&lt;/h3&gt;
&lt;p&gt;Platform subscription on an entry tier. Payment processing on modest volume. Three or four apps, chosen carefully. A domain and one business email seat. Transactional email comfortably inside a free tier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The dominant costs are not on this list.&lt;/strong&gt; They are photography, initial content, and whatever brings the first traffic. Store running costs at this stage are genuinely small, and the common mistake is over-investing in tooling before there is anything to tool.&lt;/p&gt;
&lt;h3 id=&quot;an-established-store-steady-trade&quot;&gt;An established store, steady trade&lt;/h3&gt;
&lt;p&gt;Platform subscription, possibly on a higher tier. Payment processing now a substantial monthly number. Eight to fifteen apps, several of which nobody has reviewed since installing. Transactional email now paid. A developer engaged periodically for changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is where the app audit pays for itself.&lt;/strong&gt; It is also where development budget starts mattering, because the store now needs to change regularly and every change that requires a quote is a change that gets deferred.&lt;/p&gt;
&lt;h3 id=&quot;a-growing-store-multiple-markets&quot;&gt;A growing store, multiple markets&lt;/h3&gt;
&lt;p&gt;Higher platform tier or Plus. Payment processing across currencies with additional fees. A larger app stack, plus at least one genuinely expensive specialist tool. Meaningful transactional volume. Either a retainer or an in-house hire, because ad-hoc development no longer keeps up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Costs are now dominated by people rather than software.&lt;/strong&gt; The subscriptions are noise against the development and operational spend, which is a different budgeting conversation entirely.&lt;/p&gt;
&lt;h2 id=&quot;costs-that-scale-and-costs-that-do-not&quot;&gt;Costs that scale, and costs that do not&lt;/h2&gt;
&lt;p&gt;Useful when forecasting, because they behave very differently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scales with revenue:&lt;/strong&gt; payment processing, transactional messaging volume, hosting on a self-hosted store, some usage-priced apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scales with complexity:&lt;/strong&gt; development time, integrations, the number of templates and markets to maintain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scales with neglect:&lt;/strong&gt; technical debt, an unaudited app stack, deferred updates. This category is invisible until it is expensive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fixed regardless:&lt;/strong&gt; platform subscription, domain, certificates, most app subscriptions.&lt;/p&gt;
&lt;p&gt;The third category is the one to watch, because nothing on a dashboard reports it. A store that has not been maintained for two years has a real, accumulating cost that appears all at once when something finally breaks.&lt;/p&gt;
&lt;h2 id=&quot;the-subscription-audit-step-by-step&quot;&gt;The subscription audit, step by step&lt;/h2&gt;
&lt;p&gt;Half a day, twice a year, and it is the highest-return administrative task available on a store.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;List every recurring charge&lt;/strong&gt;, including anything on a personal card or a departmental budget. Check the payment provider statement rather than relying on memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For each, answer:&lt;/strong&gt; what does it do, when did we last use it, has the platform since built this in, and does it inject a script on every page?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cancel anything that fails all four.&lt;/strong&gt; There is usually more than you expect.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check what removal leaves behind.&lt;/strong&gt; Uninstalled apps frequently leave code in the theme — detail in &lt;a href=&quot;/blog/shopify-apps-slowing-your-store/&quot;&gt;the apps slowing your store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure the store before and after.&lt;/strong&gt; Both the monthly total and the page weight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write down what remains and why&lt;/strong&gt;, so the next audit starts from a list rather than from scratch.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most stores that have never done this find both money and speed in the same afternoon, which is a rare combination in this line of work.&lt;/p&gt;
&lt;h2 id=&quot;project-or-retainer&quot;&gt;Project or retainer?&lt;/h2&gt;
&lt;p&gt;For continuous small work, a retainer is usually better value — each separate project carries scoping and context-switching overhead that a retainer absorbs.&lt;/p&gt;
&lt;p&gt;For a single defined piece of work with a clear end, a project quote is better. The deciding factor is not size, it is whether the work is continuous or finite.&lt;/p&gt;
&lt;p&gt;Our own answer to this is &lt;a href=&quot;/unlimited-services/&quot;&gt;ProNuts&lt;/a&gt;, published at a real monthly price rather than “contact us for pricing”, with the exclusions listed openly. If your need is one defined project, we will quote it as a project instead.&lt;/p&gt;
&lt;h2 id=&quot;a-budgeting-exercise&quot;&gt;A budgeting exercise&lt;/h2&gt;
&lt;p&gt;List every recurring charge against the store. Include the ones on someone’s personal card. For each, answer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What does this do?&lt;/li&gt;
&lt;li&gt;When did we last use it?&lt;/li&gt;
&lt;li&gt;Has the platform since built this in?&lt;/li&gt;
&lt;li&gt;Does it inject a script on every page?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On most stores, that exercise finds money and speed in the same afternoon.&lt;/p&gt;
&lt;h2 id=&quot;costs-outside-this-list&quot;&gt;Costs outside this list&lt;/h2&gt;
&lt;p&gt;Deliberately excluded above because they are not store running costs, but they consume the same budget and are worth naming so the picture is complete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Photography.&lt;/strong&gt; The most consistently underinvested line in ecommerce. Product pages fail more often on missing information and poor imagery than on anything technical, and good photography outperforms most development work per pound spent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content.&lt;/strong&gt; Product descriptions, category copy, editorial. Someone has to write it, and “we’ll do it internally” usually means it does not happen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marketing.&lt;/strong&gt; Paid acquisition, email, affiliates. Frequently the largest number in the whole business, and entirely outside this article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fulfilment and returns.&lt;/strong&gt; Packaging, postage, warehousing, and the cost of goods coming back. In some categories returns are the difference between profit and loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer support.&lt;/strong&gt; Whether that is somebody’s time or a dedicated person.&lt;/p&gt;
&lt;p&gt;We separate these because store running costs get conflated with the cost of running a business, and the conflation makes the technology look either cheap or ruinous depending on which side of the line you draw it.&lt;/p&gt;
&lt;h2 id=&quot;reducing-what-you-spend&quot;&gt;Reducing what you spend&lt;/h2&gt;
&lt;p&gt;In rough order of return.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audit the subscriptions.&lt;/strong&gt; Covered above. Fastest win available, and it improves speed at the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consolidate overlapping tools.&lt;/strong&gt; Most stores run two things that do the same job because each was added to solve a specific problem at a different time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check your payment processing rate.&lt;/strong&gt; Rates are negotiable at volume and most merchants never ask. This is a phone call, and on a store doing real numbers it is a meaningful annual saving.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Move recurring work into automation&lt;/strong&gt; where the payback is clear — see &lt;a href=&quot;/blog/what-to-automate-in-ecommerce-first/&quot;&gt;what to automate first&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix things properly rather than repeatedly.&lt;/strong&gt; A recurring manual workaround has a cost that never appears on any invoice, and it usually exceeds the cost of fixing whatever causes it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not economise on hosting&lt;/strong&gt; if you are self-hosted. It is the one line where spending less reliably costs more, in performance, in incidents, and eventually in an emergency migration.&lt;/p&gt;
&lt;h2 id=&quot;a-budgeting-template&quot;&gt;A budgeting template&lt;/h2&gt;
&lt;p&gt;For an annual review, list against each line: what you pay, whether it scales with revenue, when you last reviewed it, and what would happen if you removed it.&lt;/p&gt;




































































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Line&lt;/th&gt;&lt;th&gt;Monthly&lt;/th&gt;&lt;th&gt;Scales with&lt;/th&gt;&lt;th&gt;Last reviewed&lt;/th&gt;&lt;th&gt;If removed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Platform subscription&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Plan tier&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store stops&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Payment processing&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Revenue&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store stops&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apps and extensions&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Nothing&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Varies — check each&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hosting&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Traffic&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store stops&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Transactional email&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Volume&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Customers get no confirmations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Domain and certificates&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Nothing&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store stops&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Maintenance&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Complexity&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store decays&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Development&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Ambition&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Store freezes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;That last column is the useful one. Anything where the honest answer is “nothing much” has been identified, and anything where the answer is “the store stops” is not a candidate for cutting regardless of cost.&lt;/p&gt;
&lt;h2 id=&quot;the-one-habit-worth-adopting&quot;&gt;The one habit worth adopting&lt;/h2&gt;
&lt;p&gt;Put a recurring reminder in the calendar, twice a year, to review every subscription against the store.&lt;/p&gt;
&lt;p&gt;That single habit prevents the most common cost problem in ecommerce, which is not any individual expensive tool. It is the slow accumulation of a dozen small ones that each made sense at the time, that nobody has revisited, and that collectively cost more than anybody realises while making the store measurably slower.&lt;/p&gt;
&lt;p&gt;Half a day, twice a year. It is the highest-return administrative task available to a store owner.&lt;/p&gt;
&lt;h2 id=&quot;a-closing-note&quot;&gt;A closing note&lt;/h2&gt;
&lt;p&gt;The most expensive line on any store is rarely the one anybody worries about. It is the accumulated cost of small decisions nobody revisited — the app installed for a campaign that ended, the plan tier upgraded for a feature never used, the maintenance deferred until it became an incident.&lt;/p&gt;
&lt;p&gt;None of those appear on a budget as a problem. All of them appear eventually as a number.&lt;/p&gt;
&lt;h2 id=&quot;where-the-money-usually-is&quot;&gt;Where the money usually is&lt;/h2&gt;
&lt;p&gt;Two things, on nearly every store we audit.&lt;/p&gt;
&lt;p&gt;An app or extension stack that has never been reviewed as a set, costing more than anyone realises and slowing the store while it does it. And a payment processing rate that was agreed when the business was much smaller and has never been renegotiated since.&lt;/p&gt;
&lt;p&gt;Neither requires development work to address. Both are worth more than most optimisation projects.&lt;/p&gt;</content:encoded><category>Running a Store</category><category>costs</category><category>budgeting</category><category>operations</category><category>apps</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>What to automate in an ecommerce business first</title><link>https://buildecommercewebsites.com/blog/what-to-automate-in-ecommerce-first/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/what-to-automate-in-ecommerce-first/</guid><description>A ranking of ecommerce automations by build effort against realistic payback — including the two things clients ask for first that we recommend doing last.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Almost everything written about AI in ecommerce is vague enough to be useless. This article names specific automations, ranks them by effort against payback, and says which ones we recommend against.&lt;/p&gt;
&lt;h2 id=&quot;why-the-first-automation-should-not-be-a-chatbot&quot;&gt;Why the first automation should not be a chatbot&lt;/h2&gt;
&lt;p&gt;It is what most people ask for first, and it is close to the worst place to start.&lt;/p&gt;
&lt;p&gt;A customer-facing assistant is the most visible AI project available, which is exactly the problem. It sits in front of customers, where mistakes are expensive and public. It is high effort to build properly, because doing it well requires retrieval over your own content rather than a generic model. And it pays back slowly, because deflection rates take months to establish.&lt;/p&gt;
&lt;p&gt;The highest-return first automation is nearly always internal and invisible. Nobody sees it. It saves hours every week from the day it ships. And when it makes a mistake, somebody catches it before a customer does.&lt;/p&gt;
&lt;h2 id=&quot;the-ranking&quot;&gt;The ranking&lt;/h2&gt;











































































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Automation&lt;/th&gt;&lt;th&gt;Build effort&lt;/th&gt;&lt;th&gt;Payback speed&lt;/th&gt;&lt;th&gt;Risk if it fails&lt;/th&gt;&lt;th&gt;Start here?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Product description first drafts&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Immediate&lt;/td&gt;&lt;td&gt;Low — caught in review&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Inventory sync between systems&lt;/td&gt;&lt;td&gt;Low–medium&lt;/td&gt;&lt;td&gt;Immediate&lt;/td&gt;&lt;td&gt;Medium — oversells&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Order routing and exception flagging&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Fast&lt;/td&gt;&lt;td&gt;Medium — delayed orders&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search-gap reporting&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;Yes, cheap&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alt text generation for catalogue images&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Yes, cheap&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Review response drafting&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Later&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Product recommendations&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;Low&lt;/td&gt;&lt;td&gt;Later&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customer support assistant&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Slow&lt;/td&gt;&lt;td&gt;&lt;strong&gt;High — customer-facing errors&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Not first&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Automated pricing decisions&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;Unclear&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Very high&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The last two rows are the two things clients most often ask for first.&lt;/p&gt;
&lt;h2 id=&quot;the-three-to-start-with&quot;&gt;The three to start with&lt;/h2&gt;
&lt;h3 id=&quot;product-description-first-drafts&quot;&gt;Product description first drafts&lt;/h3&gt;
&lt;p&gt;Given real product data and three example descriptions in your house style, a model produces usable first drafts at a fraction of the time writing them from scratch takes.&lt;/p&gt;
&lt;p&gt;Given only a product name, it produces plausible fiction — which on an ecommerce site means inaccurate claims about a physical object you then have to ship. That is a commercial and legal problem before it is an SEO one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every generated description needs a human pass before publication&lt;/strong&gt;, and we build that step into the workflow rather than leaving it to discipline.&lt;/p&gt;
&lt;h3 id=&quot;inventory-sync&quot;&gt;Inventory sync&lt;/h3&gt;
&lt;p&gt;Usually no language model at all. A webhook fires on order creation, logic decides what updates where, and systems stay consistent. Shopify Flow and WooCommerce’s Action Scheduler handle much of this natively.&lt;/p&gt;
&lt;p&gt;Payback is immediate and obvious: it removes a recurring manual reconciliation and it stops overselling, which costs real money in refunds and goodwill.&lt;/p&gt;
&lt;h3 id=&quot;order-routing-and-exception-flagging&quot;&gt;Order routing and exception flagging&lt;/h3&gt;
&lt;p&gt;Rules decide fulfilment destination; anything unusual gets flagged for a human rather than silently processed. The value is less in the routing than in the flagging — surfacing the twenty orders a week that need attention, out of the two thousand that do not.&lt;/p&gt;
&lt;h2 id=&quot;what-we-will-not-automate&quot;&gt;What we will not automate&lt;/h2&gt;
&lt;p&gt;Stated plainly, because the boundary matters more than the capability list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pricing decisions.&lt;/strong&gt; Automated repricing without oversight fails in ways that are expensive and public.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final customer-facing copy without review.&lt;/strong&gt; First drafts yes; publication no.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything with legal or safety consequences&lt;/strong&gt; — returns entitlements, product safety claims, regulated categories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fraud or chargeback decisions&lt;/strong&gt; on model output alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support escalation.&lt;/strong&gt; A customer asking for a human gets a human, immediately, every time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;retrieval-and-why-it-decides-quality&quot;&gt;Retrieval, and why it decides quality&lt;/h2&gt;
&lt;p&gt;If you do build a customer-facing assistant, the architecture question that matters is whether it answers from your content or from the model’s general knowledge.&lt;/p&gt;
&lt;p&gt;Retrieval-augmented generation means the system searches your own policies, product data and documentation first, then asks the model to answer using what it found. That is the difference between an assistant that quotes your actual returns policy and one that invents a plausible-sounding policy you are then held to.&lt;/p&gt;
&lt;p&gt;For any customer-facing use, retrieval is not an optimisation. It is the requirement.&lt;/p&gt;
&lt;h2 id=&quot;data-handling&quot;&gt;Data handling&lt;/h2&gt;
&lt;p&gt;Worth being explicit, because it is every buyer’s unspoken second question.&lt;/p&gt;
&lt;p&gt;Name which provider processes what before building anything. Do not send customer personal data to a model unless the task genuinely requires it, and minimise the fields when it does. Build retrieval over content you control. Confirm each provider’s retention and training terms in writing during scoping, because those terms change.&lt;/p&gt;
&lt;p&gt;As data controller, the compliance obligations remain yours. Our job is to document the processing accurately so your records are correct.&lt;/p&gt;
&lt;h2 id=&quot;measure-it-or-lose-it&quot;&gt;Measure it, or lose it&lt;/h2&gt;
&lt;p&gt;Agree before building: what does this replace, and how will we know it worked? Hours saved per week, tickets deflected, error rate against the manual baseline. Record the baseline first.&lt;/p&gt;
&lt;p&gt;That number is what defends the automation the first time it gets something wrong — and it will get something wrong. Automations without a number attached get switched off within a quarter, usually after one visible failure that nobody can weigh against the invisible successes.&lt;/p&gt;
&lt;h2 id=&quot;how-to-scope-an-automation-properly&quot;&gt;How to scope an automation properly&lt;/h2&gt;
&lt;p&gt;Most automation projects go wrong at scoping rather than at build. These are the questions we work through before quoting anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What exactly does a person do today?&lt;/strong&gt; Step by step, including the judgement calls. If nobody can describe the manual process precisely, it is not ready to automate — you would be encoding a process nobody understands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How often, and how long does it take?&lt;/strong&gt; This produces the hours-saved figure that decides whether the work is worth doing. “It takes ages” is not a number.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does the input look like, really?&lt;/strong&gt; Not the ideal case. The messy supplier feed with inconsistent units, the orders with missing fields, the customer messages that contain three questions at once. Automation fails on the edge cases, and the edge cases are where the current manual effort actually goes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What happens when it gets it wrong?&lt;/strong&gt; Who notices, how quickly, and what does it cost? This determines how much review the workflow needs, which is often the largest part of the design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is the fallback?&lt;/strong&gt; Every automation needs a manual path for when it fails or is switched off. Building something the business cannot operate without, that nobody can operate manually, is a fragility you do not want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who owns it afterwards?&lt;/strong&gt; Automations need occasional attention — an API changes, a format shifts, a provider deprecates something. An unowned automation degrades silently.&lt;/p&gt;
&lt;h2 id=&quot;the-four-categories-and-how-they-differ&quot;&gt;The four categories, and how they differ&lt;/h2&gt;
&lt;p&gt;Grouping automations by where they sit clarifies both effort and risk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content generation.&lt;/strong&gt; Product descriptions, alt text, category copy, translation. Low risk when reviewed, immediate payback, and the quality is entirely determined by the quality of the input data. Covered in detail in &lt;a href=&quot;/blog/ai-product-descriptions/&quot;&gt;AI product descriptions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data movement.&lt;/strong&gt; Inventory sync, order routing, catalogue imports, reporting pipelines. Usually no language model at all — this is integration work. Highest reliability, most predictable payback, least glamorous.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer interaction.&lt;/strong&gt; Support assistants, order enquiry handling, recommendations. Highest risk because errors are public, highest effort because doing it properly requires retrieval over your own content, slowest payback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analysis.&lt;/strong&gt; Performance summaries, anomaly detection, search-gap reports, sentiment analysis on reviews. Low risk, slow payback, genuinely useful for the person running the store. Frequently the most under-appreciated category.&lt;/p&gt;
&lt;p&gt;A sensible sequence works through those roughly in order: content, then data, then analysis, then customer interaction last.&lt;/p&gt;
&lt;h2 id=&quot;what-good-looks-like-six-months-in&quot;&gt;What good looks like six months in&lt;/h2&gt;
&lt;p&gt;If automation is working, six months later you should be able to say:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Which specific tasks stopped being done manually&lt;/strong&gt;, named&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How many hours a week that represents&lt;/strong&gt;, measured rather than estimated&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What the error rate is&lt;/strong&gt;, compared against the manual baseline&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who owns each automation&lt;/strong&gt; and when it was last reviewed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which ones you switched off&lt;/strong&gt; and why&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one matters. Some automations do not earn their keep, and being willing to remove them is what stops the automation stack accumulating the way app subscriptions do.&lt;/p&gt;
&lt;p&gt;If instead the answer is “we have AI now” with no numbers attached, the project did not have a measure defined at the start, and it will be difficult to defend the next time somebody reviews costs.&lt;/p&gt;
&lt;h2 id=&quot;cost-and-how-to-think-about-it&quot;&gt;Cost, and how to think about it&lt;/h2&gt;
&lt;p&gt;We deliberately have not quoted figures for individual automations, because the range within each category is wider than the gap between categories. A product-description workflow for two hundred products and one for forty thousand are different projects.&lt;/p&gt;
&lt;p&gt;What is stable is the &lt;em&gt;shape&lt;/em&gt; of the cost:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build cost&lt;/strong&gt; scales with how messy the input data is, not with how clever the automation sounds. Clean, structured product data makes a description workflow straightforward. Inconsistent data spread across three systems makes the same workflow largely a data-cleaning project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Running cost&lt;/strong&gt; is per-operation for anything involving a model, and effectively zero for rules-based integration work. This is one reason we push toward the latter where it will do the job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Review cost&lt;/strong&gt; is ongoing and frequently forgotten. If every output needs a human pass, that time is part of the automation’s real cost and it should be in the comparison.&lt;/p&gt;
&lt;p&gt;The useful calculation is not “what does this cost” but “what does this cost against the hours it removes, including review”. An automation saving four hours a week is worth considerably more than one saving four hours a month, regardless of which was cheaper to build.&lt;/p&gt;
&lt;h2 id=&quot;starting-from-where-you-are&quot;&gt;Starting from where you are&lt;/h2&gt;
&lt;p&gt;If you have never automated anything, the sequence that works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;List the repetitive tasks.&lt;/strong&gt; Anything somebody does the same way every time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time them honestly&lt;/strong&gt; for a fortnight. Estimates are consistently wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick the one with the highest hours and the lowest risk.&lt;/strong&gt; That is almost always internal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record the baseline&lt;/strong&gt; — time taken, error rate, volume.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build the smallest version that works.&lt;/strong&gt; Not the complete vision.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure after a month&lt;/strong&gt; and decide whether to extend or stop.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That sixth step is what most automation programmes lack, and it is why so many end up with a stack of half-used tools nobody can justify.&lt;/p&gt;
&lt;h2 id=&quot;two-things-worth-saying-plainly&quot;&gt;Two things worth saying plainly&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Most ecommerce businesses do not need AI to automate their biggest time sinks.&lt;/strong&gt; Inventory reconciliation, order routing and report generation are integration problems solved with scheduled jobs and API calls. They are less interesting to talk about and they save more hours than anything involving a model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And an automation nobody owns will decay.&lt;/strong&gt; APIs change, formats shift, providers deprecate endpoints. Every automation needs a named owner and an occasional review, exactly like the plugins and apps that accumulate on a store. Building one and walking away produces something that works until it quietly does not, which is worse than not building it.&lt;/p&gt;
&lt;h2 id=&quot;where-to-begin-this-week&quot;&gt;Where to begin this week&lt;/h2&gt;
&lt;p&gt;Spend an hour listing the tasks somebody on your team does the same way every time. Not the interesting ones — the repetitive ones nobody mentions in meetings.&lt;/p&gt;
&lt;p&gt;Time the top three honestly over a fortnight. Then pick the one with the most hours and the least customer-facing risk, and build the smallest possible version of it.&lt;/p&gt;
&lt;p&gt;That sequence has a much better record than starting with the automation that sounds most impressive, and it produces a number you can point at when somebody asks what the investment returned.&lt;/p&gt;
&lt;h2 id=&quot;a-closing-note&quot;&gt;A closing note&lt;/h2&gt;
&lt;p&gt;The businesses that get the most from automation are not the ones with the most sophisticated tooling. They are the ones that measured a manual process, replaced a specific part of it, checked whether that worked, and then did it again.&lt;/p&gt;
&lt;p&gt;That is unglamorous and it compounds. Buying an impressive tool without the measurement rarely does.&lt;/p&gt;</content:encoded><category>AI &amp; Automation</category><category>ai</category><category>automation</category><category>workflow</category><category>operations</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>The ecommerce product page checklist</title><link>https://buildecommercewebsites.com/blog/ecommerce-product-page-checklist/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/ecommerce-product-page-checklist/</guid><description>The questions a product page must answer before a customer will buy, in the order they ask them — plus the four numbers to record before changing anything.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Product pages carry more revenue than any other template on a store, and receive less attention than the home page. This is the checklist we work through on every audit.&lt;/p&gt;
&lt;h2 id=&quot;before-you-change-anything-record-four-numbers&quot;&gt;Before you change anything: record four numbers&lt;/h2&gt;
&lt;p&gt;A redesign that cannot be measured is a redecoration. Before touching a page, record:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Conversion rate by device.&lt;/strong&gt; Mobile and desktop separately, always. They behave differently enough that a blended figure hides the problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add-to-cart rate.&lt;/strong&gt; Distinguishes “they did not want it” from “they wanted it and checkout lost them”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checkout completion rate.&lt;/strong&gt; The proportion who begin checkout and finish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The funnel drop-off point.&lt;/strong&gt; Where in the sequence people actually leave.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Without these you cannot distinguish improvement from seasonality, and the conversation after launch becomes an argument about taste.&lt;/p&gt;
&lt;h2 id=&quot;is-your-product-page-actually-the-problem&quot;&gt;Is your product page actually the problem?&lt;/h2&gt;
&lt;p&gt;Worth checking before spending a budget. If paid traffic converts at a fraction of organic, the storefront is probably fine and the targeting is not. If mobile converts far below desktop, look at performance before layout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We would rather tell you this at audit stage than three months into a redesign.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-checklist&quot;&gt;The checklist&lt;/h2&gt;
&lt;h3 id=&quot;information--the-section-that-matters-most&quot;&gt;Information — the section that matters most&lt;/h3&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is the &lt;strong&gt;delivered price&lt;/strong&gt; clear, including delivery, before checkout?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is &lt;strong&gt;delivery timing&lt;/strong&gt; stated on the page, not only in the footer?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Are &lt;strong&gt;returns terms&lt;/strong&gt; visible near the buy button, not buried in a policy page?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is it clear &lt;strong&gt;what is physically included&lt;/strong&gt;?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; For anything sized: is there a &lt;strong&gt;sizing guide&lt;/strong&gt;, and does it open without leaving the page?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Are &lt;strong&gt;materials, dimensions or specifications&lt;/strong&gt; present for products where they decide the purchase?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is it clear &lt;strong&gt;how this variant differs&lt;/strong&gt; from the one beside it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This section fails more often than all the others combined. Customers abandon because a question went unanswered, and adding the answer near the buy button reliably outperforms rearranging the page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The cheapest conversion work on most product pages is writing, not designing.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;imagery&quot;&gt;Imagery&lt;/h3&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Does at least one image communicate &lt;strong&gt;scale&lt;/strong&gt;?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Can images be &lt;strong&gt;zoomed&lt;/strong&gt; without breaking layout?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is there an image showing the product &lt;strong&gt;in use or in context&lt;/strong&gt;?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Do images have explicit &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; so the page does not shift as they load?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is the primary image served in a modern format at an appropriate size?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-buy-action&quot;&gt;The buy action&lt;/h3&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is the buy button &lt;strong&gt;reachable without hunting&lt;/strong&gt; on a phone?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is variant selection &lt;strong&gt;obvious&lt;/strong&gt;, and does it make out-of-stock combinations clear before selection rather than after?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Does the page communicate &lt;strong&gt;stock status&lt;/strong&gt; honestly?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Are payment methods, including any buy-now-pay-later options, &lt;strong&gt;visible before checkout&lt;/strong&gt;?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is there a clear route back to browsing that does not lose the cart?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;trust&quot;&gt;Trust&lt;/h3&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Are reviews genuine and numerous enough to be credible?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is there a visible contact route for pre-purchase questions?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Are guarantees or warranties stated where they apply?&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Is the returns process described, not merely linked?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;technical-and-accessibility&quot;&gt;Technical and accessibility&lt;/h3&gt;
&lt;ul class=&quot;contains-task-list&quot;&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Every interactive target at least 44×44 CSS pixels&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Contrast meets WCAG 2.2 AA throughout&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Visible focus state on every control&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Interaction responsiveness stays comfortable during variant selection&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Structured data present and matching what is rendered&lt;/li&gt;
&lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; disabled/&gt; Page usable at 200% zoom without content loss&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;category-specific-requirements&quot;&gt;Category-specific requirements&lt;/h2&gt;
&lt;p&gt;The checklist above is universal. These are the additions that matter by category, because a customer buying a jacket asks different questions from one buying a replacement part.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apparel and footwear.&lt;/strong&gt; Sizing guide with actual measurements, not just size labels. Model height and worn size. Fabric composition. Care instructions. Fit description — does it run small? Returns terms stated prominently, because return rates in this category are structurally high and customers know it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Furniture and homeware.&lt;/strong&gt; Dimensions with a scale reference. Assembly requirements and time. Delivery method — kerbside or room of choice materially changes the purchase. Weight, where it affects handling. Material detail beyond the marketing name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Electronics and technical products.&lt;/strong&gt; Full specifications in a structured table rather than prose. Compatibility, stated explicitly. What is in the box, itemised. Warranty terms. Firmware or software requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Food, drink and supplements.&lt;/strong&gt; Ingredients and allergens, prominently. Nutritional information. Storage and shelf life. Any regulated claims handled carefully — this category has real legal exposure and is not a place for generated copy without qualified review.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Made-to-order and personalised.&lt;/strong&gt; Lead time stated before the buy button, not in a policy page. What can and cannot be changed after ordering. Whether returns apply at all, since personalised goods often fall outside standard cancellation rights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replacement parts and consumables.&lt;/strong&gt; Compatibility is the entire purchase decision. A fitment lookup, or at minimum an explicit compatibility list, matters more than photography.&lt;/p&gt;
&lt;h2 id=&quot;how-to-prioritise-what-the-audit-finds&quot;&gt;How to prioritise what the audit finds&lt;/h2&gt;
&lt;p&gt;An audit typically produces thirty to sixty findings. Shipping all of them is neither possible nor sensible, so they need ordering.&lt;/p&gt;
&lt;p&gt;We score each finding on two axes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expected impact&lt;/strong&gt; — how much of the funnel does this touch, and how strong is the evidence that it matters? A missing delivery estimate on every product page scores high. A slightly cramped related-products row scores low.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation effort&lt;/strong&gt; — content change, template change, or architectural change. Content changes are usually hours; architectural changes are weeks.&lt;/p&gt;
&lt;p&gt;That produces four groups:&lt;/p&gt;




















&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Low effort&lt;/th&gt;&lt;th&gt;High effort&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;High impact&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Do first&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Plan properly&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Low impact&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Do while you are in there&lt;/td&gt;&lt;td&gt;Do not do&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The top-left group is where most of the available gain sits, and it is nearly always writing rather than designing — adding delivery timing, stating returns terms, answering the questions support gets asked daily.&lt;/p&gt;
&lt;p&gt;The bottom-right group is worth naming explicitly in any audit report, because it stops the same low-value ideas being raised repeatedly.&lt;/p&gt;
&lt;h2 id=&quot;measuring-afterwards&quot;&gt;Measuring afterwards&lt;/h2&gt;
&lt;p&gt;Compare the same four numbers from the top of this article, over a full traffic cycle rather than a week. A week of data on a store with weekly seasonality tells you about the day of the week.&lt;/p&gt;
&lt;p&gt;Three things to be careful of:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seasonality.&lt;/strong&gt; Comparing December to January will mislead you regardless of what you changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simultaneous changes.&lt;/strong&gt; If a redesign ships alongside a campaign, you cannot attribute the result to either. Stagger where you can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regression to the mean.&lt;/strong&gt; If you changed something because a metric was unusually bad, some of the improvement would have happened anyway.&lt;/p&gt;
&lt;p&gt;None of this means measurement is futile. It means the honest report says “conversion improved by X, and here is what else changed in the same period” rather than claiming clean causation.&lt;/p&gt;
&lt;h2 id=&quot;on-ab-testing-honestly&quot;&gt;On A/B testing, honestly&lt;/h2&gt;
&lt;p&gt;Most stores do not have the traffic for statistically meaningful A/B tests on anything except checkout. Testing a product-page variant at two hundred sessions a week produces noise, not evidence, and treating that noise as a result is worse than not testing.&lt;/p&gt;
&lt;p&gt;We say which changes we can genuinely test and which are judgement calls informed by established research. Anyone promising rigorous testing on low-traffic product pages is selling certainty they cannot deliver.&lt;/p&gt;
&lt;h2 id=&quot;what-to-fix-first&quot;&gt;What to fix first&lt;/h2&gt;
&lt;p&gt;If you can only do three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Put delivery cost and timing on the page.&lt;/strong&gt; Unexpected shipping cost is the most common abandonment cause in every study of the subject.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Answer the top three pre-purchase questions your support team receives&lt;/strong&gt;, in text, near the buy button.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make the buy button reachable on mobile without scrolling back up.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of those require a redesign. All of them are usually cheaper than one.&lt;/p&gt;
&lt;h2 id=&quot;a-worked-example&quot;&gt;A worked example&lt;/h2&gt;
&lt;p&gt;A product page we audited recently, anonymised. A mid-priced consumer product, healthy traffic, conversion well below what the category would suggest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What the page had:&lt;/strong&gt; eight studio photographs on white, a well-written brand story, a price, a buy button, and a related-products carousel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it did not answer:&lt;/strong&gt; how much delivery cost. When it would arrive. What the returns terms were. What was physically in the box. How the two colour variants differed beyond colour. What the product’s dimensions were.&lt;/p&gt;
&lt;p&gt;The design was genuinely good. The photography was expensive. And a customer could not work out what it would cost delivered, or what would happen if it was wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we changed first:&lt;/strong&gt; added delivery cost and estimated arrival above the buy button; added a two-line returns summary beside it; itemised box contents; added one photograph with a scale reference.&lt;/p&gt;
&lt;p&gt;None of that was design work. It was four pieces of writing and one photograph. It is the pattern we see repeatedly — &lt;strong&gt;the page looked finished and was not informationally complete&lt;/strong&gt;, and those are different things that get conflated.&lt;/p&gt;
&lt;h2 id=&quot;where-the-checklist-comes-from&quot;&gt;Where the checklist comes from&lt;/h2&gt;
&lt;p&gt;Nothing above is novel. It comes from three sources, and it is worth naming them so you can go deeper than this article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Published ecommerce UX research&lt;/strong&gt;, particularly &lt;a href=&quot;https://baymard.com/&quot;&gt;Baymard Institute&lt;/a&gt;, which has run large-scale usability testing across ecommerce interfaces for years. Their findings on checkout and product pages are the closest thing the field has to an evidence base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility standards.&lt;/strong&gt; A surprising amount of good ecommerce UX is simply &lt;a href=&quot;https://www.w3.org/TR/WCAG22/&quot;&gt;WCAG 2.2&lt;/a&gt; applied properly — adequate target sizes, visible focus, sufficient contrast, no information conveyed by colour alone. Building accessibly produces better product pages for everyone, not only for people using assistive technology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support tickets.&lt;/strong&gt; The cheapest research available and the most ignored. The questions your support team answers repeatedly are, by definition, questions your product pages are failing to answer. Reading a month of tickets will tell you more about your product pages than any audit.&lt;/p&gt;
&lt;p&gt;That third source deserves emphasis. If you do nothing else from this article, ask whoever handles customer enquiries for the five questions they answer most often, and put those answers on the page.&lt;/p&gt;
&lt;h2 id=&quot;what-we-would-not-bother-with&quot;&gt;What we would not bother with&lt;/h2&gt;
&lt;p&gt;Worth stating, because audit reports tend to list everything and prioritise nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exit-intent popups on product pages.&lt;/strong&gt; They interrupt at the moment of consideration and the recovered conversions rarely justify the annoyance or the script weight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Countdown timers on evergreen products.&lt;/strong&gt; Customers recognise them, and a timer that resets on refresh damages trust more than urgency helps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live visitor counters.&lt;/strong&gt; Same reasoning. If the number is real it is usually unimpressive; if it is fabricated it is dishonest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extensive related-product carousels.&lt;/strong&gt; They push the information customers actually need further down the page, and carousels perform poorly for both engagement and layout stability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video autoplay.&lt;/strong&gt; Weight, distraction, and an accessibility problem for no measured conversion benefit.&lt;/p&gt;
&lt;p&gt;Every one of these is regularly proposed and every one costs more than it returns on a typical store.&lt;/p&gt;
&lt;h2 id=&quot;running-the-checklist-yourself&quot;&gt;Running the checklist yourself&lt;/h2&gt;
&lt;p&gt;You do not need an agency for the first pass. Open your best-selling product page on a phone, and work through the Information section at the top of this article as a customer who has never seen your brand.&lt;/p&gt;
&lt;p&gt;Note every question you cannot answer from the page alone. That list is your work queue, ordered roughly by how early in the page the gap appears.&lt;/p&gt;
&lt;p&gt;Most stores find between five and fifteen items on that first pass, and most of them are writing rather than design. That is a good afternoon’s work with a real return, and it costs nothing but attention.&lt;/p&gt;
&lt;h2 id=&quot;a-closing-note-on-priorities&quot;&gt;A closing note on priorities&lt;/h2&gt;
&lt;p&gt;If there is one bias worth correcting on product pages, it is the assumption that visual quality and informational completeness are the same thing. They are not, and stores routinely have the first without the second.&lt;/p&gt;
&lt;p&gt;Answer the questions first. Then make it beautiful.&lt;/p&gt;</content:encoded><category>UX &amp; Conversion</category><category>ux</category><category>conversion</category><category>product-page</category><category>cro</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Running WooCommerce properly: hosting, caching and security</title><link>https://buildecommercewebsites.com/blog/running-woocommerce-properly/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/running-woocommerce-properly/</guid><description>The infrastructure a WooCommerce store actually needs, why shared hosting fails it, and the maintenance routine that keeps a self-hosted store from becoming a liability.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WooCommerce gets blamed for problems that belong to its hosting. The plugin is mature, widely audited and runs some very large stores. What it does not do is specify its own infrastructure, and that gap is where most disappointing WooCommerce stores are born.&lt;/p&gt;
&lt;h2 id=&quot;why-is-woocommerce-blamed-for-hosting-problems&quot;&gt;Why is WooCommerce blamed for hosting problems?&lt;/h2&gt;
&lt;p&gt;Because the failure looks like a platform failure. The store is slow, the admin is sluggish, checkout hangs under load — and the visible thing is WooCommerce.&lt;/p&gt;
&lt;p&gt;Underneath, the pattern is nearly always the same: a store on shared hosting with no object cache, no CDN, an undersized database and PHP configured for a brochure site. The same store on adequate infrastructure performs completely differently, with no code changes at all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specify the infrastructure before you blame the software.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-a-woocommerce-store-actually-needs&quot;&gt;What a WooCommerce store actually needs&lt;/h2&gt;


















































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;Requirement&lt;/th&gt;&lt;th&gt;Why&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;PHP&lt;/td&gt;&lt;td&gt;8.2 or later, generous memory limit&lt;/td&gt;&lt;td&gt;Performance and supported security patches&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Database&lt;/td&gt;&lt;td&gt;MySQL 8 or MariaDB 10.6+&lt;/td&gt;&lt;td&gt;Query performance, proper indexing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Object cache&lt;/td&gt;&lt;td&gt;Redis or Memcached&lt;/td&gt;&lt;td&gt;The single biggest win — see below&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Page cache&lt;/td&gt;&lt;td&gt;With correct exclusions&lt;/td&gt;&lt;td&gt;Never cache cart, checkout or account pages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CDN&lt;/td&gt;&lt;td&gt;In front of static assets&lt;/td&gt;&lt;td&gt;Latency for geographically spread customers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staging&lt;/td&gt;&lt;td&gt;A real environment, not a copy on the same server&lt;/td&gt;&lt;td&gt;Testing updates before they touch production&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Backups&lt;/td&gt;&lt;td&gt;Automated, offsite, and &lt;strong&gt;restore-tested&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;The only backup that counts is one you have restored&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS&lt;/td&gt;&lt;td&gt;With HSTS&lt;/td&gt;&lt;td&gt;Baseline, and required for payment processing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h3 id=&quot;object-caching-is-the-largest-single-win&quot;&gt;Object caching is the largest single win&lt;/h3&gt;
&lt;p&gt;WordPress makes a large number of repeated database queries per request. Without an object cache, every one hits the database every time. With Redis, the repeated results are held in memory.&lt;/p&gt;
&lt;p&gt;On the stores we have taken over, enabling Redis has routinely done more for admin and cart response times than any amount of frontend work. It is a hosting configuration, not a code change, and &lt;strong&gt;most hosts do not enable it by default.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you take one thing from this article: find out whether your store has a persistent object cache. Many owners discover it does not.&lt;/p&gt;
&lt;h3 id=&quot;high-performance-order-storage&quot;&gt;High-Performance Order Storage&lt;/h3&gt;
&lt;p&gt;Historically, WooCommerce stored orders in the WordPress posts table alongside pages and blog posts. That works until order volume grows, at which point order queries and content queries compete for the same indexes.&lt;/p&gt;
&lt;p&gt;High-Performance Order Storage moves orders into purpose-built tables. If your store predates it and still uses legacy storage, migrating is a configuration change rather than a rebuild, and the effect on admin performance at volume is substantial.&lt;/p&gt;
&lt;h2 id=&quot;the-plugin-problem&quot;&gt;The plugin problem&lt;/h2&gt;
&lt;p&gt;Every plugin is code somebody else maintains, running inside your store, with full database access.&lt;/p&gt;
&lt;p&gt;The failure we see most often is not a hacked site. It is a store with forty plugins where three do broadly the same job, two have been abandoned by their authors, and nobody can say which one owns the checkout behaviour that is misbehaving.&lt;/p&gt;
&lt;p&gt;Our working rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Before installing a plugin, ask whether fifty lines of custom code would do it.&lt;/strong&gt; Fifty lines we wrote can be read, tested and removed. A plugin cannot always be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete rather than deactivate.&lt;/strong&gt; Deactivated plugin code still sits on disk and can still be exploited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the last update date and the support forum before installing.&lt;/strong&gt; An abandoned plugin is a scheduled security incident.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom business logic belongs in a versioned plugin&lt;/strong&gt;, not in the theme’s &lt;code&gt;functions.php&lt;/code&gt;, so it survives a theme change and can be code-reviewed and rolled back.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;a-maintenance-routine-that-works&quot;&gt;A maintenance routine that works&lt;/h2&gt;
&lt;p&gt;Self-hosting means somebody owns this. Not “the team” — a named person.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weekly:&lt;/strong&gt; check for security releases and apply them after a staging test. Review error logs. Confirm backups ran.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monthly:&lt;/strong&gt; apply routine core, plugin and theme updates on staging, test checkout end to end, then deploy. Review the plugin list and remove anything unused.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quarterly:&lt;/strong&gt; restore a backup to staging and confirm it actually works. Review database size and clean up expired transients and old revisions. Audit admin user accounts and remove people who have left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Annually:&lt;/strong&gt; review PHP and database versions against current supported releases. Re-check that every active plugin is still maintained.&lt;/p&gt;
&lt;p&gt;That routine is unglamorous and it is the entire difference between a WooCommerce store that runs for five years and one that becomes a liability in eighteen months.&lt;/p&gt;
&lt;h2 id=&quot;security-concretely&quot;&gt;Security, concretely&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enforce strong authentication on every admin account, with two-factor where possible&lt;/li&gt;
&lt;li&gt;Limit login attempts and change the default login URL&lt;/li&gt;
&lt;li&gt;Never run an administrator account for day-to-day content editing&lt;/li&gt;
&lt;li&gt;Keep file permissions tight and disable file editing from the WordPress admin&lt;/li&gt;
&lt;li&gt;Put a web application firewall in front of the site&lt;/li&gt;
&lt;li&gt;Keep offsite backups, because a backup on the compromised server is not a backup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is exotic. All of it is skipped regularly.&lt;/p&gt;
&lt;h2 id=&quot;what-you-get-in-exchange&quot;&gt;What you get in exchange&lt;/h2&gt;
&lt;p&gt;It is worth restating what this work buys, because the maintenance burden is real and the benefit should be too.&lt;/p&gt;
&lt;p&gt;You hold the database. There is no per-transaction platform fee. No vendor can change your checkout underneath you, deprecate a feature you depend on, or restrict an export. You can move hosts, modify anything, and integrate with systems no platform has anticipated.&lt;/p&gt;
&lt;p&gt;For a business with technical capacity or a maintenance retainer, that is an excellent trade. For a business with neither, it is a bad one — and we will say so rather than sell you a store nobody will look after.&lt;/p&gt;
&lt;h2 id=&quot;getting-the-database-in-order&quot;&gt;Getting the database in order&lt;/h2&gt;
&lt;p&gt;Databases on long-running WooCommerce stores accumulate weight nobody is watching. A periodic clean-up is safe, quick and frequently produces a noticeable improvement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expired transients.&lt;/strong&gt; Temporary cached values meant to expire that often do not clean up properly. On older stores these can number in the tens of thousands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post revisions.&lt;/strong&gt; WordPress stores every save of every page and product as a revision, indefinitely by default. Useful for a week, dead weight after a year. Limiting how many are retained is a one-line configuration change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Orphaned metadata.&lt;/strong&gt; When a plugin is removed, its data usually stays. Over years of installing and removing plugins, a store accumulates metadata belonging to code that no longer exists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autoloaded options.&lt;/strong&gt; The one that matters most, because these load on &lt;em&gt;every single request&lt;/em&gt;. Plugins add them freely and rarely clean up. Checking the total size of autoloaded data takes a minute and is frequently revealing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Order and session tables.&lt;/strong&gt; Abandoned sessions and expired carts accumulate. WooCommerce has scheduled clean-up for some of this; confirm it is actually running rather than assuming it.&lt;/p&gt;
&lt;p&gt;Do this on staging first, with a tested backup, and measure before and after so you know whether it helped.&lt;/p&gt;
&lt;h2 id=&quot;who-owns-this-in-practice&quot;&gt;Who owns this, in practice&lt;/h2&gt;
&lt;p&gt;Everything above needs an owner. Not a team, not whoever notices — a named person with the access and the time.&lt;/p&gt;
&lt;p&gt;The three arrangements that work:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In-house.&lt;/strong&gt; Someone technical whose responsibilities explicitly include the store, with time allocated rather than assumed. Works well when the person exists and stays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A maintenance retainer.&lt;/strong&gt; An external party with a defined scope, a schedule, and accountability. Works well when the scope is written down rather than implied.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A hybrid.&lt;/strong&gt; Someone internal owns content and monitoring; an external party owns updates, security and infrastructure. This is the arrangement we see succeed most often, because it puts each responsibility with whoever is best placed to hold it.&lt;/p&gt;
&lt;p&gt;The arrangement that does not work is the implicit one, where everybody assumes somebody else is watching. That is how a store goes fourteen months without an update.&lt;/p&gt;
&lt;h2 id=&quot;choosing-a-host-the-questions-to-ask&quot;&gt;Choosing a host: the questions to ask&lt;/h2&gt;
&lt;p&gt;Hosting salespeople answer the question you asked, not the one you meant. These are phrased to get useful answers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Is a persistent object cache available, and is it enabled by default?”&lt;/strong&gt; Not “do you have caching” — that gets you a yes about page caching. Redis or Memcached, specifically, and whether you have to request it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“What PHP versions do you support, and what memory limit?”&lt;/strong&gt; You want 8.2 or later and generous memory. A 128MB limit will cause problems on a real store.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Is there a staging environment, and how do I push changes between staging and production?”&lt;/strong&gt; A staging site you cannot easily sync from production is barely a staging site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“How are backups taken, where are they stored, and how do I restore one?”&lt;/strong&gt; Offsite matters. A backup on the same server does not survive the failure mode you are protecting against.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“What happens during a traffic spike?”&lt;/strong&gt; Specifically: do you throttle, queue, or fall over? Worth knowing before your busiest trading day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Is WooCommerce specifically supported?”&lt;/strong&gt; Generic WordPress hosting often page-caches aggressively without excluding cart and checkout, which breaks stores in ways that look random.&lt;/p&gt;
&lt;h2 id=&quot;what-a-staging-environment-actually-needs-to-be&quot;&gt;What a staging environment actually needs to be&lt;/h2&gt;
&lt;p&gt;“We have staging” covers a wide range of quality.&lt;/p&gt;
&lt;p&gt;A staging environment worth having is a &lt;strong&gt;full copy of production&lt;/strong&gt; — same PHP version, same database engine, same plugin set, same theme, with representative data volume. Testing an update against three sample products tells you very little about how it behaves against forty thousand.&lt;/p&gt;
&lt;p&gt;It must be &lt;strong&gt;isolated&lt;/strong&gt;, so nothing done there can send an email to a real customer or charge a real card. Payment gateways in test mode, email interception enabled.&lt;/p&gt;
&lt;p&gt;It must be &lt;strong&gt;refreshable&lt;/strong&gt;, so you can pull production down to staging on demand rather than working against a copy that diverged six months ago.&lt;/p&gt;
&lt;p&gt;And it must actually be &lt;strong&gt;used&lt;/strong&gt;. A staging environment that exists but is bypassed under time pressure provides no protection.&lt;/p&gt;
&lt;h2 id=&quot;reading-the-signs-your-store-is-decaying&quot;&gt;Reading the signs your store is decaying&lt;/h2&gt;
&lt;p&gt;Self-hosted stores rarely fail suddenly. They degrade, and the signals appear well before anything breaks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nobody can say when updates were last applied.&lt;/strong&gt; The single clearest indicator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The plugin list contains things nobody recognises.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Admin has become noticeably slower over months&lt;/strong&gt;, which usually means database growth nobody is managing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP or database versions are approaching or past end of life.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backups run but have never been restored.&lt;/strong&gt; Untested backups fail at exactly the wrong moment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changes are made directly on production&lt;/strong&gt;, because staging is broken or absent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The person who built it has moved on&lt;/strong&gt; and nothing was documented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any two of those together mean the store needs attention before it needs rescuing. Attention is considerably cheaper.&lt;/p&gt;
&lt;h2 id=&quot;one-thing-to-do-this-week&quot;&gt;One thing to do this week&lt;/h2&gt;
&lt;p&gt;If this article is more than you have capacity to act on, do this single check.&lt;/p&gt;
&lt;p&gt;Log into your site health information, or ask your host, and find out whether a persistent object cache is active. Not page caching — object caching, meaning Redis or Memcached.&lt;/p&gt;
&lt;p&gt;If the answer is no, that is very likely your largest available performance improvement, it costs a hosting configuration change rather than development work, and it will improve the admin experience for whoever runs the store every day.&lt;/p&gt;
&lt;p&gt;Everything else in this article can wait behind that one answer.&lt;/p&gt;
&lt;h2 id=&quot;what-good-looks-like&quot;&gt;What good looks like&lt;/h2&gt;
&lt;p&gt;A well-run WooCommerce store, summarised:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object caching enabled and verified&lt;/li&gt;
&lt;li&gt;PHP and database on current supported versions&lt;/li&gt;
&lt;li&gt;Fewer than fifteen active plugins, every one of them identifiable&lt;/li&gt;
&lt;li&gt;Orders on High-Performance Order Storage&lt;/li&gt;
&lt;li&gt;Staging environment that mirrors production and is actually used&lt;/li&gt;
&lt;li&gt;Backups running offsite, restored at least once in the past quarter&lt;/li&gt;
&lt;li&gt;Updates applied on a schedule with a named owner&lt;/li&gt;
&lt;li&gt;Page caching with correct cart and checkout exclusions&lt;/li&gt;
&lt;li&gt;Custom logic in a versioned plugin, not the theme&lt;/li&gt;
&lt;li&gt;Someone who can answer “when was this last updated?” without checking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that is exotic. All of it is the difference between WooCommerce being an excellent choice and an expensive regret.&lt;/p&gt;</content:encoded><category>WooCommerce</category><category>woocommerce</category><category>hosting</category><category>performance</category><category>security</category><category>maintenance</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item><item><title>The complete guide to building a custom Shopify store</title><link>https://buildecommercewebsites.com/blog/custom-shopify-store-guide/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/custom-shopify-store-guide/</guid><description>What actually happens across a custom Shopify build, week by week — the decisions, the sequence, and the two things that reliably break during migration.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most guides to building a Shopify store describe the admin interface. This one describes the project: what happens in which order, what decisions get made when, and where builds go wrong.&lt;/p&gt;
&lt;h2 id=&quot;should-you-build-custom-at-all&quot;&gt;Should you build custom at all?&lt;/h2&gt;
&lt;p&gt;Start here, because the honest answer is often no.&lt;/p&gt;
&lt;p&gt;A configured theme is the right choice when your catalogue is modest, your checkout is standard, and your requirements fit what the theme’s settings already expose. It launches in weeks rather than months and costs a fraction as much. &lt;strong&gt;If that describes you, buy a good theme and spend the difference on photography.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A custom build earns its cost when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have many templates that need to behave differently from one another&lt;/li&gt;
&lt;li&gt;Your product data has structure a theme cannot represent&lt;/li&gt;
&lt;li&gt;You are integrating with systems the theme knows nothing about&lt;/li&gt;
&lt;li&gt;Your brand needs a storefront that does not look like a theme&lt;/li&gt;
&lt;li&gt;You have outgrown a theme and are fighting it on every change&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;stage-1--discovery-and-platform-fit-1-week&quot;&gt;Stage 1 — Discovery and platform fit (1 week)&lt;/h2&gt;
&lt;p&gt;We audit the catalogue, order volume, integrations and business rules to confirm Shopify is the right platform at all, and document every place it will need extending.&lt;/p&gt;
&lt;p&gt;The output is a list of requirements Shopify handles natively, requirements needing an app, and requirements needing custom code. That third list is what drives the estimate, and producing it before quoting is what stops a project discovering its real scope in week six.&lt;/p&gt;
&lt;h2 id=&quot;stage-2--information-architecture-and-ux-12-weeks&quot;&gt;Stage 2 — Information architecture and UX (1–2 weeks)&lt;/h2&gt;
&lt;p&gt;We map collections, navigation, filtering and the checkout path, then wireframe the templates carrying the most revenue: home, collection, product and cart.&lt;/p&gt;
&lt;p&gt;Note the ordering. &lt;strong&gt;The home page is usually the least commercially important template on a store&lt;/strong&gt; and it consistently receives the most attention. Most sessions that convert arrive on a product page from search or an ad, and never see the home page at all.&lt;/p&gt;
&lt;h2 id=&quot;stage-3--design-2-weeks&quot;&gt;Stage 3 — Design (2 weeks)&lt;/h2&gt;
&lt;p&gt;We design the full template set in Figma against a component library, so every page is assembled from the same reusable parts rather than designed in isolation.&lt;/p&gt;
&lt;p&gt;Designing against a component library rather than page by page is what keeps the build predictable. When a designer invents a new card style on the fourth template, that is a new component, new code, new test surface, and new maintenance.&lt;/p&gt;
&lt;h2 id=&quot;stage-4--build-34-weeks&quot;&gt;Stage 4 — Build (3–4 weeks)&lt;/h2&gt;
&lt;p&gt;The theme is developed in Liquid using Online Store 2.0 sections, apps and APIs are wired up, and markets, shipping and tax are configured for your selling regions.&lt;/p&gt;
&lt;p&gt;Some specifics worth knowing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sections everywhere.&lt;/strong&gt; Online Store 2.0 allows sections on every template, not only the home page. Building this way means your team can rearrange layouts afterwards without a developer. It costs slightly more upfront and saves continuously.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Metafields before apps.&lt;/strong&gt; A great deal of what stores install apps for is structured product data — specifications, care instructions, sizing. Metafields and metaobjects handle this natively, with no monthly subscription and no injected script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shopify Functions for logic.&lt;/strong&gt; Discount, shipping and payment customisation logic runs as Shopify Functions rather than as checkout scripts. This is the supported route and it survives platform updates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Theme app extensions over script injection.&lt;/strong&gt; When an app must add frontend behaviour, a theme app extension is scoped and removable. A script injected into the theme is neither, and it is how stores accumulate code nobody can identify two years later.&lt;/p&gt;
&lt;h2 id=&quot;stage-5--migration-and-qa-12-weeks&quot;&gt;Stage 5 — Migration and QA (1–2 weeks)&lt;/h2&gt;
&lt;p&gt;Products, collections, customers and order history migrate through the Admin API. Then the testing, which matters more than the transfer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two things reliably break, and neither is the catalogue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first is URL structure. Shopify enforces &lt;code&gt;/products/&lt;/code&gt;, &lt;code&gt;/collections/&lt;/code&gt; and &lt;code&gt;/pages/&lt;/code&gt; prefixes, so almost every legacy URL changes. Every one needs a redirect. Skipping this is the most common way a migration loses search traffic, and the loss appears three weeks later when it looks like an algorithm update rather than a self-inflicted wound.&lt;/p&gt;
&lt;p&gt;The second is customer passwords. They cannot be migrated — the hashes are not portable. Every customer must reset. That means the reset email needs to be written, scheduled and tested &lt;strong&gt;before&lt;/strong&gt; launch, not discovered afterwards when support tickets arrive from people who cannot log in.&lt;/p&gt;
&lt;p&gt;Testing covers checkout across devices, payment methods, tax rules for each selling region, and every transactional email. Email templates are the most commonly forgotten item on a migration checklist.&lt;/p&gt;
&lt;h2 id=&quot;stage-6--launch-and-optimisation-1-week-and-ongoing&quot;&gt;Stage 6 — Launch and optimisation (1 week and ongoing)&lt;/h2&gt;
&lt;p&gt;We launch, then watch Core Web Vitals and checkout completion for the first weeks and prioritise fixes based on where real users actually drop out.&lt;/p&gt;
&lt;p&gt;A launch is a starting point for measurement, not the end of the project. The store as launched is a hypothesis; the first month of real traffic is the test.&lt;/p&gt;
&lt;h2 id=&quot;what-it-costs-to-run-afterwards&quot;&gt;What it costs to run afterwards&lt;/h2&gt;
&lt;p&gt;Budget explicitly for these, because they recur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shopify’s platform subscription&lt;/strong&gt; — predictable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transaction fees&lt;/strong&gt; — unless using Shopify Payments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App subscriptions&lt;/strong&gt; — the largest and least predictable line, and the one nobody audits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Development&lt;/strong&gt; — proportional to how often the store changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;App costs deserve particular attention. Each app looks inexpensive monthly. Twelve of them do not. We audit the app list at launch and again at six months, and removing unused apps is routinely the fastest performance win available.&lt;/p&gt;
&lt;h2 id=&quot;what-we-need-from-you-and-when&quot;&gt;What we need from you, and when&lt;/h2&gt;
&lt;p&gt;The most common cause of a build running late is not development. It is waiting for content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before stage 2 (information architecture):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A complete product list with categories, even in spreadsheet form&lt;/li&gt;
&lt;li&gt;Any existing analytics access, so decisions are informed by real behaviour&lt;/li&gt;
&lt;li&gt;A list of every system the store must talk to&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Before stage 3 (design):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Brand assets — logo files, fonts, colour references&lt;/li&gt;
&lt;li&gt;Product photography, or a date when it will exist&lt;/li&gt;
&lt;li&gt;Any imagery you have rights to use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Before stage 4 (build):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access to the systems being integrated, with credentials that work&lt;/li&gt;
&lt;li&gt;Final decisions on shipping rates and tax configuration&lt;/li&gt;
&lt;li&gt;Legal pages — privacy, terms, returns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Before stage 5 (migration):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The complete catalogue export from the current platform&lt;/li&gt;
&lt;li&gt;A decision on what happens to order history&lt;/li&gt;
&lt;li&gt;Sign-off on the redirect map&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photography is the single most common delay, and it delays stage 3 rather than stage 6, which means it stops everything behind it. Starting photography early is the cheapest schedule insurance available on any ecommerce project.&lt;/p&gt;
&lt;h2 id=&quot;common-ways-shopify-builds-go-wrong&quot;&gt;Common ways Shopify builds go wrong&lt;/h2&gt;
&lt;p&gt;Patterns we have seen repeatedly, all avoidable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Designing the home page first, and at length.&lt;/strong&gt; It is usually the least commercially important template. Product and collection pages carry the revenue, and they receive whatever attention is left.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choosing apps during the build rather than before.&lt;/strong&gt; Each app added mid-build changes the frontend, sometimes conflicting with what was designed. Decide the app stack in discovery.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Treating the redirect map as a launch-week task.&lt;/strong&gt; It belongs in the migration stage, sized properly, with time to test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No staging discipline.&lt;/strong&gt; Shopify’s theme preview is not the same as a full staging environment with representative data. Test with realistic catalogue volume, not with three sample products.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skipping the transactional emails.&lt;/strong&gt; Order confirmations, shipping notices and password resets all need rebuilding and testing. They are invisible until launch day, when every one of them fires at once.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nobody owning content.&lt;/strong&gt; The build finishes and the store waits three weeks for product descriptions. Assign this at kickoff.&lt;/p&gt;
&lt;h2 id=&quot;the-pre-launch-testing-checklist&quot;&gt;The pre-launch testing checklist&lt;/h2&gt;
&lt;p&gt;What we work through before a Shopify store goes live:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Checkout&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete a real purchase on desktop and on mobile&lt;/li&gt;
&lt;li&gt;Test every enabled payment method, including wallets&lt;/li&gt;
&lt;li&gt;Test with a discount code, and with an invalid one&lt;/li&gt;
&lt;li&gt;Test with a shipping address in every region you sell to&lt;/li&gt;
&lt;li&gt;Confirm tax calculates correctly per region&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Catalogue&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spot-check migrated products against the source data&lt;/li&gt;
&lt;li&gt;Confirm variant availability displays correctly, including sold-out combinations&lt;/li&gt;
&lt;li&gt;Check collections populate as expected&lt;/li&gt;
&lt;li&gt;Verify images transferred at full resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trigger and read every transactional email&lt;/li&gt;
&lt;li&gt;Confirm sender addresses and reply-to are correct&lt;/li&gt;
&lt;li&gt;Check they render on mobile mail clients&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;URLs and search&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run the full redirect list and confirm each resolves in one hop&lt;/li&gt;
&lt;li&gt;Submit the new sitemap&lt;/li&gt;
&lt;li&gt;Confirm structured data validates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Performance and accessibility&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Core Web Vitals on product and collection templates&lt;/li&gt;
&lt;li&gt;Keyboard navigation through the full purchase path&lt;/li&gt;
&lt;li&gt;Contrast and focus states throughout&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That list takes a day to work through properly and it is the difference between a quiet launch and a week of firefighting.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-in-the-first-month-after-launch&quot;&gt;What happens in the first month after launch&lt;/h2&gt;
&lt;p&gt;Launch is where measurement starts. The first month typically produces:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week one&lt;/strong&gt; — small fixes surfacing from real traffic on real devices. Something always behaves differently in the wild than in testing. This is normal and worth reserving time for rather than treating as a defect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week two&lt;/strong&gt; — the first meaningful Core Web Vitals field data begins accumulating. Lab scores from the build are indicative; field data is what counts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weeks three and four&lt;/strong&gt; — enough checkout data to see where people actually drop out, which is nearly always somewhere the build did not anticipate.&lt;/p&gt;
&lt;p&gt;Reserving a small amount of budget for this period is the difference between a store that improves after launch and one frozen at its launch assumptions.&lt;/p&gt;
&lt;h2 id=&quot;structuring-content-so-it-stays-editable&quot;&gt;Structuring content so it stays editable&lt;/h2&gt;
&lt;p&gt;A recurring frustration after launch is that changing anything requires a developer. Much of that is avoidable at build time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use sections and blocks generously.&lt;/strong&gt; Anything the business might want to reorder, hide, or duplicate should be a section with settings rather than hardcoded markup. Hero content, feature rows, trust bars, promotional banners, FAQ blocks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expose the right settings, not every setting.&lt;/strong&gt; A section with forty settings is as unusable as one with none. Expose what will genuinely change — text, images, links, ordering — and hardcode what should not, such as spacing and type scale. Letting a section’s padding be edited is how design systems degrade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use metaobjects for repeated content types.&lt;/strong&gt; Store locations, team members, size guides, ingredient lists. Defined once as a structure, reused across templates, edited in one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Document it.&lt;/strong&gt; A short page explaining which section does what, written at handover, saves an enormous amount of future support time. Most builds skip this and it is close to free to produce.&lt;/p&gt;
&lt;h2 id=&quot;where-the-estimate-actually-comes-from&quot;&gt;Where the estimate actually comes from&lt;/h2&gt;
&lt;p&gt;Useful to understand if you are comparing quotes, because two quotes for “a Shopify build” can differ by a factor of three legitimately.&lt;/p&gt;
&lt;p&gt;The drivers, in rough order of impact:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Template count.&lt;/strong&gt; Not page count — template count. Fifty products using one product template is one template. Four product types needing genuinely different layouts is four.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrations.&lt;/strong&gt; Each system the store must talk to is scoping, building and testing. An ERP integration can exceed the cost of the storefront.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration complexity.&lt;/strong&gt; Catalogue size matters less than data quality. A clean export migrates quickly; inconsistent data needs cleaning first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom logic.&lt;/strong&gt; Anything Shopify does not do natively.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content readiness.&lt;/strong&gt; Not a development cost, but the largest schedule risk.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A quote that does not distinguish these is a guess. When comparing quotes, compare what each assumes about the five above rather than the headline number.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-theme-updates&quot;&gt;A note on theme updates&lt;/h2&gt;
&lt;p&gt;One consequence of a custom build worth understanding: you are no longer on an update path.&lt;/p&gt;
&lt;p&gt;A purchased theme receives updates from its developer, which you can apply. A custom theme does not, because it is yours. That is not a drawback — it means nothing changes underneath you — but it does mean platform changes need watching. When Shopify deprecates something your theme uses, somebody has to act on it.&lt;/p&gt;
&lt;p&gt;In practice this is a small, occasional maintenance item rather than an ongoing burden, and it is the same trade as any bespoke software.&lt;/p&gt;</content:encoded><category>Shopify</category><category>shopify</category><category>liquid</category><category>migration</category><category>build-process</category><author>hello@w3nuts.co.uk (Kay Patel)</author></item><item><title>Shopify vs WooCommerce: which should you actually choose?</title><link>https://buildecommercewebsites.com/blog/shopify-vs-woocommerce/</link><guid isPermaLink="true">https://buildecommercewebsites.com/blog/shopify-vs-woocommerce/</guid><description>A decision framework based on customisation depth, total cost of ownership and who carries the maintenance burden — not on catalogue size or revenue.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most comparisons of these two platforms are written by people who sell one of them. We build on both, which means the recommendation comes before the sales conversation rather than after it. We have advised clients to stay on the platform they already had, and we have talked people out of migrations that would have cost them money for no gain.&lt;/p&gt;
&lt;p&gt;Here is how the decision actually breaks down.&lt;/p&gt;
&lt;h2 id=&quot;what-is-the-real-difference-between-shopify-and-woocommerce&quot;&gt;What is the real difference between Shopify and WooCommerce?&lt;/h2&gt;
&lt;p&gt;Shopify is hosted software. You rent it, Shopify runs the servers, applies the security patches, handles PCI compliance and guarantees uptime. In exchange you accept the boundaries of what Shopify permits, and you pay monthly.&lt;/p&gt;
&lt;p&gt;WooCommerce is a plugin for WordPress. You install it on hosting you control, and the database containing your products, customers and orders is yours outright. Nobody can change your checkout, raise a platform fee, or restrict an export. In exchange, everything that Shopify handles becomes your responsibility.&lt;/p&gt;
&lt;p&gt;That is the whole trade. Everything below is a consequence of it.&lt;/p&gt;
&lt;h2 id=&quot;does-the-closed-checkout-matter-to-you&quot;&gt;Does the closed checkout matter to you?&lt;/h2&gt;
&lt;p&gt;This is the single most decisive technical difference, and it is the one most often discovered too late.&lt;/p&gt;
&lt;p&gt;Below Shopify Plus, Shopify’s checkout is closed. You can style it. You cannot change its logic. No custom validation, no bespoke steps, no conditional fields, no business rules that Shopify has not anticipated.&lt;/p&gt;
&lt;p&gt;For most direct-to-consumer stores that is fine — the standard checkout is well tested and converts well. But if your business needs any of the following, standard Shopify cannot do it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer-specific pricing agreed by contract&lt;/li&gt;
&lt;li&gt;Purchase order or approval workflows&lt;/li&gt;
&lt;li&gt;Minimum order quantities enforced at checkout&lt;/li&gt;
&lt;li&gt;Custom tax or shipping logic beyond the built-in rules&lt;/li&gt;
&lt;li&gt;Age or licence verification as a checkout step&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On Shopify, that means Shopify Plus, which is a substantial jump in cost. On WooCommerce, it means writing a plugin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask this question first.&lt;/strong&gt; It resolves a surprising number of platform decisions on its own.&lt;/p&gt;
&lt;h2 id=&quot;what-does-each-actually-cost-over-three-years&quot;&gt;What does each actually cost over three years?&lt;/h2&gt;
&lt;p&gt;This is where both camps mislead. Shopify advocates quote the monthly fee and ignore app subscriptions. WooCommerce advocates say “it’s free” and ignore hosting and maintenance.&lt;/p&gt;


















































&lt;div class=&quot;table-wrap&quot; role=&quot;region&quot; tabindex=&quot;0&quot; aria-label=&quot;Table, scroll to see more&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cost line&lt;/th&gt;&lt;th&gt;Shopify&lt;/th&gt;&lt;th&gt;WooCommerce&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Platform licence&lt;/td&gt;&lt;td&gt;Monthly subscription&lt;/td&gt;&lt;td&gt;None — GPL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Transaction fee&lt;/td&gt;&lt;td&gt;Platform fee unless using Shopify Payments, plus processor fees&lt;/td&gt;&lt;td&gt;Payment processor only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hosting&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Yours — real, and scales with traffic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Security and updates&lt;/td&gt;&lt;td&gt;Handled for you&lt;/td&gt;&lt;td&gt;Yours — retainer or in-house time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Extensions&lt;/td&gt;&lt;td&gt;Mostly monthly subscriptions, recurring&lt;/td&gt;&lt;td&gt;Mostly one-off licences, annual renewal for updates&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PCI compliance&lt;/td&gt;&lt;td&gt;Handled&lt;/td&gt;&lt;td&gt;Your responsibility&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Developer needed to change things&lt;/td&gt;&lt;td&gt;Sometimes&lt;/td&gt;&lt;td&gt;Often&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cost trajectory as you grow&lt;/td&gt;&lt;td&gt;Rises with apps and plan tier&lt;/td&gt;&lt;td&gt;Rises with hosting and complexity&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The pattern we see repeatedly: Shopify is cheaper in year one and the gap narrows every year after, because app subscriptions accumulate quietly and nobody audits them. WooCommerce is more expensive to set up properly and flatter thereafter, provided somebody owns maintenance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neither is reliably cheaper.&lt;/strong&gt; Anyone who tells you otherwise is quoting one column and hiding the rest.&lt;/p&gt;
&lt;h2 id=&quot;who-will-own-maintenance-in-eighteen-months&quot;&gt;Who will own maintenance in eighteen months?&lt;/h2&gt;
&lt;p&gt;This is the question that should decide it, and it is not a technical question at all.&lt;/p&gt;
&lt;p&gt;A WooCommerce store needs someone to apply core, plugin and theme updates on a schedule, test them on staging first, keep backups they have actually restored from at least once, and notice when a plugin is abandoned by its author. That is a real, recurring commitment.&lt;/p&gt;
&lt;p&gt;If you have in-house technical capacity or a maintenance retainer, that commitment buys you genuine ownership and no platform fee. It is a good trade.&lt;/p&gt;
&lt;p&gt;If the honest answer is “nobody” — if the site will be built and then left alone until something breaks — &lt;strong&gt;choose Shopify.&lt;/strong&gt; An unmaintained WooCommerce store is a security incident waiting to happen, and it is the most common way we see stores fail.&lt;/p&gt;
&lt;h2 id=&quot;when-we-recommend-shopify&quot;&gt;When we recommend Shopify&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You want to launch quickly and your requirements fit standard commerce patterns&lt;/li&gt;
&lt;li&gt;Nobody on your side will own ongoing maintenance&lt;/li&gt;
&lt;li&gt;You sell direct-to-consumer with a conventional checkout&lt;/li&gt;
&lt;li&gt;You want predictable monthly costs rather than variable infrastructure ones&lt;/li&gt;
&lt;li&gt;You are entering multiple markets and want multi-currency handled for you&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-we-recommend-woocommerce&quot;&gt;When we recommend WooCommerce&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Your business logic does not fit standard commerce patterns&lt;/li&gt;
&lt;li&gt;You already run WordPress and the store is an extension of an existing content site&lt;/li&gt;
&lt;li&gt;Data ownership matters to you commercially or contractually&lt;/li&gt;
&lt;li&gt;You object to per-transaction platform fees on principle or at your volume&lt;/li&gt;
&lt;li&gt;You have technical capacity or budget for a maintenance retainer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-we-tell-people-not-to-switch&quot;&gt;When we tell people not to switch&lt;/h2&gt;
&lt;p&gt;Migration costs real money and carries real risk. We turn down migration work when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The current platform is working and the complaint is really about the design, which is cheaper to fix in place&lt;/li&gt;
&lt;li&gt;The motivation is cost saving that the three-year comparison above does not support&lt;/li&gt;
&lt;li&gt;The store launched under twelve months ago and has not yet been given a fair run&lt;/li&gt;
&lt;li&gt;The actual problem is traffic quality or product-market fit, which no platform change will address&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-decide-in-ten-minutes&quot;&gt;How to decide in ten minutes&lt;/h2&gt;
&lt;p&gt;Work through these in order and stop at the first clear answer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do you need to change checkout logic?&lt;/strong&gt; Yes, and Plus is out of budget → WooCommerce.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Will anyone own maintenance?&lt;/strong&gt; No → Shopify.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does your business logic fit standard commerce patterns?&lt;/strong&gt; No → WooCommerce.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you need to launch in under a month?&lt;/strong&gt; Yes → Shopify.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Still undecided?&lt;/strong&gt; Choose Shopify. When the decision is genuinely balanced, the lower operational burden wins.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That last point is not a cop-out. A tie means neither platform’s specific strengths are decisive for you, and in that situation the one that demands less of you afterwards is the better business decision.&lt;/p&gt;
&lt;h2 id=&quot;where-each-platform-genuinely-struggles&quot;&gt;Where each platform genuinely struggles&lt;/h2&gt;
&lt;p&gt;Both camps publish strengths. Here are the weaknesses, from building on both.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shopify struggles with:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complex B2B below Plus.&lt;/strong&gt; Company accounts, contract pricing and payment terms are Plus features. Approximating them with apps produces a compromised experience that trade customers notice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deeply structured product data.&lt;/strong&gt; Metafields have improved this enormously, but products with genuinely complex relationships — configurable assemblies, compatibility matrices, kits built from other products — still fight the data model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content-heavy sites.&lt;/strong&gt; Shopify’s blogging and page tools are basic. If editorial is central to how you sell, you will end up either accepting less than you want or running a separate content system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost predictability at scale.&lt;/strong&gt; The base fee is predictable. The app stack is not, and it grows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WooCommerce struggles with:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Neglect.&lt;/strong&gt; Every other weakness is downstream of this one. An unmaintained WooCommerce store degrades in a way a hosted platform does not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checkout under load.&lt;/strong&gt; Cart and checkout cannot be page-cached, so they hit PHP and the database on every request. This is solvable with adequate infrastructure and it is where undersized hosting shows up first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin conflicts.&lt;/strong&gt; Two extensions modifying the same hook produce behaviour neither author anticipated, and diagnosing it is genuinely time-consuming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upgrade risk.&lt;/strong&gt; A major WooCommerce release can break an extension you depend on. This is why staging is not optional.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-about-the-other-platforms&quot;&gt;What about the other platforms?&lt;/h2&gt;
&lt;p&gt;Shopify and WooCommerce dominate the decision, but they are not the only options and it is worth knowing when something else fits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adobe Commerce&lt;/strong&gt; suits large catalogues with genuinely complex B2B requirements and a budget to match. It is powerful and expensive to build and run, and it is overkill for most businesses considering it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BigCommerce&lt;/strong&gt; sits close to Shopify with no per-transaction platform fee and strong multi-channel support. Smaller ecosystem, fewer developers who know it well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Squarespace and Wix&lt;/strong&gt; are genuinely fine for small catalogues where the store is secondary to the brand presence, and where nobody wants to think about infrastructure. They become limiting quickly if commerce becomes the main business.&lt;/p&gt;
&lt;p&gt;We name these honestly rather than pretending the world contains two platforms. If one of them fits you better, that is worth knowing before you commit.&lt;/p&gt;
&lt;h2 id=&quot;a-worked-example-two-similar-businesses-different-answers&quot;&gt;A worked example: two similar businesses, different answers&lt;/h2&gt;
&lt;p&gt;Two clothing brands, comparable revenue, comparable catalogue size.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first&lt;/strong&gt; sells direct to consumers, runs seasonal drops, has no in-house technical staff, and wants to launch a new market this year. Their checkout requirements are entirely standard.&lt;/p&gt;
&lt;p&gt;Shopify. Nobody will own maintenance, the multi-market work is handled natively, and nothing about their requirements needs custom checkout logic. Any time spent on infrastructure would be time not spent on product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second&lt;/strong&gt; sells to consumers and to trade, with contract pricing per stockist, minimum order quantities on wholesale, and an existing WordPress site that generates substantial organic traffic. They employ a developer.&lt;/p&gt;
&lt;p&gt;WooCommerce. The trade requirements would force Shopify Plus, the content site is already the traffic engine, and they have somebody to own maintenance. Same sector, same size, opposite answer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The variable was never the size of the business.&lt;/strong&gt; It was the checkout requirements and the maintenance capacity, which is exactly what the questions above are designed to surface.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-switching-costs&quot;&gt;A note on switching costs&lt;/h2&gt;
&lt;p&gt;Worth factoring in before treating this as a clean comparison: if you already have a store, the cost of the decision includes moving.&lt;/p&gt;
&lt;p&gt;Migration is not only data transfer. It is rebuilding integrations, recreating transactional emails, mapping every URL, retraining whoever runs the store daily, and accepting a period of reduced performance while search engines reassess. Detail in &lt;a href=&quot;/blog/ecommerce-platform-migration-without-losing-traffic/&quot;&gt;migrating without losing search traffic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That cost is real enough that “the other platform is slightly better for us” is usually not sufficient reason to move. The threshold for switching should be higher than the threshold for choosing, and we routinely advise businesses to stay where they are.&lt;/p&gt;
&lt;h2 id=&quot;questions-to-ask-any-agency-recommending-one&quot;&gt;Questions to ask any agency recommending one&lt;/h2&gt;
&lt;p&gt;If you are taking advice on this decision, these questions separate a considered recommendation from a default one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Which do you build on?”&lt;/strong&gt; An agency that only builds on one will recommend that one. That does not make them dishonest, but it does mean the recommendation carries less information than it appears to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“What would make you recommend the other?”&lt;/strong&gt; A good answer names specific conditions. A vague answer means the decision was made before they heard your requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“What does my checkout need to do?”&lt;/strong&gt; If they have not asked this, they have not made a platform decision — they have made a platform assumption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“Who will maintain this in two years?”&lt;/strong&gt; An agency that does not raise this on a WooCommerce recommendation is not thinking past launch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“What happens if I want to leave?”&lt;/strong&gt; Both platforms allow it. The answer should be a description of the process, not discomfort.&lt;/p&gt;
&lt;h2 id=&quot;ownership-in-practical-terms&quot;&gt;Ownership, in practical terms&lt;/h2&gt;
&lt;p&gt;“Data ownership” gets used loosely, so here is what it actually means day to day.&lt;/p&gt;
&lt;p&gt;On WooCommerce you hold the database. You can query it directly, back it up whenever you like, move it to another host, and build anything you want against it. If your business needs to do something unusual with its own order data, nothing stands in the way.&lt;/p&gt;
&lt;p&gt;On Shopify you have export tools and APIs, which cover the overwhelming majority of real needs. What you do not have is the underlying store. Historical order data is harder to extract completely, and you are working within the surface the platform exposes.&lt;/p&gt;
&lt;p&gt;For most businesses this distinction is theoretical and Shopify’s exports are entirely sufficient. It becomes concrete in two situations: when you have contractual or regulatory obligations about data custody, and when you eventually want to leave.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neither position is wrong.&lt;/strong&gt; It is worth knowing which one you are choosing rather than discovering it later.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;p&gt;If you have landed on Shopify, our &lt;a href=&quot;/services/shopify-development/&quot;&gt;Shopify development service&lt;/a&gt; covers custom themes, headless builds and migrations. If WooCommerce is the fit, &lt;a href=&quot;/services/woocommerce-development/&quot;&gt;our WooCommerce work&lt;/a&gt; starts with an infrastructure audit rather than a quote.&lt;/p&gt;
&lt;p&gt;Still unsure? &lt;a href=&quot;/contact/&quot;&gt;Tell us what you are building&lt;/a&gt; and we will give you a straight answer, including if that answer is that you do not need us.&lt;/p&gt;</content:encoded><category>Platform Selection</category><category>shopify</category><category>woocommerce</category><category>platform-selection</category><category>migration</category><author>hello@w3nuts.co.uk (Samir Kaila)</author></item></channel></rss>