Shopify bundles en volumekortingen — technische implementatie
Terug naar blog

Shopify bundles en volumekortingen — technische implementatie

AuthorRuthger Idema
29 juni 20269 min leestijd

Shopify bundles en volumekortingen technisch implementeren: van de native Bundles app tot custom Functions voor B2B kortingen, met aandacht voor voorraadbeheer en checkout-performance.

Shopify bundles en volumekortingen — technische implementatie

Gemiddeld 35% hogere orderwaarde. Dat is wat goed geïmplementeerde bundles en volumekortingen opleveren in B2C én B2B-shops. Toch zien wij bij klanten regelmatig dat dit soort promoties worden gebouwd op fragiele app-stacks die bij elke Shopify-update breken — of erger: die voorraad niet correct bijhouden.

In dit artikel gaan we door de technische opties heen: van de native Shopify Bundles app tot custom Shopify Functions voor complexe kortingslogica. Je leert wanneer een app voldoende is, wanneer je naar maatwerk Functions gaat, en welke valkuilen je moet vermijden bij voorraadbeheer en checkout-performance.


Hoe Shopify bundles intern werken

Een bundle in Shopify is geen magisch product-type. Het is een product waarbij meerdere losse varianten of producten worden gecombineerd tot één aankoop. De uitdaging zit in de voorraadkoppeling: als een bundle uit drie producten bestaat, moeten alle drie tegelijk op voorraad zijn.

Shopify lost dit op via twee mechanismen:

  1. Component-based bundles — via de officiële Shopify Bundles app, waarbij elk component een aparte variant is met eigen inventory.
  2. Fixed bundles — één product met één variant, handmatig gevuld en zonder automatische voorraadsynchronisatie.

De Shopify Bundles app (gratis, officieel) ondersteunt component-based bundles met inventory deduction per component. Dat klinkt ideaal, maar heeft grenzen: maximaal 10 componenten per bundle, en de configuratie loopt via Shopify's Cart Transform API die functioneel werkt maar niet triviaal te customizen is. Wil je de bundle-prijs dynamisch berekenen op basis van de geselecteerde componenten, dan kom je al snel aan de grenzen van de standaard app.


Shopify Functions: de juiste laag voor kortingslogica

Shopify Functions zijn de vervanging van de (nu verouderde) Script Editor. Ze draaien op Shopify's eigen infrastructuur, zijn geschreven in Rust of via een JavaScript/AssemblyScript-wrapper, en worden uitgevoerd tijdens checkout.

Voor volumekortingen is de Discount Functions API de relevante laag. Hiermee definieer je kortingsregels die Shopify zelf uitvoert — je bent niet afhankelijk van een third-party server of app-backend die bij checkout moet responderen.

Een eenvoudig voorbeeld van een volumekorting via Shopify Functions (JavaScript/AssemblyScript-stijl):

javascript
// discount-function/src/index.js (Shopify Functions)
export function run(input) {
  const targets = [];
  const discounts = [];

  for (const line of input.cart.lines) {
    const quantity = line.quantity;
    const variantId = line.merchandise.id;

    let percentage = 0;

    if (quantity >= 50) percentage = 20;
    else if (quantity >= 20) percentage = 15;
    else if (quantity >= 10) percentage = 10;
    else if (quantity >= 5) percentage = 5;

    if (percentage > 0) {
      targets.push({ cartLine: { id: line.id } });
      discounts.push({
        targets: [{ cartLine: { id: line.id } }],
        value: { percentage: { value: percentage.toString() } },
      });
    }
  }

  return {
    discounts,
    discountApplicationStrategy: "MAXIMUM",
  };
}

Dit is de basis. In productie wil je de kortingsdrempels ophalen uit metafields of een custom metaobject, zodat je ze kunt aanpassen zonder een nieuwe deployment. De functieconfiguratie in shopify.extension.toml bepaalt welke cart-data Shopify aanlevert als input — vergeet niet de juiste fields te declareren, anders krijg je undefined values tijdens execution.


Voorraadbeheer bij bundles: het echte pijnpunt

Voorraad bij bundles is waar het mis gaat. Er zijn drie aanpakken, elk met eigen trade-offs:

