Webhooks
Subscribd automatically registers a webhook endpoint for each configured gateway at/subscribd/webhook/{gateway}. Incoming payloads are verified, deduplicated, and translated into Laravel events that your application can listen to.
Endpoint URLs
All endpoints are automatically excluded from Laravel’s CSRF protection.
Signature verification
Subscribd verifies every incoming webhook signature before processing. Configure the appropriate secret for each gateway:403 response and are never processed. Do not disable signature verification in production.
Idempotency
Subscribd records every processed webhook event insubscribd_webhook_events. If a gateway retries delivery, the duplicate payload is detected by its event ID and acknowledged without reprocessing. This table is pruned automatically according to subscribd.webhook.retention_days (default: 30).
Events dispatched by webhook handlers
When a verified webhook payload is processed, Subscribd dispatches the corresponding Laravel event. Your listeners receive a fully hydrated local model — you do not need to interact with the gateway API inside your listener.
See Hooks and Events for the full event reference and listener registration.
Configuring webhooks per gateway
Stripe
In the Stripe Dashboard, create an endpoint pointing tohttps://yourapp.com/subscribd/webhook/stripe and enable:
customer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.paidinvoice.payment_failedinvoice.payment_action_requiredcheckout.session.completed
STRIPE_WEBHOOK_SECRET.
PayPal
In your PayPal Developer App, add a webhook forhttps://yourapp.com/subscribd/webhook/paypal. Enable:
BILLING.SUBSCRIPTION.CREATEDBILLING.SUBSCRIPTION.ACTIVATEDBILLING.SUBSCRIPTION.UPDATEDBILLING.SUBSCRIPTION.CANCELLEDPAYMENT.SALE.COMPLETEDPAYMENT.SALE.DENIED
PAYPAL_WEBHOOK_ID.
Braintree
In the Braintree Control Panel under Settings > Webhooks, addhttps://yourapp.com/subscribd/webhook/braintree and enable:
subscription_charged_successfullysubscription_charged_unsuccessfullysubscription_canceledsubscription_expiredsubscription_went_past_duesubscription_trial_ended
Paddle
In the Paddle Dashboard, create a notification destination forhttps://yourapp.com/subscribd/webhook/paddle and enable:
subscription.createdsubscription.updatedsubscription.canceledsubscription.pausedsubscription.resumedtransaction.completedtransaction.payment_failed
PADDLE_WEBHOOK_SECRET.
FastSpring
In your FastSpring Dashboard under Developer > Webhooks, configurehttps://yourapp.com/subscribd/webhook/fastspring and enable:
subscription.activatedsubscription.updatedsubscription.canceledsubscription.deactivatedorder.completedorder.failed
FASTSPRING_WEBHOOK_SECRET.
Square
In the Square Developer Dashboard, configurehttps://yourapp.com/subscribd/webhook/square and enable:
subscription.createdsubscription.updatedsubscription.canceledsubscription.expiredinvoice.payment_madeinvoice.payment_failedpayment.completedpayment.failed
SQUARE_WEBHOOK_SIGNATURE_KEY.
Local development
Use the Stripe CLI to forward Stripe webhooks to your local app:STRIPE_WEBHOOK_SECRET in your .env while developing locally.
For other gateways, tools like ngrok or Expose can create a public tunnel to your local server.
Queue configuration
Webhook processing runs on the queue. Ensure your queue worker is running:subscribd.queue:
billing queue is recommended:
Replaying webhook events
Replay a previously received webhook event by its ID:Next steps
- Hooks and Events — Full event reference and listener registration
- Dunning — Automatic retry logic for failed payments