4 developer highlights from Shopify’s Winter '25 Editions
TLDR: Another day, another Shopify Editions
Shopify’s Winter Editions 2025 is here (in… 2024)!
“The Boring Edition” brings over 150 updates to the Shopify platform. This release does not include anything completely new, but there are plenty of user experience improvements and a tighter integration of existing features across the Shopify platform.
Here are some of my developer-focused highlights!
Extension-only discount apps (and MORE discounts)
Released in November, you can now build discount apps using Admin UI extensions.
This means that you no longer need to worry about building and hosting an application for simple discount apps. Instead, you can spin up an extension-only app using the Shopify CLI and create Admin UI extensions embedded inside the admin discount page.
Admin UI discount extensions are the UI for your existing discount Functions. Shopify Functions can only accept metafields for custom data so it makes sense to pair them with a Shopify-native UI extension. This allows you to host your entire discounts app on Shopify’s infrastructure.
Additionally, Shopify increased the number of discounts powered by a discount Function from 5 to 25 and doubled the input limit to 128kb, allowing Functions to run on carts with 200+ products.
With all these recent changes, it is a great time to dive into discount apps for Shopify!
The REST → GraphQL migration just got easier!
A live view of the Shopify connections team at Gadget when they see that REST to GraphQL field mappings have been added to the API docs:
If you are migrating any existing apps from the REST API to GraphQL these new field mappings are major life savers! Now you can see exactly how the REST API maps to GraphQL, allowing for a smoother transition and eliminating guesswork from the process.
The Gadget team handles the REST to GraphQL migrations under the hood thanks to the Shopify plugin. Developers working on Gadget only need to update any writes to Shopify.
Better data syncing
Shopify is improving the experience for syncing data with external systems and services. With the introduction of custom IDs and upsert APIs, you can now assign the same IDs to Shopify resources that are used in an external platform.
The Upsert API only supports products and customers right now, but custom IDs can be used for any data type that has metafield support! This means you no longer need to manage different IDs across multiple platforms, which should help to simplify data storage, access, and the code required to power your integration apps.
Integrations are Gadget’s bread and butter thanks to our built-in Shopify sync and background jobs system. These API changes will make integrating with external services or migrating to Shopify even easier!
The Picker API
Want a resource picker for something other than products, variants, or collections? The new Picker API allows you to customize the data available in a picker component which gives merchants the ability to string search across custom data, such as product reviews, email templates, or a collection of your favourite Pokemon (or Gadgemon?).
The API gives you plenty of customization options for the `items` available in the picker widget, including badges with a status, thumbnails, and the option to add additional columns with data points.
I do wish I could directly map an existing metaobject collection to the picker. There doesn’t appear to be support for this now but it would make feeding data stored in Shopify to merchants using the admin really, really easy — and fits in nicely with the types of information I could use metaobjects to store such as, once again, product reviews.
Bonus: Open-source Shopify Subscriptions app
The Shopify team open-sourced their Subscriptions app!
This is a great sample app that can (and should!) be referenced when building subscription apps. The repo is accompanied by a guide that will walk you through setting up the Subscriptions Reference app and includes a delightful page that explains the core components of the app.
This is a great sample app because it's so robust, and includes a background jobs system (that can be configured to use Google Cloud Tasks for production apps), handles billing retry logic, and takes full advantage of metaobjects for data persistence.
Have questions about Shopify app development? Join the Gadget developer Discord and start building!