Last updated

Qliro Checkout Adapter

Overview Document: Payment Adapters Overview

Overview and Unique Capabilities

The Qliro Checkout Adapter integrates Qliro Checkout with Norce Checkout. Changes made in Norce Checkout are synced with Qliro Checkout and vice versa. This page focuses on the unique technical details and configuration for Qliro.

Supported payment methods and other features: Features Overview

Qliro Adapter Architecture

Configuration in Norce Admin

The adapter is configured using the following unique details obtained from Qliro:

FieldDescriptionExample Value
apiUrlQliro API URL (test or production).https://pago.qit.nu
merchantApiKeyYour Qliro merchant API key.abc123
merchantApiSecretYour Qliro merchant API secret.xyz789

Optional Configuration

FieldDescriptionExample Value
recurringEnable recurring payment tokens.true
useIntegratedShippingEnable integrated shipping in Qliro.true
useUpsellEnable upsell offers after checkout completion. Must also be enabled in your Qliro account.true
upsellTimeoutSecondsMaximum time window (seconds) for upsell offers. Default: 300.300
loyaltyConfigurationEnables the Qliro Loyalty Sign-up feature for Voyado or Klaviyo. See Qliro Loyalty Sign-up.object
primaryColorHex color for primary UI elements.#FF5733
backgroundColorHex color for background.#FFFFFF
callToActionColorHex color for call-to-action buttons.#00AA00
callToActionHoverColorHex color for call-to-action buttons on hover.#008800
cornerRadiusCorner radius for UI elements (pixels).4
buttonCornerRadiusCorner radius for buttons (pixels).4
minimumCustomerAgeMinimum customer age requirement. When set, this also prevents the customer from authenticating as a company in Qliro. Leave unset or set to 0 to allow B2B/company checkout.18
requireIdentityVerificationRequire BankID for Swedish customers.true
merchantConstraintNameEnables dynamic filtering of payment channels.my-constraint

Reference Source Configuration

FieldDescriptionExample Value
merchantReferenceSourceSource for merchant reference: OrderId or OrderCartReference.OrderId
mapDiscountPerRowWhen true, discounts are embedded in item prices. When false, separate discount line items.false
useSkuAsIdentifierWhen true, uses SKU as item reference. When false, uses item ID.false
shippingReferenceSourceSource for shipping reference: ShippingId or CustomValue.ShippingId
customShippingReferenceCustom shipping reference value (when using CustomValue).shipping-ref
voucherReferenceSourceSource for voucher reference: VoucherId or CustomValue.VoucherId
customVoucherReferenceCustom voucher reference value (when using CustomValue).voucher-ref

Redirect URLs Configuration

FieldDescription
redirectUrls.checkoutUrlURL to redirect back to checkout page.
redirectUrls.confirmationUrlURL to redirect after successful payment.
redirectUrls.merchantTermsUrlURL to merchant terms and conditions.
redirectUrls.merchantIntegrityPolicyUrlURL to merchant privacy/integrity policy.
FieldDescription
consentOptions.emailNewsletterSubscriptionConsentIdConsent ID for email newsletter subscription.

Shipping Configuration

FieldDescription
shippingConfiguration.providerMerchantProvided, NShift, or Ingrid
shippingConfiguration.unifaunCheckoutIdnShift checkout ID (when using NShift)

Qliro API Environments

In addition to the generic Norce Adapter URLs (see Payment Adapters Overview), Qliro uses the following external API environments:

EnvironmentQliro API Base URL
Productionhttps://payments.qit.nu
Testhttps://pago.qit.nu

Create Payment

To get a Qliro Checkout HTML snippet, create a Qliro Checkout payment for an existing Norce order:

POST /api/checkout/v1/orders/{order_id}/payments
Host: {slug}.api-se.stage.norce.tech
x-merchant: {merchant}
x-channel: {channel}
Authorization: Bearer {token}

