Recurring

PPRO supports recurring payments for iDEAL through SEPA Direct Debit. You can offer iDEAL recurring payments easily with our payment agreements API.

📘

Note

When offering iDEAL at checkout for a recurring product, it is essential to secure explicit approval (a mandate) from the consumer to debit their account on a recurring basis via SEPA Direct Debit. Given the inherent chargeback risk associated with SEPA Direct Debits, transparency with the consumer is key to mitigating this risk.

Create the payment agreement

To create an iDEAL payment agreement, provide the following information when calling our payment agreements API:

Data FieldRequiredDescription
Authentication MethodREDIRECT
paymentMethodMIDEAL
consumer.nameMFull name of the consumer.
consumer.countryMThe country from which the consumer is shopping.
instrument: BANK_ACCOUNT
details.debitMandateId
MWhen a consumer chooses iDEAL for recurring payments and agrees to a direct debit mandate, generate a mandate ID and store it. Provide this ID when creating the payment agreement with PPRO.
authenticationSettings: REDIRECT
settings.returnUrl
MAdd the url where the consumer should be redirected to after they complete the payment. Required for the REDIRECT payment flow.
instrument: BANK_ACCOUNT
details.bankCode
OProviding the bankCode will bypass the bank selection. Optional and must meet the conditions listed above.

You can also include the initialPaymentCharge object in this agreement creation call to immediately initiate the first payment without making a separate call. If you include this object, you'll need to specify:

  • The exact amount.value and amount.currency of the first payment

If you don't include an initialPaymentCharge when creating the agreement, a €0.01 verification payment will be made and immediately refunded to validate the bank account. You'll need to make a separate API call to /v1/payment-agreements/{agreement_id}/payment-charges to create the first charge.

Request

POST /v1/payment-agreements

{
  "paymentMethod": "IDEAL",
  "consumer": {
    "name": "John Smith",
    "country": "NL"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "debitMandateId": "YOUR_GENERATED_MANDATEID"
    }
  },
  "authenticationSettings": [
    {
      "type": "REDIRECT",
      "settings": {
        "returnUrl": "https://www.webshop.com/order-results-page"
      }
    }
  ]
}
{
  "paymentMethod": "IDEAL",
  "consumer": {
    "name": "John Smith",
    "country": "NL"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "debitMandateId": "YOUR_GENERATED_MANDATEID"
    }
  },
  "authenticationSettings": [
    {
      "type": "REDIRECT",
      "settings": {
        "returnUrl": "https://www.webshop.com/order-results-page"
      }
    }
  ],
  "initialPaymentCharge": {
    "amount": {
      "value": 1000,
      "currency": "EUR"
    }
  }
}

Response

You'll receive our standard payment agreement response (see responses in the API Reference)

❗️

Note

Although no initial payment charge is submitted in the request, a €0.01 verification payment is authorized and immediately refunded to verify the agreement.

{
  "id": "agr_z3RcfOXROR7nmy3WlJI94",
  "status": "AUTHENTICATION_PENDING",
  "paymentMethod": "IDEAL",
  "startDate": "2025-04-15T17:11:59.354Z",
  "instrumentId": "instr_eU80TTzNzRPj7XfHwO3Q3",
  "consumer": {
    "name": "John Smith",
    "country": "NL"
  },
  "authenticationMethods": [
    {
      "details": {
        "requestUrl": "https://redirection-target.ppro.com",
        "requestMethod": "GET"
      },
      "type": "REDIRECT"
    }
  ],
  "history": [
    {
      "id": "ahist_lqBDnAWmqpluqCDo3MJi8",
      "status": "AUTHENTICATION_PENDING",
      "createdAt": "2025-04-15T17:12:00.019Z"
    }
  ],
  "initialPaymentChargeId": "charge_AoLMTgQe2AmGDq3ePPnav",
  "createdAt": "2025-04-15T17:12:00.019Z",
  "updatedAt": "2025-04-15T17:12:00.019Z"
}
{
  "id": "agr_rTOfYUHHaxfuEYQrCDc0L",
  "status": "AUTHENTICATION_PENDING",
  "paymentMethod": "IDEAL",
  "startDate": "2025-04-14T12:25:04.274Z",
  "instrumentId": "instr_UJ5dpTkpNZxL7kPgRSM7v",
  "consumer": {
    "name": "John Smith",
    "country": "NL"
  },
  "authenticationMethods": [
    {
      "details": {
        "requestUrl": "https://redirection-target.ppro.com",
        "requestMethod": "GET"
      },
      "type": "REDIRECT"
    }
  ],
  "history": [
    {
      "id": "ahist_pz7KWLQ993LgjaK5GzYNI",
      "status": "AUTHENTICATION_PENDING",
      "createdAt": "2025-04-14T12:25:04.712Z"
    }
  ],
  "initialPaymentChargeId": "charge_58Uoysih1v5uPAJhEoWpc",
  "createdAt": "2025-04-14T12:25:04.712Z",
  "updatedAt": "2025-04-14T12:25:04.712Z"
}

Pick the desired authentication method

REDIRECT

Redirect your consumer to the returned $.authenticationMethods[?(@.type == "REDIRECT")].details.requestUrl For example, with the value of https://redirection-target.ppro.com/ using the returned $.authenticationMethods[?(@.type == "REDIRECT")].details.requestMethod HTTP method.


Handling the result

REDIRECT

  1. After the consumer completes the authentication, they are redirected to the returnUrl specified in the payment charge creation request.
  2. Upon redirect back to your site, retrieve the latest agreement status by performing a GET /v1/payment-agreements/{agreementId}. Use the returned status field to determine and display the final payment outcome to the consumer.
  3. Additionally, webhooks are triggered to notify you of the payment result. This ensures you receive the outcome even if the consumer closes their browser or fails to return to your website.

Create a recurring payment

To initiate a subsequent recurring payment, send a request against an active agreement /v1/payment-agreements/{agreement-id}/payment-charges

Request

POST /v1/payment-agreements/{agreement-id}/payment-charges

{
  "amount": {
    "value": 1100,
    "currency": "EUR"
  }
}

Response

{
  "id": "charge_fmUbxp5wZi1zZj4mUDn4S",
  "paymentMethod": "SEPA_DIRECT_DEBIT",
  "currency": "EUR",
  "country": "NL",
  "instrumentId": "instr_UJ5dpTkpNZxL7kPgRSM7v",
  "status": "AUTHORIZATION_ASYNC",
  "consumer": {
    "name": "John Smith",
    "country": "NL"
  },
  "authorizations": [
    {
      "id": "authz_5WhS0eutxeiOHHLbAP7ad",
      "amount": 1100,
      "status": "AUTHORIZATION_ASYNC",
      "createdAt": "2025-04-14T12:30:56.522Z",
      "updatedAt": "2025-04-14T12:30:56.522Z"
    }
  ],
  "captures": [],
  "refunds": [],
  "voids": [],
  "createdAt": "2025-04-14T12:30:55.957Z",
  "updatedAt": "2025-04-14T12:30:56.522Z"
}
❗️

Since subsequent recurring charges are processed via SEPA Direct Debit, they are inherently susceptible to chargebacks, as outlined here



Did this page help you?