Adyen
Accept card and SEPA Direct Debit payments through Adyen using PaymentKit. PaymentKit handles PCI compliance and securely orchestrates every payment operation with Adyen — 3D Secure, network tokens, off-session subscription renewals, refunds, and SEPA (euro bank debit), including its mandate and asynchronous settlement flow.
Set up summary
To accept payments with Adyen in PaymentKit, you will need to:
- Request API PCI Payments role enablement from Adyen
- Generate Adyen API credentials
- Confirm your Adyen account uses immediate capture
- Connect Adyen to PaymentKit and turn on the payment methods you want
- Configure an Adyen standard webhook and add its HMAC signing key to PaymentKit (required for refunds and SEPA)
Request API PCI Payments role enablement
PaymentKit routes payments to Adyen, but Adyen will reject all card charges until the API PCI role is enabled on your account. This role is required if you or a Third-Party Service Provider (TPSP) handle raw, unencrypted card data. To allow PaymentKit to process your payments, submit a one-time activation request to Adyen’s Payment Risk Operations team (paymentriskoperations@adyen.com).
Here are all the docs you will need to share with Adyen when submitting your request:
- PaymentKit ASV Site Certification Attestation
- PaymentKit Compliance Certificate
- PaymentKit Self-Assessment Questionnaire (SAQ D-SP)
- VGS PCI DSS documentation
- PCI DSS document (SAQ A) — to be downloaded and completed by you before sending to Adyen
Submit a request to paymentriskoperations@adyen.com using the following message:
Hi,
We’d like to activate the API PCI Payments role on our account:
{{WS_username}}.PaymentKit serves as our PCI-compliant payment orchestrator and provides the required Self-Assessment Questionnaire (SAQ D) and On-Site Attestation of Compliance, which can be accessed at the following links:
- PaymentKit ASV Site Certification Attestation
- PaymentKit Compliance Certificate
- PaymentKit Self-Assessment Questionnaire (SAQ D-SP)
Raw card data is handled by our PCI DSS-compliant third-party service provider, Very Good Security (VGS), which vaults and tokenizes card data on our behalf. As a payment orchestrator, we route either VGS-provisioned network tokens or raw PANs depending on the flow; VGS handles the raw card data in both cases. VGS’s PCI DSS documentation can be found here.
We’ve also attached our completed PCI DSS self-assessment questionnaire (SAQ A) listing PaymentKit and VGS as TPSPs.
Replace {{WS_username}} with your Adyen web-service (API) username. You must also fill out the PCI DSS document (SAQ A) before you send it to Adyen with your request.
What Adyen supports in PaymentKit
PaymentKit supports the following with Adyen:
- Card payments — one-time and customer-initiated (CIT)
- Off-session / merchant-initiated payments (MIT) — including subscription renewals and dunning retries
- 3D Secure 2 (3DS2) — both the frictionless and challenge flows
- Network tokens
- Refunds — see Refunds below
- SEPA Direct Debit — euro bank debit; see How SEPA Direct Debit works below
The following is not currently supported:
- Manual capture / authorization holds (immediate capture only — see below)
- Partial capture
- Digital wallets (Apple Pay and Google Pay)
- Adyen local payment methods
- ACH direct debit
For non-euro bank debit or any of the methods above, use a different processor.
Generate API credentials in Adyen
PaymentKit requires an API key and your merchant account name to securely connect to your Adyen account.
- Log in to your Adyen Customer Area (use the test Customer Area for sandbox)
- Navigate to Developers → API credentials
- Select (or create) a web-service user, then generate an API key and copy it
- Note your merchant account name — shown in the Customer Area account switcher
For a production connection, Adyen assigns your account a unique live URL prefix. Find it in the Customer Area under Developers → API URLs. PaymentKit needs this prefix to reach your live Adyen endpoints — sandbox connections do not require it.
A cards-only connection needs only these values: API key, merchant account, and the environment (plus the live URL prefix in production). The webhook HMAC key described later is required for refund settlement and for SEPA.
Set your Adyen account to immediate capture
Your Adyen account — and the merchant account you connect — must be configured for immediate (instant) capture. This integration does not support manual or delayed capture.
With manual or delayed capture, PaymentKit’s charges are only authorized at Adyen and never captured. The payment appears successful, but any later refund will fail — Adyen returns “Transaction hasn’t been captured, refund not possible.”
In your Adyen Customer Area, set your capture delay / capture mode to immediate before you start accepting live payments.
Connect Adyen to PaymentKit
- Navigate to Orchestration → Payment processors
- Click the add (+) button, then choose Adyen from the Payment processor list
- Enter a Label for the connection, select the Environment (Sandbox or Production), and enter your API Key and Merchant account
- For a Production connection, also enter your Live URL prefix
- Turn on the payment methods you want to accept
SEPA Direct Debit cannot be enabled until you add the webhook HMAC signing key (next step). SEPA payments settle asynchronously, and PaymentKit can only confirm them from a signed Adyen webhook — without the signing key those outcomes could never be verified, so SEPA stays unavailable.
Configure the Adyen webhook and HMAC key
Set up a standard webhook in Adyen so PaymentKit can receive asynchronous notifications.
Card authorization and capture happen synchronously — cards work without a webhook configured. A webhook is required for refund settlement and for SEPA, both of which are asynchronous.
- In your Adyen Customer Area, navigate to Developers → Webhooks
- Click Add webhook and choose Standard webhook
- Under Server configuration, paste the webhook URL shown on your Adyen connection in PaymentKit. It is unique per connection and ends with your connection’s ID (a
proc_…value) — for examplehttps://<paymentkit-webhook-domain>/proc_prod_a1b2c3d4e5f6g7h8. Always copy the exact URL from the connect/edit form rather than typing it by hand - Enable the REFUND event so refund outcomes are delivered. If you accept SEPA, also enable the AUTHORISATION event — that is the notification that settles a SEPA charge
- Under Security, generate an HMAC Key and copy it (Adyen issues a hex key and signs each notification with HMAC-SHA256)
- Save the webhook, and make sure it is enabled
- Back in PaymentKit, edit your Adyen connection and paste the key into the Webhook HMAC key field
Enable HMAC signing on the webhook and use the same key in both places. PaymentKit verifies every incoming notification’s signature with this key and ignores any notification that does not match — so a missing or mismatched key means refund and SEPA outcomes never settle.
Keep the webhook enabled in Adyen for as long as you accept SEPA or process refunds. If it is disabled or misconfigured, Adyen stops delivering results — the affected refunds stay pending and SEPA payments stay processing indefinitely.
Refunds
Adyen refunds are asynchronous. When you issue a refund, PaymentKit sends it to Adyen and records it as pending; it resolves to succeeded only once Adyen confirms it with a REFUND webhook notification.
If you have not configured the webhook and its HMAC key, a refund still executes at Adyen, but PaymentKit has no way to learn the outcome — so the refund stays pending in PaymentKit indefinitely. Configure the webhook (above) before processing refunds.
How SEPA Direct Debit works
SEPA Direct Debit lets euro-zone customers pay directly from their bank account instead of using a card. It behaves differently from card payments, so it helps to set expectations for both you and your customers.
The webhook HMAC key is required to enable SEPA. Because SEPA settles asynchronously, PaymentKit will not offer or charge SEPA on a connection that has no HMAC key configured.
Request SEPA enablement
Before you can accept SEPA Direct Debit, Adyen must enable it on your merchant account. Adyen reviews each request, so complete this step ahead of when you plan to go live.
- Download and complete Adyen’s direct debit questionnaire: Adyen direct debit questionnaire.
- Email support@adyen.com with your completed questionnaire attached, using the request below.
Hi,
We’d like to enable SEPA for our account:
{{WS_username}}.We’ve attached our completed direct debit questionnaire.
Thank you.
Fill out the direct debit questionnaire and attach it before you send the request —
Adyen cannot enable SEPA without it. Replace {{WS_username}} with your Adyen
web-service (API) username (the web-service user from
Generate API credentials in Adyen).
Adyen typically responds within a few business days. Once SEPA is enabled on your account, turn it on for your Adyen connection in PaymentKit.
At checkout
- SEPA is offered only when the payment currency is EUR and your Adyen connection has SEPA enabled with a webhook configured.
- The customer enters their IBAN and account-holder name, and accepts a mandate — their standing authorization for you to debit the account, including future subscription renewals.
- The payment is submitted to Adyen, which normally accepts the debit instruction and returns a processing result — not a final “paid”. (A submission Adyen cannot accept — for example a malformed IBAN — is declined immediately at checkout instead.)
Settlement is asynchronous
Money physically moves through the banking system, so the final result arrives later — typically within a few minutes in test, and anywhere from minutes to a few business days in production. Until it does:
- The payment shows as processing, not paid.
- The related invoice stays open.
- A new subscription stays incomplete — it is not activated yet, and no confirmation email is sent.
When the bank result arrives via the Adyen webhook:
- Success → the payment and its invoice are both marked paid, any subscription activates, the stored mandate is saved for future renewals, and the success receipt is sent.
- Failure (for example insufficient funds or a closed account) → the payment is marked failed and your normal dunning / decline handling runs.
A processing SEPA payment is normal and expected — it does not mean anything went wrong. Unlike a card authorization that resolves instantly, bank debit is inherently asynchronous. Avoid granting access or shipping goods until the payment reaches paid.
SEPA refunds
SEPA refunds are asynchronous too. When you refund a settled SEPA payment, the refund is recorded as pending and resolves to succeeded — or failed if the bank rejects it — once Adyen confirms the outcome via webhook.
SEPA Direct Debit is EUR-only. A SEPA payment in any other currency is rejected before it reaches Adyen. Use a card processor for non-euro charges.