AanpakHoe het werktVoordeelNadeel
Native Bundles appComponent deduction via Cart TransformGratis, officieel ondersteundMax 10 componenten, beperkte customizatie
Bundle als apart productEigen SKU, eigen voorraadEenvoudig beheerDubbele voorraad bijhouden, sync-problemen
Custom via Inventory APIDeduct per component via webhooks of serverside logicVolledig flexibelComplexe implementatie, eigen infrastructure nodig

Wij adviseren bij klanten om de native Bundles app te gebruiken zolang je binnen de limieten blijft. Zodra je meer dan 10 componenten nodig hebt, of bundles wilt combineren met complexe kortingsregels, ga je naar een custom implementatie via de Admin API en Inventory API.

Bij een custom implementatie leg je de voorraadkoppeling vast in metafields of een externe datastore. Bij iedere checkout-aankoop deduct je de component-voorraad via een Shopify webhook (orders/paid of fulfillments/create). Reken op enige vertraging bij piekbelasting — dat is inherent aan webhook-gebaseerde architectuur. Bouw altijd idempotente webhook-handlers: Shopify kan dezelfde webhook meerdere keren versturen bij netwerkstoringen, en dubbele deductie wil je niet.

Een extra veiligheidslaag is een inventory check in een Cart Transform Function vóór de checkout. Zo blokkeer je bundels direct in de cart als een component dreigt uit te vallen, in plaats van een fout aan het einde van het bestelproces.


B2B volumekortingen: price lists vs. Functions

Shopify Plus biedt voor B2B native ondersteuning via B2B Price Lists. Hiermee koppel je vaste prijzen of percentagekortingen aan specifieke companies en locations. Dit is de schoonste oplossing voor B2B-klanten met vaste contractprijzen.

Volumekortingen op basis van quantity zijn iets complexer. Je hebt twee routes:

Route 1: B2B Price Lists met quantity breaks

Shopify ondersteunt quantity pricing in Price Lists via de Admin API. Je definieert price breaks per variant:

graphql
mutation priceListCreate($input: PriceListCreateInput!) {
  priceListCreate(input: $input) {
    priceList {
      id
      name
    }
    userErrors {
      field
      message
    }
  }
}

Met als variabelen:

json
{
  "input": {
    "name": "Groothandel NL",
    "currency": "EUR",
    "parent": {
      "adjustment": {
        "type": "PERCENTAGE_DECREASE",
        "value": 10
      }
    }
  }
}

Quantity breaks binnen een Price List zijn beschikbaar via quantityPriceBreaks. Dat vereist Shopify Plus én de B2B-feature.

Route 2: Discount Functions voor B2B

Als je B2B-klanten via een reguliere Shopify-shop bedient (zonder Shopify Plus B2B), dan zijn Functions de aangewezen route. Je identificeert de B2B-klant via customer tags of metafields, en past daar je kortingslogica op toe.


App vs. maatwerk Functions: wanneer kies je wat?

Dit is de vraag die wij het vaakst krijgen. Het eerlijke antwoord: begin met een app, switch naar maatwerk als de app je blokkeert.

De beslisboom in de praktijk:

Kies een app als:
  • Je minder dan 10 componenten per bundle hebt
  • Je kortingsstructuur eenvoudig is (één percentage, één drempel)
  • Je team geen Rust/AssemblyScript kan of wil schrijven
  • Je budget beperkt is en time-to-market telt

Bekende opties: Shopify Bundles (gratis, officieel), Bundler (betaald, meer features), Wide Bundles (betaald, goede UI).

Kies custom Functions als:
  • Je meer dan drie kortingsniveaus combineert
  • Je kortingen wilt combineren met bundle-logica (quantity van de bundle bepaalt de korting)
  • Je B2B-klanten specifieke tier-pricing nodig hebben die niet past in Price Lists
  • Je performance-kritische situaties hebt waarbij app-latency onaanvaardbaar is
Kies custom API-integratie als:
  • Je voorraad uit een extern systeem (ERP, WMS) beheert
  • Je bundles dynamisch wilt samenstellen op basis van klantdata
  • Je multi-locatie inventory hebt waarbij bundle-componenten op verschillende locaties liggen

Reken voor een volledige custom Functions-implementatie inclusief admin UI en testing op 20-40 uur werk. Een eenvoudige volumekorting via Functions alleen is sneller: doorgaans 8-12 uur. Voor de meeste webshops is de app-route de juiste start — je kunt altijd later migreren naar maatwerk als je groeit.


