Payment Gateways
WhatsMine supports three payment gateways — Stripe, PayPal and Paddle. Enable any combination; customers will see the enabled options at checkout.
Location: Admin → Payment Gateways (/admin/payment-gateways)
📸 Screenshot: The Payment Gateways overview showing Stripe, PayPal and Paddle with their enabled/test status.
The gateways overview
The overview lists all three gateways with their current state: enabled or disabled, test or live mode, and whether credentials are configured. Click a gateway to edit it.
Configuring a gateway
Open a gateway and enter its credentials:
Stripe
| Field | Where to find it |
|---|---|
| Publishable key | Stripe Dashboard → Developers → API keys |
| Secret key | Stripe Dashboard → Developers → API keys |
| Webhook secret | Created when you add the webhook endpoint (below) |
PayPal
| Field | Where to find it |
|---|---|
| Client ID | PayPal Developer Dashboard → your app |
| Client secret | PayPal Developer Dashboard → your app |
| Webhook ID | Created when you add the webhook (below) |
Paddle
| Field | Where to find it |
|---|---|
| API key | Paddle Dashboard → Developer Tools → Authentication |
| Webhook secret | Paddle Dashboard → Developer Tools → Notifications |
Each gateway has a test/sandbox mode toggle. Use test mode while setting up, then switch to live when ready. Secrets are masked after saving for security.
Registering webhooks (required for renewals)
Each gateway must send events to WhatsMine so subscriptions stay in sync and renewals are recorded. Add these endpoint URLs in each gateway's dashboard:
| Gateway | Webhook URL |
|---|---|
| Stripe | https://your-domain.com/webhooks/stripe |
| PayPal | https://your-domain.com/webhooks/paypal |
| Paddle | https://your-domain.com/webhooks/paddle |
Then subscribe to the right events:
Stripecheckout.session.completed, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.paid, invoice.payment_succeeded, invoice.payment_failed
PayPalBILLING.SUBSCRIPTION.ACTIVATED, BILLING.SUBSCRIPTION.CANCELLED, BILLING.SUBSCRIPTION.SUSPENDED, PAYMENT.SALE.COMPLETED
Paddlesubscription.created, subscription.activated, subscription.updated, subscription.canceled, transaction.completed
A missing signing secret blocks all webhooks
In production, if the webhook signing secret isn't set, every incoming webhook is rejected — meaning renewals stop silently. Always store the signing secret after creating the endpoint.
Linking plans to prices
For Stripe and Paddle, each plan needs the matching price IDs from the gateway. Create the recurring prices in the gateway dashboard, then paste their IDs into the plan (stripe_monthly_id, paddle_monthly_id, etc.). Paddle checkout will not work without them.
Testing before launch
- Set the gateway to test/sandbox mode and save credentials.
- Run a test subscription through checkout on your pricing page.
- Confirm a transaction appears in Payments, the subscription is active, and the invoice downloads.
- (Stripe) Use a test clock to fast-forward a renewal and confirm the renewal is recorded and the email arrives.
- Switch to live mode.
➡️ Full step-by-step provider setup is in Payments Integration.