F12 Labs
EN
Contact
← All posts

Managing Shopify bundles from your ERP: why the bundle app needs an API

If your ERP or PIM is where bundles are defined, Shopify needs to receive them automatically. What Shopify's own bundle APIs offer, the ownership rule that decides who can change a bundle, and what to look for in a bundle app that your ERP can create and update bundles through.

The Bundles Pro API access page with two API keys, ERP sync with read and write access and Catalog report with read only access, the API base URL, and an example request that creates a bundle with a 15% discount

In many businesses the ERP is where products are defined. A new kit gets an item number, a bill of materials and a price there first. The website should follow: when the kit is created, changed or discontinued in the ERP, Shopify should change with it, without someone rebuilding it by hand in an app screen.

For single products that's routine. Bundles are harder, because of one rule in how Shopify bundles work. Here's what Shopify offers natively, where that rule bites, and what a bundle app needs for an ERP to drive it.

What Shopify offers natively

Shopify has bundles built in, and its Admin GraphQL API can create them. There are two kinds (About product bundles):

Fixed bundles. A bundle is a product whose components are other products. Two Admin API mutations build them:

  • productBundleCreate "Creates a product bundle that groups multiple Product objects together as components", and productBundleUpdate changes one. Both need the write_products scope and a shop with the bundles feature, and they run in the background: "The mutation runs asynchronously and returns a ProductBundleOperation object", which you poll until it's done. (productBundleCreate, productBundleUpdate)
  • productVariantRelationshipBulkUpdate sets components per variant: it "Creates new bundles, updates component quantities in existing bundles, and removes bundle components". (productVariantRelationshipBulkUpdate)

Shopify then handles stock (the parent's quantity is "the minimum of the component's inventory quantities"), groups the lines in cart and checkout, and puts the components on the order. (Start building bundles)

Customized bundles use a Cart Transform Function. It changes the cart, not the catalog: it can expand one cart line into its components, merge several lines into one bundle line, or (on Shopify Plus and development stores only) override a line's price, title and image. A store can have "a maximum of one cart transform function per app". (Cart Transform API) It's for build-your-own boxes chosen by the shopper, not for publishing a fixed catalog of kits from an ERP.

Some limits apply to every bundle: up to 30 components and three options per fixed bundle, no bundles inside bundles (Add a product fixed bundle), and no subscriptions, pre-orders or try-before-you-buy (Eligibility and considerations).

The rule that decides who can change a bundle

Shopify's developer docs:

"After an app has assigned components to a bundle, only that app can manage the components of the bundle."

(Add a product fixed bundle)

A bundle belongs to the app that built it. Its title, images and description are ordinary product fields, but its contents can only be changed by that one app. That leaves an ERP with two native routes, each with a catch:

Build bundles in a bundle app, then sync from the ERP. The ERP's connector is a different app, so it can't change those bundles' contents. Shopify's own Bundles app doesn't help here either: "Bundles don't support import, export, or bulk editing capabilities." (Eligibility and considerations) Every change to a kit is retyped in the app.

Have the ERP connector create the bundles itself, with productBundleCreate. This works, if your connector (or a custom app you build) does it. But now the connector owns the bundles. Your team can't open them in a bundle app's screens to fix a variant, and a bundle app's storefront and admin features don't know about them. You also build everything around the bundle yourself: polling operations, pricing each bundle variant (Shopify prices a fixed bundle from "the parent variant", so someone has to set it), and keeping prices right when component prices change. Shopify Bundles has the same pricing gap: "the bundle price doesn't update. You need to manually update the bundle price." (Shopify Bundles)

So the practical answer is a bundle app that is also the API: the ERP talks to the bundle app, the bundle app owns the bundles, and your team edits the same bundles in its screens.

What to look for in a bundle app

Bundle apps are usually built around their own admin screens. If an ERP or PIM will drive your bundles, check the app's public documentation for:

  • A documented API that creates bundles and changes their contents, not just reads them. An OpenAPI spec saves your integrator time.
  • Keys you control: created and revoked by you, read-only or read and write, scoped to one store.
  • Safe retries. ERP syncs time out and retry. An idempotency key stops a retry from creating a second bundle.
  • Honest handling of Shopify's background build. Creates and content changes are asynchronous in Shopify, so the API should return an operation you can check, not pretend it finished.
  • Pricing rules, not just prices, so a bundle can be the total of its products, a percentage off, or a fixed price, worked out from the components.
  • The same bundles in the admin. Bundles made by the API should show and be editable in the app, so staff aren't locked out of what the ERP made.
  • A clear answer on deleting. Find out how a bundle is retired or removed through the API, before you need it.

How Bundles Pro does it

Bundles Pro creates native Shopify fixed bundles and, on the Pro plan, has a REST API that runs every change through the app, so Shopify accepts it as the bundle's owner.

  • Create: POST /bundles with a title, status, pricing, the sales channels to publish to, and up to 30 products, each with a quantity and, if you like, the exact variants. Send an Idempotency-Key and a retried request returns the first result instead of a duplicate.
  • Check: the create returns an operation; GET /operations/{id} says when Shopify has built it and gives you the bundle's product ID to store in your ERP.
  • Update: PATCH /bundles/{id} changes title, status, price and channels at once, or replaces the products (as a new operation).
  • Price from components: sum, percent_off or fixed_price, with the products' total as the compare-at price. Re-send pricing when your ERP changes a product's price, and the bundle is repriced from the current prices.
  • Keys: created on API access in the app, read-only or read and write, shown once and stored only as a fingerprint, revocable at any time. 120 requests a minute per key.
  • Reference: an interactive API reference and an OpenAPI 3.1 spec.

Bundles from the API show in the app next to the ones staff made, marked API, and appear in the product page cards and the storefront blocks like any other.

What it doesn't do: there's no delete endpoint. Your ERP can retire a bundle by setting it to DRAFT and removing its sales channels; deleting it for good is done on the bundle's product in Shopify. There's no outgoing webhook either: your integration checks the operation.

The Bundles Pro API access page with an ERP sync key and a Catalog report key, the base URL, and an example request creating a bundle
API access in Bundles Pro: keys, base URL and an example create request.

Setting it up

  1. Install Bundles Pro and move to the Pro plan.
  2. On API access, generate a Read and write key named after the integration, and copy the token into your ERP connector's secrets.
  3. Map each ERP kit to a bundle: product IDs for the components, a quantity for each, and a pricing rule.
  4. Create, poll the operation, and store the returned product ID against the ERP kit. From then on, send PATCH requests for changes.

Create and update bundles with the API has the endpoints, payloads, errors and a sync pattern.

Before you rely on it

  • Bundles you already have stay where they are. Bundles made in Shopify Bundles or another app belong to that app; Bundles Pro can't change their contents. Create new ones through Bundles Pro.
  • Prices follow saves, not product changes. Re-send pricing (or save in the app) when a component's price changes.
  • Poll every operation. That's when Bundles Pro applies the status, price and channels you asked for.
  • Store eligibility is Shopify's. Shopify's bundle rules apply: no checkout.liquid customizations, no subscriptions on bundles.

Shopify behavior checked on 20 October 2026 against Shopify's developer docs (About product bundles, Start building bundles, Add a product fixed bundle, productBundleCreate, productVariantRelationshipBulkUpdate, Cart Transform API) and help center (Shopify Bundles, Eligibility and considerations for product bundles). If Shopify adds bundle import or lets other apps manage a bundle's components, we'll update this post.