The response includes an HTML snippet containing a script tag that should be rendered on your checkout page. The script tag will load an iframe which guides the customer through the Qliro Checkout UI.

Example response:

{
  "paymentId": "pyTWfWFQDxIwodoImZHAfSsZvON",
  "htmlSnippet": "<script type=\"text/javascript\">...</script><div id=\"qliro-root\"></div>"
}

The adapter also updates your Norce order with the Qliro payment details. The payments[].id property represents the paymentId from the response, and payments[].reference contains the Qliro order ID.

Confirmation Page

When the payment has been confirmed, Qliro redirects the user to the confirmationUrl. You must also include the Qliro Checkout iframe on your confirmation page, as it shows important purchase details to the customer.

To display the confirmation page, retrieve the Qliro Checkout order and render the snippet:

GET /api/checkout/v1/orders/{order_id}/payments/{payment_id}
Host: {slug}.api-se.stage.norce.tech
x-merchant: {merchant}
x-channel: {channel}
Authorization: Bearer {token}

When the Qliro Checkout order is in the state of PurchaseCompleted, it will show a "thank you" page instead of the default purchase flow.

Creating a Recurring Payment

To create an order using a previously stored recurring token:

POST /api/checkout/v1/orders/{order_id}/payments/recurring
Host: {slug}.api-se.stage.norce.tech
x-merchant: {merchant}
x-channel: {channel}
Authorization: Bearer {token}
Content-Type: application/json

{
  "token": "3d2092a6-7baf-49e3-bd34-d0d0d85744b5"
}

The token is retrieved from a previous order where the customer completed a purchase with recurring payments enabled. To use recurring payments, merchants must activate this feature on both their Qliro merchant account (by contacting Qliro support) and in the Norce Qliro configuration by setting recurring: true.

Upsell

The upsell feature allows merchants to offer additional products to customers after they have completed their initial purchase. This is useful for subscription services, accessories, or related products.

To enable upsell:

  1. Enable useUpsell in the adapter configuration
  2. Ensure upsell is also enabled in your Qliro merchant account (contact Qliro support)
  3. Configure upsellTimeoutSeconds to set the maximum time window for upsell offers (default: 300 seconds)

When an order is in the Accepted state and upsell is enabled, you can add items to the order. The adapter will call Qliro's upsell API to add the items to the existing payment. Once the upsell period expires or you explicitly complete the upsell, call the complete endpoint:

POST /api/checkout/v1/callback/orders/{order_id}/payments/{payment_id}/upsell/complete
Host: {slug}.api-se.stage.norce.tech
x-merchant: {merchant}
x-channel: {channel}
Authorization: Bearer {token}

This endpoint requires no request body. A successful response returns 200 OK with no content.

Qliro Loyalty Sign-up

The Qliro Checkout Adapter supports Qliro's Loyalty Sign-up feature, which allows customers to enroll in a merchant's loyalty program directly inside the Qliro Checkout iframe. The adapter forwards a loyaltyConfiguration block to Qliro when the order is created, and Qliro renders the sign-up UI for the supported provider:

  • Voyado Engage — creates a contact (or updates an existing member) in Voyado.
  • Klaviyo — creates or updates a profile in Klaviyo and adds it to one or more lists.

For a full description of the customer-facing flow, see Qliro's Loyalty Sign-up documentation.

Prerequisites for Qliro Loyalty Sign-up

Before configuring loyaltyConfiguration in the Qliro Checkout Adapter, ensure all of the following are in place:

  1. Qliro has activated the loyalty integration on your merchant account. Contact Qliro merchant solutions and provide:
    • An SVG logo for the loyalty provider, displayed in the sign-up component.
    • A provider API key (Voyado API key or Klaviyo private API key with Profile, List, and Subscription full-access permissions).
  2. The loyalty provider is fully configured.
    • Voyado: the contact type and any consent IDs referenced in the configuration must already exist in your Voyado tenant.
    • Klaviyo: every list referenced by name in klaviyo.lists must already exist in your Klaviyo account, and the email or SMS subscription channels you enable must be configured (sending domain verified, default sender set).
  3. The customer's email address is available in the Qliro Checkout iframe. Qliro looks up the customer in the loyalty provider by email. If the email is not pre-filled by the merchant in customerInformation.email, the customer must enter it in the iframe before Qliro can render the loyalty sign-up modal.

