“Should we just build it ourselves?” is a question that comes up constantly for growing Shopify merchants, usually the moment an app doesn’t quite do what the business needs, or the monthly app subscription bill starts looking uncomfortably large. It’s also usually the wrong first question, because it assumes there are only two options.
On Shopify, there are actually three tiers of customisation, and most merchants only ever seriously consider two of them. There’s installing an app from the Shopify App Store. There’s full custom development, a bespoke app or custom code built specifically for your store. And sitting between them, underused and under-discussed, is Shopify Functions: a native customisation layer that lets you build genuinely custom business logic, custom discounts, shipping rate logic, payment method customisation, without building a full application.
This post is a framework for working out which of the three tiers a given problem actually belongs in. The short version: build is almost always the more expensive and riskier option, so the bar to justify it should be high, but “install another app” isn’t free either, and for a specific class of problem, Shopify Functions is the option most merchants don’t know they have.
Tier One: When an Existing App Genuinely Solves the Problem
Start here, honestly, for the overwhelming majority of common ecommerce needs. Product reviews, subscription billing, basic post-purchase upsells, loyalty points, size charts, back-in-stock notifications, these are solved problems. Multiple mature, well-supported apps exist for each, built by teams whose entire job is maintaining and improving that one function across thousands of merchants.
Building your own version of any of these is very rarely a good use of development budget. You’d be recreating years of edge-case handling, what happens when a review is left on a product that’s since been deleted, how a subscription handles a partial refund, how an upsell interacts with a discount code, that an established app has already been through in production, across a much larger set of stores than any single merchant could test against. Unless the thing you need is genuinely unusual, treat “is there an app for this” as your default first question, and treat “yes” as a satisfying answer, not a disappointing one.
The trap here isn’t buying too much. It’s buying carelessly, installing without checking whether the app is actively maintained, how it behaves when uninstalled, and what it actually costs once you account for its full pricing tier at your order volume, not just the entry price shown on the listing.
The Hidden Costs of “Just Install an App”
Because apps feel low-commitment, a few clicks to install, a few clicks to remove, merchants tend to under-count what they actually cost over time. Four costs are easy to miss:
App fatigue. Each app adds another setting panel, another vendor relationship, another thing that can break during a Shopify update or theme change. A store running thirty-plus apps is much harder to reason about, debug, and hand over to a new team member than one running eight well-chosen ones.
Page speed and performance cost. Many apps inject their own JavaScript into your storefront, and that script has to load, parse, and execute for every visitor, on every page it’s active on, not just the page where the feature is used. A reviews widget on every product page, a chat widget on every page, an upsell script on cart, each one is a small tax on load time, and they compound. Slow storefronts cost conversions, and “which apps are actually earning their performance cost” is a question worth asking regularly, not just at setup.
Ongoing subscription costs stacking up. Most apps bill monthly, and most pricing scales with your store’s size or order volume. An app that cost very little when you were a small store can become a meaningfully larger recurring cost as you grow, and it’s easy not to notice, because each individual increase looks small against total revenue. Reviewing your total app spend against what each app actually delivers, on a schedule, is a basic piece of store hygiene few merchants do.
Conflicts between apps. Two apps that both want to modify the cart, or both inject scripts into checkout-adjacent pages, or both try to control the same section of a theme, can create bugs that are genuinely difficult to diagnose because neither app is technically “broken” on its own, they only break in combination. The more apps you run, the higher the odds of this kind of interaction.
None of this means “avoid apps.” It means factor the full cost, not just the sticker price, into the buy side of the decision, rather than assuming buy is automatically the cheap option and build is automatically the expensive one.
Tier Two: When Shopify Functions Are the Right Middle Ground
This is the tier most merchants skip straight past, usually because they don’t know it exists as a distinct option from “install an app” or “hire a developer.”
Shopify Functions is Shopify’s own native customisation layer, available on Shopify Plus and on some other Shopify plans, that lets specific pieces of backend business logic run natively within Shopify’s checkout and cart infrastructure, server-side, without you needing to build and host a separate application. Common use cases include custom discount logic that doesn’t match any standard discount type, shipping rate rules based on business logic specific to your store (say, a rate that depends on a combination of product tags and delivery region that no shipping app anticipates), and payment method customisation at checkout.
Functions are the right call when you hit a specific pattern: the business logic you need is genuinely particular to your operation, not something an app’s settings panel can be configured to do, no matter how many options you tick, but it also doesn’t need a custom user interface, a new admin screen, or a database of its own. It’s a rule, running at a decision point Shopify already exposes, not a new application.
The practical advantage over full custom development is significant. Because Functions run within Shopify’s own infrastructure, you’re not maintaining hosting, and you’re not exposed to as much of the “this broke because Shopify changed something upstream” risk that comes with a fully custom, separately-hosted application. It’s a considerably smaller build than a custom app, but it solves a category of problem that no configuration panel in an off-the-shelf app will ever cover, because the logic is too specific to your business to have been built as a general-purpose setting.
Tier Three: When Custom Development Is Genuinely Justified
This is the tier to reach for least often, and the one where the bar should be genuinely high, because it’s the most expensive to build and the most expensive to maintain over time, every custom feature is a piece of software your business now owns and is responsible for keeping compatible with Shopify’s platform changes indefinitely.
Custom development earns its cost in a narrower set of situations:
- Unique business logic that’s core to your competitive advantage. If the thing you’re building is genuinely how you win, a configurator, a proprietary matching or recommendation engine, a workflow no competitor runs the same way, that’s a legitimate reason to own the code rather than rent someone else’s generic version of it.
- Integration requirements no app supports. If your business runs on a specific combination of ERP, warehouse, or legacy system that no existing Shopify app connects to, custom integration work is often the only path, not a preference.
- Performance requirements at genuinely high scale. At high order volumes, the overhead of general-purpose apps, extra script weight, generic (rather than optimised) database queries, features you don’t use running anyway, can become a real performance cost. Custom-built, purpose-specific code can be leaner, but this only pays off at a scale where the performance difference is material to conversion or revenue.
- App costs at scale exceeding the cost of ownership. If you’re paying a percentage-of-revenue or per-unit app fee that, projected forward at your growth rate, will cost meaningfully more over a few years than building and maintaining an owned equivalent, that’s a legitimate build case, provided you honestly account for the ongoing maintenance cost of owning code, not just the build cost.
Even when one of these applies, custom development should be scoped tightly around the specific capability that justifies it, not treated as a licence to rebuild your whole stack from scratch. The scope creep from “we need one custom integration” to “let’s build everything ourselves” is where a lot of build decisions go wrong. This is the kind of work our Shopify app development team scopes carefully with merchants precisely because getting the boundary right, building only what genuinely needs to be custom, is what makes the investment pay off rather than becoming an ongoing maintenance burden.
A Decision Framework: Walk Through These Questions in Order
Work through this in sequence. Don’t skip ahead to “build” until you’ve genuinely ruled out the earlier tiers.
- Does an established Shopify app solve this need reasonably well? If yes, install it, and move on, this covers most requests. Check maintenance activity, real pricing at your scale, and uninstall behaviour before committing.
- If no app fits, is the gap a specific, isolated piece of business logic, a discount rule, a shipping rate, a checkout customisation, rather than a need for a new interface or workflow? If yes, this is very likely a Shopify Functions job, not a custom app.
- If it needs its own interface, data storage, or workflow beyond what Functions or an app can offer, does it meet at least one of the genuine custom-development criteria, core competitive logic, an unsupported integration, high-scale performance need, or app costs that outweigh ownership costs over a realistic time horizon? If not, keep looking for a partial app or Functions-based solution rather than defaulting to build.
- If custom development is justified, is the scope tightly defined around the specific capability, with a clear owner for ongoing maintenance once it ships? If the scope is vague or nobody has thought about who maintains it in a year, that’s a sign to narrow it before starting, not a reason to abandon it.
Frequently Asked Questions
Is building always more expensive than buying an app?
Almost always, at least in upfront cost, and often in ongoing cost too once you account for maintenance. The exceptions are narrow: genuinely unique business logic, unsupported integrations, high-scale performance needs, or app costs that structurally outgrow the cost of ownership. Build should be the option you reach for last, not first.
What’s the difference between a Shopify app and a Shopify Function, in practical terms?
An app is a separate piece of software, often with its own interface in your Shopify admin, that you install and configure. A Function is a specific piece of business logic, a discount calculation, a shipping rate rule, that runs natively inside Shopify’s checkout and cart process, without a standalone application or interface of its own.
Do I need Shopify Plus to use Shopify Functions?
Functions are available on Shopify Plus and on some other Shopify plans, with the specific availability depending on the type of Function and Shopify’s current plan structure. It’s worth checking current plan-level access for the specific Function type you need before assuming it requires Plus.
How do I know if my app stack is costing me more than it looks like?
Review total monthly app spend against your current order volume, since many app pricing tiers scale with size. Also check page speed reporting for scripts that are loading on every page regardless of whether that page uses the feature, that’s a real, if less visible, cost on top of the subscription fee itself.
Can I move from an app to a custom solution later if I start with buy?
Generally yes, and starting with an app is usually the lower-risk path while you validate that the feature matters to your business. The main thing to check before you’re deep into any app is how easily its data, configuration, customer records, historical data, can be exported if you do outgrow it.
Not Sure Which Tier Your Store Needs?
If you’re weighing up an app, a Shopify Function, or a custom build for a specific problem in your store, a Shopify audit is a practical way to get an outside, technically grounded view before you commit budget in the wrong direction.