Databaseschema voor plannen en toegangsrechten bij upgrades en add-ons
Databaseschema voor plannen en toegangsrechten dat upgrades, add-ons, proefperiodes en intrekkingen ondersteunt zonder hardcoded regels, met duidelijke tabellen en controles.

Waarom plannen en functies snel rommelig worden
Op een prijspagina lijken plannen eenvoudig: Basic, Pro, Enterprise. De rommel begint zodra je die namen in echte toegangsregels binnen je app probeert om te zetten.
Hardcoded feature-checks (zoals if plan = Pro then allow X) werken voor de eerste versie. Daarna verandert de prijsstelling. Een functie verhuist van Pro naar Basic, er verschijnt een nieuwe add-on, of een sales-deal bevat een custom bundle. Plotseling staat diezelfde regel gekopieerd in API's, UI, mobiele apps en background jobs. Je verandert één plek en vergeet een andere. Gebruikers merken het.
Een tweede probleem is tijd. Abonnementen zijn geen statische label; ze veranderen midden in een periode. Iemand upgrade vandaag, downgrade volgende maand, pauzeert of annuleert terwijl er nog betaalde tijd over is. Als je database alleen de “huidige plan” opslaat, verlies je de tijdlijn en kun je later geen basisvragen meer beantwoorden: wat hadden ze afgelopen dinsdag? Waarom keurde support een terugbetaling goed?
Add-ons maken het erger omdat ze planafsnijdend zijn. Een add-on kan extra seats ontgrendelen, een limiet wegnemen of een specifieke functie inschakelen. Mensen kunnen het op elk plan kopen, later verwijderen of behouden na een downgrade. Als de regel in code zit, eindig je met een groeiende stapel speciale gevallen.
Dit zijn situaties die naïeve ontwerpen meestal breken:
- Upgrade midden in de periode: toegang moet direct veranderen, proration kan andere regels volgen.
- Geplande downgrade: toegang kan “hoger” blijven tot het betaalde tijdvak eindigt.
- Grandfathering: oudere klanten behouden een functie die nieuwe klanten niet krijgen.
- Custom deals: één account krijgt Feature A maar niet Feature B, ook al delen ze dezelfde plannaam.
- Auditbehoefte: support, finance of compliance vraagt “wat precies was ingeschakeld en wanneer?”
Het doel is simpel: een flexibel toegangsmodel dat verandert met prijswijzigingen, zonder elke keer bedrijfslogica te herschrijven. Je wilt één plek om te vragen “mag dit?” en een databaan die het antwoord uitlegt.
Aan het einde van dit artikel heb je een schemapatroon dat je kunt kopiëren: plannen en add-ons worden inputs, en entitlements worden de enige bron van waarheid voor feature-toegang. Diezelfde aanpak past ook bij no-code builders zoals AppMaster, omdat je de regels in data kunt houden en consistent vanuit je backend, webapp en mobiele apps kunt opvragen.
Belangrijke termen: plan, add-on, entitlement en toegang
Veel abonnementsproblemen beginnen als een vocabulaireprobleem. Als iedereen hetzelfde woord anders gebruikt, verandert je schema in speciale gevallen.
Houd deze termen gescheiden in een plans- en entitlements-databaseschema:
- Plan: het standaardpakket dat iemand krijgt bij abonnement (bijvoorbeeld Basic of Pro). Een plan zet meestal de basislimieten en inbegrepen functies.
- Add-on: een optionele aankoop die de basis verandert (bijvoorbeeld “extra seats” of “advanced reporting”). Add-ons moeten koppelbaar en verwijderbaar zijn zonder het plan te veranderen.
- Entitlement: het uiteindelijke, berekende “wat ze nu hebben”, na combineren van plan + add-ons + overrides. Dit is wat je app moet opvragen.
- Permission (of capability): een specifieke actie die iemand kan uitvoeren (bijvoorbeeld “export data” of “manage billing”). Permissions hangen vaak af van rol plus entitlements.
- Toegang: het daadwerkelijke resultaat wanneer de app regels afdwingt (een scherm toont of verbergt een functie, een API-aanroep is toegestaan of geblokkeerd, een limiet wordt toegepast).
Feature flags zijn verwant maar anders. Een feature flag is typisch een product-schakelaar die je bestuurt (rollouts, experimenten, een feature uitzetten tijdens een incident). Een entitlement is klant-specifieke toegang op basis van wat ze betalen of wat je hebt toegekend. Gebruik flags wanneer je gedrag voor groepen wilt veranderen zonder met billing te rommelen. Gebruik entitlements wanneer toegang moet overeenkomen met een abonnement, factuur of contract.
Scope is een andere bron van verwarring. Houd deze ideeën duidelijk:
- User: één persoon. Handig voor rollen (admin vs member) en persoonlijke limieten.
- Account (customer): de betalende entiteit. Handig voor betalingsgegevens en eigendom van het abonnement.
- Workspace (project/team): waar gewerkt wordt. Veel producten passen entitlements hier toe (seats, opslag, ingeschakelde modules).
Tijd is belangrijk omdat toegang verandert. Modelleer het direct:
- Start en eind: een entitlement kan alleen binnen een venster actief zijn (trial, promo, jaarlijks contract).
- Geplande wijziging: upgrades kunnen nu ingaan; downgrades starten vaak bij de volgende verlenging.
- Grace en annulering: je kunt beperkte toegang toestaan na mislukte betaling, maar alleen tot een duidelijke einddatum.
Voorbeeld: een bedrijf zit op Pro, voegt halverwege de maand “Advanced Reporting” toe en plant later een downgrade naar Basic. Het plan verandert later, de add-on start nu, en de entitlement-laag blijft de enige plek om te vragen: “Mag deze workspace vandaag advanced reports gebruiken?”
Een eenvoudig kernschema voor plannen en functies
Een goed plans- en entitlements-databaseschema begint klein: scheid wat je verkoopt (plannen en add-ons) van wat mensen kunnen doen (features). Als je die twee ideeën helder houdt, worden upgrades en nieuwe add-ons datawijzigingen, geen herschrijvingen.
Hier is een praktische set tabellen die voor de meeste abonnementsproducten werkt:
- products: het verkoopbare ding (Base plan, Team plan, Extra seats add-on, Priority support add-on).
- plans: optioneel, als je plannen als een speciaal type product wilt met plan-specifieke velden (billing interval, publieke weergavevolgorde). Veel teams slaan plannen gewoon in
productsop en gebruiken eenproduct_type-kolom. - features: de catalogus van mogelijkheden (API access, max projects, export, SSO, SMS credits).
- product_features (of
plan_featuresals je plannen scheidt): een join-tabel die zegt welke features bij welk product horen, meestal met een waarde.
Die join-tabel is waar de meeste kracht zit. Features zijn zelden alleen aan of uit. Een plan kan max_projects = 10 bevatten, terwijl een add-on +5 toevoegt. Dus product_features moet ten minste ondersteunen:
feature_value(nummer, tekst, JSON, of aparte kolommen)value_type(boolean, integer, enum, json)grant_mode(replace vs add), zodat een add-on “5 seats toevoegen” kan doen in plaats van de basislimiet te overschrijven
Modelleer add-ons ook als producten. Het enige verschil is hoe ze worden gekocht. Een basisplanproduct is “één tegelijk”, terwijl een add-onproduct mogelijk hoeveelheid toestaat. Maar beiden mappen op features op dezelfde manier. Dit voorkomt speciale gevallen zoals “als add-on X dan enable feature Y” verspreid door je code.
Features moeten data zijn, geen codeconstanten. Als je feature-checks hardcoded in meerdere services hebt, zal je uiteindelijk mismatches uitrollen (web zegt ja, mobiel zegt nee, backend is het oneens). Wanneer features in de database leven, kan de app één consistente vraag stellen en kun je wijzigingen doorvoeren door rijen te bewerken.
Naamgeving is belangrijker dan men verwacht. Gebruik stabiele identifiers die nooit veranderen, zelfs niet als de marketingnaam verandert:
feature_keyzoalsmax_projects,sso,priority_supportproduct_codezoalsplan_starter_monthly,addon_extra_seats
Houd displaylabels apart (feature_name, product_name). Als je AppMaster’s Data Designer met PostgreSQL gebruikt, betaalt het zich direct uit om deze keys uniek te hebben: je kunt veilig regenereren en integraties en rapportage blijven stabiel.
De entitlement-laag: één plek om te vragen “mogen ze?”
De meeste abonnementsystemen gaan mis wanneer “wat ze gekocht hebben” in één plek staat, maar “wat ze kunnen doen” in vijf verschillende codepaden wordt berekend. De oplossing is een entitlement-laag: een enkele tabel (of view) die effectieve toegang voor een subject op een tijdstip representeert.
Als je een plans- en entitlements-databaseschema wilt dat upgrades, downgrades, trials en eenmalige gunningen overleeft, is deze laag wat alles voorspelbaar maakt.
Een praktische entitlements-tabel
Zie elke rij als één claim: “dit subject heeft toegang tot deze feature met deze waarde, van deze tijd tot die tijd, vanuit deze bron.” Een gangbare vorm ziet er zo uit:
- subject_type (bijv. "account", "user", "org") en subject_id
- feature_id
- value (de effectieve waarde voor die feature)
- source (waar het vandaan komt: "direct", "plan", "addon", "default")
- starts_at en ends_at (nullable ends_at voor doorlopende toegang)
Je kunt value op een paar manieren implementeren: één tekst/JSON-kolom plus een value_type, of aparte kolommen zoals value_bool, value_int, value_text. Houd het saai en makkelijk te queryen.
Waardetypen die de meeste producten dekken
Features zijn niet altijd aan/uit. Deze waardetypen dekken meestal echte billing- en toegangscontrolebehoeften:
- Boolean: ingeschakeld/uitgeschakeld ("can_export" = true)
- Quota-nummer: een limiet ("seats" = 10, "api_calls" = 100000)
- Tier-level: een rang ("support_tier" = 2)
- String: een modus of variant ("data_retention" = "90_days")
Precedentie: hoe conflicten worden opgelost
Conflicten zijn normaal. Een gebruiker kan op een plan zitten dat 5 seats toestaat, een add-on kopen voor 10 extra en ook een handmatige toekenning van support krijgen.
Stel een duidelijke regel in en houd je er overal aan:
- Directe gunning overschrijft plan
- Daarna add-ons
- Daarna defaults
Een eenvoudige aanpak is alle kandidaat-rijen op te slaan (plan-afgeleide, add-on-afgeleide, direct) en een uiteindelijke “winnaar” per subject_id + feature_id te berekenen door te sorteren op source-precedentie en dan nieuwste starts_at.
Hier is een concreet scenario: een klant downgrades het plan vandaag, maar heeft al een add-on betaald die tot het eind van de maand loopt. Met starts_at/ends_at op entitlements gaat de downgrade direct in voor plan-gebaseerde features, terwijl de add-on feature actief blijft tot de ends_at. Je app kan met één query antwoorden op “mogen ze?” in plaats van speciale-case logica.
Abonnementen, items en tijdsgebonden toegang
Je plancatalogus (plannen, add-ons, features) is het “wat.” Abonnementen zijn het “wie heeft wat, en wanneer.” Als je deze gescheiden houdt, worden upgrades en annuleringen minder eng.
Een praktisch patroon is: één subscription per account en meerdere subscription_items eronder (één voor het basisplan, plus nul of meer add-ons). In een plans- en entitlements-databaseschema geeft dit je een schone plek om veranderingen over tijd vast te leggen zonder toegangsregels te herschrijven.
Kern tabellen om de aankoop-tijdlijn te modelleren
Je kunt het simpel houden met twee tabellen die makkelijk te queryen zijn:
- subscriptions: id, account_id, status (active, trialing, canceled, past_due), started_at, current_period_start, current_period_end, canceled_at (nullable)
- subscription_items: id, subscription_id, item_type (plan, addon), plan_id/addon_id, quantity, started_at, ends_at (nullable), source (stripe, manual, promo)
Een veelvoorkomend detail: sla elk item met zijn eigen datums op. Zo kun je een add-on slechts 30 dagen toekennen, of een plan laten doorlopen tot het einde van een betaalde periode zelfs als de klant de verlenging annuleert.
Houd proration en billing buiten toegangslogica
Proratie, facturen en betalingspogingen zijn billing-problemen. Feature-toegang is een entitlement-probleem. Probeer niet “toegang te berekenen” uit factuurregels.
Laat in plaats daarvan billing-events subscription-records bijwerken (bijv. extend current_period_end, create a new subscription_item row, of set ends_at). Je app beantwoordt toegangsvragen dan vanuit de subscription-tijdlijn (en later vanuit de entitlement-laag), niet vanuit billing-wiskunde.
Geplande wijzigingen zonder verrassingen
Upgrades en downgrades treden vaak op een specifiek moment in:
- Voeg pending_plan_id en change_at toe op subscriptions voor één geplande planwijziging.
- Of gebruik een subscription_changes-tabel (subscription_id, effective_at, from_plan_id, to_plan_id, reason) als je historie en meerdere toekomstige wijzigingen nodig hebt.
Dit voorkomt hardcoded regels zoals “downgrades gebeuren aan het einde van de periode” in willekeurige delen van je code. Het schema is data.
Waar trials passen
Trials zijn gewoon tijdsgebonden toegang met een andere bron. Twee heldere opties:
- Behandel trial als subscription-status (trialing) met trial_start/trial_end datums.
- Of maak trial-granted items/entitlements met started_at/ends_at en source = trial.
Als je dit in AppMaster bouwt, mappen deze tabellen netjes naar de Data Designer in PostgreSQL, en maken de datums het eenvoudig om “wat is nu actief” te queryen zonder speciale gevallen.
Stap voor stap: implementeer het patroon
Een goed plans- en entitlements-databaseschema begint met één belofte: featurelogica leeft in data, niet verspreid door codepaden. Je app moet één vraag stellen - “wat zijn de effectieve entitlements nu?” - en een helder antwoord krijgen.
1) Definieer features met stabiele keys
Maak een feature-tabel met een stabiele, menselijk-leesbare sleutel die je nooit hernoemt (zelfs niet als het UI-label verandert). Goede keys zijn export_csv, api_calls_per_month of seats.
Voeg een type toe zodat het systeem weet hoe de waarde behandeld moet worden: boolean (aan/uit) vs numeriek (limieten/quotas). Houd het saai en consistent.
2) Koppel plannen en add-ons aan entitlements
Nu heb je twee bronnen van waarheid nodig: wat een plan bevat, en wat elke add-on toekent.
Een eenvoudige, praktische volgorde is:
- Zet alle features in één
feature-tabel met stabiele keys en een value type. - Maak
planenplan_entitlementwaar elke rij een featurewaarde toekent (bijvoorbeeldseats = 5,export_csv = true). - Maak
addonenaddon_entitlementdie extra waarden toekennen (bijvoorbeeldseats + 10,api_calls_per_month + 50000, ofpriority_support = true). - Bepaal hoe waarden gecombineerd worden: booleans gebruiken meestal OR, numerieke limieten vaak MAX (hogere wint), en seat-achtige hoeveelheden vaak SUM.
- Leg vast wanneer entitlements starten en eindigen zodat upgrades, annuleringen en proratie geen toegangchecks breken.
Als je dit in AppMaster bouwt, kun je deze tabellen modelleren in de Data Designer (PostgreSQL) en de combinatieregels als een kleine “policy”-tabel of enum opnemen die door je Business Process-logica wordt gebruikt.
3) Produceer “effectieve entitlements”
Je hebt twee opties: bereken on read (query en merge elke keer) of genereer een gecachte snapshot wanneer er iets verandert (planwijziging, add-on aankoop, verlenging, annulering). Voor de meeste apps zijn snapshots makkelijker te begrijpen en sneller onder load.
Een veelgebruikte aanpak is een account_entitlement-tabel die het uiteindelijke resultaat per feature opslaat, plus valid_from en valid_to.
4) Handhaaf toegang met één check
Verspreid regels niet over schermen, endpoints en background jobs. Zet één functie in de appcode die effectieve entitlements leest en beslist.
can(account_id, feature_key, needed_value=1):
ent = get_effective_entitlement(account_id, feature_key, now)
if ent.type == "bool": return ent.value == true
if ent.type == "number": return ent.value >= needed_value
Zodra alles can(...) aanroept, worden upgrades en add-ons data-updates, geen herschrijvingen.
Voorbeeldscenario: upgrade plus add-on zonder verrassingen
Een supportteam van 6 personen zit op het Starter-plan. Starter bevat 3 agent-seats en 1.000 SMS-berichten per maand. Halverwege de maand groeien ze naar 6 agents en willen een extra SMS-pack van 5.000. Je wilt dat dit werkt zonder speciale code zoals “als plan = Pro dan…”.
Dag 1: ze starten op Starter
Je maakt een subscription voor het account met een betaalperiode (bijvoorbeeld 1 jan tot 31 jan). Dan voeg je één subscription_item voor het plan toe.
Bij checkout (of via een nightly job) schrijf je entitlement-gunningen voor die periode:
entitlement_grant:agent_seats, waarde3, start1 jan, eind31 janentitlement_grant:sms_messages, waarde1000, start1 jan, eind31 jan
Je app vraagt nooit “op welk plan zitten ze?” maar “wat is hun effectieve entitlement nu?” en krijgt seats = 3, SMS = 1000.
Dag 15: upgrade naar Pro, dezelfde dag SMS-pack toevoegen
Op 15 jan upgraden ze naar Pro (bevat 10 agent-seats en 2.000 SMS). Je bewerkt geen oude gunningen. Je voegt nieuwe records toe:
- Sluit het oude plan item: zet
subscription_item(Starter) end op15 jan - Maak een nieuw plan item:
subscription_item(Pro) start15 jan, end31 jan - Voeg een nieuw add-on item toe:
subscription_item(SMS Pack 5000) start15 jan, end31 jan
Dan worden gunningen voor dezelfde periode toegevoegd:
entitlement_grant:agent_seats, waarde10, start15 jan, eind31 janentitlement_grant:sms_messages, waarde2000, start15 jan, eind31 janentitlement_grant:sms_messages, waarde5000, start15 jan, eind31 jan
Wat gebeurt er direct op 15 jan?
- Seats: effectieve seats wordt 10 (je kiest een regel zoals “neem de max voor seats”). Ze kunnen die dag 3 extra agents toevoegen.
- SMS: effectieve SMS wordt 7.000 voor de rest van de periode (je kiest “somatieve gunningen” voor message-packs).
Bestaand gebruik hoeft niet verplaatst te worden. Je gebruikstabel blijft berichten tellen; de entitlement-check vergelijkt gebruik deze periode gewoon met de huidige effectieve limiet.
Dag 25: downgrade plannen, toegang behouden tot periode-einde
Op 25 jan plannen ze een downgrade terug naar Starter vanaf 1 feb. Je raakt de gunningen van januari niet aan. Je maakt toekomstige items (of toekomstige gunningen) voor de volgende periode:
subscription_item(Starter) start1 feb, end28 feb- Geen SMS-pack item vanaf
1 feb
Resultaat: ze behouden Pro-seats en het SMS-pack tot 31 jan. Op 1 feb daalt hun effectieve seats naar 3 en reset SMS naar Starter-limieten voor de nieuwe periode. Dit is makkelijk redeneerbaar en past netjes in een no-code workflow in AppMaster: datums veranderen creëert nieuwe rijen en de entitlement-query blijft hetzelfde.
Veelgemaakte fouten en valkuilen
De meeste abonnementsbugs zijn geen billing-bugs. Het zijn toegangsbugs veroorzaakt door verspreide logica door het product. De snelste manier om een plans- en entitlements-databaseschema te breken is “mogen ze?” in vijf verschillende plekken te beantwoorden.
Een klassiek falen is hardcoded regels in UI, API en background jobs apart. De UI verbergt een knop, de API vergeet het endpoint te blokkeren, en een nightly job draait nog steeds omdat die iets anders checkt. Je eindigt met verwarrende “het werkt soms”-meldingen die moeilijk te reproduceren zijn.
Een andere val is checks op plan_id in plaats van featurechecks. Het lijkt eenvoudig (Plan A kan exporteren, Plan B niet), maar het valt uit elkaar zodra je een add-on, een grandfathered klant, een gratis proef of een enterprise-exceptie toevoegt. Als je ooit zegt “if plan is Pro then allow…”, bouw je een doolhof dat je voor altijd moet onderhouden.
Tijd- en annulering-randgevallen
Toegang blijft ook “plakken” als je alleen een boolean zoals has_export = true opslaat en nooit datums toevoegt. Annuleringen, refunds, chargebacks en mid-cycle downgrades hebben allemaal tijdsgrenzen nodig. Zonder starts_at en ends_at geef je per ongeluk permanente toegang, of neem je toegang te vroeg weg.
Een eenvoudige check om dit te vermijden:
- Elke entitlement-gunning moet een bron hebben (plan, add-on, handmatige override) en een tijdsbereik.
- Elke toegangsbeslissing moet “nu tussen start en einde” gebruiken (met duidelijke regels voor null end-datums).
- Background jobs moeten entitlements bij runtime opnieuw controleren, niet aannemen dat de staat van gisteren nog geldt.
Meng billing en toegang niet
Teams krijgen ook problemen door billingrecords en toegangsregels in dezelfde tabel te mengen. Billing heeft facturen, belastingen, proratie, provider-IDs en retry-states nodig. Toegang heeft duidelijke feature-keys en tijdvensters nodig. Wanneer ze verstrengeld raken, wordt een billing-migratie een productstoring.
Tot slot slaan veel systemen geen audittrail op. Als een gebruiker vraagt “waarom kan ik exporteren?”, heb je een antwoord nodig zoals: “Ingeschakeld door Add-on X van 2026-01-01 tot 2026-02-01” of “Handmatig toegekend door support, ticket 1842.” Zonder dat raden support en engineering.
Als je dit in AppMaster bouwt, houd auditvelden in je Data Designer-model en maak de “mogen ze?”-check een enkele Business Process die web, mobiel en geplande flows gebruiken.
Snelle checklist voordat je live gaat
Voordat je je plans- en entitlements-databaseschema uitrolt, doe je één laatste ronde met echte vragen, niet theorie. Het doel is dat toegang verklaarbaar, testbaar en wijzigbaar is.
Realiteitscheck-vragen
Kies één gebruiker en één feature, en probeer het resultaat uit te leggen zoals je dat aan support of finance zou doen. Als je alleen kunt antwoorden “ze zitten op Pro” (of erger, “de code zegt het”), krijg je pijn zodra iemand midden in de periode upgrade of een eenmalige deal krijgt.
Gebruik deze checklist:
- Kun je “waarom heeft deze gebruiker toegang?” beantwoorden met alleen data (subscription items, add-ons, overrides en tijdvensters), zonder applicatiecode te lezen?
- Zijn alle toegangchecks gebaseerd op stabiele feature-keys (zoals
feature.export_csv) in plaats van plan-namen (zoals “Starter” of “Business”)? Plannaam verandert; feature-key niet. - Hebben entitlements duidelijke start- en eindtijden, inclusief trials, grace-periodes en geplande annuleringen? Als tijd ontbreekt, ontstaan er discussies bij downgrades.
- Kun je toegang voor één klant granten of verwijderen met een override-record, zonder je logica te vertakken? Zo handel je “geef ze deze maand 10 extra seats” zonder custom code.
- Kun je een upgrade en downgrade testen met een paar voorbeeldrijen en voorspelbare resultaten krijgen? Als je een complex script nodig hebt om dit te simuleren, is je model te impliciet.
Een praktische test: maak drie gebruikers (nieuw, mid-month geüpgraded, geannuleerd) en één add-on (bijvoorbeeld “extra seats” of “advanced reports”). Draai je toegangquery voor elk. Als de resultaten duidelijk en verklaarbaar zijn, ben je klaar.
Als je met een tool als AppMaster werkt, houd één regel: laat één plek (één query of één Business Process) verantwoordelijk zijn voor “mogen ze?”, zodat elk web- en mobiel scherm hetzelfde antwoord gebruikt.
Volgende stappen: maak upgrades onderhoudbaar
De beste manier om upgrades beheersbaar te houden is kleiner beginnen dan je denkt. Kies een handvol features die echt waarde hebben (5–10 is genoeg) en bouw één entitlement-query of functie die één vraag beantwoordt: “Mag dit account X nu doen?” Als je dat niet in één plek kunt beantwoorden, blijven upgrades risicovol.
Als die ene check werkt, behandel upgradepaden als productgedrag, niet alleen als billinggedrag. De snelste manier om rare randgevallen te vangen is een klein setje access-tests te schrijven gebaseerd op echte klantbewegingen.
Praktische volgende stappen die vaak snel renderen:
- Definieer een minimaal feature-catalogus en koppel elk plan aan een duidelijke set entitlements.
- Voeg add-ons toe als aparte “items” die entitlements toekennen of uitbreiden, in plaats van ze in planregels te bakken.
- Schrijf 5–10 access-tests voor veelvoorkomende paden (mid-cycle upgrade, downgrade bij verlenging, add-on toegevoegd en later verwijderd, trial naar betaald, grace-periode).
- Maak prijswijzigingen data-only: werk planrijen, feature-mappings en entitlement-gunningen bij, niet applicatiecode.
- Stel een gewoonte in: elke nieuw plan of add-on moet ten minste één test komen met bewijs dat toegang zich gedraagt zoals verwacht.
Als je een no-code backend gebruikt, kun je dit patroon nog steeds duidelijk modelleren. In AppMaster is de Data Designer geschikt om de kerntabellen te maken (plannen, features, subscriptions, subscription items, entitlements). De Business Process Editor kan dan de toegangsgedachte vasthouden (laad actieve entitlements, pas tijdvensters toe, retourneer allow/deny) zodat je niet verspreid checks in endpoints handmatig codeert.
De winst zie je bij de volgende prijswijziging. In plaats van regels te herschrijven, bewerk je data: een feature verhuist van “Pro” naar een add-on, een entitlement-duur verandert, of een legacy-plan behoudt oude gunningen. Je toegangslogica blijft stabiel en upgrades worden een gecontroleerde update, geen code-sprint.
Als je je schema snel wilt valideren, probeer dan één upgrade plus één add-on end-to-end te modelleren en voer die access-tests uit voordat je iets anders toevoegt.


