Build checkout form with Klarna WebSDK (Worldpay orchestrated)
Integrate Klarna’s Web SDK and let Worldpay orchestrate the Klarna authorization. Initialize the SDK, present Klarna in the payment selector, and forward the `klarna_network_session_token` to Worldpay to complete the flow.
In this flow, Worldpay orchestrates the Klarna authorization and subscribes to the payment.request.state-change.completed webhook on your behalf. You don't need to register webhooks with Klarna or call Klarna's Payment Request API directly.
Presenting Klarna in the payment form involves retrieving the visual assets, localized text, and display instructions required to correctly render Klarna as a payment option and display the payment button. This dynamic presentation ensures a consistent customer experience, accurate localization, and optimized conversion performance, while adapting seamlessly to different checkout states.
On a high level, the process involves:
1.
Initialize Klarna Web SDK in your checkout experience.
2.
Request Klarna’s payment presentation for the current payment context.
3.
Render Klarna payment option(s) dynamically in the payment form according to the instructions.
4.
Allow the customer to select and deselect a Klarna payment option.
5.
Display the Klarna button and start the payment process when clicked.
The expected outcomes are as follows:
Initial presentation
When Klarna is selected
Klarna's payment presentation best practice
To ensure the best user experience and optimal conversion rates when presenting Klarna as a payment option, please apply the following recommendations:
Display Klarna descriptor dynamically alongside other payment options in your payment form.
Embed Klarna’s UI elements directly in your frontend for a consistent and responsive design.
The next sections in this guideline will walk through how this can be achieved using Klarna Web SDK.
The Klarna Web SDK (klarna.mjs) follows the JavaScript module approach and should be included in places where you need to have a reference to the SDK such as while rendering any components or initiating a payment flow. Here are the initialization parameters:
Parameter
Presence
Description
clientId
required
A credential used to identify the Partner, which can be obtained from the Klarna Partner Portal. To ensure the credential functions properly, make sure to register all domains where the Web SDK will be used.
products
optional
An array used to specify which products should be loaded to optimize performance by limiting the amount of data downloaded. If the PAYMENT product is included, only the Klarna.Payment package will be loaded. If the products array is omitted, all available packages will be loaded by default.
locale
optional
Language and region code (e.g., en-US). If omitted, Klarna may default based on the customer’s browser settings.
For the full API specifications, refer to Klarna Web SDK.
SDK initialization sample
Klarna payment presentation provides all the visual assets, localized texts, and instructions needed to correctly display Klarna in your checkout form.
Basic checkout context parameters must be provided:
Parameter
Presence
Description
amount
conditional
The transaction amount in minor units following ISO 4217 exponents (e.g., $118.00 = 11800, ¥1400 = 1400). This field is required if any of the intents include PAY, SUBSCRIBE, or DONATE; otherwise, it is optional.
currency
required
Three-letter ISO 4217 currency code (e.g., USD, EUR).
locale
optional
Locale code to localize texts and formats (e.g., en-US, de-DE). If you don’t set this, it will automatically use the value chosen when you first set up the Web SDK. If that’s not available, it will use your browser’s settings instead.
intents
optional
Specify the intent of the checkout flow: PAY, SUBSCRIBE, SIGNUP, SIGNIN, DONATE, ADD_TO_WALLET. If omitted, intents defaults to ["PAY"].
For the full API specifications, refer to Klarna Web SDK.
Performance optimization
It is important to ensure that Klarna is displayed at roughly the same time as other payment methods, with an acceptable delay of less than 100 ms. To achieve this, begin initializing the Klarna Web SDK and invoke the payment presentation method concurrently while loading the list of all enabled payment methods from your server.
The PaymentPresentation interface provides the full Klarna branding package and instructions tailored to the customer's purchase:
Attribute
Presence
Purpose
instruction
required
Specifies how Klarna as a payment option(s) should be displayed (e.g., whether to show, preselect, or display as show-only). Adhering to these payment presentation instructions ensures customers have the best possible experience and optimizes conversion rates.
paymentOption
optional
Defines the default payment option applicable to all purchase types. This object includes the visual elements required to represent Klarna during checkout.
The paymentOption object structure is as follows:
Attribute
Presence
Purpose
paymentOptionId
required
The identifier of the payment option. The value is required to be sent to the Payment Authorize API or the Payment Request API when initiating the payment.
icon
required
Klarna badge/logo suitable for checkout forms.
header
required
The main descriptor that introduces Klarna in the payment form. The value will be dynamically adjusted based on the locale provided.
subheader
required
The descriptor subheader which must be loaded inline below the main descriptor header. Short and enriched descriptive texts. Provides transparency on available options like installments, pay later, etc.
message
optional
Enriched tailored description with link.
badge
optional
Badge used for saved options or promotions.
terms
optional
Defines terms/disclosures potentially with links.
paymentButton
required
Payment button that starts the Klarna Purchase Journey.
For the full API specifications, refer to Klarna Web SDK.
This section describes how to apply Klarna’s payment presentation instructions, which define how Klarna should appear in your checkout. Following these instructions ensures a consistent experience across payment states and is required for features like Klarna Express Checkout and Sign in with Klarna.
The instruction attribute has the following values:
Instruction
Description
SHOW_KLARNA
Show Klarna alongside other payment methods.
PRESELECT_KLARNA
Show Klarna pre-selected but still alongside others. This is returned when using the customer_token issued from the Sign in with Klarna feature or the tokenization flow.
SHOW_ONLY_KLARNA
Show Klarna as the only payment method. This is returned when the customer has finished the first step of Klarna Express Checkout multistep.
For the full API specifications, refer to Klarna Web SDK.
Skip this section if you don't use any Conversion Boost features from Klarna such as Klarna Express Checkout, Sign-in with Klarna, Klarna Messaging or Klarna Prequalification.
Here are example outcomes illustrating how Klarna should be displayed for each instruction:
Show Klarna
Preselect Klarna
Show only Klarna
The presentation instructions are derived from possible customer purchase journeys described in the How to present Klarna article.
Sample code:
Once an instance of PaymentPresentation is created, the Klarna payment option(s) must be rendered dynamically in the payment selector according to Klarna’s presentation guidelines. The following diagram displays different visual components and how they are rendered in different selection states:
1.
Icon
2.
Badge
3.
Header
4.
Subheader
5.
Message
6.
Terms
7.
Button
Mount the Klarna payment option components within your designated Klarna payment method container to render them dynamically in the payment form. Ensure that all components—including those not immediately visible—are mounted during initialization, and manage their visibility through your own logic or UI controls.
When a Klarna payment option is selected/deselected, ensure the additional visual components are shown/hidden properly.
JS
1
2
3
4
5
6
7
8
9
10
/**
* Toggle the Klarna payment option selected state.
* Use for both SDK preselection (PRESELECT_KLARNA) and user interactions.
*/functiontoggleKlarnaPaymentOptionSelection(containerId, isSelected) {
const container = qs(`#${containerId}`);
if (!container) {
console.error(`Missing container #${containerId}.`);
return;
}
The payment presentation instance allows you to mount the prebuilt button component. The Klarna Payment Button is context-aware and dynamically adapts to your configuration.
[ Klarna payment button variants]
Choose the theme and shape of the payment button to best fit into your online store in a way that complements your brand and encourages user engagement. More details on the button styling can be found here.
[ Configure Klarna payment button]
The paymentButton.component() can be configured with the following set of parameters:
Parameter
Description
id
Sets a custom DOM ID on the rendered button. Useful for testing or styling.
shape
Defines the button’s shape. Possible values are:default, pill, rect
theme
Sets the visual theme of the button. Possible values are: default, light, dark, outlined
locale
Sets the language and region (e.g., en-US). If you don’t set this, it will automatically use the value chosen when you first set up the Web SDK. If that’s not available, it will use your browser’s settings instead.
disabled
Disables the button when set to true. Useful during form validation or async operations.
loading
Forces the button into a loading state. Useful when awaiting async setup or validation.
intents
Sets the purpose of the payment. Used to personalize the button and flow if not set when creating the PaymentPresentation instance.
initiate
Function that returns a Promise resolving to either a PaymentRequestData, a paymentRequestUrl, or a returnUrl. This will be handled differently depending on the integration path.
initiationMode
Defines how Klarna launches the Klarna Purchase Journey.
For the full API specifications, refer to Klarna Web SDK.
In this flow, you don’t call Klarna’s Payment Request API directly. Instead, the initiate callback receives a klarnaNetworkSessionToken from the Klarna Web SDK. You forward this token to Worldpay together with the purchase details, and Worldpay performs the authorization with Klarna on your behalf.
The callback must return one of the following to the Web SDK:
Return value
When to return it
undefined or an empty object
Worldpay confirms the payment was approved without step-up. The Web SDK completes without launching a Klarna Purchase Journey.
{ paymentRequestUrl }
Worldpay indicates that customer authentication is required (STEP_UP_REQUIRED) and returns a payment_request_url. The Web SDK launches the Klarna Purchase Journey with this URL.
A klarna_network_session_token is valid for 1 hour. Forward it to Worldpay as soon as you receive it.
Your server endpoint forwards the klarna_network_session_token to Worldpay. Worldpay then calls Klarna’s Payment Authorize API and returns either an approval or a STEP_UP_REQUIRED response containing a payment_request_id.
JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
// Server.js// Simplified backend example: forward the Klarna token to [acquiring-partner]const axios = require('axios');
constACQUIRING_PARTNER_API_KEY = 'YOUR_API_KEY';
constACQUIRING_PARTNER_BASE_URL = 'https://api.acquiring-partner.com';
asyncfunctioncreatePaymentSession({ klarnaNetworkSessionToken, paymentOptionId, order }) {
const url = `${ACQUIRING_PARTNER_BASE_URL}/payment`;
For the full request/response schema, consult Worldpay’s API reference.
Create a new payment session on every button click instead of reusing tokens.
If Worldpay returns STEP_UP_REQUIRED with a payment_request_url, return { paymentRequestUrl } from the initiate callback. The Klarna Web SDK launches the Klarna Purchase Journey, the customer completes the authentication, and Worldpay notifies you of the final result.
You don’t need to subscribe to Klarna webhooks or monitor the Klarna payment request lifecycle yourself — Worldpay handles these on your behalf.
The final order-completed notification is delivered by Worldpay according to their own callback/webhook contract. Use it as the signal to redirect the customer to your confirmation page.
Once the payment is authorized — either directly or after a successful step-up — Worldpay notifies you that the order is completed. Display the confirmation page to the customer based on Worldpay’s notification.
In rare cases where there’s a discrepancy between the amount and purchase details submitted by the Klarna Web SDK and the information submitted to Worldpay, the authorization may be rejected and the customer asked to approve the purchase again through the step-up journey.