payment-gateway.app Docs
Getting Started

Provider Setup Guides

Step-by-step configuration for Stripe, Mollie, GoCardless, Wise, PayPal, and Wire Transfer.

Provider Setup Guides

Each payment provider requires specific credentials and webhook registration before it can process payments.

Stripe

Stripe is the recommended starting point — it supports cards (Visa, Mastercard, Amex) and can be enabled in test mode instantly.

1. Get Your Stripe API Keys

  1. Log in to dashboard.stripe.com.
  2. Navigate to Developers → API Keys.
  3. Copy your Publishable key (pk_live_... or pk_test_...).
  4. Click Reveal to copy your Secret key (sk_live_... or sk_test_...).

[!CAUTION] Never expose your Stripe Secret key in frontend code, mobile apps, or public repositories.

2. Register the Webhook Endpoint

Stripe must be told where to send payment event notifications. The URL must be on your Main Backend host (MAIN_BACKEND_DOMAIN — hosted: webhook.payment-gateway.app) — Hostnames & DNS conventions.

[!NOTE] For self-hosted stacks using branded webhook domains, keep this hostname stable and under your control. Many providers expect webhook and return/callback URLs to stay on approved domains. If that hostname is behind Cloudflare proxying, review the custom-domain Cloudflare caveat in Hostnames & DNS conventions.

  1. In Stripe Dashboard, go to Developers → Webhooks → Add endpoint.
  2. Set the Endpoint URL to:
    https://webhook.yourcompany.com/hooks/stripe/{providerId}
    (Hosted: https://webhook.payment-gateway.app/hooks/stripe/{providerId}.) The {providerId} is the MongoDB ObjectId of your provider record — visible in the Admin Panel URL after you create the provider.
  3. Set the webhook Event payload API version to 2026-03-25.dahlia or later. The gateway tolerates signed Stripe webhooks from other API versions, but matching the backend SDK version gives the safest object deserialization.
  4. Under Events to listen to, select only the events you need. At minimum, enable payment_intent.succeeded, payment_intent.payment_failed, charge.succeeded, charge.failed, charge.refunded, and charge.dispute.created.
  5. Click Add endpoint.
  6. Copy the Signing secret (whsec_...).

3. Add Provider in Admin Panel

  1. Navigate to Providers → Add Provider → Stripe.
  2. Fill in:
    • Secret Key: sk_live_...
    • Publishable Key: pk_live_...
    • Webhook Secret: whsec_...
  3. Save.

Provider management showing enabled Stripe, GoCardless, and wire transfer rails

Test Mode

Use sk_test_... / pk_test_... keys and Stripe test cards (e.g., 4242 4242 4242 4242, any future expiry, any CVC). See Testing Guide.


Mollie

Mollie supports hosted checkout and local payment methods through Mollie payment links and provider webhooks.

1. Get Your Mollie API Keys

  1. Log in to my.mollie.com.
  2. Open Developers -> API keys.
  3. Copy the test or live API key for the profile you want to connect.
  4. If you enable card components, also copy the Mollie Profile ID.

2. Register the Webhook Endpoint

Use your Main Backend host (MAIN_BACKEND_DOMAIN - hosted: webhook.payment-gateway.app):

https://webhook.yourcompany.com/hooks/mollie/{providerId}

Choose one callback mode deliberately:

  • Classic payment-ID callback: configure the URL for the payment. Mollie sends a payment ID, and the gateway fetches the canonical payment with the API key for the selected Test or Live mode. A signing secret is not required for this classic form-encoded callback.
  • Next-generation event webhook: in Developers → WebHooks, create one webhook for each Test or Live mode you use, select Snapshot payloads, and copy that webhook's signing secret. Store the secret in the provider's Webhook Signing Secret field for the same mode. The gateway verifies X-Mollie-Signature with HMAC-SHA256 before it fetches and validates the referenced records.

For a next-generation webhook, subscribe only to the event families handled by the gateway:

  • Payments API: payment.authorized, payment.canceled, payment.expired, payment.failed, payment.paid, payment.pending
  • Refunds API: refund.queued, refund.pending, refund.processing, refund.refunded, refund.failed, refund.canceled
  • Chargebacks API: chargeback.received, chargeback.reversed (these events may require Mollie to enable beta access for your account)

See Mollie's create-webhook reference, refund webhook event list, and next-generation webhook signing guide.

3. Add Provider in Admin Panel

  1. Navigate to Providers -> Add Provider -> Mollie.
  2. Fill in the API key for the selected mode.
  3. For next-generation events, fill in the mode-matched Webhook Signing Secret.
  4. Optionally enable card components and set the Profile ID.
  5. Save, reopen the provider, and confirm the selected mode, masked API key, and masked signing secret before enabling callbacks.

GoCardless

GoCardless handles direct debit / bank mandates. Customers authorize recurring debits from their bank account.

1. Get Your GoCardless API Keys

  1. Log in to manage.gocardless.com.
  2. Navigate to Developers → API Keys → Create.
  3. Copy the Access Token.

[!NOTE] GoCardless has separate sandbox and live environments with different base URLs. Use the sandbox (api-sandbox.gocardless.com) for testing.

2. Register the Webhook Endpoint

Use your Main Backend host (MAIN_BACKEND_DOMAIN — hosted: webhook.payment-gateway.app) — Hostnames & DNS conventions.

[!NOTE] For self-hosted stacks using branded webhook domains, keep this hostname stable and under your control. If you proxy it through Cloudflare, review the custom-domain Cloudflare caveat in Hostnames & DNS conventions before onboarding merchant custom domains.

  1. In GoCardless Dashboard, go to Developers → Webhooks → Create Webhook.
  2. Set the URL to:
    https://webhook.yourcompany.com/hooks/gocardless/{providerId}
    (Hosted: https://webhook.payment-gateway.app/hooks/gocardless/{providerId}.)
  3. Generate and copy the Webhook Secret.

3. Add Provider in Admin Panel

  1. Navigate to Providers → Add Provider → GoCardless.
  2. Fill in:
    • Access Token: your GoCardless token
    • Webhook Secret: your webhook signing secret
    • Environment: sandbox or live
  3. Save.

Direct Debit Flow Difference

Unlike card payments, GoCardless uses a redirect mandate flow:

  1. Customer clicks Pay on checkout → redirected to GoCardless mandate authorization page.
  2. Customer authorizes the debit mandate at their bank.
  3. GoCardless redirects back to the gateway.
  4. The gateway creates a pending_provider transaction; payment is captured asynchronously (usually within 1–5 business days).
  5. GoCardless sends a webhook when payment clears → transaction moves to succeeded.

[!IMPORTANT] GoCardless payments are not instant. Design your fulfillment logic to handle pending_provider state and wait for the succeeded webhook before delivering goods/services.


Wise (Wire Transfers)

Wise (formerly TransferWise) enables international wire transfers with competitive FX rates.

1. Get Your Wise API Token

  1. Log in to wise.com/user/account.
  2. Navigate to Account Settings → API Tokens → Add new token.
  3. Grant Read and Write permissions.
  4. Copy the token.

2. Get Your Wise Profile ID

In the Wise API, operations are scoped to a Profile ID (your business profile):

curl https://api.wise.com/v1/profiles \
  -H "Authorization: Bearer YOUR_WISE_TOKEN"

Note the id of your business profile.

3. Add Provider in Admin Panel

  1. Navigate to Providers → Add Provider → Wise.
  2. Fill in:
    • API Token: your Wise token
    • Profile ID: your business profile ID
  3. Save.

PayPal

PayPal supports PayPal checkout and wallet-style payments, with optional advanced card fields where enabled.

1. Get Your PayPal App Credentials

  1. Log in to developer.paypal.com.
  2. Create or open an app in Apps & Credentials.
  3. Copy the Client ID and Client Secret for sandbox or live mode.

2. Register the Webhook Endpoint

Use your Main Backend host (MAIN_BACKEND_DOMAIN - hosted: webhook.payment-gateway.app):

https://webhook.yourcompany.com/hooks/paypal/{providerId}

Copy the PayPal Webhook ID and store it on the provider record. The gateway uses it to verify PayPal webhook signatures before processing order or payment events.

3. Add Provider in Admin Panel

  1. Navigate to Providers -> Add Provider -> PayPal.
  2. Fill in:
    • Client ID
    • Client Secret
    • Webhook ID
    • Mode: sandbox or live
  3. If advanced card fields are enabled, set the supported currency code.
  4. Save.

The selected mode determines the canonical PayPal API endpoint. Do not configure or persist an apiBaseUrl override. For an older deployment, use this bounded migration:

  1. Back up MongoDB and test restoration before the maintenance window. Inventory every affected provider by organization, provider ID, label, receipt account identity, current enabled state, explicit mode, and whether apiBaseUrl is present. Record presence only; never export endpoint values, masked or unmasked credentials, webhook IDs, configuration dumps, .env files, or customer data.
  2. Prevent new PayPal checkout attempts during the change while keeping accepted payment and webhook records intact. In Providers → Edit, open each inventoried PayPal provider. The migration notice appears when the legacy key is present.
  3. Confirm the provider belongs to Sandbox or Live, select that mode explicitly, leave masked Client ID and Client Secret values unchanged, and verify the immutable receiving account identity, Webhook ID, enabled state, domain assignments, and unrelated settings. Select Save Changes. This supported save removes only apiBaseUrl; repeating the save is safe.
  4. Reopen the same provider and read it back. Confirm the migration notice is gone, the chosen mode is still shown, credentials remain masked, the receipt account identity and other settings match the inventory, and the provider remains assigned as intended. Verify the matching PayPal app and webhook are in the same Sandbox or Live environment before resuming callbacks. Use sandbox test traffic for Sandbox; do not create a live charge solely for migration verification.

Rollback the application separately from payment data. Do not restore apiBaseUrl, delete accepted events, clear operations, or restore a database snapshot over newer payment or callback records. If the wrong canonical mode was selected, return to maintenance, choose the correct mode, save again, read it back, and repeat the environment and webhook checks. Production has no custom endpoint fallback.


Wire Transfer (Manual)

Wire Transfer is a manual-confirmation provider — the gateway generates payment instructions and marks transactions as paid when you manually confirm receipt.

Configuration

No external account or API key is required. When creating a Wire Transfer provider:

  1. Navigate to Providers → Add Provider → Wire Transfer.
  2. Enter your bank account details:
    • Bank Name
    • Account Holder Name
    • IBAN (or local account number)
    • BIC/SWIFT
    • Reference Instructions (how customers should label the transfer)
  3. Save.

Payment Flow

  1. Customer selects Wire Transfer at checkout → sees bank details and reference.
  2. Customer initiates transfer from their bank.
  3. You monitor your bank account for incoming transfers.
  4. In the Admin Panel, navigate to the transaction and mark it as Paid manually.

[!NOTE] Wire transfers typically settle in 1–5 business days. The transaction stays in pending_provider state until you manually mark it as paid.

On this page