Performance en checkout impact

Shopify Functions draaien op Shopify's eigen infrastructure, niet op jouw server. De execution timeout is 5ms (CPU) voor discount functions — dat klinkt krap, maar is in de praktijk ruim voldoende voor kortingsberekeningen. Geen externe API-calls vanuit een Function; die moeten via input-data meekomen.

Cart Transform Functions (voor bundles) hebben een iets ruimere timeout maar dezelfde spelregels. Houd de logica slim: geen loops over duizend regels, geen zware string-operaties.

Wij zien bij klanten dat incorrecte Function-implementaties leiden tot checkout-blokkering als de Function een error gooit. Bouw altijd een fallback in: als de kortingslogica faalt, laat de checkout dan door zonder korting — beter geen korting dan een geblokkeerde checkout. Test je Functions uitgebreid in een development store met edge cases: lege cart, varianten zonder metafields, klanten zonder tags. Die scenario's zijn precies waar fouten opduiken.


Combineren van bundles en volumekortingen

De meest gevraagde use-case: een bundle met een extra volumekorting bovenop de bundel-prijs. Shopify staat combinatie van meerdere discount types toe via de discountApplicationStrategy. Gebruik MAXIMUM als je de hoogste korting wilt toepassen, FIRST voor de eerste die matcht.

Wat niet werkt: twee discount Functions die allebei dezelfde cart line als target hebben en allebei een percentage toepassen. Shopify past dan de strategie toe, maar de gecombineerde logica moet je zelf orkestreren in één Function of via een gelaagde aanpak.

Bij Shopify Plus kun je automatische kortingen (via Functions) combineren met discount codes. Bij de reguliere Shopify-plannen werkt combinatie anders — test dit altijd in een development store voor je live gaat.


Shopify of toch Magento voor complexe bundels?

Eerlijk antwoord: voor zeer complexe bundel-configuraties (configureerbare bundles, afhankelijkheden tussen componenten, dynamic pricing op basis van klanthistorie) is Magento technisch flexibeler. Magento's productmodel kent bundled products als native type met complete configuratiemogelijkheden en eigen voorraadlogica.

Maar dat gaat gepaard met hogere beheerskosten. Voor de meeste B2C- en B2B-shops met standaard volumekortingen en fixed bundles is Shopify snel te implementeren en te onderhouden. De afweging is altijd: complexiteit van je kortingslogica versus overhead van het platform.

Heb je een complexe B2B-omgeving met maatwerk nodig voor pricing, bundels én integraties met een ERP of PIM? Dan bekijken wij bij contact graag welke stack bij jouw situatie past.


Veelgestelde vragen

Werkt de gratis Shopify Bundles app ook op een niet-Plus plan?

Ja. De officiële Shopify Bundles app werkt op alle Shopify-plannen. Shopify Plus-specifiek zijn de B2B Price Lists en sommige geavanceerde checkout-extensies. Functions zijn beschikbaar vanaf het Basic-plan, maar voor productie-gebruik is een hoger plan aan te raden vanwege de Function-limieten op lagere plannen.

Hoe voorkom ik dat een bundle wordt verkocht als één component niet op voorraad is?

Met de component-based aanpak via de Bundles app regelt Shopify dit automatisch: als één component uitverkocht is, is de bundle niet bestelbaar. Bij een custom implementatie moet je dit zelf afvangen, bijvoorbeeld door een checkout validation Function die controleert of alle component-varianten voldoende voorraad hebben.

Kunnen Shopify Functions API-calls doen naar externe systemen?

Nee. Functions draaien in een sandbox zonder netwerktoegang. Data die je nodig hebt tijdens de uitvoering — zoals klanttags, metafields, of prijsafspraken — moet je meegeven als input via de Function's input query. Je configureert welke data Shopify aanlevert in het shopify.extension.toml bestand.

Wat kost een custom volumekorting-implementatie via Shopify Functions?

Reken op 8-12 uur voor een eenvoudige implementatie (één kortingsstructuur, geen B2B-specifieke logica). Een volledige B2B-setup inclusief Price Lists, volume breaks, admin UI in metafields en testdekking kost doorgaans 25-50 uur. Gebruik je ook een externe app voor de admin-kant, dan bespaart dat 10-15 uur maar betaal je maandelijks voor de app.

Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check