Shopify Custom App Development: Theme App Extensions and Shopify Functions After Script Editor
Shopify Scripts stopped running on June 30, 2026. Learn when to use Theme App Extensions, Shopify Functions and custom apps instead of legacy code injections.

For Shopify merchants scaling past basic out-of-the-box features, custom app development is the standard path to integrate internal ERPs, automate custom shipping options, or build bespoke visual layout elements.
Historically, developers injected custom Liquid code directly into theme files or used the Script Editor (Shopify Plus only) to customize line items, shipping and payment methods. Shopify retired Scripts in 2026: editing and publishing ended on April 15, 2026, and Scripts stopped executing on June 30, 2026. Their replacement is Shopify Functions. For storefront features, Theme App Extensions are the supported way for apps to add UI without editing theme code; editing theme files is still possible, but it is fragile for app functionality.
This guide evaluates Shopify's modern architecture, explaining when and how to build Theme App Extensions using the Shopify CLI to protect theme upgradability and optimize storefront speed.
1. Comparing Legacy Theme Edits vs. Theme App Extensions
In legacy Shopify setups, installing a custom features app required editing the theme's core code (like theme.liquid or product-template.liquid). When the merchant wanted to upgrade their theme to a newer version, these injected code blocks would break or block automatic updates.
The Extension Standard
Theme App Extensions allow developers to package app code (Liquid, CSS, and JS) into isolated App Blocks. Merchants can then drag, drop, and configure these blocks using the native Shopify Theme Editor without touching a line of code.
| Evaluation Metric | Legacy Theme Injection / Script Editor | Modern Theme App Extensions & Functions |
|---|---|---|
| Theme Integrity | High risk (Breaks theme updates, leaves orphaned code on uninstall) | Low risk (App blocks are removed from the storefront when the app is uninstalled) |
| Page Speed Impact | Often slower (Injected, render-blocking script files) | Usually lighter (Shopify serves extension assets from its CDN and only on pages where the block is used) |
| Custom checkout logic | Ruby scripts (Shopify Plus only; no longer run after June 30, 2026) | Shopify Functions (public apps with Functions work on any plan; custom apps containing Functions require Shopify Plus) |
| Deployment Flow | Manual copy-pasting of code snippets | Integrated CLI deploy pipeline directly to Shopify |
2. When to Use Theme App Extensions
Before coding your app, determine which extension point is required for your custom feature:
- App Block (a Liquid file in
blocks/with"target": "section"): Use when your app needs to render visual elements on specific store pages (e.g., custom product badges, dynamic sizing charts, or interactive reviews blocks). - App Embed Block (a file in
blocks/whose schema targetsheadorbody): Use when your app needs to run background tasks globally across the entire storefront without rendering visible sections (e.g., live chat widgets, analytics trackers, or cookie consent banners). - Shopify Functions: Use when you need to write custom logic directly into Shopify's backend checkout engine (e.g., custom discount rules, delivery courier options, or payment gateway sorting logic).
3. How to Initialize a Theme App Extension
To build a secure app extension, you must use the official Shopify CLI. This tool scaffolds the extension structure and deploys it to your app configuration.
Step 1: Create Your App Project
Run the initialization command inside your local development workspace:
`bash
npm init @shopify/app@latest
`
Follow the command line prompts to link the app to your Shopify developer account.
Step 2: Generate the Extension
Once the base app is configured, generate your Theme App Extension:
`bash
shopify app generate extension --template theme_app_extension
`
This command creates an extension folder under extensions/ with a shopify.extension.toml file and directories such as:
`text
extensions/
└── custom-theme-extension/
├── assets/ # CSS and client-side JS files
├── blocks/ # Liquid files defining App Blocks and App Embeds
├── snippets/ # Reusable Liquid snippets
└── locales/ # Translation files
`
Step 3: Write Your App Block Code
Open the generated liquid block under blocks/custom-badge.liquid and write your clean template structure:
`liquid
<div class="custom-promo-badge" style="color: {{ block.settings.color }};">
<p>{{ block.settings.promo_text }}</p>
</div>
{% schema %}
{
"name": "Custom Promo Badge",
"target": "section",
"stylesheet": "badge.css",
"javascript": "badge.js",
"settings": [
{
"type": "text",
"id": "promo_text",
"label": "Promotion Text",
"default": "Special B2B Discount Active"
},
{
"type": "color",
"id": "color",
"label": "Text Color",
"default": "#FF0000"
}
]
}
{% endschema %}
`
4. Deploying and Testing
To preview your app extension in a live development sandbox:
- 1Start your local dev server:
`bash
shopify app dev
`
- 1The CLI will output a developer preview link. Open the link to open the Shopify Theme Editor.
- 2Drag your new "Custom Promo Badge" block into any section template.
- 3When testing is complete, package and deploy the app:
`bash
shopify app deploy
`
Transitioning from old-style theme modifications to Theme App Extensions ensures that your storefront remains fast, clean, and compatible with automatic platform updates.
When to Use Shopify Functions
Use Theme App Extensions for storefront UI and Shopify Functions for backend commerce logic. Functions are better for discount rules, delivery customization, payment customization, cart validation and checkout rules that must run reliably inside Shopify's commerce engine.
Do not force business logic into frontend JavaScript when it affects price, eligibility, delivery or payment behavior. Frontend scripts can be blocked, delayed or manipulated by users. Backend commerce logic should be enforced by the platform or a trusted app backend.
App Review and Maintenance
Custom Shopify apps need lifecycle ownership. Before launch, document scopes, API version, webhook topics, uninstall behavior, billing model, support owner and rollback plan. Shopify API versions change on a schedule, so app maintenance should be part of the merchant's operating plan.
Test theme install and uninstall, theme updates, app block settings, mobile rendering, storefront speed, webhook retries, permission scopes, error logging and API version upgrades.
Frequently Asked Questions
Are Theme App Extensions better than editing theme files?
For reusable app functionality, yes. They keep custom features isolated, configurable and easier to remove without leaving orphaned code in the theme.
Is Script Editor still the right approach?
No. Shopify Scripts stopped executing on June 30, 2026. Discount, shipping and payment logic that used Scripts must be rebuilt with Shopify Functions or a suitable app. Shopify's admin includes a Scripts customizations report to help identify what needs replacing.
Do custom apps slow Shopify stores?
They can if they inject heavy scripts or block rendering. Well-built extensions load only necessary assets and keep storefront impact measurable.
What should be built as a private custom app?
Internal integrations, specialized product workflows, ERP sync, reporting exports, or merchant-specific automation can fit private custom app development when public apps cannot support the workflow reliably.
Security and Permissions
Shopify apps should request the smallest practical permission scope. A product badge extension should not need order-write access. An inventory sync app may need product and inventory scopes, but it should still avoid customer data unless the workflow truly requires it.
Review access tokens, webhook verification, app proxy routes, embedded app authentication and uninstall cleanup. Remove data that is no longer needed and document retention rules for logs and customer records.
Deployment Workflow
Use a development store, test store data and a controlled release process. Preview extensions in the theme editor, test on duplicate themes, then deploy with a rollback plan. For apps connected to ERP, warehouse or finance systems, run a staged pilot with a small product or order segment before full rollout.
Custom app work should improve operations without making the store dependent on undocumented code that nobody can maintain.
Final Recommendation
Use Theme App Extensions for maintainable storefront UI, Shopify Functions for commerce rules, and custom apps for workflows public apps cannot support cleanly. Keep scopes tight, test uninstall behavior and plan API maintenance from the start.
100-Point Shopify App Readiness Score
| Area | Points |
|---|---|
| Correct extension point selected | 10 |
| Minimal permission scopes | 15 |
| Theme install and uninstall tested | 10 |
| Mobile rendering verified | 10 |
| Storefront performance measured | 10 |
| Webhooks signed and retried safely | 10 |
| API version ownership documented | 10 |
| Error handling and logs ready | 10 |
| Merchant settings clear | 10 |
| Rollback plan prepared | 5 |
Below 80, the app may work in a demo but fail under real merchant operations. The best Shopify app is boring in production: predictable, reversible and measurable.
Commercial Decision Rule
Build a custom app when it protects a valuable workflow or creates a clear operating advantage. Use a public app when the requirement is common and the public app is trustworthy. Keep theme-only edits for narrow visual changes that do not need reusable app distribution.
Example Use Cases
Theme App Extensions fit product badges, sizing helpers, trust blocks, bundle displays, delivery notes and custom merchandising modules. Shopify Functions fit discount eligibility, cart validation, shipping logic and payment customization. A full custom app fits ERP sync, supplier inventory updates, custom reporting, wholesale workflows or fulfillment automation.
Each use case needs a different testing plan. A visual block must be checked across themes and mobile layouts. A function must be tested against cart edge cases. An integration app must handle API failures, retries, permissions and reconciliation.
Choosing the right extension point keeps the store easier to maintain. Choosing the wrong one creates fragile code that works during launch and becomes expensive during the next theme update or Shopify API change.
Postlaunch Ownership
After deployment, assign an owner for app updates, merchant support, API version reviews, webhook failures and theme compatibility. A custom app is not a one-time code drop. It becomes part of the store's operating system.
Review performance after installation and after every theme change. If the app changes product, cart or checkout behavior, test a real order path before major campaigns. Small app defects can affect conversion, fulfillment or reporting across the whole store.
Merchant QA Checklist
Before a merchant depends on the app, test the feature as a store owner, theme editor, buyer and support user. Confirm that app settings are understandable, defaults are safe, disabled states are graceful, and uninstalling the app removes visible output without damaging the theme.
For integrations, test API rate limits, expired tokens, failed webhooks and partial sync. For storefront extensions, test theme preview, published theme, duplicate theme and mobile layouts. QA should prove that the app behaves well outside the developer's demo store.
Business Fit
A custom Shopify app should be tied to a measurable business result: fewer manual operations, cleaner merchandising, better checkout rules, stronger reporting or safer integrations. If the result cannot be named, the store may be adding complexity without enough value.
Document the expected result before build, then measure after launch. If the app does not reduce work, protect revenue or improve the buyer journey, simplify it or remove it before it becomes another maintenance burden.
Final Technical Review
Before handing the app to a merchant, review the code, permissions, theme output, customer-facing copy and operational fallback. A storefront block should degrade gracefully if app data is missing. A sync app should queue failures rather than losing records. A checkout customization should have clear behavior when rules do not match.
Also document what happens when the app is disabled. Stores change themes, pause apps and move between plans. A well-built custom app should not leave broken sections, abandoned snippets or hidden business logic that nobody can find later.
This final review protects the merchant from an app that looks polished on launch day but becomes fragile during normal store operations.
For planning and implementation support, connect this work with Shopify Store Setup, Shopify Store Creation, and Store Optimization.
Related posts

Shared vs VPS vs Managed Hosting for a Small Business Website or Store
A plain comparison of shared hosting, VPS and managed hosting or PaaS for small business sites and online stores: responsibilities, isolation and performance, the signs a WooCommerce store or Next.js app has outgrown shared hosting, GDPR data residency, and a decision table.
Read article →

How to Secure a New Ubuntu VPS: A Setup Checklist for Business Websites
A step-by-step hardening checklist for a fresh Ubuntu 26.04 or 24.04 LTS VPS that will host a business website, with copy-paste commands for SSH keys, ufw, unattended-upgrades, fail2ban, time sync, swap, monitoring and backups.
Read article →

Deploy a Next.js 16 App on a VPS with Nginx, systemd or PM2, and HTTPS
A working guide to running Next.js 16 on your own VPS: Node.js LTS, build-time versus runtime environment variables, a systemd unit and PM2 alternative, an Nginx server block with certbot HTTPS, the standalone output option, logs, and a two-port release script.
Read article →
Author
Anushka Dahanayake
Anushka Dahanayake builds SEO-focused websites, e-commerce platforms, dashboards, and automation systems for businesses worldwide.
