Checkout with iDEAL payments

    Use Checkout to accept iDEAL payments, a common payment method in the Netherlands.

    Stripe users in Europe and the United States can accept one-time iDEAL payments using Checkout.

    Customers pay with iDEAL by redirecting away from a Checkout Session to their bank, sending you payment, and then returning to Checkout.

    Follow these steps to modify your existing Checkout client & server integration to create a Checkout page that accepts cards and iDEAL for one-time payments:

    1. Enable iDEAL in the Stripe Dashboard
    2. Create a Checkout Session which accepts iDEAL payments
    3. Redirect to Checkout

    Step 1: Enable iDEAL in the Stripe Dashboard

    In order to accept iDEAL payments via Checkout, you must first enable iDEAL in the Stripe Dashboard and accept the iDEAL terms of service. Doing so requires an activated Stripe Account.

    Step 2: Create a Checkout Session which accepts iDEAL payments

    When creating a Checkout Session, you must specify which payment methods you wish to accept using the payment_method_types argument. Possible values for this argument are currently card and ideal.

    Checkout Sessions use line_items. to represent a list of items the customer is purchasing. Each line item must have a currency, and all line items in a given Session must share the same currency. Specify Euro (currency code eur) for all line items if you wish to accept iDEAL payments.

    The following example code demonstrates how to create a Checkout Session which accepts both card and ideal payments for a single item:

    curl https://api.stripe.com/v1/checkout/sessions \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d "payment_method_types[]"=card \
      -d "payment_method_types[]"=ideal \
      -d "line_items[][name]"=T-shirt \
      -d "line_items[][description]"="Comfortable cotton t-shirt" \
      -d "line_items[][images][]"="https://example.com/t-shirt.png" \
      -d "line_items[][amount]"=2000 \
      -d "line_items[][currency]"=eur \
      -d "line_items[][quantity]"=1 \
      -d success_url="https://example.com/success?session_id={CHECKOUT_SESSION_ID}" \
      -d cancel_url="https://example.com/cancel"
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    session = Stripe::Checkout::Session.create(
      payment_method_types: ['card', 'ideal'],
      line_items: [{
        name: 'T-shirt',
        description: 'Comfortable cotton t-shirt',
        images: ['https://example.com/t-shirt.png'],
        amount: 2000,
        currency: 'eur', # 'eur' is required in order to accept iDEAL
        quantity: 1,
      }],
      success_url: 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
      cancel_url: 'https://example.com/cancel',
    )
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    session = stripe.checkout.Session.create(
      payment_method_types=['card', 'ideal'],
      line_items=[{
        'name': 'T-shirt',
        'description': 'Comfortable cotton t-shirt',
        'images': ['https://example.com/t-shirt.png'],
        'amount': 2000,
        'currency': 'eur', # 'eur' is required in order to accept iDEAL
        'quantity': 1,
      }],
      success_url='https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
      cancel_url='https://example.com/cancel',
    )
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    $session = \Stripe\Checkout\Session::create([
      'payment_method_types' => ['card', 'ideal'],
      'line_items' => [[
        'name' => 'T-shirt',
        'description' => 'Comfortable cotton t-shirt',
        'images' => ['https://example.com/t-shirt.png'],
        'amount' => 2000,
        'currency' => 'eur', // 'eur' is required in order to accept iDEAL
        'quantity' => 1,
      ]],
      'success_url' => 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
      'cancel_url' => 'https://example.com/cancel',
    ]);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    Map<String, Object> params = new HashMap<String, Object>();
    
    ArrayList<String> paymentMethodTypes = new ArrayList<>();
    paymentMethodTypes.add("card");
    paymentMethodTypes.add("ideal");
    params.put("payment_method_types", paymentMethodTypes);
    
    ArrayList<HashMap<String, Object>> lineItems = new ArrayList<>();
    HashMap<String, Object> lineItem = new HashMap<String, Object>();
    lineItem.put("name", "T-shirt");
    lineItem.put("description", "Comfortable cotton t-shirt");
    lineItem.put("amount", 2000);
    lineItem.put("currency", "eur"); // "eur" is required in order to accept iDEAL
    lineItem.put("quantity", 1);
    lineItems.add(lineItem);
    params.put("line_items", lineItems);
    
    params.put("success_url", "https://example.com/success?session_id={CHECKOUT_SESSION_ID}");
    params.put("cancel_url", "https://example.com/cancel");
    
    Session session = Session.create(params);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    (async () => {
      const session = await stripe.checkout.sessions.create({
        payment_method_types: ['card', 'ideal'],
        line_items: [{
          name: 'T-shirt',
          description: 'Comfortable cotton t-shirt',
          images: ['https://example.com/t-shirt.png'],
          amount: 2000,
          currency: 'eur', // 'eur' is required in order to accept iDEAL
          quantity: 1,
        }],
        success_url: 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
        cancel_url: 'https://example.com/cancel',
      });
    })();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.CheckoutSessionParams{
        PaymentMethodTypes: stripe.StringSlice([]string{
            "card",
            "ideal",
        }),
        LineItems: []*stripe.CheckoutSessionLineItemParams{
            &stripe.CheckoutSessionLineItemParams{
                Name: stripe.String("T-shirt"),
                Description: stripe.String("Comfortable cotton t-shirt"),
                Amount: stripe.Int64(2000),
                Currency: stripe.String(stripe.CurrencyEUR), // stripe.CurrencyEUR is required in order to accept iDEAL
                Quantity: stripe.Int64(1),
            },
        },
        SuccessURL: stripe.String("https://example.com/success?session_id={CHECKOUT_SESSION_ID}"),
        CancelURL: stripe.String("https://example.com/cancel"),
    }
    
    session, err := session.New(params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new SessionCreateOptions {
        PaymentMethodTypes = new List<string> {
            "card",
            "ideal",
        },
        LineItems = new List<SessionLineItemOptions> {
            new SessionLineItemOptions {
                Name = "T-shirt",
                Description = "Comfortable cotton t-shirt",
                Amount = 2000,
                Currency = "eur", // "eur" is required in order to accept iDEAL
                Quantity = 1,
            },
        },
        SuccessUrl = "https://example.com/success?session_id={CHECKOUT_SESSION_ID}",
        CancelUrl = "https://example.com/cancel",
    };
    
    var service = new SessionService();
    Session session = service.Create(options);
    

    Step 3: Redirect to Checkout

    If you are modifying an existing Checkout integration to accept iDEAL payments, no changes are required to the code which runs on your website frontend. Simply call redirectToCheckout and provide the Checkout Session id as a parameter to begin the payment process.

    See one-time payments with Checkout for more details about this step.

    iDEAL-specific considerations

    Determining which payment methods to display

    Using the payment_method_types argument, it is possible to specify any combination of card and ideal for a given Checkout Session. Your application logic is responsible for determining which payment methods to make available. For example, you might choose only to display iDEAL for customers who are located in the Netherlands.

    Be careful when creating Checkout Sessions which only support iDEAL and not cards as customers without a compatible bank account will be unable to pay.

    Compatibility

    In order to support iDEAL payments, a Checkout Session must satisfy all of the following conditions:

    • Only one-time line items can be used (recurring subscription plans are not supported)
    • Prices for all line items must be expressed in Euro (currency code eur)

    Testing

    To test iDEAL in your testmode Checkout integration, enter any email address and name, and select any iDEAL bank from the menu. Clicking “Pay” will redirect you to a Stripe-hosted iDEAL test payment page where you can either authorize or fail the test payment.

    This is unlike cards, which require a specific Stripe test card number to test.

    Disputed payments

    iDEAL payments have a low risk of fraud or unrecognized payments because the customer must authenticate the payment with their bank. Therefore, there is no dispute process that can result in a chargeback and funds withdrawn from your Stripe account.

    Refunds

    iDEAL payments can be submitted for refunds within 180 days from the date of the original payment. After 180 days, refunding the payment is no longer possible.

    Next steps

    Congrats! You now have a complete Checkout integration for one-time payments with cards and iDEAL.

    Was this page helpful?

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.

    On this page