Qliro Loyalty Configuration

The loyaltyConfiguration object is part of the qliro_checkout_adapter configuration. The adapter includes it in the Qliro order-creation request. Provide either a voyado block or a klaviyo block — not both.

Top-level fields

FieldDescription
askForSignupCheckedWhether the loyalty sign-up checkbox is pre-checked in the checkout.
merchantLoyaltyTermsUrlURL to the merchant's loyalty program terms and conditions.
merchantLoyaltyIntegrityPolicyUrlURL to the merchant's loyalty program privacy/integrity policy.
mainTextPrimary text shown in the loyalty sign-up section. Object with title and description.
secondaryTextsOptional array of additional text blocks (title, description) shown alongside mainText.
updateTextObject with title and description shown to existing members when prompted to update consents (Voyado only).
voyadoVoyado-specific configuration. See Voyado configuration.
klaviyoKlaviyo-specific configuration. See Klaviyo configuration.

Voyado loyalty configuration

The voyado block configures Qliro's interaction with Voyado Engage.

FieldDescription
contactTypeThe Voyado contact type used when creating new contacts (for example Member or Contact). Must exist in Voyado.
consentsArray of Voyado consent IDs to set when creating a new contact.
memberConsentsArray of Voyado consent IDs that identify a contact as a member. If a contact has all listed consents, Qliro treats them as an existing member.
updateObject containing checkBoxes, an array of consent checkboxes shown to existing members. Each checkbox has isChecked, consentId, and label. Use together with the top-level updateText to render an update prompt for returning members.
storeExternalIdOptional Voyado store external ID assigned to new contacts.

Example Voyado configuration:

"loyaltyConfiguration": {
  "askForSignupChecked": true,
  "merchantLoyaltyTermsUrl": "https://example.com/loyalty/terms",
  "merchantLoyaltyIntegrityPolicyUrl": "https://example.com/loyalty/privacy",
  "mainText": {
    "title": "Become a member",
    "description": "Join our loyalty program to collect bonus points on every purchase."
  },
  "updateText": {
    "title": "Update your preferences",
    "description": "We'd like to keep you up to date on offers and news."
  },
  "voyado": {
    "contactType": "Member",
    "consents": ["member"],
    "memberConsents": ["member"],
    "update": {
      "checkBoxes": [
        {
          "isChecked": false,
          "consentId": "newsletter",
          "label": "I want to receive the newsletter"
        }
      ]
    },
    "storeExternalId": "store-001"
  }
}

Klaviyo loyalty configuration

The klaviyo block configures Qliro's interaction with Klaviyo.

FieldDescription
listsArray of Klaviyo list names (not list IDs). Each list must already exist in Klaviyo. The profile is added to all listed lists on opt-in.
useEmailSubscriptionChannelIf true, the profile subscribes to the email marketing channel on opt-in. Requires a verified sending domain and configured sender in Klaviyo.
useSmsSubscriptionChannelIf true, the profile subscribes to the SMS marketing channel on opt-in.
useSmsTransactionalChannelIf true, the profile subscribes to the SMS transactional channel on opt-in.

Example Klaviyo configuration:

"loyaltyConfiguration": {
  "askForSignupChecked": true,
  "merchantLoyaltyTermsUrl": "https://example.com/loyalty/terms",
  "merchantLoyaltyIntegrityPolicyUrl": "https://example.com/loyalty/privacy",
  "mainText": {
    "title": "Join our newsletter",
    "description": "Sign up to receive exclusive offers."
  },
  "klaviyo": {
    "lists": ["Newsletter"],
    "useEmailSubscriptionChannel": true,
    "useSmsSubscriptionChannel": false,
    "useSmsTransactionalChannel": false
  }
}

