Shopify abonnementen bouwen zonder ReCharge? Met de native Subscriptions API en Selling Plans bespaar je duizenden euro's per jaar. Lees de technische opzet en TCO-afweging.
Shopify abonnementen zonder ReCharge — native subscriptions
ReCharge kost je tussen de $99 en $499 per maand, plus 1-2% transactiekosten bij hogere volumes. Voor een webshop met €30.000 aan maandelijkse subscription-omzet lopen die kosten snel op naar €3.000-€7.000 per jaar — alleen voor de app. Shopify biedt sinds 2021 een native Subscriptions API. Je hebt die app misschien helemaal niet nodig.
Dit artikel laat zien hoe je Shopify-abonnementen bouwt met de native Subscription APIs en Selling Plans — zonder maandelijkse app-fees. We behandelen de technische opzet, de TCO-afweging, en wanneer een third-party app toch de betere keus is.
Wat zijn Selling Plans?
Een Selling Plan is het Shopify-datamodel achter een abonnement. Je maakt een SellingPlanGroup aan en koppelt die aan een product. Die group bevat één of meerdere SellingPlan-objecten — elk met eigen prijsregels, factuurfrequentie en leveringsschema.
Drie pricing policies zijn beschikbaar:
- Fixed: klant betaalt altijd hetzelfde bedrag (€19,95/maand).
- Recurring: prijs is gekoppeld aan de reguliere productprijs, eventueel met korting.
- Prepaid: klant betaalt vooruit voor meerdere cycli (3 maanden ineens, 10% korting).
De checkout-flow werkt precies zoals een gewone aankoop. Het verschil zit in het sellingPlanId dat meegaat met het line item. Shopify genereert automatisch een SubscriptionContract na de eerste betaling.
Selling Plans aanmaken via de Admin API
Je werkt met GraphQL. Via de sellingPlanGroupCreate mutatie maak je een group aan en koppel je hem direct aan producten of variants.
mutation {
sellingPlanGroupCreate(
input: {
name: "Maandelijks abonnement"
merchantCode: "maandelijks"
options: ["Factuurfrequentie"]
sellingPlans: [
{
name: "Elke maand — 10% korting"
options: ["Maandelijks"]
billingPolicy: {
recurring: {
interval: MONTH
intervalCount: 1
}
}
deliveryPolicy: {
recurring: {
interval: MONTH
intervalCount: 1
anchors: { type: WEEKDAY_OF_MONTH, day: 1 }
}
}
pricingPolicies: [
{
recurring: {
adjustmentType: PERCENTAGE
adjustmentValue: { percentage: 10.0 }
}
}
]
}
]
}
resources: {
productIds: ["gid://shopify/Product/123456789"]
}
) {
sellingPlanGroup {
id
name
}
userErrors {
field
message
}
}
}
Dit is het volledige fundament. Na aanmaken verschijnt het abonnement direct in de productpagina, zichtbaar in de Storefront API en klaar voor checkout.
Subscription Contracts beheren
Zodra een klant een abonnement afsluit, maakt Shopify een SubscriptionContract aan. Dit object bevat de klantdata, het betalingsschema, de shipping-informatie en de line items.
Contracten ophalen
query {
subscriptionContracts(first: 10) {
edges {
node {
id
status
nextBillingDate
customer {
email
displayName
}
lines(first: 5) {
edges {
node {
title
quantity
currentPrice {
amount
currencyCode
}
}
}
}
}
}
}
}
Factuurcyclus triggeren
Shopify triggert factuurcycli automatisch op de nextBillingDate. Maar je kunt ze ook handmatig starten via subscriptionBillingAttemptCreate. Dit is nuttig voor retry-logica bij mislukte betalingen.
mutation {
subscriptionBillingAttemptCreate(
subscriptionContractId: "gid://shopify/SubscriptionContract/987654321"
subscriptionBillingAttemptInput: {
idempotencyKey: "retry-2026-06-05-001"
}
) {
subscriptionBillingAttempt {
id
ready
errorCode
}
userErrors {
field
message
}
}
}
Let op het idempotencyKey-veld. Gebruik altijd een unieke sleutel per poging om dubbele afschrijvingen te voorkomen. Wij zien bij klanten dat dit de meest vergeten stap is bij een custom retry-implementatie.
Checkout-integratie
De native checkout werkt out-of-the-box met Selling Plans. Je hoeft niets extra te configureren — zolang je Shopify Payments gebruikt als gateway.
Wil je een custom storefront (Hydrogen of headless), dan geef je het sellingPlanId mee bij het aanmaken van het cart line item:
mutation {
cartCreate(
input: {
lines: [
{
quantity: 1
merchandiseId: "gid://shopify/ProductVariant/456789123"
sellingPlanId: "gid://shopify/SellingPlan/111222333"
}
]
}
) {
cart {
id
checkoutUrl
}
}
}
De rest handelt Shopify af: betalingsautorisatie, contract aanmaken, bevestigingsmail. Je klant ziet de abonnementsdetails in hun customer account — mits je de nieuwe Customer Accounts gebruikt (niet de legacy versie).
Klantenportaal: het zwakke punt
Dit is waar native bouwen wrijving geeft. Shopify heeft geen standaard "manage my subscription"-pagina in het customer account voor native subscription contracts. Klanten kunnen hun abonnement niet zelf pauzeren, overslaan of annuleren zonder dat jij dit bouwt.
Je opties:
| Oplossing | Inspanning | Kosten |
|---|---|---|
| Custom pagina via Storefront API | 20-40 uur development | Eenmalig |
| Shopify Flow + e-mail links | Laag, beperkte functionaliteit | Gratis |
| Third-party portal (Skio, Loop) | Plug-and-play | €49-€299/maand |
| ReCharge / Bold | Volledig featured | €99-€499/maand |
In de praktijk geldt: als je churn wilt verlagen, is een zelfbedieningsportaal geen nice-to-have. Het is de feature die het verschil maakt. Klanten die hun abonnement makkelijk kunnen aanpassen, annuleren minder snel.
TCO-afweging: native build vs. app
Hier wordt het eerlijk. Native bouwen is niet altijd goedkoper.
Wanneer native bouwen loont
- Je hebt een development team (intern of extern) dat de implementatie kan dragen.
- Je subscription-omzet is hoog genoeg dat app-fees pijn doen: reken op breakeven rond €5.000-€10.000 omzet per maand, afhankelijk van het AppStore-model.
- Je wilt volledige controle over de UX, de retry-logica en de data.
- Je gebruikt Shopify Plus en wilt diep integreren met je ERP of fulfillment-systeem.
Wanneer een app de betere keuze is
- Je lanceert een nieuw subscription-product en wilt de markt testen zonder development-investering.
- Je team heeft geen capaciteit om customer portal, retry-flows en e-mailnotificaties te bouwen.
- Je hebt geavanceerde features nodig zoals dunning management, prepaid gifting of loyaliteitsprogramma's — dit zijn maanden development-werk.
- Je omzet is te laag voor de ROI van een custom build.
De eerlijke conclusie: voor de meeste Shopify-stores onder €20.000 maandelijkse subscription-omzet is een app goedkoper in totaal. Daarboven wordt de rekening interessanter.
Kostenvergelijking op jaarbasis
| Scenario | App (ReCharge Growth) | Native build |
|---|---|---|
| Setup | €0 | €4.000-€8.000 eenmalig |
| Maandelijkse kosten | €299/maand = €3.588/jaar | €0 (beheer intern) |
| Transactiekosten (1% op €15k/maand) | €1.800/jaar | €0 |
| Totaal jaar 1 | €5.388 | €4.000-€8.000 |
| Totaal jaar 2 | €10.776 | €500-€1.000 (onderhoud) |
Vanaf jaar 2 wint native bouwen doorgaans. Dat verschil neemt toe naarmate je omzet groeit.
Webhooks en automatisering
Een native implementatie vereist dat je webhooks verwerkt. De relevante topics voor subscription-flows:
subscription_contracts/create— nieuw contract aangemaaktsubscription_contracts/update— status of schema gewijzigdsubscription_billing_attempts/success— betaling geluktsubscription_billing_attempts/failure— betaling mislukt (start dunning-flow)
Verwerk deze webhooks asynchroon via een queue. In de praktijk zien wij dat synchrone verwerking bij piekbelasting (bijv. maandelijkse verlenging van honderden contracten tegelijk) leidt tot timeouts en gemiste events.
Voor een Laravel-backend is een eenvoudige opzet:
// routes/api.php
Route::post('/webhooks/shopify', [ShopifyWebhookController::class, 'handle']);
// App\Http\Controllers\ShopifyWebhookController.php
public function handle(Request $request): JsonResponse
{
$topic = $request->header('X-Shopify-Topic');
$payload = $request->json()->all();
// Dispatch naar queue, return 200 direct
ProcessShopifyWebhook::dispatch($topic, $payload);
return response()->json(['status' => 'queued'], 200);
}
Return altijd een 200 direct. Shopify herprobeert webhooks bij non-200 responses — dat wil je niet voor al-verwerkte events.
Shopify Plus: extra mogelijkheden
Op Shopify Plus heb je toegang tot de subscriptionDraftUpdate mutatie, waarmee je contracten server-side kunt aanpassen zonder klantinteractie. Dit maakt scenario's mogelijk zoals:
- Automatische prijsaanpassingen op basis van inkoopcostenstijgingen.
- Bulkmigratie van bestaande abonnementen bij een nieuw pricing-model.
- Integratie met een externe loyalty engine die contracten aanpast op basis van klantgedrag.
Wij bouwen dit soort koppelingen regelmatig in combinatie met een Laravel backend die de business-logica beheert en via de Shopify Admin API communiceert.
Migratie vanuit ReCharge
Heb je bestaande abonnees in ReCharge en wil je migreren? Reken op de volgende stappen:
- Export alle actieve contracten via de ReCharge API (customer, product, frequentie,
next_charge_date, betaalmethode-token). - Maak Selling Plans aan in Shopify die matchen met je bestaande frequenties.
- Importeer contracten via
subscriptionContractCreate— let op: betalingstokens zijn niet overdraagbaar. Klanten moeten hun betaalgegevens opnieuw invoeren, tenzij je een tokenmigratie-overeenkomst hebt met je payment provider. - Communiceer de migratie actief naar klanten. Een e-mailcampagne met duidelijke instructie verlaagt churn tijdens de overgang.
Stap 3 is de pijnpunt van vrijwel elke migratie. Wij raden aan de migratie te faseren en bestaande klanten minimaal 4 weken de tijd te geven.
Shopify Markets en multi-currency abonnementen
Een onderschat aandachtspunt: als je internationaal verkoopt, moet je Selling Plans per markt configureren. Shopify Markets regelt de valutaconversie voor eenmalige aankopen automatisch, maar voor subscription billing geldt de valuta die op het moment van contractaanmaak is vastgelegd.
Praktisch betekent dit: een klant die abonneert in EUR wordt altijd in EUR gefactureerd, ook als ze later inloggen via een GBP-markt. Dit is in de meeste gevallen gewenst gedrag. Maar als je prijzen aanpast op de primaire markt, werkt dat niet automatisch door naar bestaande contracten. Je hebt een migratiescript nodig dat actieve contracten bijwerkt via subscriptionContractUpdate.
Wanneer kies je voor een Shopify-partner?
Native subscription-implementatie is technisch haalbaar voor elk team met Shopify API-ervaring. Maar de combinatie van selling plan setup, webhook-infrastructuur, klantenportaal, dunning-logica en migratie is een project van meerdere weken.
Wij nemen dit soort trajecten op ons voor Shopify Plus-merchants die controle willen over hun subscription-stack. Geen app-fees, geen vendor lock-in, volledige integratie met je bestaande infrastructuur. Neem contact op als je wilt weten wat dit concreet voor jouw situatie betekent.
Veelgestelde vragen
Heeft Shopify een ingebouwde interface voor het beheren van abonnementen door klanten?Shopify biedt beperkte functionaliteit in het nieuwe customer account, maar geen volledig selfservice-portaal voor native subscription contracts. Je hebt een custom pagina nodig via de Storefront API, of je kiest voor een third-party portal zoals Skio of Loop.
Werkt de native Subscriptions API ook op gewone Shopify-plannen, of alleen Plus?De Subscriptions API en Selling Plans zijn beschikbaar op alle Shopify-plannen. Shopify Plus geeft je aanvullende mutaties voor server-side contractbeheer, maar de basisimplementatie werkt ook op lagere plannen.
Wat gebeurt er als een betaling mislukt bij een native subscription?Shopify genereert een subscription_billing_attempts/failure webhook. Je bent zelf verantwoordelijk voor de dunning-flow: retry-planning, klantnotificaties en uiteindelijke contractpauze of -annulering. Apps als ReCharge doen dit out-of-the-box; bij een native build bouw je dit zelf.
Technisch kan een SubscriptionContract meerdere line items bevatten, ook van verschillende producten. Of je dit kunt aanbieden hangt af van je fulfillment-setup. Multi-vendor scenarios vereisen doorgaans custom logica in de order-processing om correct te splitsen en te factureren.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →