# Ledenzone & Betaalde Content (dfmembership): volledige gids

> Overzicht De module Ledenzone & Betaalde Content (dfmembership) maakt van uw winkel een lidmaatschapsplatform: u verkoopt abonnementen die toegang geven tot een ledenzone en tot voorbehouden inhoud (artikels, video's, bestanden,…

- Pagina: <https://www.datafirefly.com/nl/documentation/dfmembership/>
- Taal: nl
- Bijgewerkt op: 2026-09-09
- Andere talen: [fr](https://www.datafirefly.com/documentation/dfmembership/index.md), [en](https://www.datafirefly.com/en/documentation/dfmembership/index.md), [es](https://www.datafirefly.com/es/documentation/dfmembership/index.md), [de](https://www.datafirefly.com/de/documentation/dfmembership/index.md), [it](https://www.datafirefly.com/it/documentation/dfmembership/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfmembership/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfmembership/index.md)
- Index: <https://www.datafirefly.com/nl/documentation/llms.txt>

## Overzicht

De module **Ledenzone & Betaalde Content** (`dfmembership`) maakt van uw winkel een lidmaatschapsplatform: u verkoopt **abonnementen** die toegang geven tot een **ledenzone** en tot **voorbehouden inhoud** (artikels, video's, bestanden, links), tot groepsprijzen of tot privé CMS-pagina's. Elk plan hangt aan een **native klantgroep** van PrestaShop, zodat de winkel de zichtbaarheid van de catalogus en de prijzen per groep gewoon zelf regelt; de module voegt daar de facturatie, de paywall, de bibliotheek, het automatisch verlopen en de synchronisatie van de groepen aan toe.

Er zijn **vanaf de eerste versie** twee verdienmodellen beschikbaar, die u per plan kiest: een **toegang met beperkte duur** (de klant betaalt één keer voor N dagen, waarna de toegang automatisch verloopt) en een **echt terugkerend abonnement** via Stripe Billing (met verlenging en opzegging aangestuurd door webhooks).

## Compatibiliteit

- PrestaShop 8.0 tot 9.x
- PHP 7.4 tot 8.3
- Eén winkel en multistore
- 5 talen: FR, EN, ES, DE, IT
- Classic-thema en eigen thema's
- Geen enkele afhankelijkheid: geen Composer, geen ingebouwde Stripe-SDK (de API-aanroepen gebeuren met native cURL)

## Kernbegrippen

### Plan = klantgroep

Een **plan** staat voor een lidmaatschapsformule (bijvoorbeeld « Premium » of « Pro jaarlijks »). Elk plan is **gekoppeld aan een klantgroep** van PrestaShop: wordt een klant lid, dan komt hij in die groep; verloopt zijn abonnement of zegt hij op, dan gaat hij eruit. Zo benut u de volledige native werking van PrestaShop: **specifieke prijzen per groep**, **beperkingen op vervoerders**, **zichtbaarheid van categorieën** en meer, zonder extra configuratie in de module.

Maak eerst uw klantgroepen aan in **Klanten > Groepen** en koppel ze daarna aan uw plannen. Eenzelfde groep kan tegelijk de basis vormen voor uw groepsprijzen en voor het voorbehouden van inhoud.

### De twee facturatiemodi

- **Beperkte duur**: de klant betaalt één keer en krijgt toegang voor de duur van het plan (in dagen). Een crontaak laat de vervallen toegangen verlopen. Ideaal voor een eenmalige pas, een seizoenstoegang of inhoud met een vaste looptijd. Verlengt de klant vervroegd, dan telt de resterende tijd mee.
- **Stripe-abonnement**: een echt terugkerend abonnement dat Stripe Billing beheert. De verlenging, de mislukte betaling en de opzegging komen binnen via **webhooks** en worden automatisch op de toegang van de klant toegepast. Ideaal voor terugkerende omzet (MRR).

## Installatie

1. Open in de backoffice **Modules > Modulebeheer**.
2. Klik op **Een module installeren** en kies het bestand `dfmembership.zip`.
3. Klik na de installatie op **Configureren**.

Bij de installatie maakt de module zijn tabellen aan (plannen, abonnementen, inhoud), registreert hij zijn hooks, genereert hij een willekeurig **crontoken** en voegt hij een menu **Membership** toe onder **Verkopen**, met drie subtabbladen: **Plannen**, **Abonnementen** en **Inhoud**. In de klantenzone verschijnt een link **Mijn lidmaatschap**.

## Algemene configuratie

De configuratiepagina van de module bundelt de globale instellingen en de twee **integratie-URL's** (de Stripe-webhook en de cron) die u in uw externe tools moet overnemen.

### Stripe-instellingen

- **Geheime Stripe-sleutel**: uw sleutel `sk_live_…` (of `sk_test_…` in testmodus). Vereist voor de terugkerende facturatie.
- **Publiceerbare Stripe-sleutel**: uw sleutel `pk_…`.
- **Ondertekeningsgeheim van de webhooks**: de waarde `whsec_…` die Stripe voor het endpoint aanlevert. Zij dient om de **handtekening** van elke binnenkomende webhook te controleren.

### Inhoud en paywall

- **Beschermde CMS-pagina's**: de lijst met identificaties van CMS-pagina's die aan leden zijn voorbehouden, gescheiden door komma's (bijvoorbeeld `4,7,9`). Niet-leden die er toch heen gaan, worden naar de bibliotheek gestuurd.
- **SEO-schema van de paywall**: injecteert gestructureerde gegevens met `isAccessibleForFree` op false bij de voorbehouden inhoud, zodat die indexeerbaar blijft voor Google zonder als cloaking te gelden.
- **Lengte van de teaser (woorden)**: het aantal woorden dat vóór de paywall verschijnt wanneer er bij een inhoud geen eigen teaser is ingevuld.
- **Het crontoken opnieuw genereren**: vervangt het token in de cron-URL (nuttig als dat is uitgelekt).

De geheime sleutel en het webhookgeheim zijn gevoelig. Gebruik de **testsleutels** zolang u het traject valideert, en schakel in productie over op de **live**-sleutels. Deel de cron-URL met haar token nooit publiek.

## Een plan aanmaken

Voeg in **Membership > Plannen** een formule toe en vul in:

- **Naam, slagzin en beschrijving** (meertalig): getoond op de abonnementspagina en in het blok op de startpagina.
- **Facturatiemodus**: « Toegang met beperkte duur (cron) » of « Terugkerend abonnement (Stripe) ».
- **Prijs**: het bedrag dat de klant te zien krijgt.
- **Duur (dagen)**: de duur van de toegang in de modus met beperkte duur.
- **Proef (dagen)**: een eventuele proefperiode (0 betekent geen). In de Stripe-modus wordt de proefperiode aan het Stripe-abonnement doorgegeven.
- **Stripe Price ID**: de identificatie `price_…` van het terugkerende tarief dat u in Stripe hebt aangemaakt (alleen in de Stripe-modus).
- **Gekoppelde klantgroep**: de groep waarin het lid komt zolang zijn toegang actief is.
- **Positie** en **Actief**: de weergavevolgorde en de beschikbaarheid van het plan.

## Modus met beperkte duur en de cron

In de duurmodus wordt het abonnement aangemaakt en daarna geactiveerd voor de duur van het plan; de einddatum wordt vanaf de activeringsdatum berekend. Gratis plannen (prijs nul) worden meteen actief, en een plan met proefperiode opent eerst een proefvenster.

Om de vervallen toegangen automatisch te sluiten, plant u de **cron-URL** in die in de configuratie staat (beveiligd met een token). Eén uitvoering per dag volstaat:

```
curl "https://uw-winkel/index.php?fc=module&module=dfmembership&controller=cron&token=UW_TOKEN"
```

De cron zet elk duurabonnement waarvan de einddatum voorbij is op « verlopen » en **synchroniseert daarna de groepen** van de betrokken klant opnieuw. Zonder cron verlopen de toegangen niet vanzelf: denk eraan die in te plannen.

## Stripe-abonnementsmodus

In de Stripe-modus gaat de klant naar een betaalpagina van **Stripe Checkout** in abonnementsmodus. Zodra de betaling rond is, verwittigt Stripe uw winkel via een webhook en wordt de toegang geactiveerd. De volledige levenscyclus wordt daarna door Stripe aangestuurd.

### Instellen

1. Maak in Stripe een **product** en een **terugkerend tarief** aan (maandelijks, jaarlijks en zo verder) en kopieer de `price_…` ervan naar het bijbehorende plan.
2. Vul uw Stripe-sleutels en het webhookgeheim in de configuratie van de module in.
3. Voeg in Stripe een **webhook-endpoint** toe dat naar de URL uit de configuratie wijst, en abonneer dat op de gebeurtenissen `checkout.session.completed`, `invoice.paid`, `invoice.payment_failed`, `customer.subscription.updated` en `customer.subscription.deleted`.

### Wat doen de webhooks?

- **checkout.session.completed**: activeert het abonnement en legt de Stripe-abonnementsidentificatie vast.
- **invoice.paid**: verlengt de toegang en schuift de einddatum van de periode op.
- **invoice.payment_failed**: laat de toegang open tijdens de herinneringsperiode (dunning) die Stripe beheert.
- **customer.subscription.updated**: neemt een opzegging aan het einde van de periode of een datumwijziging over.
- **customer.subscription.deleted**: sluit de toegang definitief af en haalt de klant uit zijn groep.

Elke webhook wordt op handtekening gecontroleerd met het geheim `whsec_…`. Is de handtekening ongeldig of is het geheim niet ingevuld, dan wordt het verzoek geweigerd. Controleer die instelling als eerste wanneer abonnementen niet actief worden.

## Bibliotheek met inhoud en paywall

Maak in **Membership > Inhoud** de voorbehouden items aan. Elke inhoud heeft:

- **Type**: artikel, video, bestand of link.
- **Titel, teaser en inhoud** (meertalig). De **teaser** is het publieke voorproefje vóór de paywall; laat u die leeg, dan wordt hij automatisch uit de eerste woorden van de inhoud gehaald (met een instelbare lengte).
- **Media-URL**: de video-integratie, het te downloaden bestand of de externe link.
- **Vereist plan**: het plan dat toegang tot de inhoud geeft. De waarde « Elk actief lid » opent de inhoud voor elk lopend abonnement.
- **Dripvertraging (dagen)**: het aantal dagen na de start van het abonnement voordat de inhoud vrijkomt, om een bibliotheek geleidelijk te ontsluiten (drip content).

Aan winkelzijde toont de **bibliotheek** de inhoud met hun teaser. Een lid ziet de volledige inhoud; een bezoeker of niet-lid ziet de teaser en daarna een **paywall** die hem uitnodigt zich te abonneren. De toegangscontrole combineert het vereiste plan en de dripvertraging.

### Vindbaarheid van de voorbehouden inhoud

Staat de optie voor het SEO-schema aan, dan voegt de module bij de vrijgegeven inhoud gestructureerde gegevens toe die aangeven dat het om betaalde inhoud gaat (de flexible sampling van Google). Het voorbehouden blok krijgt een eigen CSS-klasse, waardoor Google de pagina kan indexeren zonder het verschil tussen wat de robot en wat het lid ziet af te straffen.

## Voorbehouden CMS-pagina's

Wilt u bestaande CMS-pagina's voorbehouden (een pagina met bronnen, een privézone), vul dan hun identificaties in bij **Beschermde CMS-pagina's**. Een niet-lid dat zo'n pagina opent, wordt automatisch naar de bibliotheek gestuurd, waar hij de formules kan ontdekken. Leden komen er gewoon op.

## Ledenzone

Via **Mijn account > Mijn lidmaatschap** vindt de klant zijn lopende abonnementen terug: plan, status, facturatiemodus en de datum van verlenging of einde. Hij kan de **bibliotheek openen** en desgewenst een abonnement **opzeggen**. Het opzeggen gebeurt **op het einde van de periode**: de toegang blijft open tot het al betaalde einde en sluit daarna. In de Stripe-modus gaat de aanvraag naar Stripe; in de duurmodus wordt de toegang eenvoudigweg niet verlengd.

## Abonnementen beheren (backoffice)

In **Membership > Abonnementen** ziet u alle abonnementen (klant, e-mailadres, plan, status, modus, datums), met een zoekfunctie en een export. In de detailweergave kunt u zo nodig een **status forceren** (actief, verlopen, opgezegd): bij een commerciële geste, een rechtzetting of een geschil. Elke statuswijziging **synchroniseert meteen de groep** van de klant.

De groepen worden ook opnieuw gesynchroniseerd wanneer de klant inlogt en bij de validatie van een bestelling, zodat de toegang altijd de werkelijk actieve abonnementen weerspiegelt.

## Verder gaan

De facturatiearchitectuur is **uitbreidbaar**: een nieuwe aanbieder (bijvoorbeeld terugkerende PayPal-betalingen) voegt u toe door de interface `BillingManagerInterface` uit de map `src/Billing/` te implementeren en die in de fabriek `BillingManagerFactory` te registreren, zonder de rest van de module aan te raken. Mogelijke uitbreidingen: teasers die door AI worden geschreven, herinneringsmails, cadeauabonnementen, van formule wisselen met verrekening, of een dashboard met MRR en verlooppercentage.

## FAQ en probleemoplossing

### Een klant heeft betaald maar krijgt geen toegang

Controleer in de Stripe-modus eerst het **webhookgeheim** en of het endpoint de gebeurtenissen wel ontvangt in het Stripe-dashboard (tabblad Webhooks). De activering hangt af van de gebeurtenis `checkout.session.completed`. Controleer in de duurmodus of het abonnement wel op actief staat; u kunt dat in de detailweergave forceren.

### De toegangen verlopen nooit

De duurmodus steunt op de cron. Ga na of u de **cron-URL** (dagelijks) hebt ingepland met het juiste token. U kunt die handmatig aanroepen om te testen: het JSON-antwoord toont hoeveel abonnementen zijn verlopen.

### Hoe koppel ik het plan aan lagere prijzen?

Koppel het plan aan een **klantgroep** en stel daarna **specifieke prijzen** voor die groep in op uw productfiches (of via een catalogusprijsregel). Zolang het lid actief is, hoort het bij de groep en krijgt het die prijzen automatisch.

### Is de voorbehouden inhoud indexeerbaar voor Google?

Ja, als de optie voor het SEO-schema aanstaat: de betaalde inhoud wordt via gestructureerde gegevens als zodanig aangeduid, wat overeenkomt met de aanbevelingen van Google over flexible sampling. U behoudt de indexering zonder het betalende karakter te verbergen.

### Kan ik een gratis proefperiode aanbieden?

Ja. Vul op het plan een aantal proefdagen in. In de duurmodus opent een proefvenster; in de Stripe-modus wordt de proefperiode aan het Stripe-abonnement doorgegeven (`trial_period_days`).

### Wordt PayPal ondersteund?

Versie 1 ondersteunt de duurmodus en Stripe. Terugkerende PayPal-betalingen kunnen worden toegevoegd via de uitbreidbare facturatie-interface, zonder de module te herbouwen.

### Werkt de module met PrestaShop 9?

Ja. De module werkt met PrestaShop 8 en 9, in multistore en meertalig (FR, EN, ES, DE, IT).