Qliro Loyalty Sign-up Notifications

When a customer opts in or updates consents in the loyalty sign-up component, Qliro calls the adapter with one of the following push notifications:

Notification typeTrigger
LOYALTY_PROVIDER_MEMBER_CREATEA new member or profile was created in the loyalty provider.
LOYALTY_PROVIDER_MEMBER_UPDATEAn existing member or profile was updated.

The adapter receives the full provider payload (Voyado contact or Klaviyo profile), maps it to a Norce loyalty record, and persists it on the Norce order at customer.loyalty. The persisted record contains:

  • id — the provider's identifier for the member or profile.
  • providerVoyado or Klaviyo.
  • attributes — an object containing:
    • isMembertrue when the Voyado contact has contactType set to Member and approved set to true; false otherwise (including all Klaviyo profiles).
    • attributes — the provider's contact or profile fields (name, email, member number, bonus points, etc.).
    • meta — provider metadata such as contact type, approval status, and timestamps.
    • preferences — communication preferences returned by the provider.
    • consents — consent records returned by the provider.

The notification is processed asynchronously; the loyalty data may not be present on the order immediately after the customer opts in.

Qliro Loyalty Sign-up Troubleshooting

The Qliro Loyalty Sign-up modal does not appear in the Qliro Checkout iframe.

Verify, in order:

  1. The order create request to Qliro includes a loyaltyConfiguration object with a non-null voyado or klaviyo block. If it is missing, check that loyaltyConfiguration is set in the qliro_checkout_adapter configuration for the channel.
  2. The customer has entered an email address in the Qliro Checkout iframe (or the merchant has pre-filled customerInformation.email). Qliro cannot look up the customer in the loyalty provider without an email.
  3. Qliro merchant solutions has activated the loyalty integration for your merchant API key, including the SVG logo and the provider API key.

The customer signs up but the profile or contact is not created in the loyalty provider.

  • Klaviyo: confirm every list name in klaviyo.lists exactly matches an existing list in Klaviyo (names are case-sensitive). Confirm the Klaviyo private API key supplied to Qliro has Profile, List, and Subscription full-access permissions. If useEmailSubscriptionChannel is true and the list uses double opt-in, the profile is created but stays unsubscribed until the customer confirms via email.
  • Voyado: confirm the contactType and every consent ID in consents and memberConsents exist in the Voyado tenant connected to Qliro.

The returning-member update flow is not shown to existing members.

The update flow requires both updateText (top level) and voyado.update.checkBoxes to be configured. Without both, Qliro shows the standard sign-up flow even for known members.

Synchronization Callbacks

The Qliro Checkout Adapter automatically handles synchronization between Qliro and Norce:

  • Cart Changed: Qliro UI is suspended, order updated, then resumed
  • Customer Update: Norce order updated with customer info from Qliro
  • Shipping Option Update: Norce order updated with shipping selection

Idempotency and Retries

Qliro's checkout system uses idempotency to ensure that repeated identical requests have the same effect. This is important for retry scenarios and webhook handling. Please read the Qliro Checkout documentation on Idempotency and retries for detailed information.

Troubleshooting (Qliro Specific)

In addition to the generic troubleshooting steps:

  • Review the order status in Qliro's merchant portal.
  • If Capture fails, verify the Norce order is in the reserved state.
  • Use the refresh endpoint to update available payment actions:
POST /api/order/v1/orders/{order_id}/payments/{payment_id}/refresh
Host: {slug}.api-se.stage.norce.tech
x-merchant: {merchant}
x-channel: {channel}
Authorization: Bearer {token}

Common Errors

  • 409 Conflict: A payment already exists for this order.
  • Validation Fails: Check stock availability and discount validity.
  • Capture Fails: Order must be in reserved state.