Skip to content

Webhooks

Webhooks are the notifications payment providers send to LicenseDock when something happens – a payment succeeds, a subscription renews, a refund is issued, a dispute opens. Without webhooks, recurring payments and refunds won't sync.

Webhook URLs

GatewayURL
Stripehttps://yoursite.com/api/index.php/v1/licensedock/webhooks/stripe
PayPalhttps://yoursite.com/api/index.php/v1/licensedock/webhooks/paypal
Molliehttps://yoursite.com/api/index.php/v1/licensedock/webhooks/mollie

The exact URLs are also displayed in Components → LicenseDock → Gateways.

For local development, set Webhook Base URL in Settings → Gateways to your tunnel URL – the gateways need a publicly reachable endpoint.

What Each Event Does

Stripe

EventAction
checkout.session.completedCompletes the order after the initial payment
invoice.paidRecords a subscription renewal, extends the license
invoice.payment_failedRecords a failed renewal (dunning)
charge.refundedApplies a refund (full or partial)
customer.subscription.deletedCancels the local subscription record
charge.dispute.createdOpens a dispute, suspends linked licenses
charge.dispute.closedResolves the dispute (won = restore, lost = revoke)

PayPal

EventAction
PAYMENT.CAPTURE.COMPLETEDCompletes a one-time payment order
PAYMENT.CAPTURE.REFUNDEDApplies a refund on a one-time payment
PAYMENT.SALE.COMPLETEDRecords a subscription payment (initial or renewal)
PAYMENT.SALE.REFUNDEDApplies a refund on a subscription payment
BILLING.SUBSCRIPTION.ACTIVATEDBackup completion for the approval flow
BILLING.SUBSCRIPTION.PAYMENT.FAILEDRecords a failed renewal
BILLING.SUBSCRIPTION.SUSPENDEDSuspends licenses after repeated failures
BILLING.SUBSCRIPTION.CANCELLEDCancels the local subscription record
CUSTOMER.DISPUTE.CREATEDOpens a dispute, suspends linked licenses
CUSTOMER.DISPUTE.RESOLVEDResolves the dispute

Mollie

NotificationAction
Payment paid (clean)Completes one-time order or records subscription renewal
Payment paid (with refund / chargeback)Applies the refund or chargeback
Payment failed (one-time)Marks the order failed
Payment failed (subscription)Records a dunning failure
Payment expired / canceledMarks the order terminal

Security

GatewayVerification
StripeHMAC-SHA256 signature in the Stripe-Signature header. Checked with a 5-minute timestamp tolerance
PayPalRemote verification via PayPal's verify-webhook-signature endpoint, using your Webhook ID
MollieRe-fetch payment status from Mollie's API – Mollie webhooks don't carry signatures

Webhook signing secrets and webhook IDs are entered in Settings → Gateways and encrypted at rest.

Idempotency

GatewayApproach
StripeDeduplicates by event.id
PayPalDeduplicates by transmission_id
MollieHandlers are idempotent – Mollie sends the same payment ID for every status change

Plan Changes

Plan-change behaviour differs per gateway. The mode (immediate vs scheduled) is picked by the customer or admin in the customer portal.

Stripe

ModeCustomer experienceCharge todayRedirect
Immediate upgrade"Plan updated, $X charged today"Yes (delta)No
Immediate downgrade"Plan updated, $X credited"Credit issuedNo
Scheduled"Change scheduled for [next renewal]"NoNo

PayPal

ModeCustomer experienceCharge todayRedirect
Immediate upgrade (net > 0)Approve delta, then approve plan reviseYesYes (two hops)
Immediate downgrade (net < 0)Approve plan revise, refund issuedRefundYes (single hop)
ScheduledApprove plan reviseNoYes (single hop)

Mollie

ModeCustomer experienceCharge todayRedirect
Immediate upgrade (net > 0)"Plan updated, $X charged"Yes (delta via mandate)No
Immediate downgrade (net < 0)"Plan updated, $X refunded"RefundNo
Scheduled"Change scheduled for [next renewal]"NoNo

Troubleshooting

If a webhook doesn't fire or doesn't process:

  1. Check Components → LicenseDock → Webhook Logs – every received webhook is logged with its raw payload, signature status, and the action taken
  2. Verify the webhook URL matches what's in your gateway dashboard
  3. Confirm the signing secret / webhook ID in LicenseDock matches the gateway
  4. Use the gateway's own webhook log (Stripe Dashboard → Webhooks, PayPal Developer → Webhooks, Mollie Dashboard → API Keys) to confirm the gateway sent the event
  5. For Mollie, make sure the Webhook Base URL is publicly reachable

Joomla Extensions by Contona