# Walley Developer Portal > Walley - Smart, secure and robust payment solutions that boosts sales and customer loyalty The full text of every page of the Walley developer documentation, concatenated. An index of the same pages is available at https://dev.walleypay.com/llms.txt. --- # Authentication Source: https://dev.walleypay.com/docs/authentication.md ### Overview
### 1. Generate an API secret Go to [Walley Merchant Hub](https://merchanthub.walleypay.com) click on your name in the top right menu, and select **Manage Organization** in the menu. - Select **Create new** and then **Api key**. - Fill out the form and select **Create**. - Copy the client id and secret and save this to a password manager. :::warning Important The secret is only visible once and can't be recovered. If lost a new secret must be created instead. ::: ### 2. Request an access token In order to communicate with our APIs, you will need to request an access token that you will use in all subsequent requests to our API. To get the access token your application needs to perform a request against our authentication endpoint: `https://api.uat.walleydev.com/oauth2/v2.0/token`. > [See endpoints for testing and production](/docs/manage/getting-started/endpoints).
[Read more about access tokens](https://www.oauth.com/oauth2-servers/access-tokens/) :::info Please Note The token provided in this response will expire and to get a new token you can simply execute the same request again. ::: ```json POST /oauth2/v2.0/token HTTP/1.1 Host: api.uat.walleydev.com Content-Type: application/x-www-form-urlencoded client_id=4edbc2f0-a1b2-4ec1-a238-cfdfa2b54cee&client_secret=7a4ksd0326~2t145676&grant_type=client_credentials&scope=1c5acc63-5f8c-4ee5-8eba-cb433ee2bc78/.default ``` ```json { "token_type": "Bearer", "expires_in": 3599, "ext_expires_in": 3599, "access_token": "bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE..." } ``` #### Request Properties | Property | Description | | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `client_id` | The client identifier of your application | | `client_secret` | The secret key you acquired that is connected to your clientId | | `grant_type` | The grant_type should be set to client_credentials | | `scope` | This is a constant value that is unique for every environment: UAT (testing) and PROD.
UAT = `705798e0-8cef-427c-ae00-6023deba29af/.default`
PROD = `a3f3019f-2be9-41cc-a254-7bb347238e89/.default` | ### 3. Provide the access token with all requests In all following calls, provide the request with an `Authorization` header with the value `Bearer {{access_token}}`. ```json // Example request with an Authorization header set GET /manage/orders/0f05ebc2-89ec-4l13-830a-ac4e0141f652 HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Content-Type: application/json Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` --- # Authentication Source: https://dev.walleypay.com/docs/b2b/authentication.md To protect your data and users, Walley uses Microsoft Azure ADB2C as an authentication service provider. To gain access to the API you must identify your application against this service to obtain a token that you use to identify your application against our APIs. > Microsoft Azure ADB2C follows the standard OAuth2 and for integrating with Walley api you use the **Client Credentials** flow. > [Read more about it](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) --- # Identify Source: https://dev.walleypay.com/docs/b2b/identify.md Prior to invoking the AddInvoice function to initiate a purchase, the buyer must be authenticated using the endpoints detailed in this document. The identification process for `Phone Number` involves the following steps. Only valid if no registration number exists: 1. Dispatch an OTP challenge to the buyer via SMS using the `Identify buyer` endpoint. 2. Validate the OTP with the `Verify` endpoint using the OTP from the challenge. This returns a list of organizations for which the buyer has purchasing rights. 3. Utilize the token returned in step 1 when invoking AddInvoice. Refer to [AdditionalInformation](/docs/paymentsApi/integration/creating-purchases/addinvoice#additionalinformation) in Add Invoice. The identification process for `Registration Number` involves the following steps: 1. Request an OTP challenge using the `Identify buyer` endpoint. 2. Validate the OTP with the `Verify` endpoint. This returns a list of organizations for which the buyer has purchasing rights. 3. Utilize the token returned in step 1 when invoking AddInvoice. Refer to [AdditionalInformation](/docs/paymentsApi/integration/creating-purchases/addinvoice#additionalinformation) in Add Invoice.
### Initiate buyer identification This endpoint is used to initiate a new identification. Depending on the means of identification, either SMS or registration number, the identification flow is slightly different. A token is returned, which is subsequently used to validate any OTP and the AddInvoice request. #### Registration number (CivRegNo) When identifying the end customer using registration number the request is immediately validated. The returned token can be used to fetch organizations and to make purchases as soon as it is returned. ```json POST /b2b/{{countryCode}}/identify HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "Type": "RegistrationNumber", "Value": "198010011016" } ``` ```json Status: 202 Accepted /* Body */ { "data": { "token": "YeJA5TTGBFtC-xNwKiBOAQ" } } ``` #### Phone The request below will cause a text message with an password to be sent to the supplied phone number. ```json POST /b2b/{{countryCode}}/identify HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "Type": "Phone", "Value": "+46731234567" } ``` ```json Status: 202 Accepted /* Body */ { "data": { "token": "YeJA5TTGBFtC-xNwKiBOAQ" } } ``` ### Verify OTP This endpoint is used to verify the OTP with the password entered by the buyer. After the OTP has been successfully verified, the organizations for which the buyer has purchasing rights are displayed. It's important to store the returned token, as it is required to authorize the AddInvoice request. Note that if identification has been done with registration number, no password has to be supplied. #### Registration number (CivRegNo) ```json POST /b2b/{{countryCode}}/identify/{{token}}/verify HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... {} ``` ```json Status: 200 OK { "data": { "organizations": [ { "id": "5567164818", "name": "Swedec AB" } ] } } ``` #### Phone ```json POST /b2b/{{countryCode}}/identify/{{token}}/verify HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "Otp": "519943" } ``` ```json Status: 200 OK { "data": { "organizations": [ { "id": "5567164818", "name": "Swedec AB" } ] } } ``` | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | 200 | Identity verified | | 202 | OTP challenge sent through SMS | | 400 | Error, refer to returned problem details | | 401 | Unauthorized, token verification needed. See: [Authentication](/docs/manage/getting-started/authentication) for more information | | 403 | Permissions needed | ## Data Model ### Request ##### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | ##### Request path parameters | Parameter | Required | Explanation | | --------------- | -------- | --------------------------------------------------------------------------------- | | **countryCode** | Yes | The country where the purchase is made. (SE, NO or FI) | | **token** | Yes | A unique token for the identification. Used to verify a OTP. | ##### Request body ###### Initiate buyer identification | Property | Required | Explanation | Type | Notes | | --------- | -------- | ----------------------------------------- | ------ | ------------------------------------------------------------------------------- | | **type** | Yes | The type of OTP method | enum | 1 = Phone, where OTP challenge is delivered by SMS
2 = RegistrationNumber | | **Value** | Yes | Phone number or Registration Number | string | Include countryCode | ###### Verify OTP | Property | Required | Explanation | Type | Notes | | -------- | -------- | ------------------------------------------- | ------ | ------------------------------------------------------------------ | | **Otp** | Yes | The challenge password entered by the buyer | number | Received by SMS from Walley. Only required if identifying by phone | --- # B2B overview Source: https://dev.walleypay.com/docs/b2b/overview.md The B2B API is used to verify and apply to become a buyer for companies. :::preview B2B API is in preview The B2B functionality is in preview and may change before general availability ::: --- # Registration Source: https://dev.walleypay.com/docs/b2b/registration.md These endpoint are used to setup a new profile or create an application for new buyers. The registration process involves the following steps: 1. The applicant enters `Organization Id` and `Phone Number` and / or `Registration Number` which is then posted to the applications endpoint. 2. If the applicant is not authorized to review, a list of reviewers are returned, from which the applicant chooses one and enters their phone number. 3. The reviewer ID and phone number is posted to the reviewers endpoint. 4. A SMS is sent to the entered phone number asking the reviewer to identify with their Electronic ID and approve the buyer. 5. Finally an SMS is sent back to the applicant informing them that they've been approved as an buyer for the organization.
### Initiate new application This endpoint is used to request that a person is added as buyer to an organization. The list of reviewers contains both names and a unique ID. The names should be displayed to the applicant while the ID is used to identify which reviewer the applicant has chosen ```json POST /b2b/{{countryCode}}/applications HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "organizationId": "2576102-5", "applicantPhoneNumber": "+46073456789", "applicantRegistrationNumber": "200110282381", "firstName" : "John", "lastName" : "Doe" } ``` ```json Status: 201 Created /* Body */ { "data": { "applicationId": "933fb0ec-bdc0-4a40-b02d-e4205072e90c", "organizationName": "Test Company Education Oy", "reviewers": [ { "name": "Test Name_B", "id": "927f1ec3-90e5-4e5e-8dfc-ca5d3acd0464" }, { "name": "Test Name_A", "id": "e12d1a09-8e11-4f0c-a4ed-ed98c0663a81" } ], "buyerStatus": "Inactive" } } ``` #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | #### Request path | Path | Required | Explanation | | --------------- | -------- | ------------------------------------------------------ | | **countryCode** | Yes | The country where the purchase is made. (SE, NO or FI) | #### Request body Phone number or Registration number is required. | Property | Required | Explanation | Type | Notes | | ------------------------------- | -------- | ----------------------------------------------------------- | ------ | -------------------- | | **organizationId** | Yes | The company's organization ID | string | | | **applicantPhoneNumber** | No | Phone number to the person wanting to become a buyer | string | Include country code | | **applicantRegistrationNumber** | No | Registration number to the person wanting to become a buyer | string | Include country code | | **firstName** | No | First name of the applicant | string | | | **lastName** | No | Last name of the applicant | string | | #### Response body Phone number or Registration number is required. | Property | Explanation | Type | Notes | | -------------------- | ----------------------------------------------------------- | ------ | ----- | | **applicationId** | Unique id for the application, used in subsequentl calls | string | | | **organizationName** | The name of the organization | string | | | **reviewers** | List of people authorized to approve the application | array | | | **buyerStatus** | If `Active` the application has been automatically approved | string | | ### Choose reviewer This endpoint is used to choose a reviewer that should approve the request. Here the application ID and reviewer ID from the response above is used to select a reviewer. The phone number must include the country code eg. `+46`. :::info Automatically approved applicant If the applicant is an authorized signatory themselves the application is automatically approved. This is indicated with `buyerStatus=Active` in the response above. In that case there is no need to choose a reviewer with the request below, and the applicant can proceed to place a purchase directly. ::: ```json POST /b2b/{{countryCode}}/applications/{{applicationId}}/reviewers HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "reviewer": { "reviewerId": "927f1ec3-90e5-4e5e-8dfc-ca5d3acd0464", "phoneNumber": "+46123456789" } } ``` ```json Status: 202 Accepted /* No Body */ ``` #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | #### Request path | Path | Required | Explanation | | ----------------- | -------- | ------------------------------------------------------ | | **countryCode** | Yes | The country where the purchase is made. (SE, NO or FI) | | **applicationId** | Yes | A unique ID to identify a registration request | #### Request body | Property | Required | Explanation | Type | Notes | | --------------- | -------- | ---------------------------------- | ------ | -------------------------------------- | | **reviewerId** | Yes | Unique identifier for the reviewer | number | Received when creating the application | | **phoneNumber** | Yes | Phone number to the reviewer | number | Include country code | ## Response codes | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | 400 | Error, refer to returned problem details | | 401 | Unauthorized, token verification needed. See: [Authentication](/docs/manage/getting-started/authentication) for more information | | 403 | Permissions needed | | 404 | Organization, application or reviewer not found | --- # Authentication Source: https://dev.walleypay.com/docs/checkout/authorization.md To communicate with the Checkout API an Authorization header must be appended to each request. Follow the guide below to retrieve a token and create such authorization headers --- # Branding resources Source: https://dev.walleypay.com/docs/checkout/branding-resources.md The Walley Checkout badge is a small trust signal you can display on your site — a Walley logo paired with an illustrative set of payment method icons. Placing it on product pages, in your footer, or near the checkout button tells customers that Walley Checkout is available. :::tip Looking for a live list of payment methods? The badge is a static image — the icons shown are illustrative of what's typically offered in that market, not a live or personalized list of the methods available to a given customer. For a dynamic display that adapts to country, cart amount, and your Walley configuration, use the [Payment method logos widget](/docs/checkout/widgets/payment-method-logos-widget) instead. ::: ## Resource location All badges are delivered as SVG, so they scale to any size without quality loss. They follow this URL pattern: `https://cdn.walleypay.com/logo/walley-checkout-badge-{locale}-{variant}.svg` Example: `https://cdn.walleypay.com/logo/walley-checkout-badge-sv-SE-color-on-light.svg` Each badge is a vector SVG with an intrinsic viewBox of **366 × 115** (aspect ratio ≈ 3.2 : 1). File size depends on the variant and locale: color variants are **~80–110 KB**, mono variants **~20–55 KB**. Because it's vector, it renders crisply at any size — use the `max-width` guidance in the snippet below rather than matching intrinsic pixels. We recommend linking directly to the CDN URL. Walley occasionally updates the artwork (for example, when adding a payment method), and direct linking means your site picks up the new version with no deploy on your side. If you must self-host — CSP restrictions, procurement rules, or offline/print contexts — be aware you'll need to re-fetch when we update the artwork. ## Preview Preview a badge for any supported locale and variant, and copy a ready-to-paste snippet. ### Accessibility Screen readers announce the `alt` attribute in place of the image, so use it to convey what the badge communicates visually. Set a description that names the market's notable local payment method, and write it in the language of the surrounding page (which will usually match the badge locale): | Locale | Suggested alt text | | ------- | ----------------------------------------------------------- | | `sv-SE` | `Betala med Walley — faktura, kort, Swish med mera` | | `en-SE` | `Pay with Walley — invoice, card, Swish, and more` | | `nb-NO` | `Betal med Walley — faktura, kort, Vipps med mer` | | `fi-FI` | `Maksa Walleylla — lasku, kortti, MobilePay ja muut` | | `sv-FI` | `Betala med Walley — faktura, kort, MobilePay med mera` | | `da-DK` | `Betal med Walley — faktura, kort, MobilePay og flere` | Example: ```html Betala med Walley — faktura, kort, Swish med mera ``` ### Automatic dark mode To switch between the light and dark variants based on the user's system preference, use a `` element: ```html Betala med Walley — faktura, kort, Swish med mera ``` ## Variants Four variants are available. Pick the one that contrasts best with your surroundings. | Variant | When to use | | ----------------- | ---------------------------------------------------------------------------------------------------- | | `color-on-light` | Light backgrounds. Colorful gradient Walley logo + payment methods. **The default.** | | `color-on-dark` | Dark backgrounds. Colorful logo tuned for contrast against dark surroundings. | | `mono-on-light` | Light backgrounds where you want a single-color badge (e.g. monochrome print or minimalist UI). Black logo. | | `mono-on-dark` | Dark backgrounds where you want the logo and payment methods rendered in a single color. White logo. | ## Countries and locales The country code in the URL controls two things inside the badge: 1. The language of any text rendered inside the SVG. 2. Which payment methods appear as icons — these reflect the typical set available in that market (e.g. Walley invoice variants differ by market), but are **not** filtered per customer or cart. Currently available: | Code | Market | | ------- | ------------------------- | | `sv-SE` | Sweden — Swedish | | `en-SE` | Sweden — English | | `nb-NO` | Norway — Norwegian Bokmål | | `fi-FI` | Finland — Finnish | | `sv-FI` | Finland — Swedish | | `da-DK` | Denmark — Danish | Today, English is only offered for the Swedish market (`en-SE`). For pan-Nordic rollouts, use the local-language variant in each market. ## Delivery The badge is served from `cdn.walleypay.com`, a globally cached CDN. CORS is open (`Access-Control-Allow-Origin: *`), so the asset can be used cross-origin from ``, ``, and `fetch()` contexts. --- # Handling Shopping Cart Changes Source: https://dev.walleypay.com/docs/checkout/common-use-cases/cart-management.md Customers change their cart during an active checkout session by adding items, adjusting quantities, removing products or applying discounts. Walley Checkout gives you APIs to apply those changes while the checkout keeps its state and the customer information already collected. Synchronize every cart change with Walley so that pricing, tax calculations and payment processing stay accurate. This guide explains when and how to update the cart during checkout. ## Common scenarios requiring cart updates - **Quantity changes** - Customer increases or decreases item quantities - **Add/remove items** - Customer continues shopping and modifies cart - **Price updates** - Promotions, discounts, or dynamic pricing changes - **Cart corrections** - Items removed due to stock or business rule changes ## Example flow The typical flow for handling cart changes involves suspending the checkout, updating the cart via backend API, and resuming the checkout to reflect the changes. ```mermaid sequenceDiagram participant User participant Frontend participant Backend participant Walley User->>Frontend: Modify cart (add item, change quantity) Frontend->>Frontend: Suspend checkout iframe Note over Frontend: Shows spinner, disables inputs Frontend->>Backend: POST /update-cart Backend->>Walley: PUT /checkouts/{id}/cart Note over Backend,Walley: Update cart items via Walley API Walley-->>Backend: Success response Backend-->>Frontend: Cart updated Frontend->>Frontend: Resume checkout iframe Note over Frontend: Reloads checkout with updated cart Frontend->>User: Display updated cart ``` ## Implementation approaches There are two main approaches to updating the cart, depending on what needs to change: ### Option 1: Update cart only Use the [Update Cart API](/docs/checkout/optional/updatecart) when you only need to modify cart items without changing other checkout properties. **When to use:** - Only cart items or quantities change - Price updates on existing items - Adding or removing products - Smaller payload size than full checkout update **Backend API call:** ```http PUT /checkouts/{checkout-id}/cart HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "items": [ { "id": "10001", "description": "Product 1", "unitPrice": 100.0, "quantity": 2, "vat": 25.0 }, { "id": "10002", "description": "Product 2", "unitPrice": 50.0, "quantity": 1, "vat": 25.0 } ] } ``` ### Option 2: Update entire checkout Use the [Update Checkout API](/docs/checkout/optional/updatecheckout) when you need to update multiple checkout properties simultaneously. **When to use:** - Updating reference or metadata along with cart - Complex updates requiring multiple changes :::note On this endpoint `cart` is an array of items. On [Initialize Checkout](/docs/checkout/initcheckout) it is an object with an `items` array, and on [Update Cart](/docs/checkout/optional/updatecart) the items sit directly in the request body. Check the shape for the endpoint you are calling. ::: **Backend API call:** ```http PUT /checkouts/{checkout-id} HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "cart": [ { "id": "10001", "description": "Product 1", "unitPrice": 100.0, "quantity": 2, "vat": 25.0 } ] } ``` ## Best practices **Always suspend before updating** - Call `suspend()` on the checkout iframe before making backend API calls to update the cart - Always call `resume()` afterward, even if the update fails - This prevents race conditions where the iframe and backend state become inconsistent **Handle API errors gracefully** - Always resume the iframe after any update attempt (success or failure) to prevent a stuck checkout - For 423 (Resource_Locked) errors, implement retry logic with exponential backoff (e.g., wait 500ms, then 1s, then 2s) ## Important limitations - **Cannot update completed purchases** - Cart updates only work before purchase completion - **Resource locking** - Only one update at a time per checkout session (returns HTTP 423 if another update is in progress) - **Purchase commitment** - Once the customer clicks "Complete Purchase", Walley locks the cart and further updates return code 900 with the reason `Purchase_Commitment_Found` ## Related documentation - [Update Cart API](/docs/checkout/optional/updatecart) - Detailed API reference for cart updates - [Update Checkout API](/docs/checkout/optional/updatecheckout) - Update entire checkout state - [Client-side API](/docs/checkout/optional/clientapi) - Suspend and resume functions - [ValidateOrder Callback](/docs/checkout/optional/validateorder) - Validate cart before payment --- # Handling Discounts Source: https://dev.walleypay.com/docs/checkout/common-use-cases/discounts.md Represent discounts in Walley Checkout so that the amounts still add up when you refund the order, in full or in part. This guide covers: - Overview of approaches for different discount models - Comparison matrix to choose the right model - Clear end-to-end JSON examples for checkout and refund ## Overview of approaches Walley supports multiple ways to handle discounts in checkout: | Approach | Description | When to use | |----------|-------------|-------------| | **Explicit discount item** | Represent discounts as a separate negative cart item | Most flexible; recommended for most campaigns | | **Campaign cases** | Standard patterns like Buy 3 Pay for 2, percent discounts | Use explicit discount items and refund recalculation | | **Simple discount (adjusted price)** | Discount is baked into the product price | Quick + simple, minimal refund needs | ## Comparison matrix | Criteria | Explicit discount item | Simple discount | |----------|----------------------|-----------------| | **Transparency** | ✅ Customer sees discount item | ⚠️ Only visible in item description | | **Refund flexibility** | ✅ Fully controllable | ✅ Fully controllable | | **Partial refunds** | ✅ Supported | ✅ Supported | ## 1. Explicit discount item (recommended) ### Checkout A discount item is a cart item with a negative `unitPrice` that represents the discount amount. Add the discount item to the cart alongside regular products. ```json "cart": { "items": [ { "id": "item-001", "description": "Cool T-shirt", "unitPrice": 250, "quantity": 1, "vat": 25 }, { "id": "discount-SPRING", "description": "Spring campaign discount", "unitPrice": -50, "quantity": 1, "vat": 25 } ] } ``` ### Full refund ```http POST /manage/orders/{orderId}/refund HTTP/1.1 Content-Type: application/json { "amount": 200, "actionReference": "refund-spring-discount", "items": [ { "id": "item-001", "description": "Cool T-shirt", "unitPrice": 250, "quantity": 1, "type": "purchase" }, { "id": "discount-SPRING", "description": "Spring discount refund", "unitPrice": -50, "quantity": 1, "vat": 25, "type": "discount" } ] } ``` ## 2. Partial refund – buy 3, pay for 2 (explicit discount) This section describes how to model a **Buy 3, Pay for 2** campaign using an explicit discount item, and how to correctly perform a partial refund. ### Original order (Checkout) **Scenario:** - 3 products - Price per product: 100 SEK - Buy 3, Pay for 2 discount: negative 100 SEK - Amount paid by customer: 200 SEK #### Checkout All products are sent with their full price, and the campaign is represented as a separate discount item. ```json "cart": { "items": [ { "id": "item-001", "description": "Product A", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-002", "description": "Product B", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-003", "description": "Product C", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "discount-B3P2", "description": "Buy 3, pay for 2 discount", "unitPrice": -100, "quantity": 1, "vat": 25 } ] } ``` ### Partial refund (2 items returned) **Refund logic:** The customer returns 2 out of 3 items. **Refund calculation:** - Refund products: 2 multiplied by 100 SEK = 200 SEK - Apply adjusted discount: negative 100 SEK - **Net refund amount: 100 SEK** The refund must reflect the net amount paid for the returned items. #### Refund request ```http POST /manage/orders/{orderId}/refund HTTP/1.1 Authorization: Bearer Content-Type: application/json { "amount": 100, "actionReference": "partial-refund-buy3pay2", "items": [ { "id": "item-001", "description": "Product A", "unitPrice": 100, "quantity": 1, "type": "purchase" }, { "id": "item-002", "description": "Product B", "unitPrice": 100, "quantity": 1, "type": "purchase" }, { "id": "discount-B3P2", "description": "Buy 3, pay for 2 discount (adjusted)", "unitPrice": -100, "quantity": 1, "vat": 25, "type": "discount" } ] } ``` **Result:** - plus 200 SEK refunded for products - minus 100 SEK discount applied - Customer receives **100 SEK** :::info Important notes - The discount remains negative during refunds - `type: "discount"` is required for discount items in refunds - The `amount` must equal the sum of all refund items - Walley does not recalculate discounts — the merchant must adjust the discount item manually ::: ## 3. Percentage discounts with explicit discount items ### Checkout (10 Percent on 3 Multiplied by 100) ```json "cart": { "items": [ { "id": "item-001", "description": "Product A", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-002", "description": "Product B", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-003", "description": "Product C", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "discount-10pct", "description": "10 percent discount", "unitPrice": -30, "quantity": 1, "vat": 25 } ] } ``` ### Partial refund (2 items returned, refund amount 180) ```http POST /manage/orders/{orderId}/refund HTTP/1.1 Content-Type: application/json { "amount": 180, "actionReference": "partial-refund-10pct", "items": [ { "id": "item-001", "description": "Product A", "unitPrice": 100, "quantity": 1, "type": "purchase" }, { "id": "item-002", "description": "Product B", "unitPrice": 100, "quantity": 1, "type": "purchase" }, { "id": "discount-10pct", "description": "10 percent discount (original)", "unitPrice": -30, "quantity": 1, "vat": 25, "type": "discount" }, { "id": "discount-10pct-adj", "description": "10 percent discount (remaining)", "unitPrice": 10, "quantity": 1, "vat": 25, "type": "discount" } ] } ``` **Explanation:** - Original discount refunded: negative 30 - Remaining discount added back: plus 10 - Net discount: negative 20, which results in **amount 180** ## 4. Simple discount (price already adjusted) Discount is reflected directly in product price — no dedicated discount item. ### Checkout example (10 percent simple) ```json "cart": { "items": [ { "id": "item-001", "description": "Product A (10 percent discount applied)", "unitPrice": 90, "quantity": 1, "vat": 25 } ] } ``` ### Simple "Buy 3 Pay 2" ```json "cart": { "items": [ { "id": "item-001", "description": "Product A (Buy 3 Pay 2)", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-002", "description": "Product B (Buy 3 Pay 2)", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "item-003", "description": "Product C (Buy 3 Pay 2 – discounted)", "unitPrice": 0, "quantity": 1, "vat": 25 } ] } ``` ### Refund with simple discount ```http POST /manage/orders/{orderId}/refund HTTP/1.1 Content-Type: application/json { "amount": 90, "actionReference": "refund-simple-discount", "items": [ { "id": "item-001", "description": "Product A (10 percent discount applied)", "unitPrice": 90, "quantity": 1, "type": "purchase" } ] } ``` ## Best practices - **Use explicit discount items** for campaigns and complex refunds. - **Use simple discount** when discount logic is internal and refund patterns are trivial. - Always **align VAT correctly** for both items and discount items. - **Recalculate discount** for partial refunds and represent in refund request. ## See also - [Initialize Checkout](/docs/checkout/initcheckout) - Setup checkout sessions with cart items - [Order Management API](/docs/manage/getting-started/overview) - Capture, refund, cancel orders - [Inventory Validation Use Case](/docs/checkout/common-use-cases/inventory-validation) - Another callback example - [Simple Payment Flow](/docs/checkout/common-use-cases/simple-payment-flow) - Complete payment lifecycle --- # Gift cards Source: https://dev.walleypay.com/docs/checkout/common-use-cases/giftcards.md Add each gift card to the cart as a separate item with a negative amount and VAT set to 0, then read back how much of each card the purchase used. Gift cards are most commonly categorized as so-called multi-purpose vouchers, meaning that they allow purchases for products with different tax rates. Since the tax amount cannot be predicted until purchase, the usage of a gift card should be through a separate item with a negative amount and the VAT set to 0. Gift cards are identified within the cart with the type of value "GiftCard". This identification allows for separate handling of gift cards in calculations and processing. ## Example flow A common use case to handle gift cards is to authorize the amounts used by each gift card when [validating the order](/docs/checkout/optional/validateorder), and then capture the amounts when the [purchase is completed](/docs/checkout/notificationcallback). If the purchase was unsuccessful for some reason you can listen to [payment failed callback](/docs/checkout/optional/init-checkout-features#paymentfailed) to revert the authorization. Gift Cards example flow When you specify a cart you can add one or more gift cards like the following example: ```json [ { "id": "10001", "description": "Product 1", "unitPrice": 95.0, "quantity": 1, "vat": 25.0 }, { "id": "10002", "description": "Gift Card 50", "type": "GiftCard", "unitPrice": -50.0, "quantity": 1, "vat": 0.0 }, { "id": "10003", "description": "Gift Card 100", "type": "GiftCard", "unitPrice": -100.0, "quantity": 1, "vat": 0.0 }, { "id": "10004", "description": "Gift Card 100", "type": "GiftCard", "unitPrice": -100.0, "quantity": 1, "vat": 0.0 } ] ``` If multiple giftcards are specified, the ones with the lowest amounts are used first, and the ones with higher amount can be used partly or not at all. When you [get checkout information](/docs/checkout/getcheckoutinformation) you will get a response similar to: ```json { "totalAmount": -155.0, "items": [ { "id": "10001", "description": "Product 1", "unitPrice": 95.0, "quantity": 1, "vat": 25.0 }, { "id": "10002", "description": "Gift Card 50", "type": "GiftCard", "unitPrice": -50.0, "quantity": 1, "vat": 0.0, "usedAmount": 50.0 }, { "id": "10003", "description": "Gift Card 100", "type": "GiftCard", "unitPrice": -100.0, "quantity": 1, "vat": 0.0, "usedAmount": 45.0 }, { "id": "10004", "description": "Gift Card 100", "type": "GiftCard", "unitPrice": -100.0, "quantity": 1, "vat": 0.0, "usedAmount": 0.0 } ] } ``` Using this information you can decide which gift cards and amounts are used by using `usedAmount`. The remaining amount is calculated by adding `unitPrice` and `usedAmount`. `totalAmount` can be negative if not all gift cards are used and reflects the total remaining amount of the gift cards. --- # Inventory Validation and Reservation Source: https://dev.walleypay.com/docs/checkout/common-use-cases/inventory-validation.md Choose how to validate stock and reserve inventory during checkout, so that you stop overselling without adding friction for the customer. This guide compares three strategies for validating stock availability and reserving inventory during the checkout process. ## Overview of approaches There are three main approaches to handle inventory during checkout: | Approach | When to Validate | Best For | |----------|------------------|----------| | **No Validation** | After payment | Digital products, low-traffic stores | | **Pre-Payment Validation** | Before payment | Standard e-commerce, stock checking | | **Advanced Validation** | Before payment, Failed payment | Complex rules, Inventory reservation, Gift cards | ## Comparison matrix Choose the right approach based on your requirements: | Criteria | No Validation | Pre-Payment Validation | Advanced Callbacks | |----------|--------------|----------------------|-------------------| | **Overselling Prevention** | ❌ None | ✅ Good | ✅ Excellent | | **Checkout Speed** | ⚡ Fastest | 🐌 Slower (+10s max) | 🐌 Slower (+10s max) | | **Implementation Complexity** | ✅ Simple | ✅ Simple | ⚠️ Medium | | **Conversion Rate Impact** | ✅ None | ⚠️ Potential negative | ⚠️ Potential negative | | **Custom Validation** | ❌ No | ⚠️ Limited | ✅ Full support | | **Rollback Support** | N/A | ❌ No | ✅ Yes (PaymentFailed) | | **HTTP Method** | N/A | GET | POST with body | ## Approach 1: No validation (notification only) ### Overview The simplest approach relies solely on the [notification callback](/docs/checkout/notificationcallback) to process orders after payment completion. No pre-payment validation is performed. ### Configuration ```json { "storeId": 123, "countryCode": "SE", "merchantTermsUri": "https://myshop.com/terms", "notificationUri": "https://api.myshop.com/notifications/{checkout.id}", "cart": { "items": [...] } } ``` ### When to use - **Digital products** - No physical inventory to manage - **Made-to-order products** - Items created after purchase - **Low-traffic stores** - Minimal risk of simultaneous purchases - **Services** - No stock limitations ### Pros and cons ✅ **Advantages:** - Fastest checkout experience - Simplest implementation - No timeout concerns - Highest conversion rate ❌ **Disadvantages:** - Risk of overselling - Customer disappointment if items unavailable - Manual handling of out-of-stock situations ### How it works 1. Customer completes payment through Walley Checkout 2. Walley sends GET request to your `notificationUri` 3. Your backend receives the notification 4. Check if order was already processed (idempotency) 5. Retrieve checkout information using the checkout ID 6. If status is `PurchaseCompleted`: - Deduct inventory from stock - Create the order in your system - Send confirmation email to customer 7. Respond with `200 OK` to confirm receipt --- ## Approach 2: Pre-payment validation ### Overview Validate stock availability just before payment is processed using the `validationUri`. This provides a final check to ensure items are in stock before the customer's payment is authorized. ### Architecture ``` Customer completes checkout form ↓ Customer clicks "Complete Purchase" ↓ Walley calls validationUri (GET) ↓ Your backend checks stock availability ↓ Response: Success or Error ↓ If success → Process payment ↓ If payment succeeds → Notification callback ``` ### Configuration ```json { "storeId": 123, "countryCode": "SE", "merchantTermsUri": "https://myshop.com/terms", "notificationUri": "https://api.myshop.com/notifications/{checkout.id}", "validationUri": "https://api.myshop.com/validate/{checkout.id}", "cart": { "items": [...] } } ``` ### When to use - **Standard e-commerce** - Typical online stores with inventory management - **Medium traffic** - Moderate number of concurrent users - **Simple validation** - Primary need is stock availability checking - **Quick implementation** - Simpler than reservation systems ### Pros and cons ✅ **Advantages:** - Prevents overselling at point of payment - No reservation state to manage - Simple to implement - Works with existing inventory systems ❌ **Disadvantages:** - Adds latency to checkout (up to 10 seconds) - No rollback mechanism if payment fails - Customer may lose item during checkout - Multiple validation calls possible ### How it works 1. Customer completes checkout form and clicks "Complete Purchase" 2. Walley calls your `validationUri` with a GET request 3. Your validation endpoint: - Retrieves checkout information using the checkout ID - Checks stock availability for all items - Returns success (200 OK) or error (400/500) response 4. If validation succeeds: - Payment is processed - Order can optionally be created in pending state 5. If validation fails: - Customer sees error message - Purchase is not completed 6. After successful payment: - Walley sends notification to `notificationUri` - Your backend finalizes the order - Inventory is deducted - Confirmation email is sent ### Key considerations - **10-Second Timeout**: Validation must complete within 10 seconds - **Multiple Calls**: Validation may be called multiple times if customer retries - **Idempotency**: Handle duplicate validation requests gracefully - **Error Messages**: Provide clear feedback about unavailable items :::warning Important Even if validation succeeds, the purchase may still fail due to credit checks or payment issues. Always treat the order as pending until receiving the `notificationUri` callback with `PurchaseCompleted` status. ::: --- ## Approach 3: Advanced validation with callbacks ### Overview Use the [callback object](/docs/checkout/optional/init-checkout-features#callback-object) with `ValidateOrder` and `PaymentFailed` callback types for advanced validation scenarios with built-in rollback support. ### Configuration ```json { "storeId": 123, "countryCode": "SE", "merchantTermsUri": "https://myshop.com/terms", "notificationUri": "https://api.myshop.com/notifications/{checkout.id}", "callback": { "callbackUri": "https://api.myshop.com/callbacks/{checkout.id}", "callbackTypes": ["ValidateOrder", "PaymentFailed"] }, "cart": { "items": [...] } } ``` ### When to use - **Complex validation rules** - Multiple checks beyond stock (customer eligibility, regional restrictions) - **Rollback requirements** - Need to handle payment failures gracefully - **Multiple validation steps** - Customer verification, business rules, inventory reservation, gift cards ### Pros and cons ✅ **Advantages:** - Prevents overselling - Supports complex business logic - Built-in rollback via PaymentFailed callback - Structured request/response format ❌ **Disadvantages:** - Adds latency to checkout (up to 10 seconds) - More complex than validationUri - Requires fast backend response - May lower conversion rate if slow ### Callback flow ``` Customer completes checkout form ↓ Customer clicks "Complete Purchase" ↓ Walley calls ValidateOrder callback (POST) ↓ Your backend: Check stock, validate rules ↓ Response: Success or Error ↓ If success → Process payment ↓ If payment fails → PaymentFailed callback ↓ If payment succeeds → Notification callback ``` ### How it works **ValidateOrder Callback:** 1. Walley sends POST request to your `callbackUri` with type `ValidateOrder` 2. Request body includes `checkoutId` and `publicToken` for verification 3. Your backend: - Retrieves checkout information - Checks stock availability - Validates customer eligibility (if needed) - Validates business rules (regional restrictions, etc.) - Optionally reserves inventory - Creates pending order 4. Response options: - **Success (200 OK)**: Return `{ orderReference: "ORDER-123" }` (optional) - **Error (400)**: Return `{ title: "...", message: "...", clientPayload: {...} }` - **Timeout/Error (500)**: Customer sees generic error
**PaymentFailed Callback:** 1. Triggered when payment fails after successful validation 2. Your backend: - Finds the pending order by checkoutId - Cancels the order - Releases any inventory reservations - Cleans up any other resources 3. Always respond with 200 OK (failures here don't affect customer)
**Notification Callback:** 1. Triggered when payment succeeds 2. Your backend: - Updates order from pending to completed - Confirms inventory reservation (converts to sale) - Sends confirmation email - Triggers fulfillment process ### Key considerations - **10-Second Timeout**: Validation must complete within 10 seconds - **Idempotency**: Implement caching to handle duplicate calls - **Error Handling**: Provide clear error messages to customers - **Rollback**: Always handle PaymentFailed to release reservations --- ## Decision guide Use this flowchart to choose the right approach: ``` Do you sell physical products with limited stock? │ ├─ NO (digital/services) → Use No Validation │ └─ YES → Need to prevent overselling? │ ├─ Simple stock checking only? │ └─ YES → Use Pre-Payment Validation (validationUri) │ ├─ Need rollback if payment fails? │ └─ YES → Use Advanced Callbacks (ValidateOrder + PaymentFailed) │ └─ Complex validation rules? (customer eligibility, regional restrictions, gift cards, release inventory reservations) └─ YES → Use Advanced Callbacks ``` ## Migration from validationUri to callbacks If you're currently using `validationUri` and want to add rollback support, migrate to the callback object: **Before (validationUri):** ```json { "notificationUri": "https://api.myshop.com/notifications/{checkout.id}", "validationUri": "https://api.myshop.com/validate/{checkout.id}" } ``` **After (callback object):** ```json { "notificationUri": "https://api.myshop.com/notifications/{checkout.id}", "callback": { "callbackUri": "https://api.myshop.com/callbacks/{checkout.id}", "callbackTypes": ["ValidateOrder", "PaymentFailed"] } } ``` **Key Differences:** - **Request Method**: GET (validationUri) → POST (callback) - **Request Body**: None → JSON with type and checkout details - **Rollback**: Not available → PaymentFailed callback - **Authentication**: None → checkoutId and publicToken provided :::tip You cannot use both `validationUri` and `callback.ValidateOrder` simultaneously. Choose one validation method. ::: ## Best practices ### All approaches - **Implement Idempotency**: Always check if a notification/callback was already processed - **Comprehensive Logging**: Log all inventory operations for debugging and auditing - **Monitor Performance**: Track validation times and reservation expiry rates - **Error Handling**: Gracefully handle timeouts, connection failures, and partial stock ### Pre-payment validation (validationUri) - **Response Time**: Must complete within 10 seconds - **Idempotency**: Handle duplicate validation requests (customer may retry) - **Error Messages**: Provide clear, specific reasons for validation failures - **Pending Orders**: Optionally create pending orders during validation ### Advanced validation (callbacks) - **Response Time**: Must complete within 10 seconds (set internal timeout at 8-9 seconds) - **Optimization**: Use caching, batch queries, and parallel execution - **Clear Errors**: Provide specific, actionable error messages to customers - **Always Rollback**: Handle PaymentFailed callback to release resources ## Testing considerations ### Key test scenarios 1. **Happy Path**: Successful purchase with stock available 2. **Out of Stock**: Item becomes unavailable during checkout 3. **Reservation Expiry**: User abandons checkout, reservation is released 4. **Payment Failure**: Payment declined, rollback occurs correctly 5. **Concurrent Purchases**: Multiple users buying last available item 6. **Timeout Handling**: Validation takes too long, proper error shown ### What to verify - Inventory is correctly reserved/deducted - No overselling occurs under concurrent load - Expired reservations are released - PaymentFailed callback releases resources - Idempotency works for duplicate notifications - Error messages are clear and helpful ## Troubleshooting | Issue | Possible Cause | Solution | |-------|---------------|----------| | Overselling occurs | Race conditions | Implement database locks/transactions | | "Reservation expired" | Checkout takes too long | Increase expiry duration (30 min) | | "Validation timeout" | Slow backend | Optimize queries, add caching | | Inventory remains locked | Cleanup job not running | Verify background job is active | | Duplicate orders | Missing idempotency | Always check if already processed | ## Related documentation - [Initialize Checkout](/docs/checkout/initcheckout) - Setup callbacks and configuration - [Validate Order Callback](/docs/checkout/optional/validateorder) - Detailed callback documentation - [Notification Callback](/docs/checkout/notificationcallback) - Purchase completion handling - [Gift Cards Use Case](/docs/checkout/common-use-cases/giftcards) - Another callback example ## Summary Choose your inventory validation strategy based on: - **Product type** - Digital → No Validation - **Validation needs** - Simple stock check → Pre-Payment Validation - **Rollback requirements** - Need cleanup → Advanced Callbacks - **Business rules** - Complex logic → Advanced Callbacks Remember that the [notification callback](/docs/checkout/notificationcallback) is **always required** and is the only reliable confirmation of purchase completion, regardless of which validation approach you choose. For questions or assistance, contact Walley Merchant Services at [help@walley.se](mailto:help@walley.se). --- # Complete payment flow Source: https://dev.walleypay.com/docs/checkout/common-use-cases/simple-payment-flow.md Follow Walley's full payment lifecycle, from checkout to settlement, with the API calls you need at each stage. ## Prerequisites Before you start, make sure you have: - API credentials from [Merchant Hub](/docs/checkout/prerequisites), and a [bearer token](/docs/checkout/authorization) generated from them - A store set up in the UAT environment, so you can run the whole flow without moving real money - A notification endpoint that Walley can reach over HTTPS and that answers `200 OK` - The [endpoints](/docs/checkout/endpoints) for the environment you are targeting Every request below goes to UAT. Swap the hostname for production when you are ready. ## Payment lifecycle overview Five phases make up the full payment lifecycle, each with its own integration steps: ```mermaid sequenceDiagram participant Customer participant Frontend participant Backend participant Walley Note over Customer,Walley: Phase 1: Create the checkout session Customer->>Frontend: Browse products Customer->>Frontend: Add items to cart Customer->>Frontend: Proceed to checkout Frontend->>Backend: Request checkout session Backend->>Walley: POST /checkouts Walley-->>Backend: privateId & publicToken Backend-->>Frontend: publicToken Frontend->>Customer: Display checkout form Customer->>Frontend: Complete purchase Frontend->>Walley: Submit payment Note over Customer,Walley: Phase 2: Receive the order Walley->>Backend: GET /notify?checkoutId={privateId} Backend-->>Walley: 200 OK Backend->>Walley: GET /checkouts/{privateId} Walley-->>Backend: Checkout details with orderId Backend->>Backend: Store order, update inventory Note over Customer,Walley: Phase 3: Capture the payment Backend->>Backend: Prepare goods for shipment Backend->>Walley: POST /manage/orders/{orderId}/capture Walley-->>Backend: 202 Accepted Backend->>Customer: Send shipment notification Note over Customer,Walley: Phase 4: Refund the order Customer->>Backend: Request refund Backend->>Walley: POST /manage/orders/{orderId}/refund Walley-->>Backend: 202 Accepted Backend->>Customer: Refund processed notification Note over Customer,Walley: Phase 5: Reconcile settlements Backend->>Walley: GET /reports/settlements Walley-->>Backend: Settlement data Backend->>Walley: GET /reports/settlements/{id}/transactions Walley-->>Backend: Transaction details Backend->>Backend: Reconcile with accounting ``` The worked example below follows one order of 1 048 SEK through all five phases: a pair of headphones at 999 SEK plus 49 SEK shipping. ## Phase 1: Create the checkout session **When:** the customer reaches your checkout page. Create the session from your backend. You get back a `publicToken` for rendering the checkout iframe, and a `privateId` for every later backend call about this session. The `{checkout.id}` template in `notificationUri` resolves to that same `privateId`. Name the query parameter whatever suits your backend; this example calls it `checkoutId`. See [Templating the URI values](/docs/checkout/optional/init-checkout-features#templating-the-uri-values) for the other variables and which URIs accept them. ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "storeId": 123, "countryCode": "SE", "reference": "ORDER-2024-12345", "merchantTermsUri": "https://example.com/terms", "notificationUri": "https://example.com/api/walley/notify?checkoutId={checkout.id}", "cart": { "items": [ { "id": "PROD-001", "description": "Wireless Headphones", "unitPrice": 999.00, "quantity": 1, "vat": 25.0 }, { "id": "SHIP-001", "description": "Standard Shipping", "unitPrice": 49.00, "quantity": 1, "vat": 25.0 } ] } } ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "data": { "privateId": "6f4a9bc3-8d2e-4f1a-9b7c-3e8d2f1a9b7c", "publicToken": "public-SE-7f1b3d2a2a73d348dfbd17d3965ff1458c249f84c695eac1" } } ``` Use the `publicToken` to [render the checkout iframe](/docs/checkout/renderiframe). For every property you can send, see [Initialize checkout](/docs/checkout/initcheckout). ## Phase 2: Receive the order **When:** the customer completes the purchase. Walley calls your notification endpoint. Answer `200 OK`, then read the session back to get the `orderId` you need for the rest of the flow. ```http GET /api/walley/notify?checkoutId=6f4a9bc3-8d2e-4f1a-9b7c-3e8d2f1a9b7c HTTP/1.1 Host: example.com ``` The `checkoutId` here carries the `privateId` from Phase 1. Answer `200 OK`, or Walley retries. See [Handle purchase callbacks](/docs/checkout/notificationcallback). ```http GET /checkouts/6f4a9bc3-8d2e-4f1a-9b7c-3e8d2f1a9b7c HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` Read `data.order.orderId` from the response and store it. See [Acquire information about a Checkout session](/docs/checkout/getcheckoutinformation) for the full response. :::info Important Treat this callback as the only reliable signal that a purchase completed. Create the order in your system here, not on the browser redirect. ::: ## Phase 3: Capture the payment **When:** you ship the goods or deliver the service. Capturing moves the money. Only captured amounts reach your account. You can capture an order with status [`NotActivated` or `PartActivated`](/docs/manage/concepts/order-lifecycle#order-statuses), in full or a part at a time. :::info Wait briefly before capturing The system is eventually consistent. If you capture immediately after the notification arrives, you may get `404 Not Found` or `403 Forbidden` while the order is still becoming available. Retry with exponential backoff. ::: ```http POST /manage/orders/7890abcd-ef12-3456-7890-abcdef123456/capture HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 { "amount": 1048.00, "actionReference": "SHIP-2024-12345", "items": [ { "id": "PROD-001", "description": "Wireless Headphones", "unitPrice": 999.00, "quantity": 1, "vat": 25.0 }, { "id": "SHIP-001", "description": "Standard Shipping", "unitPrice": 49.00, "quantity": 1, "vat": 25.0 } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/7890abcd-ef12-3456-7890-abcdef123456 ``` Walley answers `202 Accepted` and processes the capture asynchronously. Follow the `Location` header to read the order back. What to know about captures: - You can capture the whole order or part of it, for example only the items you have shipped. - Several partial captures are fine. - Send the `items` array on partial captures so your reconciliation stays accurate. - For B2B customers the `items` array is required, so the customer sees the right VAT. For partial capture, capture by amount, replacing items and error handling, see [Capture order](/docs/manage/orders/capture). ## Phase 4: Refund the order **When:** the customer returns something, or you compensate them. You can only refund what you have already captured. Refund the whole amount or part of it. ```http POST /manage/orders/7890abcd-ef12-3456-7890-abcdef123456/refund HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json Walley-Idempotency: 7c1f0a52-9e34-4b81-9d0a-2f6b8c4d1e77 { "amount": 1048.00, "description": "Full refund, customer cancellation", "actionReference": "REFUND-2024-12345", "items": [ { "id": "PROD-001", "description": "Wireless Headphones", "unitPrice": 999.00, "quantity": 1, "vat": 25.0 }, { "id": "SHIP-001", "description": "Standard Shipping", "unitPrice": 49.00, "quantity": 1, "vat": 25.0 } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/7890abcd-ef12-3456-7890-abcdef123456 ``` Walley answers `202 Accepted` and processes the refund asynchronously. What to know about refunds: - Full refunds, partial refunds, and refunds carrying fees or discounts are all supported. - Send the `items` array on partial refunds so your reconciliation stays accurate. - For B2B customers the `items` array is required, so the customer sees the right VAT. For partial refunds, fees and discounts, replacement articles and error handling, see [Refund order](/docs/manage/orders/refund). ## Phase 5: Reconcile settlements **When:** daily or weekly, as part of your bookkeeping. Settlements normally arrive daily and hold everything you captured, less what you refunded. Read them to match Walley's payouts against your own ledger. ```http GET /reports/settlements?query=startDate:>=2024-12-01%20AND%20endDate:<=2024-12-04&page=1&perPage=10 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "data": [ { "id": "1", "startDate": "2024-12-01T00:00:00", "endDate": "2024-12-04T00:00:00", "storeId": 1, "totalAmount": 100000.0, "currency": "SEK", "captured": 103000.0, "refunded": -3000.0, "reference": "2134" } ] } ``` ```http GET /reports/settlements/1/transactions?page=1&perPage=10 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "data": [ { "orderId": "7890abcd-ef12-3456-7890-abcdef123456", "orderNumber": "ORDER-2024-12345", "type": "Purchase", "amount": 1048.00, "currency": "SEK", "purchaseDate": "2024-12-01", "invoiceNumber": "11111111" } ] } ``` For query parameters, file formats and reconciliation advice, see [Settlements](/docs/reports/settlements-api/settlements). ## Best practices **Security** - Keep API credentials in a secret store, never in source control. - Call the API over HTTPS, and serve your notification endpoint over HTTPS. - Restrict who can reach your notification and validation endpoints. **Error handling** - Retry with exponential backoff rather than in a tight loop. - Log the requests and responses you exchange with Walley, so you can trace an order later. - Alert on repeated failures instead of letting them queue silently. **Idempotency** - Send `Walley-Idempotency` on every capture, refund, cancel and reauthorize. See [Idempotency](/docs/manage/idempotency). - Store the ids of notifications you have processed, so a repeat delivery changes nothing. - Wrap your own state changes in a database transaction. **Operations** - Capture before the order reaches its `expiresAt`, or it expires uncaptured. - Process notifications asynchronously, and answer `200 OK` straight away. - Reconcile settlements on a schedule rather than on demand. ## Next steps You now have an order that goes from checkout to settlement: a session created from your backend, an order created off the notification callback, money captured when you ship, a refund path, and settlement data to reconcile against. From here: - Decide how to handle stock. [Inventory validation](/docs/checkout/common-use-cases/inventory-validation) compares three approaches. - Model your campaigns so refunds still add up. See [Handling discounts](/docs/checkout/common-use-cases/discounts). - Work through the [go-live checklist](/docs/checkout/go-live-checklist) before you switch to production. ## Related documentation - [Initialize checkout](/docs/checkout/initcheckout), every property you can send when creating a session - [Handle purchase callbacks](/docs/checkout/notificationcallback), retry behavior and the events Walley notifies you about - [Acquire checkout information](/docs/checkout/getcheckoutinformation), the full response and what each status means - [Order lifecycle](/docs/manage/concepts/order-lifecycle), how an order moves between statuses - [Capture order](/docs/manage/orders/capture) and [Refund order](/docs/manage/orders/refund), the full request schemas - [Settlements](/docs/reports/settlements-api/settlements), querying and reconciling payouts - [Error codes](/docs/checkout/error-codes), what each status code means and what to do about it --- # Content security policy Source: https://dev.walleypay.com/docs/checkout/content-security-policy.md [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP) is a security mechanism that helps prevent malicious content from being executed on a webpage by specifying trusted sources for scripts, styles, and other resources. ## Walley iframe The Walley iframe is a secure way to collect sensitive payment information. To secure the iframe, only allow content from trusted sources. We strongly recommend that CSP is used to restrict the sources of content that can be loaded. The following domains are used by Walley and should be allowed in your CSP depending on environment. :::info The domain lists below are subject to change. Subscribe for updates in the Merchant Hub to stay up to date. ::: ### Production | URL | Description | | :-------------------------------- | :----------------------------------------- | | https://\*.walleypay.com | Main domain that Walley Pay uses | | https://\*.checkout.walleypay.com | Main domain that Walley Pay uses | | https://\*.paymentiq.io | Needed for card payments | | https://\*.cdn-apple.com | Needed for Apple Pay payments | | https://\*.ingrid.com | Needed if Ingrid delivery adapter is used | ### Test | URL | Description | | :------------------------------------ | :----------------------------------------- | | https://\*.uat.walleydev.com | Main domain that Walley Pay uses | | https://\*.checkout.uat.walleydev.com | Main domain that Walley Pay uses | | https://\*.paymentiq.io | Needed for card payments | | https://\*.cdn-apple.com | Needed for Apple Pay payments | | https://\*.ingrid.com | Needed if Ingrid delivery adapter is used | :::warning Important If you are using the deprecated 'collector.se' URL for iframe loader please update. See [Endpoints](/docs/checkout/endpoints) for more information. ::: --- # Data sources Source: https://dev.walleypay.com/docs/checkout/data-sources.md The Checkout uses various open data sources to enhance the user experience. Including but not limited to the following. - [Finnish Patent and Registration Office](https://avoindata.prh.fi/en/info/swagger-ui) --- # Custom Delivery Adapter Source: https://dev.walleypay.com/docs/checkout/delivery/custom-adapter.md If you want total control of the provided delivery methods, you can build and host your own adapter that provides Walley Checkout with delivery methods. This allows you to separate the items in the cart in multiple shipments, set specific pickup/delivery dates, add options to each delivery etc. ## How to get started 🚀 1. Contact [Walley Merchant Services](/support) for help with setup in our test environment and for questions regarding integration with the Delivery Module. 2. Build a delivery adapter (api) with an endpoint that Walley Checkout will do a GET request towards to get the delivery methods that should respond according to the response below. Use basic auth as authentication. 3. Provide Walley Merchant Services with the adapter endpoint url, basic auth credentials as well as what [fallback strategy](./introduction-delivery-module#fallback-strategy-and-shipping-fees) to use. ## Overview Sequence diagram of the Delivery Module flow between the Checkout frontend, the Checkout API, your delivery adapter and you As shown in the diagram, the Checkout frontend identifies the customer and then asks the Checkout API for delivery methods. The API fetches them from your adapter and returns them to be rendered alongside the payment methods. Once the customer has chosen a delivery and payment option and completed the purchase, the API optionally creates an external shipment against your adapter, then notifies you so you can fetch the checkout and read the selection. ## GET delivery methods Walley Checkout fetches the list of available delivery methods every time the customer changes any relevant information that might lead to a change in available delivery methods, e.g. the customer changes delivery address or updates the cart. ### Custom request parameters When the Checkout sends the GET request to the delivery adapter, apart from some [default parameters](#default-request-query-parameters), a merchant can send custom parameters called `ShippingProperties` that are related to the cart. This is done in either [Initialize checkout](/docs/checkout/initcheckout), [Update checkout](/docs/checkout/optional/updatecheckout) or [Update cart](/docs/checkout/optional/updatecart).
```json { "ShippingProperties": { "height":"10", "width": "20", "isBulky": "true" } } ``` The following scenario would result in the following GET-request to the delivery adapter to fetch the available delivery methods: ``` https://{UriToDeliveryAdaptersGetDeliveryMethodsEndpoint}?currency={currency}&....&height=10&width=20&isBulky=true ``` :::info The height, width, and isBulky values above are examples. Any key/value pair can be used and will be translated to query parameters accordingly. ::: :::info If using a custom delivery adapter where the privateId is sent in the query, you can [Acquire Checkout Information](/docs/checkout/getcheckoutinformation) to get more information. This will add some time for your customer in the checkout, so use it only if necessary. ::: ### Default request query parameters Below are the default query parameters that are included when fetching delivery methods. | Parameter | Explanation | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | **privateId** | The checkout's private id which can be used to fetch information about the checkout | | **storeId** | The storeId for the checkout session | | **currency** | Currency used for the checkout session | | **language** | The display language used for the checkout session, sent as the language part of the [locale](/docs/checkout/languages): sv, nb, fi, da, de, nl, en | | **countryCode** | The country code for the customer's current delivery address | | **postalCode** | The postal code for the customer's current delivery address | | **cartPrice** | The total price for cart | | **cartWeight** | The total weight for the cart, sum of all the article's weights sent in set cart request | | **email** | The customer's email address | | **address** | The address for the customer's current delivery address | | **storeType** | CustomerType for the checkout session, b2b or b2c | | **loyalty-isMember** | Customer loyalty membership, see below | | **loyalty-level** | The member's level, only sent when the member has one, see below | ### Loyalty booster synergies If you are using any of our loyalty boosters, we will include loyalty membership as the query parameter `loyalty-isMember`, set to one of `Yes`, `No` or `New`: - Yes: The customer is an existing member. - No: The customer is not a member and has opted out of becoming one. - New: The customer is not a member but has opted in to become one. Does your loyalty program use membership levels? Then we also send an existing member's level as `loyalty-level=`, for example `loyalty-level=Gold` — the name exactly as you wrote it, and the same level your customer sees in the checkout. No levels, or no level for that member, means no parameter. Use it to price delivery by level: free home delivery for your top level, a reduced fee for the one below. ### Response from adapter The response can contain a lot of data and options that will be available for the customer, but not many of them are required. The [response examples](#response-examples) show both a successful response and an error response. #### Response header | Header | Required | Explanation | | ----------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Expires** | No | A DateTime set if the choices should be valid only for a certain time. We will force the customer to reload delivery methods if a selection is made with delivery methods that has expired. Supported formats are [RFC-7234](https://www.rfc-editor.org/rfc/rfc7234#page-28) or .NET DateTimeOffset for example "Tue, 01 Jan 2002 00:00:00 GMT" or "2002-01-01 00:00:00 +00:00". If the header cannot be parsed, no expiration date is used | #### Response body | Property | Required | Explanation | | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | **configurationId** | No | An optional identifier returned by the adapter to reference which configuration was used. It is also included in the create external shipment request. | | **shipments** | Yes | Array of shipments, at least one must be present | **Shipment Property** | Property | Required | Explanation | | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------- | | **id** | Yes | Id of the shipment | | **name** | Yes | Name of shipment, will be displayed as a header for the entire shipment selection | | **shippingChoices** | Yes | Array of choices that the customer can choose from for the shipment, at least one must be present | | **metadata** | No | Any metadata for the delivery, will not be used in checkout but returned every time you acquire checkout information | | **info** | No | Shipment specific info for costumer with a title and description | **Info Property** | Property | Required | Explanation | | --------------- | -------- | -------------------------------------- | | **title** | Yes | Informational title regarding shipment | | **description** | Yes | Informational text regarding shipment | **ShippingChoice Property** | Property | Required | Explanation | | ------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **id** | Yes | Id of the choice | | **name** | Yes | Name of the choice, will be the title for the selection | | **description** | No | Description of the choice, will be the subtitle for the selection | | **icon** | No | Icon for the choice. Available icon property values can be found [below](#icons). If none is provided, a default icon will be used. | | **fee** | No | Fee for the option, if combined with destinations and/or options, this fee will be added to all of them. Max 2 decimals, i.e. `25.00` | | **destinations** | No | Array of destinations that will be a subselection for the shipping choice | | **options** | No | Array of options that the customer can add optionally to add to the shipping choice | | **metadata** | No | Any metadata for the shipping choice, will not be used in checkout but returned every time you acquire checkout information | | **badges** | No | Array of [Badges](#badges) with text and color for information regarding shipping choice | | **regularFee** | No | If a fee is discounted, this property can return the original non-discounted fee. It allows the checkout to display the regular price alongside the discounted price (shown as a struck-through value in the UI). | | **additionalInformation** | No | Additional information for the choice, shown only when the customer selects it. See [Additional information](#additional-information). | **Destinations Property** | Property | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **id** | Yes | Id of the destination | | **name** | Yes | Name of the destination, will be the title of the selectable destination | | **description** | No | Description of the destination, will be the subtitle of the selectable destination | | **deliveryDates** | No | Array of available delivery dates for the destination | | **fee** | No | Fee for the specified destination. Max 2 decimals, i.e. `100.00` | | **metadata** | No | Any metadata for the destination, will not be used in checkout but returned every time you acquire checkout information | **DeliveryDate Property** | Property | Required | Explanation | | ------------ | -------- | ------------------------------------------------------------------------------------------------------------------------- | | **date** | Yes | DateTime of the selectable delivery date | | **timeFrom** | Yes | Time of the day from where the selectable delivery date option starts | | **timeTo** | Yes | Time of the day from where the selectable delivery date option ends | | **fee** | No | Fee for the specified delivery date. Max 2 decimals, i.e. `100.00` | | **metadata** | No | Any metadata for the delivery date, will not be used in checkout but returned every time you acquire checkout information | **Option Property** | Property | Required | Explanation | | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | | **id** | Yes | Id of the option | | **description** | Yes | Description of the option | | **type** | Yes | Type of the option, available types: "bool" - checkbox, "string" - text field, "number" - digits only | | **fee** | No | Fee for the specified option. Max 2 decimals, i.e. `100.00` | | **metadata** | No | Any metadata for the option, will not be used in checkout but returned every time you acquire checkout information | **Badge Property** | Property | Required | Explanation | | --------- | -------- | ----------- | | **text** | Yes | Badge text | | **color** | No | Badge color | **AdditionalInformation Property** | Property | Required | Explanation | | --------------- | -------- | ---------------------------------------------------------------------------------------------------- | | **description** | Yes | The text shown below the shipping choice when the customer selects it. Supports simplified markdown. | #### Badges Each shipping choice can have multiple [badges](#checkout-example) with text and predefined color. These can be used to add extra information regarding a shipment, such as faster or environmentally friendly shipping. Below are the available colors. | Color property value | Icon | | -------------------- | ---------------------------------- | | **default** | | | **discrete** | | | **red** | | | **green** | | | **yellow** | | | **blue** | | #### Additional information If you want to give the customer extra details about a shipping choice, add an `additionalInformation` object with a `description` to it. Walley Checkout shows the text in an info panel below the choice, but only once the customer has selected it. This keeps the list of delivery methods short while still giving the customer the details they need — for example "Have the PostNord app and Mobile BankID ready when you collect your parcel". - Walley Checkout only shows the panel when `additionalInformation` contains a non-empty `description`. Leave out the object when you have nothing to show. - Walley Checkout shows the text as-is and does not translate it. Use the `language` query parameter to localize the text in your adapter. - The text supports simplified markdown with the following formatting: `**bold**` **bold** `*italic*` *italic* #### Icons The available icons available for a `shippingChoice` is described under [Delivery Icons](./delivery-icons) #### Error message response If the GET-request is received successfully but no delivery methods can be returned, you can choose to return a non-2xx response with the following properties to inform the customer what is wrong and what action to take. This requires the [fallback strategy](./introduction-delivery-module#fallback-strategy-and-shipping-fees) to be set to true. | Property | Required | Explanation | | ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | **title** | No | The title of the failure displayed in the Checkout. Truncated to a maximum of 512 characters. | | **message** | No | The message with a more descriptive text why no delivery methods was found, and how the customer should proceed. Truncated to a maximum of 512 characters. | A default message will be shown if not overridden with title and message from the response. Both title and message must be specified in the response to be used. #### Response examples ```json { "title": "Title to be displayed", "message": "Message to be displayed" } ```
The 200-response from the example above will render the following delivery methods to the customer.

##### Rendered delivery methods {#checkout-example} The example response rendered as two shipments, each with a delivery-time notice and a list of options with prices and tags ## POST create external shipment Creating an external shipment is an optional step with the intent to produce an identifier that we will give to the merchant as an easier way to reference the shipment. For each shipment on the order we will make a POST call to a configured endpoint. The data is a slimmed down version of the shipments data we received in GET delivery methods, but only containing the information selected by the customer. ### Request ### Response ```json { "externalShipmentId": "external-shipment-id-1" } ``` --- # Delivery Icons Source: https://dev.walleypay.com/docs/checkout/delivery/delivery-icons.md When using any delivery Adapter except Ingrid then you can use Delivery Icons. With Ingrid this is configured on Ingrid's side. There are three types of delivery icons: [Carrier logo icons](#carrier-logo-icons), [Walley icons](#walley-icons) and [Custom icon](#custom-icon) ## Carrier logo icons | Value | Icon | | --------------- | ------------------------------------------- | | **airmee** | | | **best** | | | **bring** | | | **bringred** | | | **budbee** | | | **citymail** | | | **dbschenker** | | | **dhl** | | | **dooris** | | | **dsv** | | | **earlybird** | | | **gordon** | | | **helthjem** | | | **instabox** | | | **matkahuolto** | | | **movebybike** | | | **posti** | | | **postnord** | | | **wolt** | | ## Walley icons | Value | Icon | | ---------------- | --------------------------------------------- | | **walley-home** | | | **walley-mail** | | | **walley-plane** | | | **walley-ship** | | | **walley-store** | | | **walley-truck** | | | **_default_ \*** | | \* Default icon is used if no value is provided, or if the value mismatches with any of the available icon property values. ## Custom icon Icon property value: `custom-`, e.g. `custom-mylogo.svg`. To be able to use custom icons, please contact [Walley Merchant Services](/support). Fallback icon if the custom icon is not retrieved is the default icon . --- # Custom Json Example Create External Shipment Request Source: https://dev.walleypay.com/docs/checkout/delivery/examples/custom-json-example-create-external-shipment-request.md ```http POST https://{UriToDeliveryAdaptersCreateExternalShipmentEndpoint} HTTP/1.1 Authorization: Basic Auth Content-Type: application/json { "configurationId": "config-1", "storeId": 123456, "reference": "ABCDEFGHJIKLMNOP", "customer": { "email": "test@walleytest.se", "mobilePhoneNumber": "+46701111111", "deliveryAddress": { "firstName": "Lars-Erik Rudolf", "lastName": "Viberg", "companyName": null, "coAddress": null, "address": "Sommarstugevägen 2", "address2": null, "postalCode": "85353", "city": "Sundsvall", "countryCode": "SE" } }, "shipment": { "id": "shipmentId-1", "metadata": { "key-for-shipment": "metadata-for-shipment" }, "shippingChoice": { "id": "choiceId-1", "metadata": { "key-for-shipping-choice": "metadata-for-shipping-choice" }, "destination" : { "id": "destinationId-gothenburg", "metadata": { "key-for-destination": "metadata-for-destination" }, "deliveryDate": { "date": "2021-02-25T00:00:00+00:00", "timeFrom": "17:00", "timeTo": "21:00", "metadata": { "duringOpenHours": "true" } } }, "options": [ { "id": "option-1", "value": "true" }, { "id": "option-3", "value": "The dog is friendly" } ] } } } ``` --- # Custom Json Example Get Delivery Methods Response Source: https://dev.walleypay.com/docs/checkout/delivery/examples/custom-json-example-get-delivery-methods-response.md ```http HTTP/1.1 200 OK Content-Type: application/json Expires: Tue, 01 Jan 2002 00:00:00 GMT { "configurationId": "config-1", "shipments": [ { "id": "shipmentId-1", "name": "Delivery 1", "info": { "title": "Delivery time affected", "description": "Your cart contains sensitive items which may affect delivery time" }, "metadata": { "key-for-shipment": "metadata-for-shipment" }, "shippingChoices": [ { "id": "choiceId-1", "name": "Pickup in store", "icon": "walley-store", "description": "Pick up your order within five days from your chosen day for pick up", "badges": [ { "text": "Express delivery", "color": "red" } ], "metadata": { "key-for-shipping-choice": "metadata-for-shipping-choice" }, "destinations": [ { "id": "destinationId-gothenburg", "name": "Gothenburg", "description": "Kortedala", "metadata": { "key-for-destination": "metadata-for-destination" }, "deliveryDates": [ { "date": "2021-02-25T00:00:00+00:00", "timeFrom": "07:00", "timeTo": "17:00", "fee": 0.0, "metadata": { "duringOpenHours": "true" } }, { "date": "2021-02-25T00:00:00+00:00", "timeFrom": "17:00", "timeTo": "21:00", "fee": 250.0, "metadata": { "duringOpenHours": "true" } }, { "date": "2021-02-25T00:00:00+00:00", "timeFrom": "21:00", "timeTo": "22:00", "fee": 500.0, "metadata": { "duringOpenHours": "false" } }, { "date": "2021-02-26T00:00:00+00:00", "timeFrom": "07:00", "timeTo": "17:00", "fee": 100.0 }, { "date": "2021-03-01T00:00:00+00:00", "timeFrom": "07:00", "timeTo": "17:00", "fee": 0.0 } ] }, { "id": "destinationId-varberg", "name": "Varberg", "description": "Hunnestad", "deliveryDates": [ { "date": "2021-02-28T00:00:00+00:00", "timeFrom": "09:00", "timeTo": "16:00", "fee": 0.0 }, { "date": "2021-02-28T00:00:00+00:00", "timeFrom": "16:00", "timeTo": "18:00", "fee": 250.0 } ] } ], "fee": 0, "options": [ { "id": "option-1", "description": "Rent trailer", "type": "bool", "fee": 500 }, { "id": "option-2", "description": "Help to pack", "type": "bool", "fee": 250 }, { "id": "option-3", "description": "Additional information", "type": "string", "fee": 0 } ] }, { "id": "choiceId-2", "name": "Home delivery", "icon": "walley-home", "description": "Goods will be delivered as close to your home as possible", "badges": [ { "text": "Lightning fast!", "color": "yellow" }, { "text": "Environmentally friendly", "color": "green" }, { "text": "Carried to your door", "color": "red" } ], "destinations": [ { "id": "destinationId-home", "name": "The most comfortable delivery", "description": "Select day for delivery", "deliveryDates": [ { "date": "2021-03-11T00:00:00+00:00", "timeFrom": "07:00", "timeTo": "17:00", "fee": 200.0 }, { "date": "2021-03-12T00:00:00+00:00", "timeFrom": "07:00", "timeTo": "17:00", "fee": 50.0 } ] }, { "id": "destinationId-home-express", "name": "Express - a lot faster", "description": "When you are in a hurry", "fee": 500, "deliveryDates": [ { "date": "2020-10-01T00:00:00+00:00", "timeFrom": "08:00", "timeTo": "18:00" } ] } ], "fee": 500, "options": [ { "id": "option1", "description": "Notify when delivered", "type": "bool", "fee": 500 } ] }, { "id": "choiceId-3", "name": "Pick up at service point with Postnord", "icon": "postnord", "description": "Select service point", "additionalInformation": { "description": "Have the **PostNord app** and Mobile BankID ready when you collect your parcel" }, "badges": [ { "text": "At your own leisure", "color": "default" }, { "text": "Environmentally friendly", "color": "green" } ], "destinations": [ { "id": "service-point-1", "description": null, "name": "Postnord store, Avenyn" }, { "id": "service-point-2", "description": null, "name": "Postnord store, Backa" } ], "fee": 29 }, { "id": "choiceId-4", "name": "Pick up at service point with Schenker", "icon": "dbschenker", "description": "Select service point", "badges": [ { "text": "Pick up", "color": "green" } ], "destinations": [ { "id": "service-point-1", "description": null, "name": "Schenker store, Avenyn" }, { "id": "service-point-2", "description": null, "name": "Schenker store, Backa" } ], "fee": 29 }, { "id": "choice-without-destination", "name": "Pick up at central warehouse, Kalmar", "icon": "walley-store", "description": "Kalmar street 8", "destinations": null, "fee": 100 } ] }, { "id": "shipmentId-2", "name": "Delivery 2", "info": { "title": "Longer delivery time", "description": "Your cart contains items which are not in stock, this may affect delivery times" }, "shippingChoices": [ { "id": "choice-home-delivery", "name": "Home delivery", "icon": "walley-home", "badges": [ { "text": "Lightning fast!", "color": "yellow" }, { "text": "Environmentally friendly", "color": "green" } ], "destinations": [ { "id": "standard-home-delivery", "description": "Delivery within 5-7 days", "name": "Standard, the most comfortable delivery" }, { "id": "express-home-delivery", "description": "Delivery within 2 days", "name": "Express - a lot faster", "fee": 500 } ], "fee": 1500, "options": [ { "id": "option1", "description": "Bring my old stuff out", "type": "bool", "fee": 500 } ] }, { "id": "choice-without-destination-2", "name": "Pick up at warehouse", "icon": "walley-store", "destinations": null, "fee": 100 } ] } ] } ``` --- # Ingrid Json Example Get Checkout Source: https://dev.walleypay.com/docs/checkout/delivery/examples/ingrid-json-example-get-checkout.md ```http GET /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` Response example: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "1eec44b5-66d3-4058-a31f-3444229fb727", "data": { "customer": { ... }, ..., "status": "PurchaseCompleted", "order": { "totalAmount": 217, "items": [ { "id": "10001", "description": "A product description", "unitPrice": 5, "quantity": 1, "vat": 25, "sku": "Item one sku" }, { "id": "10002", "description": "Item two", "unitPrice": 2, "quantity": 1, "vat": 25, "sku": "Item two sku" }, { "id": "Frakt-1", "description": "Home delivery", "unitPrice": 100, "quantity": 1, "vat": 25 }, { "id": "Frakt-2", "description": "Home delivery", "unitPrice": 110, "quantity": 1, "vat": 25 } ] }, "shipping": { "provider": "Ingrid", "shippingFee": 210.0, "externalSessionId": "VM2-18df6365fb214ef3a175a5c3f0a1038f", "shipments": [ { "id": "shipment-1", "externalShipmentId": "01GE6FJ2J52Z2NHRY17HDJ1977", "feeItemId": "Frakt-1", "metadata": { "customerDeliveryPromise": { "earliest": "2024-01-01T00:00:00", "latest": "2024-01-07T00:00:00" }, "carrierDeliveryPromise": { "earliest": "2024-01-01T00:00:00", "latest": "2024-01-07T00:00:00" }, "pickupFromMerchant": { "earliest": "2024-01-01T00:00:00", "latest": "2024-01-07T00:00:00" } }, "shippingChoice": { "id": "pnl", "name": "Home delivery", "carrier": "PostNord", "product": "MyPack Home", "fee": 100.0, "metadata": null, "destination": { "id": "location-external-id", "name": "Gothenburg", "metadata": { "address": { "addressLines": ["Street 1", "Street 2"], "apartmentNumber": "1", "attn": "", "careOf": "", "city": "City", "companyName": "Company name", "country": "SE", "firstName": "First Name", "lastName": "Last Name", "postalCode": "12345", "region": "Region", "street": "Street 1", "streetNumber": "1" } } } } }, { "id": "shipment-2", "externalShipmentId": "01GE6FJ2J5D3QHTD57XX0B38TS", "feeItemId": "Frakt-2", "metadata": { ... }, "shippingChoice": { "id": "pnl", "name": "Home delivery", "carrier": "PostNord", "product": "MyPack Home", "fee": 100.0, "metadata": { ... }, "destination": { ... }, "options": [ { "id": "b225eaee-c31d-4c30-b6cf-1770f1d208cd", "value": "express", "fee": 10 } ] } } ] }, ... } } ``` --- # Ingrid Json Example Init Checkout Source: https://dev.walleypay.com/docs/checkout/delivery/examples/ingrid-json-example-init-checkout.md ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { ..., "cart": { "items": [ { "id": "10001", "description": "A product description", "unitPrice": 5.0, "quantity": 1, "vat": 25.0, "requiresElectronicId": true, "sku": "1111-111-1111", "shipping": { "tags": ["session-cart-item-tag"], "unitWeight": 10, "dimensions": { "height": 10, "length": 10, "width": 10 }, "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } } ] }, ..., "shipping": { "tags": ["session-cart-tag"], "shipments": [ { "tags": ["session-shipment-tag"], "id": "shipment-1", "contents": [ { "quantity": 1, "sku": "1111-111-1111" } ] } ], "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } }, ... } ``` --- # Ingrid Json Example Update Cart Source: https://dev.walleypay.com/docs/checkout/delivery/examples/ingrid-json-example-update-cart.md ```http PUT /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727/cart HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "items": [ { "id": "10001", "description": "A product description", "unitPrice": 5.0, "quantity": 1, "vat": 25.0, "requiresElectronicId": true, "sku": "1111-111-1111", "shipping": { "tags": ["session-cart-item-tag"], "unitWeight": 10, "dimensions": { "height": 10, "length": 10, "width": 10 }, "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } }, { "id": "10002", "description": "Item two", "unitPrice": 2.0, "quantity": 1, "vat": 25.0, "shipping": { "tags": ["session-cart-item-tag"], "unitWeight": 10, "dimensions": { "height": 10, "length": 10, "width": 10 }, "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } } ] } ``` --- # Ingrid Json Example Update Checkout Source: https://dev.walleypay.com/docs/checkout/delivery/examples/ingrid-json-example-update-checkout.md ```http PUT /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "cart": [ { "id": "10001", "description": "A product description", "unitPrice": 5.0, "quantity": 1, "vat": 25.0, "requiresElectronicId": true, "sku": "1111-111-1111", "shipping": { "tags": ["session-cart-item-tag"], "unitWeight": 10, "dimensions": { "height": 10, "length": 10, "width": 10 }, "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } }, { "id": "10002", "description": "Item two", "unitPrice": 2.0, "quantity": 1, "vat": 25.0, "shipping": { "tags": ["session-cart-item-tag"], "unitWeight": 10, "dimensions": { "height": 10, "length": 10, "width": 10 }, "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } } ], "shipping": { "tags": ["session-cart-tag"], "shipments": [ { "tags": ["session-shipment-tag"], "id": "shipment-1", "contents": [ { "quantity": 1, "sku": "1111-111-1111" } ] }, { "tags": ["session-shipment-tag"], "id": "shipment-2", "contents": [ { "quantity": 1, "sku": "10002" } ] } ], "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00", "alternatives": [ { "name": "alternative-name", "shippingInterval": { "startDate": "2024-01-01T00:00:00", "endDate": "2024-01-07T00:00:00" } } ] } } } ``` --- # Json Example Get Merchant After Fallback Source: https://dev.walleypay.com/docs/checkout/delivery/examples/json-example-get-merchant-after-fallback.md Simplified Get Checkout Information response with focus on the shipping and order objects: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "9eec015f-4b97-44be-a711-d22f3af75069", "data": { "customer": {...}, ..., "status": "PurchaseCompleted", "order": { "orderId": "9ea42d44-5fca-49c1-9864-b29600c7201a", "totalAmount": 17.98, "items": [ { "id": "11111", "description": "Item one", "unitPrice": 1, "quantity": 1, "vat": 25, "sku": "Item one sku" }, { "id": "222222", "description": "Item two", "unitPrice": 2, "quantity": 1, "vat": 25, "sku": "Item two sku" }, { "id": "9999", "description": "Shipping cost", "type": "ShippingFee", "unitPrice": 14.98, "quantity": 1, "vat": 25 } ] }, "shipping": { "provider": "MerchantFallback", "shippingFee": 14.98, "shipments": [ { "id": "9999", "feeItemId": "9999", "shippingChoice": { "id": "9999", "name": "Shipping cost", "fee": 14.98, "vat": 25 } } ] }, ... }, "error": null } ``` --- # Json Example Get Merchant Happy Path Source: https://dev.walleypay.com/docs/checkout/delivery/examples/json-example-get-merchant-happy-path.md Simplified Get Checkout Information response with focus on the shipping and order objects: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "9eec015f-4b97-44be-a711-d22f3af75069", "data": { "customer": {...}, ..., "status": "PurchaseCompleted", "order": { "orderId": "9ea42d44-5fca-49c1-9864-b29600c7201a", "totalAmount": 2757, "items": [ { "id": "11111", "description": "Item one", "unitPrice": 5, "quantity": 1, "vat": 25, "sku": "Item one sku" }, { "id": "222222", "description": "Item two", "unitPrice": 2, "quantity": 1, "vat": 25, "sku": "Item two sku" }, { "id": "Frakt-1", "description": "Pickup in store", "unitPrice": 750, "quantity": 1, "vat": 25 }, { "id": "Frakt-2", "description": "Home delivery", "unitPrice": 2000, "quantity": 1, "vat": 25 } ] }, "shipping": { "provider": "DeliveryAdapterName", "shippingFee": 2750, "shipments": [ { "id": "shipmentId-1", "externalShipmentId": "ABC", "feeItemId": "Frakt-1", "metadata": { "key-for-shipment": "metadata-for-shipment", "from-store-id": "1234" }, "shippingChoice": { "id": "choiceId-1", "name": "Pickup in store", "fee": 0, "metadata": { "key-for-choice-1": "metadata-for-choice-1" }, "destination": { "id": "destinationId-gothenburg", "name": "Gothenburg", "fee": 0, "metadata": { "key-for-destination": "metadata-for-destination" }, "deliveryDate": { "fee": 0, "metadata": { "duringOpenHours": "true" }, "date": "2021-02-25", "timeFrom": "07:00", "timeTo": "17:00" } }, "options": [ { "id": "option-1", "description": "Rent trailer", "type": "bool", "fee": 500, "value": true }, { "id": "option-2", "description": "Help to pack", "type": "bool", "fee": 250, "value": true }, { "id": "option-3", "description": "Additional information", "type": "string", "fee": 0, "value": "Some info" } ] } }, { "id": "shipmentId-2", "externalShipmentId": "DEF", "name": "Home delivery", "feeItemId": "Frakt-2", "metadata": null, "shippingChoice": { "id": "choice-home-delivery", "fee": 1500, "metadata": null, "destination": { "id": "standard-home-delivery", "name": "Standard, the most comfortable delivery", "fee": 0, "metadata": null, "deliveryDate": null }, "options": [ { "id": "option1", "description": "Bring my old stuff out", "type": "bool", "fee": 500, "value": true } ] } } ] }, ... }, "error": null } ``` --- # Json Example Get Merchant Without External Shipment Source: https://dev.walleypay.com/docs/checkout/delivery/examples/json-example-get-merchant-without-external-shipment.md Simplified Get Checkout Information response with focus on the shipping and order objects: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "9eec015f-4b97-44be-a711-d22f3af75069", "data": { "customer": {...}, ..., "status": "PurchaseCompleted", "order": { "orderId": "9ea42d44-5fca-49c1-9864-b29600c7201a", "totalAmount": 85, "items": [ { "id": "11111", "description": "Item one", "unitPrice": 5, "quantity": 1, "vat": 25, "sku": "Item one sku" }, { "id": "222222", "description": "Item two", "unitPrice": 2, "quantity": 1, "vat": 25, "sku": "Item two sku" }, { "id": "Frakt-1", "description": "Pickup in store", "unitPrice": 78, "quantity": 1, "vat": 25 } ] }, "shipping": { "provider": "nShift", "shippingFee": 78, "shipments": [ { "id": "shipmentId-1", "externalShipmentId": null, "feeItemId": "Frakt-1", "metadata": { "key-for-shipment": "metadata-for-shipment", "from-store-id": "1234" }, "shippingChoice": { "id": "choiceId-1", "name": "Postnord home delivery", "fee": 49, "metadata": { "key-for-choice-1": "metadata-for-choice-1" }, "destination": { "id": "destinationId-gothenburg", "name": "Gothenburg", "fee": 0, "metadata": { "key-for-destination": "metadata-for-destination" }, "deliveryDate": { "fee": 0, "metadata": { "duringOpenHours": "true" }, "date": "2021-02-25", "timeFrom": "07:00", "timeTo": "17:00" } }, "options": [ { "id": "option-1", "description": "Express delivery", "type": "bool", "fee": 29, "value": true } ] } } ] }, ... }, "error": null } ``` --- # Json Example Get Merchant Without Shipping Source: https://dev.walleypay.com/docs/checkout/delivery/examples/json-example-get-merchant-without-shipping.md Simplified Get Checkout Information response with focus on the shipping and order objects: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "9eec015f-4b97-44be-a711-d22f3af75069", "data": { "customer": {...}, ..., "status": "PurchaseCompleted", "order": { "orderId": "9ea42d44-5fca-49c1-9864-b29600c7201a", "totalAmount": 7, "items": [ { "id": "11111", "description": "Item one", "unitPrice": 5, "quantity": 1, "vat": 25, "sku": "Item one sku" }, { "id": "222222", "description": "Item two", "unitPrice": 2, "quantity": 1, "vat": 25, "sku": "Item two sku" } ] }, ... }, "error": null } ``` --- # Get delivery selection after purchase Source: https://dev.walleypay.com/docs/checkout/delivery/get-selected-delivery-method.md ## Get the customer's selected delivery method When [Acquiring Checkout Information](/docs/checkout/getcheckoutinformation), a `data.shipping` object will be available that will reflect the customer's current delivery selection. If this value is null, there are no selection at that current state of the checkout. After purchase the selections are included in the order. There will be four scenarios that can occur for the checkout session regarding the delivery selection: 1. We successfully received delivery methods 1. And successfully created external shipment. 2. External shipment was not created, due to opting out of the optional feature or a technical issue. 2. We failed to receive delivery methods (and have therefore not been able to create any external shipment) 1. And a [fallback shipment](./introduction-delivery-module#fallback-strategy-and-shipping-fees) was set during checkout initialization 2. And no fallback shipment was set. :::info For scenario 1.2, the shipment will not have an externaShipmentId (null). However, all other relevant information will still be provided, allowing you to see where the customer intends to have their packages delivered (including the carrier and service point). For scenario 2.2, the shipping object will not exist. You will need to manually create the shipment for your customer based on the delivery address. For this scenario, the delivery will always be free of charge for the customer. ::: Below are examples of the JSON structure of the `shipping` object for the four scenarios. :::info This can occur for different reasons: 1. A technical issue occurred that prevented the creation of the external shipment. 2. The creation of the external shipment was skipped (this occurs when using a custom delivery adapter, without the external shipment configuration). ::: ### nShift delivery adapter If using nShift Delivery Adapter, Walley Checkout will attempt to create a prepared shipment at nShift that is not yet activated. When we do this we get a prepareId from nShift that we will hand over to you as `externalShipmentId`. When the package is ready to be delivered, you need to activate the delivery by sending a request to nShift with this prepareId. See [nShift's documentation](https://www.unifaunonline.se/rs-docs/##prepared_shipments_prepareId_shipments) how to activate the prepared shipment. --- # Ingrid Adapter Source: https://dev.walleypay.com/docs/checkout/delivery/ingrid.md Ingrid Delivery Platform, which can be used to power Walley Checkout, connects retailers, carriers and consumers to create a better shopping experience for everyone.
## How to get started 🚀 1. Contact [Walley Merchant Services](/support) for help with setup in our test environment and for questions regarding integration Ingrid. 2. If you do not have one already, then create an account with Ingrid 3. Provide Walley Merchant Services with Ingrid API key as well as what [fallback strategy](./introduction-delivery-module#fallback-strategy-and-shipping-fees) to use. ## Ingrid links Ingrid
Ingrid developer documentation
Ingrid support documentation for Walley Integration ## Loyalty booster synergies If you are using any of our loyalty boosters, we forward the customer's membership to Ingrid as the cart attribute `loyalty-isMember`, set to one of `Yes`, `No` or `New` — for example `loyalty-isMember=Yes`: * Yes: The customer is an existing member. * No: The customer is not a member and has opted out of becoming one. * New: The customer is not a member but has opted in to become one. Does your loyalty program use membership levels? Then we also send an existing member's level as the cart attribute `loyalty-level=`, for example `loyalty-level=Gold` — the name exactly as you wrote it, and the same level your customer sees in the checkout. No levels, or no level for that member, means no attribute. Use it to price shipping by level in Ingrid: free home delivery for your top level, a reduced fee for the one below. ## Extending regular Walley API requests Walley checkout with Ingrid might require more information than a regular walley checkout. Below are examples of how to extend the regular Walley API requests to include the necessary information for Ingrid. :::info Important This only updates shipping information at the cart level — you cannot change global shipping properties with this endpoint. This can lead to conflicts when using split-shipping since a shipment might refer to a specific cart item. If you use split-shipment, use the Update Checkout operation instead. ::: ### Walley ⇨ Ingrid data mapping | Walley checkout cart items properties | Ingrid request properties | | ------------------------------------------------------------------- | ---------------------------------------------------------- | | id | cart.items.sku (if sku is not present) | | description | cart.items.name | | unitPrice | cart.items.price | | quantity | cart.items.quantity | | sku | cart.items.sku | | shipping.tags | cart.items.attributes | | shipping.unitWeight | cart.items.weight | | shipping.dimensions | cart.items.dimensions | | shipping.shippingInterval.startDate | cart.items.shipping_date.start | | shipping.shippingInterval.endDate | cart.items.shipping_date.end | | shipping.shippingInterval.alternatives[].name | cart.items.shipping_date.category_tags.name | | shipping.shippingInterval.alternatives[].shippingInterval.startDate | cart.items.shipping_date.category_tags.shipping_data.start | | shipping.shippingInterval.alternatives[].shippingInterval.endDate | cart.items.shipping_date.category_tags.shipping_data.end | | Walley checkout shipping properties | Ingrid request properties | | ---------------------------------------------------------- | ---------------------------------------------------- | | tags | cart.attributes | | shipments[].tags | cart.groups.attributes | | shipments[].id | cart.groups.group_id | | shipments[].contents[].sku | cart.groups.contents.sku | | shipments[].contents[].quantity | cart.groups.contents.quantity | | shippingInterval.startDate | cart.shipping_data.start | | shippingInterval.endDate | cart.shipping_data.end | | shippingInterval.alternatives[].name | cart.shipping_date.category_tags.name | | shippingInterval.alternatives[].shippingInterval.startDate | cart.shipping_date.category_tags.shipping_data.start | | shippingInterval.alternatives[].shippingInterval.endDate | cart.shipping_date.category_tags.shipping_data.end | ## Extending regular Walley API GET checkout response As with any delivery adapter walley provide information about the selected delivery when you [get checkout information](/docs/checkout/getcheckoutinformation) located in the `shipping` property. When using the Ingrid Adapter you will get additional data that you can find in the mapping tables below. ### Walley provided shipping data | Walley checkout properties | Walley provided values | | ---------------------------------------| --------------------------------------------------------------------------------------------------------------------------- | | shipping.provider | 'Ingrid' or 'MerchantFallback' | | shipping.shippingFee | Total cost of all deliveries | | shipping.externalSessionId | The Ingrid session id. Returned once the purchase is completed, so you can fetch the remaining delivery data from Ingrid. | | shipping.shipments[] | All of the data in each shipment (except feeItemId) is taken from the Ingrid session, and can be found in the table below. | | shipping.shipments[].feeItemId | Id for the shipping fee item | ### Ingrid ⇨ Walley data mapping | Walley checkout shipment properties (found in shipping.shipments[]) | Ingrid delivery group properties (found in session.delivery_groups[]) | -------------------------------------------------------------------- | ---------------------------------------------------------------------------- | id | group_id | externalShipmentId | tos_id | metadata.customerDeliveryPromise.earliest | delivery_time.customer_delivery_promise.earliest | metadata.customerDeliveryPromise.latest | delivery_time.customer_delivery_promise.latest | metadata.carrierDeliveryPromise.earliest | delivery_time.carrier_delivery_promise.earliest | metadata.carrierDeliveryPromise.latest | delivery_time.carrier_delivery_promise.latest | metadata.pickupFromMerchant.earliest | delivery_time.pickup_from_merchant.earliest | metadata.pickupFromMerchant.latest | delivery_time.pickup_from_merchant.latest | shippingChoice.id | shipping.carrier_product_id | shippingChoice.name | category.presented_category_name (falls back to category.name, then shipping.carrier) | shippingChoice.carrier | shipping.carrier | shippingChoice.product | shipping.product | shippingChoice.fee | pricing.price / 100 | shippingChoice.metadata | shipping.meta | shippingChoice.destination.id | address.location.external_id | shippingChoice.destination.name | address.location.name | shippingChoice.destination.metadata.address.addressLines | address.location.address.addressLines | shippingChoice.destination.metadata.address.apartmentNumber | address.location.address.apartmentNumber | shippingChoice.destination.metadata.address.attn | address.location.address.attn | shippingChoice.destination.metadata.address.careOf | address.location.address.careOf | shippingChoice.destination.metadata.address.city | address.location.address.city | shippingChoice.destination.metadata.address.companyName | address.location.address.companyName | shippingChoice.destination.metadata.address.country | address.location.address.country | shippingChoice.destination.metadata.address.firstName | address.location.address.firstName | shippingChoice.destination.metadata.address.lastName | address.location.address.lastName | shippingChoice.destination.metadata.address.postalCode | address.location.address.postalCode | shippingChoice.destination.metadata.address.region | address.location.address.region | shippingChoice.destination.metadata.address.street | address.location.address.street | shippingChoice.destination.metadata.address.streetNumber | address.location.address.streetNumber | shippingChoice.options[].id | shipping.delivery_addons[].id | shippingChoice.options[].value | shipping.delivery_addons[].external_addon_id | shippingChoice.options[].fee | shipping.pricing.price_components[].value ### Total shipping fee per shipment There is no single property that holds the total shipping cost for a shipment. When using split shipping you calculate the total fee for each shipment in `shipping.shipments[]` by summing the fees of the selected delivery: ``` shippingChoice.fee + shippingChoice.destination.fee + shippingChoice.destination.deliveryDate.fee + sum(shippingChoice.options[].fee) ``` :::note Properties that are not part of the selected delivery are omitted or `null`, and should be treated as `0` in the calculation. ::: The sum of the total fee of all shipments equals `shipping.shippingFee`. ### Example --- # Introduction Source: https://dev.walleypay.com/docs/checkout/delivery/introduction-delivery-module.md

With the Delivery Module, selection of delivery method is integrated into Walley Checkout. This gives a better user experience when selection of delivery methods are done after identification based on the given delivery address and the content in the cart. The Delivery Module is built in a way that it can interact with multiple different providers, and you can even build one yourself. The providers of such delivery methods will be referred to as delivery adapters. ## Current delivery adapters - Ingrid Adapter - An adapter built by Walley that handles integration with the Ingrid Delivery Platform. By creating an Ingrid account and provide us with the required credentials you can get started rather easily. - nShift Adapter - An adapter built by Walley that handles integration with nShift's APIs. By creating a Delivery Checkout configuration in nShift and provide us with the required credentials you can get started rather easily. - Custom Adapter - Build and host your own adapter that Walley Checkout will call to get the available delivery methods. This option gives you maximum flexibility and features to supply the Delivery Module with delivery methods. - Redlight Adapter - An adapter built by [Redlight Media](https://redlight.se/produkt/walley-shipping/) for merchants using WooCommerce. ## Fallback strategy and shipping fees If, for any reason, Walley Checkout does not receive any delivery methods from the delivery adapter, there are two different behaviors that can be applied; stop the purchase, or let the purchase through. This behavior is controlled by a setting that is set by Merchant Services [help@walley.se](mailto:help@walley.se) for your profile. - **Stop the purchase**: We will show an error and stop the purchase if we cannot fetch at least one valid delivery method - **Continue**: We will allow the customer to complete the purchase, with an optional fallback shipping fee. This fallback fee can be set when initializing the checkout session using the `fees.shipping` property. If no fallback fee is set then no shipping fee is charged. Regular shipping fees should be configured inside whichever adapter system you are using, for every delivery method, and the fee will be added to the order as the customer changes selection, and the `fees.shipping` object for [Initialize Checkout](/docs/checkout/initcheckout) is instead only used for fallback purposes. ## Client-side event A [client side event](/docs/checkout/optional/clientevents) is sent every time the delivery method information is changed. This event can be used to display the most recent delivery information outside Walley Checkout. When this event is received, the information can be fetched by [Acquire Checkout Information](/docs/checkout/getcheckoutinformation) in the `data.shipping` object. ```javascript // Start listening to the shipping updated event document.addEventListener("walleyCheckoutShippingUpdated", listener); ``` --- # nShift Adapter Source: https://dev.walleypay.com/docs/checkout/delivery/nshift.md nShift DeliveryCheckout, which can be used to power Walley Checkout with delivery options, is a solution that enables the merchant to easily add new delivery options from nShift's extensive carrier library. The merchant can also easily configure business rules to handle for instance price levels for free delivery and ranking of delivery options.

## nShift features The nShift Delivery Adapter is built and hosted by Walley. The adapter communicates with nShift and fetches the list of available delivery methods based on the configuration that the merchant has created. The response from nShift is mapped to suit the adapter interface and provides the DeliveryCheckout with options. Since new services and features are added in nShift, we might not support all the features that are available in nShift. If you are interested in a feature that is not listed below, please contact Walley. ### Custom request query parameters When the delivery adapter sends the GET request to nshift, apart from some [default parameters](#default-request-query-parameters), a merchant can send custom parameters called `ShippingProperties` that are related to the cart. This is done in either [Initialize checkout](/docs/checkout/initcheckout), [Update checkout](/docs/checkout/optional/updatecheckout) or [Update cart](/docs/checkout/optional/updatecart).
```json { "ShippingProperties": { "height":"10", "width": "20", "isBulky": "true" } } ``` The following scenario would result in the following GET-request to the nShift api to fetch the available delivery methods: ``` https://api.unifaun.com/rs-extapi/v1/delivery-checkouts/{id}?currency={currency}&....&height=10&width=20&isBulky=true ``` :::info The height, width, and isBulky values above are examples. Any key/value pair can be used and will be translated to query parameters accordingly. ::: ### Default request query parameters Below are the default query parameters that are always included when fetching delivery methods. | Parameter | Explanation | | ------------- | ---------------------------------------------------------------------------------------------- | | **currency** | Currency used for the checkout session | | **language** | The display language used for the checkout session. Supported language are: sv, no, fi, da, en | | **tocountry** | The country code for the customer's current delivery address | | **tozipcode** | The postal code for the customer's current delivery address | | **cartprice** | The total price for cart | | **weight** | The total weight for the cart, sum of all the article's weights sent in set cart request | | **toemail** | The customer's email address | | **tostreet** | The address for the customer's current delivery address | | **storetype** | CustomerType for the checkout session, b2b or b2c | ### Delivery options and service points Delivery options with or without service points are the most basic setup that we support fully. Selections will be included when we attempt to create the [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter). ### Individual delivery option addons Some delivery options have addons that can be configured in nShift Online. For now, we do not show any of these addons in the Delivery Module: - Notification by e-mail (addon id "FCNOTIFYEMAIL") - Notification by sms (addon id "FCNOTIFYSMS") If they are enabled in your configuration, they will automatically be added from the customer's profile when we create the [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter). The fee for such addon should always be free since there is no chance for the customer to change it. ### Delivery option icon The icon for a delivery option can be overridden by adding a General (Key / Value) values included in the result of the GET call. Add an item with Key: `logoId`. The available values are described under [Delivery Icons](/docs/checkout/delivery/delivery-icons). ### Individual delivery option delivery dates Some carriers have an option to enable delivery times. For now, we have support for this setting for Airmee. Others might work but we do not guarantee it. If this settings is enabled, the selection will be included when we create the [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter). ### Global extra data fields Extra data fields can be added globally to your configuration. For now, we only support "Door code", which will appear on all your delivery options in the Delivery Module that does not have any service points. If this extra field is enabled, the door code will be included when we create the [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter). ### Global custom addons If custom addons are added to your configuration we will show them as toggle selections with the description and price that are configured. Note that they must be added globally. An example could be to toggle express delivery for an extra fee. :::info Custom addons are not included in the [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter). That information is only available in the [get checkout response](/docs/checkout/delivery/get-selected-delivery-method). ::: ### Certificates The Nordic Swan Ecolabel can be configured in [nShift](https://helpcenter.nshift.com/hc/en-us/articles/10575915896988-Carrier-certification-The-Nordic-Swan-Ecolabel) to highlight certified carrier options. A delivery option carrying the Nordic Swan Ecolabel ## How to get started 🚀 1. Contact [Walley Merchant Services](/support) for help with setup in our test environment and for questions regarding integration with Walley Checkout. 2. Create a nShift DeliveryCheckout configuration. Visit [nShift](https://nshift.com/products/delivery-checkout) to read more and contact nShift for questions regarding prices, configuration etc. 3. Provide Walley Merchant Services with the nShift api-credentials (`Id` and `Secret Id`) as well as the `Delivery Checkout Id` and `Quick Id` of the sender to use as well as what [fallback strategy](./introduction-delivery-module#fallback-strategy-and-shipping-fees) to use. Once a DeliveryCheckout configuration is in place and properly tested in the test environment, then you are good to go. **Note**: Once the `Quick Id` has been set it must not change. :::info Important During test and development, you can use the nShift DeliveryCheckout production configuration. However, this means purchases made in the Walley test environment will create [prepared shipments](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter) against your nShift production account. Treat such prepared shipments as test. ::: :::info If you update the delivery configuration while running in production, read the section on how to work with [versions](https://help.unifaun.com/udc-se/en/18540-versions.html). Versions make it possible to create a [prepared shipment](/docs/checkout/delivery/get-selected-delivery-method#nshift-delivery-adapter) for customers that fetched delivery methods with the older configuration. ::: --- # Deprecation Notice – Migration from checkout-api.collector.se to walleypay.com Source: https://dev.walleypay.com/docs/checkout/deprecation-notice-collector-api.md The Checkout API hosted on the collector.se domain is being retired. Move your integration to a walleypay.com URL to keep it working. :::warning Shutdown date: 31st of October 2026 The **Walley Checkout API** currently hosted on the `collector.se` domain is deprecated and will be permanently shut down on **31st of October 2026**. Until then, it continues to work as before. ::: Merchants and platforms **must update their integration** to use a URL on the `walleypay.com` domain before this date. Only the domain is being retired, the API itself is not changing. You have two migration options, described below. ## What is changing? **Old URL (deprecated):** ``` https://checkout-api.collector.se ``` **New URL (minimal change):** ``` https://api-legacy.checkout.walleypay.com ``` **Or migrate to the current Walley API (recommended):** ``` https://api.walleypay.com ``` ## Option 1: Migrate to the current Walley API (recommended) The current version of the Checkout API is hosted on `api.walleypay.com` and uses **Bearer token authentication** instead of SharedKey. This is the version all new integrations use, and it is where the platform is actively developed. Migrating involves: 1. Generate API credentials (client id and secret) in [Walley Merchant Hub](https://merchanthub.walleypay.com), see [Authentication](/docs/checkout/authorization). 2. Request an access token from the authentication endpoint and send it as an `Authorization: Bearer {access_token}` header on every request. 3. Use the current endpoints, e.g. `POST https://api.walleypay.com/checkouts` to initialize a checkout session, see [Endpoints](/docs/checkout/endpoints) and [Initialize Checkout](/docs/checkout/initcheckout). The request and response payloads are the same as you use today, so for most integrations this is a change of authentication and base URL only. ## Option 2: Change the URL only (minimal change) If you cannot make code changes right now, you can keep your existing integration exactly as it is and only replace the hostname. All request paths stay the same, whichever style your integration uses today: **Example: initialize a checkout** ``` Old: POST https://checkout-api.collector.se/checkouts New: POST https://api-legacy.checkout.walleypay.com/checkouts ``` **Example: update the cart (older path style)** ``` Old: PUT https://checkout-api.collector.se/merchants/{storeId}/checkouts/{checkoutId}/cart New: PUT https://api-legacy.checkout.walleypay.com/merchants/{storeId}/checkouts/{checkoutId}/cart ``` Your existing **SharedKey authentication and request signing continue to work unchanged** on the new hostname, no code changes, no new credentials. Only the base URL in your configuration changes. :::info Transitional domain `api-legacy.checkout.walleypay.com` is a transitional domain for existing SharedKey integrations. It will remain available during the migration period, but new functionality is only released on the current API. We recommend planning a move to [Option 1](#option-1-migrate-to-the-current-walley-api-recommended) when possible. ::: ## Test environment The same migration applies to the test environment: **Old test URL (deprecated):** ``` https://checkout-api-uat.collector.se ``` **New test URL (minimal change):** ``` https://api-legacy.checkout.uat.walleydev.com ``` **Or the current Walley API (recommended):** ``` https://api.uat.walleydev.com ``` ## Required action All merchants and platform partners must, before **31st of October 2026**: 1. Choose a migration option: - **Option 1 (recommended):** Implement the current Walley API on `api.walleypay.com` with Bearer token authentication. - **Option 2 (minimal change):** Replace the hostname `checkout-api.collector.se` with `api-legacy.checkout.walleypay.com` in your configuration. 2. Verify that your integration continues to work as expected: initialize a checkout session and confirm that order administration flows work in your test environment before changing production. ## Questions? If you have any questions or need assistance with the migration, please contact our support team. --- # Deprecation Notice – Migration from collector.se to walleypay.com Source: https://dev.walleypay.com/docs/checkout/deprecation-notice-collector-loader.md The Collector Checkout Loader script hosted on the collector.se domain is being retired. Move your integration to the walleypay.com URL to keep it working. :::warning Shutdown date: 1st of October 2026 The `collector-checkout-loader.js` script on the `collector.se` domain is deprecated and will be shut down on **1st of October 2026**. ::: Merchants and platforms **must update their integration** to use the new URL on the `walleypay.com` domain. ## What is changing? **Old URL (deprecated):** ```html ``` **Or (deprecated):** ```html ``` **New URL (current):** ```html ``` ## Test environment The same migration applies to the test environment: **Old test URL (deprecated):** ```html ``` **New test URL (current):** ```html ``` ## Timeline - Current behavior: Requests to the old URL are automatically redirected (HTTP 301) to the new one. - Deprecation period: The collector.se domain will remain online until **1st of October 2026** to allow time for migration. - Shutdown: After this period, the old domain will be permanently shut down and no longer serve the script. ## Required action All merchants and platform partners must: 1. Replace all references to: ```html ``` or: ```html ``` with: ```html ``` 2. Verify that your integration continues to work as expected. :::warning Important Failure to update before the shutdown will result in checkout integrations **no longer functioning**. ::: ## Questions? If you have any questions or need assistance with the migration, please contact our support team. --- # Strong customer identification for all credit purchases Source: https://dev.walleypay.com/docs/checkout/embedded/sca-on-all-purchases.md A new law on the Swedish market to strongly identify customers when offering credit payments online expected to become final in January 2023. The reason is to limit fraudulent behavior when using credits in online shopping. [Read more on the Swedish Government website](https://www.regeringen.se/rattsliga-dokument/lagradsremiss/2022/07/stark-kundautentisering-vid-fakturabetalningar-online/) ## What is required When a consumer purchases online the consumer must be strongly identified using two-factor authentication. ## Primary solution Walley see that the best option going forward is to embed Walley on your e-commerce site. The reason behind this is that offering end customers credits is currently under a lot of investigations from authorities in the Nordic countries. To be future proof we encourage you to use this solution. ## Overview These are the basic steps you need to take ### 1. Embed Walley Embed a slim variant of Walley Checkout on your e-commerce page. This can be mounted in any element on your page, including a modal that is only shown upon request. A merchant page with the embedded Walley Checkout beside the cart ### 2. We take care of strong identification We will prompt the user for strong identification when the purchase is about to be completed The merchant page behind a BankID identification dialog ### 3. Register completed orders You will register new orders by listening to callbacks/webhooks from us The merchant page showing an order confirmation ### Basic steps 1. Acquire API keys through Merchant Hub. [https://merchanthub.walleypay.com/](https://merchanthub.walleypay.com/) 2. Use API keys to [acquire a token for authentication](/docs/checkout/authorization) 3. [Start a session](/docs/checkout/initcheckout) using the acquired token 4. [Embed Walley](/docs/checkout/renderiframe) on your page 5. [Listen for completed purchases](/docs/checkout/notificationcallback) and register them in your own system 6. [Manage your orders](/docs/checkout/orderAdministration) (in the same way you do today or through our management API) --- # Endpoints Source: https://dev.walleypay.com/docs/checkout/endpoints.md The hostname in the example requests throughout this documentation should be changed to the environment currently being used. For testing and staging purposes, Walley Merchant Services will setup an account in the UAT environment where you can test your implementation before moving to production. ## Testing endpoints 🧪 No real money will be involved in transactions. | Environment | Checkout Environment Endpoint | Description | | ----------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | Backend API | https://api.uat.walleydev.com/checkouts | Called from your backend to initialize and update checkout sessions, and to obtain information about checkout sessions and completed purchases. | | Iframe loader script | https://api.uat.walleydev.com/walley-checkout-loader.js | Used for loading the checkout iframe. | | Authentication Endpoint | https://api.uat.walleydev.com/oauth2/v2.0/token | Read about [Authentication](/docs/checkout/authorization) | ## Production endpoints 🚀 All purchases are real and real money will be involved in transactions. | Environment | Checkout Environment Endpoint | Description | | ----------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | Backend API | https://api.walleypay.com/checkouts | Called from your backend to initialize and update checkout sessions, and to obtain information about checkout sessions and completed purchases. | | Iframe loader script | https://api.walleypay.com/walley-checkout-loader.js | Used for loading the checkout iframe. | | Authentication Endpoint | https://api.walleypay.com/oauth2/v2.0/token | Read about [Authentication](/docs/checkout/authorization) | --- # Error codes Source: https://dev.walleypay.com/docs/checkout/error-codes.md When consuming the Checkout API, the following error codes can occur and should be handled according to the instructions Codes 400 to 503 are standard HTTP status codes. Code 900 is a Walley-specific status code for business errors, outside the standard HTTP range. Every code is also returned in the `error.code` property of the response body, with the specific cause in `error.errors[].reason`. | Error code | Meaning | Action | | ---------- | :------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | | 400 | Bad or faulty request. Please examine the errors property for details. | Check your request | | 401 | The resource requested requires authentication. | Check your authentication | | 403 | Access to the requested resource is denied. | Check that you are using the correct credentials and StoreId | | 404 | The resource requested was not found. | See if your are using the correct route and base URL | | 409 | The request could not be completed due to a conflict with the current state of the target resource. | Implement retry logic | | 423 | The resource requested is currently locked for modification. Try again. | Implement retry logic | | 500 | An unhandled exception has occurred. Please contact Walley! | Contact Walley | | 503 | Service unavailable. | Contact Walley | | 900 | The request was rejected by the server due to a business error. | Business error. See details in response to take action | --- # Acquire information about a Checkout session Source: https://dev.walleypay.com/docs/checkout/getcheckoutinformation.md Use the privateId property, also referred to as the private Checkout Id, to acquire information about an ongoing or completed Checkout for up to 90 days after the session was created. If the customer does not complete a purchase within 7 days, Walley aborts the session and requests for that private checkout id return a 404 Not Found. :::info Before you start You need the `privateId` returned by [Initialize checkout](/docs/checkout/initcheckout) and an [authorization header](/docs/checkout/authorization). ::: Acquire the information by sending a GET request to the following URI: [https://api.uat.walleydev.com](/docs/checkout/endpoints)/checkouts/[`{privateId}`](/docs/checkout/initcheckout) ## The GET request The GET request is always issued in the same way, but the response can differ depending on the state of the Checkout session and how the customer has been identified, as well as if it is a B2B or B2C session. ```http GET /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ## Example responses Response for a private customer strongly identified with a national identification number: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "9eec015f-4b97-44be-a711-d22f3af75069", "data": { "customerType": "PrivateCustomer", "customer": { "email": "test@walleytest.se", "mobilePhoneNumber": "+4670707071", "deliveryContactInformation": { "mobilePhoneNumber": "+46701111111" }, "deliveryAddress": { "firstName": "Lars-Erik Rudolf", "lastName": "Viberg", "coAddress": null, "address": "Sommarstugevägen 2", "address2": null, "postalCode": "85353", "city": "Sundsvall", "country": "Sverige", "countryCode": "SE" }, "billingAddress": { "firstName": "Lars-Erik Rudolf", "lastName": "Viberg", "coAddress": null, "address": "Lingonstigen 10", "address2": null, "postalCode": "85352", "city": "Sundsvall", "country": "Sverige", "countryCode": "SE" } }, "businessCustomer": null, "countryCode": "SE", "status": "PurchaseCompleted", "reference": "123456789", "cart": null, "fees": null, "purchase": { "amountToPay": 159, "paymentName": "Account", "purchaseIdentifier": "640173", "result": "Preliminary", "decisionCategory": "Yellow" }, "order": { "orderId": "0466ffb4-80d8-4c55-bd74-af400166b3d7", "totalAmount": 159, "items": [ { "id": "1", "description": "Some product", "unitPrice": 200, "quantity": 1, "vat": 20 }, { "id": "998", "description": "Shipping cost (incl. VAT)", "unitPrice": 59, "quantity": 1, "vat": 25.0 }, { "id": "10003", "description": "Gift Card 100", "type": "GiftCard", "unitPrice": -100, "usedAmount": 100, "quantity": 1, "vat": 0 } ] }, "customFields": [ { "id": "group1", "metadata": { "groupMeta": "content" }, "fields": [ { "id": "newsConsent", "name": "I agree to receive marketing communications", "type": "Checkbox", "value": false, "metadata": { "field1Meta": "field-newsletter-consent" } }, { "id": "comments", "name": "Any additional comments?", "type": "Text", "value": "no nothing noteworthy" } ] } ], "hasSessionExpired": false }, "error": null } ``` Response for a business customer: ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "80a0b38b-2f8b-47db-81a5-8b56baa4ad84", "data": { "customerType": "BusinessCustomer", "customer": null, "businessCustomer": { "invoiceTag": "Fakturamärkning: 5678", "companyName": "Bra Byggare AB", "organizationNumber": "620306-1400", "invoiceReference": "Reparation dusch Walley", "email": "bosse@brabyggare.se", "firstName": "Bosse", "lastName": "Byggare", "mobilePhoneNumber": "+46730481277", "invoiceAddress": { "companyName": "Bra Byggare AB", "coAddress": null, "address": "Storgatan 1", "address2": null, "postalCode": "50332", "city": "Borås", "country": "Sverige", "countryCode": "SE" }, "deliveryAddress": { "companyName": "WalleyPay AB", "coAddress": null, "address": "Östra Hamngatan 24", "address2": "att: Bosse Byggare", "postalCode": "41109", "city": "Göteborg", "country": "Sverige", "countryCode": "SE" } }, "countryCode": "SE", "status": "PurchaseCompleted", "reference": "1231", "cart": null, "fees": { "shipping": { "id": "Frakt", "description": "DHL Ombud", "unitPrice": 19, "vat": 25 } }, "purchase": { "amountToPay": 377, "paymentName": "DirectInvoice", "purchaseIdentifier": "33074878", "result": "Preliminary" }, "order": { "orderId": "0466ffb4-80d8-4c55-bd74-af400166b3d7", "totalAmount": 377, "items": [ { "id": "scap001", "description": "Shower Cap", "unitPrice": 10, "quantity": 1, "vat": 25 }, { "id": "shipping001", "description": "Shipping fee (incl. vat)", "unitPrice": 59, "quantity": 1, "vat": 25 }, { "id": "dirfee001", "description": "Order administration fee (incl. vat)", "unitPrice": 299, "quantity": 1, "vat": 25 } ] }, "hasSessionExpired": false, "metadata": { "administrator": "John Doe", "someOtherData": [1, { "myObj": { "key": 1 } }] } }, "error": null } ``` ## Faulty response Response for an unknown, aborted or expired `privateId`: ```http HTTP/1.1 404 Not Found Content-Type: application/json { "id": "0b18555c-3c84-4bfd-901a-f15c368ba3d9", "data": null, "error": { "code": 404, "message": "The resource requested was not found.", "errors": [] } } ``` ## Request properties **Request headers** | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [how to generate the authorization header value](/docs/checkout/authorization). | **Important properties in the response body** Some of the properties listed below may have their values set to null if they are not applicable in the current state for a Checkout. For example, the customer property is set to null if the customer has not been identified yet. | Property | Explanation | | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **data.countryCode** | The country code you specify in [initialize Checkout request](/docs/checkout/initcheckout) | | **data.status** | Contains the current status of the Checkout. Possible values include `Initialized`, `CustomerIdentified`, `CommittedToPurchase`, `PurchaseCompleted`, `Aborted`. An explanation of the different statuses can be found [further down](#datastatus) in this section. | | **data.reference** | Equal to the reference field provided in the [initialize Checkout request](/docs/checkout/initcheckout). | | **data.cart** | Contains all items for a purchase that has not yet been completed. Once the purchase is complete, all items are moved in under the `data.order` property and the `data.cart` is set to null. | | **data.fees** | Contains the fees, like shipping, when the purchase is not yet completed. Once the purchase is complete, the fee items are moved last in the `data.order.items` property and the `data.fees.shipping` is set to null. **Note** that if you are using [Custom Delivery Adapter](/docs/checkout/delivery/custom-adapter#get-delivery-methods) that the shipping fee is taken care of there instead. | | **data.customerType** | Indicates what type of customer the checkout is initialized for. Values are `PrivateCustomer` or `BusinessCustomer` | | **data.customer** | Contains all customer details for a **private customer** including the delivery address to which the order should be sent. If the customer is strongly identified with a national identification number, billing address will be included. For a private customer who is identified without a national identification number, the billing address will be the same as the delivery address. We only accept card purchase for those customers and hence a billing address is not needed. For a business customer `data.customer` is null. | | **data.customer.deliveryContactInformation** | Only used if the contact information that has been optionally entered by the user in the delivery address view differs from billing address and will override the corresponding customer property values. | | **data.businessCustomer** | Contains all customer details for a **business customer** including the invoice address and a delivery address to which the order should be sent. Also includes delivery contact information such as mobile phone number for delivery notification (only used if delivery address differs from invoice address). For a private customer `data.businessCustomer` is null. | | **data.purchase** | Contains details for a completed purchase. | | **data.purchase.paymentName** | The name of the chosen Payment option the customer used to pay for the purchase. | | **data.purchase.amountToPay** | The total amount for the customer to pay for the purchase. This value may be greater than the `data.order.totalAmount` property due to fees issued by Walley for the chosen payment method. | | **data.purchase.purchaseIdentifier** | Required to manage the invoice for the purchase, for example to activate or make changes to an invoice. The purchase identifier is the identifier for a purchase when interacting with the [Walley Payments API Integration](/docs/paymentsApi/paymentsapi). | | **data.purchase.result** | The status for the purchase **at time when the purchase was made**. For details regarding different possible statuses for a purchase, see [possible values here](#datapurchaseresult). | | **data.purchase.decisionCategory** | Credit decision outcome for the completed purchase. **Only applicable to Norwegian (`countryCode: "NO"`) checkouts**, and only included when `redirectPageUri` was set on [Initialize Checkout](/docs/checkout/optional/init-checkout-features) — i.e. the merchant displays its own thank-you page instead of Walley's hosted one. Use this value to render the appropriate purchase-outcome message to the customer on your custom thank-you page. See [possible values](#datapurchasedecisioncategory). | | **data.purchase.externalPaymentReference** | The third party reference for the payment made with Swish or Vipps with settlements directly using your own agreement. | | **data.purchase.card** | Contains card details for a purchase configured as a tokenized payment. | | **data.purchase.card.lastFour** | Contains the last four digits of the card number | | **data.purchase.card.expiryDate** | Contains the expiry date of the card. | | **data.order** | Contains the total amount and all items for a completed purchase. | | **data.order.orderId** | The unique identifier for the order created. This is used in calls to [manage the order](/docs/manage/getting-started/overview). | | **data.order.totalAmount** | The total amount to be settled, i.e. the sum to be paid to you as a merchant for the purchase. | | **data.order.customerToken** | The customer token to use for future [tokenized payments.](/docs/checkout/tokenization/introduction) (only available if configured by Walley Merchant Services) | | **data.appliedVouchers** | Array of bonus vouchers that were applied and successfully redeemed as part of the purchase. Only present when a voucher adapter is configured for the store and the customer activated at least one voucher — otherwise the field is omitted. Each entry contains `voucherId`, `code`, `description`, and `discountAmount`. The discount is not added as a line item under `data.order.items`, and neither `data.order.totalAmount` nor `data.purchase.amountToPay` includes it. Use `appliedVouchers` to reconcile the discount. See [Voyado bonus vouchers](/docs/checkout/loyalty-booster/voyado/voyado-integration#bonus-vouchers) for details. | | **data.hasSessionExpired** | If true, the Checkout session has expired and a new session must be initialized. | | **data.customFields** | If there are custom fields present, the user entered data will be present in the array. The structure mirrors the configuration object with `value` holding the users submitted data. | ### data.status Possible values for the `data.status` property: - **Initialized** denotes that the Checkout is started but no information has been supplied by the customer. - **CustomerIdentified** denotes that a customer has been successfully identified by the Checkout. - **CommittedToPurchase** a customer has pressed the purchase button and the system is waiting for a successful/unsuccessful outcome, for example when waiting for a bank id session to authenticate. In this state the checkout is locked for modifications such as adding/removing from the cart. - **PurchaseCompleted** denotes that the purchase has been completed. - **Aborted** denotes that the session has been aborted and a purchase will not be possible for this session. ### data.purchase.paymentName Possible values for the `data.purchase.paymentName` property: :::info These values are subject to change — handle them dynamically. New payment names may emerge without notice, so design your system to accommodate unknown values. ::: - **DirectInvoice** Purchase made with the direct invoice option. The invoice will be sent directly by email. - **Invoice** Purchase made with Invoice option. All purchases made within a month will be aggregated into one notification that is sent to the end customer in the end of that month. - **Account** Purchase made with Account option. All purchases made within a month will be aggregated into one notification that is sent to the end customer in the end of that month. - **PartPayment** Purchase was made using a part payment option. For example split the payment into 36 months. - **Campaign** Purchase was made with a Buy-Now-Pay-Later option. For example buy now - pay in August. - **Card** Purchase was made with the card option. - **Trustly** Purchase was made with a direct bank transfer using Trustly option. - **Swish** Purchase was made with the Swish option. - **MobilePay** Purchase was made with the Mobile Pay option. - **Vipps** Purchase was made with the Vipps option. - **PayPal** Purchase was made with the PayPal option. ### data.purchase.result Possible values for the `data.purchase.result` property: - **Preliminary** The purchase is pending and waiting for activation by Merchant when shipping is initiated. - **OnHold** The purchase is under fraud investigation. Once the status changes of the purchase, a [callback will be sent](/docs/checkout/notificationcallback). - **Activated** The purchase has been automatically activated. Auto activation is not standard. To request it contact your delivery manager. - **Rejected** The purchase has been rejected and cannot be activated. - **Signing** The purchase is waiting for electronic signing of a credit agreement by the end customer. Once the status changes on the purchase, a [callback will be sent](/docs/checkout/notificationcallback). :::info For a completed purchase, verify all details such as articles and prices before registering the order as complete on your end. ::: ### data.purchase.decisionCategory :::info This field is only applicable to Norwegian checkouts (`countryCode: "NO"`). It will not be returned for any other market. ::: Possible values for the `data.purchase.decisionCategory` property: - **Green** — purchase approved without conditions. No additional message is required on your thank-you page. - **Yellow** — purchase approved on conditions. If you are **not** using Walley's hosted confirmation page (i.e. you set `redirectPageUri` and render your own thank-you page), you **must** display the specific text shown [below](#required-thank-you-page-copy-yellow) to the customer. Walley already renders this text on its hosted confirmation page. The field is only present when `redirectPageUri` was set on [Initialize Checkout](/docs/checkout/optional/init-checkout-features). Merchants that use Walley's hosted thank-you page do not need to consume this field — Walley renders the required text there. Treat unknown values as `Green` so future categories do not break your thank-you page. #### Required thank-you page copy (Yellow) When `decisionCategory` is `Yellow` and you are rendering your own thank-you page, the following Norwegian copy must be displayed to the customer: | decisionCategory | Copy (NO) | | ---------------- | ---------------------- | | **Yellow** | **Kjøpet ditt ble godkjent med vilkår**
Kreditten din er innvilget. Basert på vår vurdering av din samlede økonomi vurderer vi denne kreditten som moderat risiko for deg. Ved en vesentlig renteøkning kan du måtte gjøre tilpasninger i økonomien. | --- # Go-live checklist Source: https://dev.walleypay.com/docs/checkout/go-live-checklist.md Before we can inspect and approve your integration with Walley Checkout, make sure all the items below are checked. Go through the list and contact us if you have any questions. { content: <> Do you save the public token-session and use it throughout the interaction with Walley? The public token is valid for 7 days. Read more at Render the Checkout iframe, isChecked: true }, { content: <> Do you always issue a GET-request to get the to get the latest customer and purchase information when receiving the notification callback? , isChecked: true }, { content: <>Do you keep the amount of requests to our API on a necessary level? For example handle the update fees and cart separately as stated in our documentation, isChecked: true }, { content: <>Have you sent in a correct page for terms of purchase?, isChecked: true }, { content: <>Do you render our Checkout iframe on your confirmation page correctly?, isChecked: true }, { content: <>If use of validate-callback, make sure the response is in accordance to our documentation, isChecked: true }, { content: <>Have you contacted help@walley.se to verify the integration?, isChecked: true }, { content: <>Have you made an announcement that you are live with Walley? Example PDF in Swedish, isChecked: true } ]; --- # Initialize checkout Source: https://dev.walleypay.com/docs/checkout/initcheckout.md Initialize a Checkout session by making a POST request to the checkout backend API endpoint. This returns a public token for rendering the Checkout iframe and a private ID for retrieving checkout information. :::info Before you start You need [API credentials](/docs/checkout/prerequisites) from Merchant Hub. Call this endpoint from your backend only. If you initialize a session from client-side code, customers can read your credentials. ::: :::tip Explore all features This guide covers the basic steps to initialize a checkout session. For every available property, optional configuration and advanced use case, see [Advanced initialization](/docs/checkout/optional/init-checkout-features). ::: ## Quick start **Basic example to get started:** ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "storeId": 123, "countryCode": "SE", "merchantTermsUri": "https://example.com/terms", "notificationUri": "https://example.com/notifications", "cart": { "items": [ { "id": "10001", "description": "Product Name", "unitPrice": 100.0, "quantity": 1, "vat": 25.0 } ] } } ``` **With order validation callback:** ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "storeId": 123, "countryCode": "SE", "merchantTermsUri": "https://example.com/terms", "notificationUri": "https://example.com/notifications", "callback": { "callbackUri": "https://example.com/callbacks", "callbackTypes": ["ValidateOrder", "PaymentFailed"] }, "cart": { "items": [ { "id": "10001", "description": "Product Name", "unitPrice": 100.0, "quantity": 1, "vat": 25.0 } ] } } ``` See [Callback object](/docs/checkout/optional/init-checkout-features#callback-object) for callback configuration details. ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "91714012-6ae9-4780-a927-fe459bc95bf6", "data": { "privateId": "1eec44b5-66d3-4058-a31f-3444229fb727", "publicToken": "public-SE-7f1b3d2a2a73d348dfbd17d3965ff1458c249f84c695eac1", "expiresAt": "2025-12-07T07:16:49.8098107+00:00", "paymentUri": "https://checkout.uat.walleydev.com/p/npBc87EFB", "paymentQrCodeUri": "https://api.uat.walleydev.com/checkouts/paylinks/npBc87EFB/qrcode" }, "error": null } ``` **Use the response:** - **`publicToken`** - Pass to [render the checkout iframe](/docs/checkout/renderiframe) - **`privateId`** - Use to [get checkout information](/docs/checkout/getcheckoutinformation) - **`expiresAt`** - When the session expires. A session is valid for 7 days from creation See [Response](#response) for the full property list. ```http HTTP/1.1 400 Bad Request Content-Type: application/json { "id": "1da39a61-d3e1-4da5-a1a0-7a315ea66d2f", "data": null, "error": { "code": 400, "message": "Bad or faulty request. Please examine the errors property for details.", "errors": [ { "reason": "Store_Invalid", "message": "Invalid store id or country code." } ] } } ``` See [Error Codes](/docs/checkout/error-codes) for troubleshooting. --- ## Request properties ### Request headers | Header | Required | Description | |--------|----------|-------------| | **Authorization** | Yes | Bearer token for authentication. See [Authorization](/docs/checkout/authorization) | | **Content-Type** | Yes | Must be `application/json` | ### Request body | Property | Required | Type | Description | |----------|----------|------|-------------| | **storeId** | No `*` | number | Your unique store identifier | | **countryCode** | Yes | string | Market code: `SE`, `NO`, `FI`, `DK`, `DE`, `NL`, or `EU` | | **merchantTermsUri** | Yes | string | URL to your terms and conditions page. Must be `https`. | | **notificationUri** | Yes | string | Endpoint for [purchase notifications](/docs/checkout/notificationcallback). Must be `https`. | | **cart** | Yes | object | Shopping cart with items. See [Cart Object](#cart-object) | `*` Only needed when `countryCode` and `salesSegment` do not identify a single store. The examples above send it because it always resolves on its own. See [Selecting a store](/docs/checkout/optional/init-checkout-features#selecting-a-store). :::note Production vs UAT - **UAT:** `https://api.uat.walleydev.com/checkouts` - **Production:** `https://api.walleypay.com/checkouts` See [Endpoints](/docs/checkout/endpoints) for the complete list. ::: --- ## Cart object The cart must contain at least one item with these required properties: | Property | Required | Type | Description | |----------|----------|------|-------------| | **id** | Yes | string | Unique item identifier | | **description** | Yes | string | Product name/description | | **unitPrice** | Yes | decimal | Price per unit (including VAT) | | **quantity** | Yes | integer | Number of items | | **vat** | Yes | decimal | VAT percentage (e.g., 25.0 for 25%) | :::note Cart Validation The cart cannot consist entirely of items with negative `unitPrice` values. At least one item in the cart must have a non-negative unit price. ::: ### Cart example ```json { "cart": { "items": [ { "id": "product-123", "description": "Premium Widget", "unitPrice": 299.0, "quantity": 2, "vat": 25.0 } ] } } ``` ## Response A successful response returns all five properties below in the `data` object, alongside the top-level `id` and a `null` `error`. | Property | Explanation | | -------- | ----------- | | **publicToken** | Renders the [Checkout iframe](/docs/checkout/renderiframe). Valid for 168 hours (7 days). | | **privateId** | Identifies the session in every backend call. Use it to [acquire information](/docs/checkout/getcheckoutinformation) for up to 90 days after the session was created, and to update the session until it completes or `expiresAt` passes. | | **expiresAt** | When the session expires. After this timestamp the customer cannot complete the purchase and you cannot update the cart, so initialize a new session. | | **paymentUri** | A shortcut link to this session, used when distributing a [Pay Link](/docs/checkout/paylink/overview). | | **paymentQrCodeUri** | A QR code image of `paymentUri`. The URL needs no authentication, so you can embed it directly. | For the callback, prefill, custom field and URI templating properties, see [Advanced initialization](/docs/checkout/optional/init-checkout-features). --- # Introduction Source: https://dev.walleypay.com/docs/checkout/introduction.md Walley Checkout is hosted within your site by placing a script tag in pages in your web shop where the Checkout should be shown. The script tag will load an iframe which will guide the customer through the purchase. Once the purchase has been completed, you will be notified through a web request to an API URI of your choosing. Details about the purchase may then be acquired from the Checkout REST API. We aim to support all browser versions released in the last 5 years that have not been deprecated by the vendor. See the [current list of supported browsers](https://browsersl.ist/#q=last+5+years+and+not+dead). Completed purchases may be managed by using the [Walley Management API](/docs/manage/getting-started/overview). This includes activating pending invoices, making returns etc. Checkout flow overview --- # Languages Source: https://dev.walleypay.com/docs/checkout/languages.md These are the available languages that can be used. | Country | Available languages (first one is default) | | ----------- | ------------------------------------------ | | Sweden | sv-SE, en-SE | | Norway | nb-NO, en-NO | | Finland | fi-FI, sv-FI, en-FI | | Denmark | da-DK, en-DK | | Germany | de-DE, en-DE | | Netherlands | nl-NL, en-NL | | Europe | en-EU | --- # Custom loyalty adapter Source: https://dev.walleypay.com/docs/checkout/loyalty-booster/custom/custom-adapter.md A custom loyalty adapter allows you to integrate Walley with your own CRM system ## Overview The custom loyalty adapter is an API that you host on your own system. It is called by Walley Checkout when certain events occur. The adapter is used to check whether a customer is a member of your loyalty program, and to create a new membership if the customer chooses to join. If the customer changes the toggle to apply for membership, a `walleyCheckoutCrmUpdated` JS event will be sent. When this event is received you have to [acquire checkout information](/docs/checkout/getcheckoutinformation) to know the status of the membership. Sequence diagram of the two calls Walley Checkout makes to a custom loyalty adapter As shown in the diagram, Walley Checkout calls Get Membership once the customer has identified, and receives the membership details. Once the customer has completed the purchase, it calls Create Membership and receives `201 Created`. :::preview Early access This functionality is at an early stage and is not yet available for all merchants. Please contact your Walley representative for more information. Also note that this is the version 1 of the custom loyalty adapter api, and will be deprecated as soon as version 2 is released later this year. ::: ## Authentication All API requests require Basic Authentication and all communication is over HTTPS. ## Get Membership ### Description Walley calls this endpoint to retrieve the loyalty membership details of a customer based on their email, phone number, and registration number. It is typically called after a successful identification of the customer in Walley Checkout. ### Example request ```http GET https://your-adapter.com/api/v1/membership?storeId=123&email=earl.grey@walley.se&mobilePhoneNumber=1234567890&locale=sv-SE HTTP/1.1 Authorization: Basic bXlVc2VybmFtZTpteVBhc3N3b3Jk... ``` #### Request headers | Header | Value | | ------------- | ----- | | Authorization | Basic | #### Query parameters | Parameter | Type | Sent | Description | | ------------------ | ------- | ----- | -------------------------------------------------------------------------------------------------------------------------------- | | storeId | integer | Yes | The store identifier. Can be used to identify where requests came from in your CRM | | email | string | Yes | The customer’s email address. | | mobilePhoneNumber | string | Yes | The customer’s mobile phone number. | | registrationNumber | string | Maybe | The customer’s registration number. Only sent if the customer has provided it. | | locale | string | Yes | The desired locale used to localize applicationText, membershipName and termsUri [Supported languages](/docs/checkout/languages) | ### Response #### Success (200 OK) ```http HTTP/1.1 200 OK Content-Type: application/json { "isMember": true, "applicationText": "Yes, I would like to become a member in ABC Reward Club and confirm the member terms\n Become a member and gain access to:\n- Points on all purchases\n- Bonus checks\n- Exclusive offers", "membershipName": "ABC Reward Club", "termsUri": "https://merchant-url.com/terms", "membershipDetails": { "id": "123456", "memberNumber": "987654" }, "requiresRegistrationNumber": false } ``` | Property | Type | Required | Description | | -------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------- | | isMember | boolean | Yes | Indicates if the customer is a member of the loyalty program or not | | applicationText | string | No | The text shown to the customer. [See description](#application-text) | | membershipName | string | Yes | The name of the loyalty program. | | termsUri | string | Yes | The URL to the terms and conditions of the loyalty program. | | membershipDetails | object | No | The membership details of the customer. Only provided if the customer is a member of the loyalty program. | | requiresRegistrationNumber | boolean | No | Indicates if the adapter requires the registration number to create the membership. | #### Application text The `applicationText` property is shown to the user if provided. It can show unique selling points if the user is not a member, or membership benefits if the user already is a member. It supports simplified markdown, and supported formatting are: `**bold**` **bold** `*italic*` *italic* `- bullet` • bullet `\n` new line ### Errors and timeouts If the response is not received within `10 seconds`, the request will be considered timed out. `1 retry` will be made for server errors and http exceptions after `2 seconds back-off`. Any non 2xx response or timeout will result in the fallback to not show the membership details to the user. ## Create Membership ### Description After the customer completes their purchase, Walley calls this endpoint if the customer is not yet a member. The `applyMembership` property indicates whether they chose to apply for membership. ### Example request ```http POST https://your-adapter.com/api/v1/membership HTTP/1.1 Authorization: Basic bXlVc2VybmFtZTpteVBhc3N3b3Jk... Content-Type: application/json { "applyMembership": true, "storeId": 123, "externalStoreId": "ext-5678", "address": { "firstName": "John", "lastName": "Doe", "address": "123 Main St", "postalCode": "416 70", "city": "Gothenburg", "countryCode": "SE" }, "email": "john.doe@example.com", "mobilePhoneNumber": "+46701234567", "registrationNumber": "000000-0000" } ``` #### Request headers | Header | Value | | ------------- | ---------------- | | Authorization | Basic | | Content-Type | application/json | #### Request body | Property | Type | Sent | Description | | ------------------ | ------- | ----- | ---------------------------------------------------------------------------------------------- | | applyMembership | boolean | Yes | Indicates if the customer wants to apply for membership. | | storeId | integer | Yes | The store identifier. Can be used to identify where requests came from in your CRM | | externalStoreId | string | Maybe | The external store identifier provided when [initializing a checkout.](/docs/checkout/initcheckout) | | address | object | Yes | The address of the customer. | | email | string | Yes | The customer’s email address. | | mobilePhoneNumber | string | Yes | The customer’s mobile phone number. | | registrationNumber | string | Maybe | The customer’s registration number. Only sent if the customer has provided it. | ### Response #### Success (201 Created) ```http HTTP/1.1 201 Created Content-Type: application/json { "id": "123456", "memberNumber": "987654" } ``` | Property | Type | Required | Description | | ------------ | ------ | -------- | ------------------------------------------ | | id | string | No | The internal ID to identify the membership | | memberNumber | string | No | The member number of the customer. | ### Errors and timeouts If the response is not received within `10 seconds`, the request will be considered timed out. `1 retry` will be made for server errors and http exceptions after `2 seconds back-off`. Any non 2xx response or timeout will result in the membership not being created. ## Acquiring loyalty membership information When [acquiring checkout information](/docs/checkout/getcheckoutinformation) after a customer is identified, the `data.customer.loyaltyMembership` object contains information about the outcome of the membership registration. | Property | Type | Returned | Description | | ------------ | ------ | -------- | -------------------------------------------------------- | | provider | string | Yes | Always `custom` for a custom adapter. | | success | bool | Yes | `false` if the registration of membership failed. | | isMember | string | Maybe | Indicates membership, possible values are: yes, no, new. | | id | string | Maybe | The internal ID to identify the membership. | | memberNumber | string | Maybe | The member number of the customer. | There will be four possible outcomes: 1. The customer is already a member, so no registration was performed. 2. The customer chose to apply for membership, and a membership was registered successfully. 3. The customer chose not to apply for membership. 4. The customer chose to apply for membership, but the registration failed due to technical reasons. :::info Important If the membership failed to register due to technical reasons, create the membership manually so the customer does not lose their points, bonus levels, or similar. To see why the registration failed, check the developer logs in the [Merchant hub](/docs/merchanthub/intro). ::: ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "custom", "success": true, "isMember":"yes", "id": "9b43c86e-227b-4149-b0ee-de7f4846be26", "memberNumber": "123456789" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "custom", "success": true, "isMember":"new", "id": "9b43c86e-227b-4149-b0ee-de7f4846be26", "memberNumber": "123456789" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "custom", "success": true, "isMember":"no" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "custom", "success": false } } } } ``` --- # Introduction Source: https://dev.walleypay.com/docs/checkout/loyalty-booster/loyalty-booster.md Loyalty Booster connects Walley Checkout to your CRM system or loyalty platform, so customers do not enter their login details again. Walley recognizes members and can show rebates, coupons, membership levels and points, or sign new customers up during the checkout. To maintain brand consistency and enhance the customer experience, it is possible to customize the color used in the loyalty module. This can be done by specifying the [`data-loyalty-color`](../renderiframe.mdx#script-element) attribute. If this attribute is not provided, the loyalty module will automatically fall back to the color defined in the `data-action-color` attribute. The loyalty module offering membership with a join toggle The loyalty module for an existing member, showing a Member badge The loyalty module for a member, showing points earned and points to the next level ## Supported markets | Country | B2C | B2B | | ----------- | --- | --- | | Sweden | Yes | No | | Norway | Yes | No | | Denmark | Yes | No | | Finland | Yes | No | | Germany | Yes | No | | Netherlands | Yes | No | ## Current adapters ### Voyado adapter Our [integration with Voyado](voyado/voyado-integration) allows Walley to check if a user is a member of the loyalty program of the merchant. If the customer is not already a member of the loyalty program, Walley will ask the customer if they would like to enroll as part of the checkout journey. If so, Walley will automatically enroll the customer to the membership program after completing the purchase, all without leaving the checkout experience. To get started, contact [Walley Merchant Services](/support). Merchant Services will need your Voyado API key and Voyado API URL, and then we will handle the rest. ### Custom loyalty adapter You can also do a custom integration where your own custom logic can be used to onboard members or provide existing members a customized experience. To get started, see [Custom loyalty adapter](custom/custom-adapter) for the endpoints your adapter must implement. Then contact [Walley Merchant Services](/support) and we connect your adapter to your store. --- # Onboarding checklist Source: https://dev.walleypay.com/docs/checkout/loyalty-booster/loyalty-onboarding.md Everything you need to hand over to Walley in order to get the Loyalty Booster enabled and your loyalty adapter configured. ## Overview The Loyalty Booster is configured per store by Walley. Before it can be activated, Walley needs a set of details about your loyalty program and, if you use a [custom loyalty adapter](/docs/checkout/loyalty-booster/custom/custom-adapter), about the API you host. Collect the information below and send it to your Walley representative or to [help@walley.se](mailto:help@walley.se). Configuration is done separately per environment, so provide the details for both test and production (share any credentials/secrets via a secure channel, not by email). Never send credentials or other secrets, such as the Basic authentication password for your adapter, by email or chat. Ask your Walley representative for a secure channel and share them there. :::preview Early access This functionality is at an early stage and is not yet available for all merchants. Please contact your Walley representative for more information. ::: ## 1. Stores and markets | Information | Required | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | Store id(s) | Yes | The Walley store id(s) the loyalty adapter should be enabled for. One configuration is made per store. | | Environment | Yes | Whether the configuration applies to test or production. Provide the details for both. | | Markets and languages | Yes | The countries and [languages](/docs/checkout/languages) the loyalty program should be offered in. | | B2C / B2B | Yes | Which customer types the loyalty program applies to. See the supported markets in the [introduction](/docs/checkout/loyalty-booster/loyalty-booster). | ## 2. Loyalty program details | Information | Required | Description | | ------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | Provider | Yes | Which adapter to use, for example [Voyado](/docs/checkout/loyalty-booster/voyado/voyado-integration) or a [custom adapter](/docs/checkout/loyalty-booster/custom/custom-adapter). | | Membership name | Yes | The name of the loyalty program shown to the customer, for example `ABC Reward Club`. | | Terms URL | Yes | A publicly available URL with the terms and conditions of the loyalty program, per language. | | Application text | No | The text shown to the customer in the checkout, per language. See [application text](/docs/checkout/loyalty-booster/custom/custom-adapter#application-text) for supported formatting. | | Registration number | Yes | Whether a registration number (for example a social security number) is required to create a membership. | | Loyalty color | No | The color used in the loyalty module. Set with the [`data-loyalty-color`](/docs/checkout/renderiframe#script-element) attribute, and falls back to `data-action-color`. | :::info Important `membershipName`, `termsUri` and `applicationText` are returned by the custom adapter per request and are localized using the `locale` query parameter. If you use a custom adapter, you only need to confirm which languages you support. ::: ## 3. Custom adapter connection details Only needed if you host your own [custom loyalty adapter](/docs/checkout/loyalty-booster/custom/custom-adapter). | Information | Required | Description | | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- | | Base URL | Yes | The HTTPS base URL of your adapter, for example `https://your-adapter.com/api/v1`. Provide one URL per environment. | | Basic auth username | Yes | The username Walley uses for Basic Authentication against your adapter. | | Basic auth password | Yes | The corresponding password. Share it through a secure channel, never by email or chat. | | API version | Yes | The version of the custom loyalty adapter API your implementation follows. | | Endpoints exposed | Yes | Confirmation that both `GET /membership` and `POST /membership` are implemented as described in the [custom adapter](/docs/checkout/loyalty-booster/custom/custom-adapter) documentation. | :::warning Reachability requirements Your adapter must be reachable from Walley over HTTPS, respond within `10 seconds`, and accept `1 retry` after a `2 seconds back-off` for server errors. Requests that time out or return a non 2xx response result in the membership not being shown or not being created. ::: ## 4. Contacts | Information | Required | Description | | ----------------------- | -------- | ------------------------------------------------------------------------------------------ | | Technical contact | Yes | Name and email of the person responsible for the adapter integration. | | Business contact | Yes | Name and email of the person responsible for the loyalty program. | | Support contact | No | Where Walley should report incidents related to the adapter. | | Planned go-live date | Yes | When you plan to activate the Loyalty Booster in production. | ## Checklist { content: <>Store id(s), environment, markets and languages are specified, isChecked: true, }, { content: <>Membership name and terms URL are provided for every language, isChecked: true, }, { content: <>It is decided whether a registration number is required to create a membership, isChecked: true, }, { content: <>The adapter base URL is reachable over HTTPS from Walley, in both test and production, isChecked: true, }, { content: <>Basic authentication credentials are shared with Walley through a secure channel, isChecked: true, }, { content: <>Both the Get Membership and Create Membership endpoints are implemented and tested, isChecked: true, }, { content: <>Your integration handles the walleyCheckoutCrmUpdated event and reads data.customer.loyaltyMembership from the checkout information, isChecked: true, }, { content: <>A routine exists to create memberships manually if a registration fails for technical reasons, isChecked: true, }, { content: <>Technical and business contacts and a planned go-live date are shared with Walley, isChecked: true, }, ]; ## Next steps When Walley has received the information, the adapter is configured for your test store so you can verify the flow end to end. Once the integration is verified, the same configuration is applied to your production store. For the overall integration, also go through the [go-live checklist](/docs/checkout/go-live-checklist). --- # Voyado adapter Source: https://dev.walleypay.com/docs/checkout/loyalty-booster/voyado/voyado-integration.md Our integration with Voyado allows Walley to check if a user is a member of the loyalty program of the merchant. If the customer is not already a member of the loyalty program, Walley will ask the customer if they would like to enroll as part of the checkout journey. If so, Walley will automatically enroll the customer to the membership program after completing the purchase, all without leaving the checkout experience. When the customer identifies in Walley Checkout, a request to Voyado will be made to check if the customer is already a member based on national registration number, email address or mobile phone number. If the customer is not already a member Walley Checkout will prompt to apply for membership. If the customer changes the toggle to apply for membership, a `walleyCheckoutCrmUpdated` JS event will be sent. When this event is received you have to [acquire checkout information](/docs/checkout/getcheckoutinformation) to know the status of the membership. If the customer chose to apply for membership Walley will automatically register the customer with Voyado: ```json { "firstName": "First name", "lastName": "Last name", "street": "Address 1", "zipCode": "12345", "city": "City", "email": "test@walleypay.se", "mobilePhone": "+46701234567", "countryCode": "SE", "socialSecurityNumber": "510731-2323", "preferences": { "acceptsEmail": true, "acceptsPostal": false, "acceptsSms": false } } ``` **Note** that Walley Checkout will also provide Voyado with the following properties: | Property | Required | Explanation | | ------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Source** | Yes | Always set to the string "Walley". | | **StoreExternalId** | No | Set to a value of your choosing to indicate which store in Voyado the customer registered in. Note that this store must be setup in Voyado and can be configured in our settings or as the `externalStoreId` parameter when initializing the checkout | | **Consent** | No | If a customer chooses to be a member then we can create a consent and send them to Voyado. Contact [Walley Merchant Services](/support) to set this up. | ## Acquiring loyalty membership information When [acquiring checkout information](/docs/checkout/getcheckoutinformation) after a customer is identified, the `data.customer.loyaltyMembership` object contains information about the outcome of the membership registration. | Property | Type | Returned | Description | | ------------ | ------ | -------- | -------------------------------------------------------- | | provider | string | Yes | Always `voyado` for a the Voyado adapter. | | success | bool | Yes | `false` if the registration of membership failed. | | isMember | string | Maybe | Indicates membership, possible values are: yes, no, new. | | id | string | Maybe | The Voyado `contactId` to identify the membership. | | memberNumber | string | Maybe | The member number of the customer. | There will be four possible outcomes: 1. The customer is already a member, so no registration was performed. 2. The customer chose to apply for membership, and a membership was registered successfully. 3. The customer chose not to apply for membership. 4. The customer chose to apply for membership, but the registration failed due to technical reasons. :::info Important If the membership failed to register due to technical reasons, create the membership manually so the customer does not lose their points, bonus levels, or similar. To see why the registration failed, check the developer logs in the [Merchant hub](/docs/merchanthub/intro). ::: ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "voyado", "success": true, "isMember":"yes", "id": "9b43c86e-227b-4149-b0ee-de7f4846be26", "memberNumber": "123456789" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "voyado", "success": true, "isMember":"new", "id": "9b43c86e-227b-4149-b0ee-de7f4846be26", "memberNumber": "123456789" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "voyado", "success": true, "isMember":"no" } } } } ``` ```json { "data": { "customer": { "loyaltyMembership": { "provider" : "voyado", "success": false } } } } ``` ## Bonus vouchers
One available bonus voucher in the loyalty module
Several available bonus vouchers, each with a checkbox
Turn loyalty points into sales. With bonus vouchers, your Voyado members see the rewards they have earned right inside Walley Checkout — and can apply them to their purchase with a single tap. No codes to remember, no copy-pasting, no abandoned carts because a customer could not find their voucher in their inbox. Available vouchers show up automatically once the customer is identified. The order total updates the moment a voucher is activated, and Walley handles the redemption with Voyado behind the scenes. The result: a shorter path to checkout, higher conversion on loyalty traffic, and a stronger reason for customers to come back. To enable bonus vouchers for your store, contact [Walley Merchant Services](/support). Make sure bonus vouchers are also activated in your Voyado setup — Voyado support can help you with that side of the configuration. :::note Voyado must be configured for the currency used in the checkout session. Vouchers issued in a currency that does not match the checkout session currency will not be returned and therefore not shown to the customer. ::: ### Vouchers in the merchant checkout information When a purchase is completed with one or more bonus vouchers applied, the [merchant checkout information](/docs/checkout/getcheckoutinformation) response includes an `appliedVouchers` array under `data`. Each entry describes a voucher that was successfully redeemed against Voyado as part of the purchase, so you can reconcile the discount with your order system, show it on receipts, or report on loyalty-driven sales. | Property | Type | Description | | ---------------- | ------- | -------------------------------------------------------------------------- | | `voucherId` | string | Unique identifier for the voucher in Voyado. | | `code` | string | The voucher code that was redeemed. | | `description` | string | Human-readable description of the voucher (e.g. campaign name). | | `discountAmount` | decimal | The discount value applied, in the checkout currency. | The voucher discount is not added as a line item under `data.order.items`, and neither `data.order.totalAmount` nor `data.purchase.amountToPay` includes the discount. Use `appliedVouchers` to account for the bonus when you reconcile the order. ```json { "data": { "appliedVouchers": [ { "voucherId": "voucher-123", "code": "SUMMER2026", "description": "Summer campaign voucher", "discountAmount": 50.00 } ] } } ``` If no voucher adapter is configured for the store, or if the customer did not activate any vouchers, the `appliedVouchers` field is omitted from the response — existing integrations are unaffected. ## Configuration The loyalty adapter can be configured to personalize the checkout experience in line with the merchant’s brand, and enable optional features. ### Optional features **Membership levels:** To enable this feature, follow these steps: 1. Contact Walley Merchant Services for help setting up the Voyado integration. 2. Make sure the corresponding setting is also enabled in your Voyado integration. (Contact Voyado for assistance.) --- # Mobile App SDKs Source: https://dev.walleypay.com/docs/checkout/mobile-sdk.md Walley Checkout can be integrated into your mobile app using our SDKs. Below follows a brief explanation of the different possible SDKs available. ## iOS See more on our Github: [https://github.com/WalleyPay/WalleySDK-iOS](https://github.com/WalleyPay/WalleySDK-iOS) ## Android See more on our Github: [https://github.com/WalleyPay/walley-checkout-android-sdk](https://github.com/WalleyPay/walley-checkout-android-sdk) --- # Handle purchase callbacks Source: https://dev.walleypay.com/docs/checkout/notificationcallback.md Walley Checkout will send a GET request with TLS to the notification URI that was provided in the initialize Checkout step for the following events: :::info Before you start Set `notificationUri` when you [initialize the checkout session](/docs/checkout/initcheckout). The endpoint must be reachable over HTTPS and must answer `200 OK`. ::: ## Notification events ### Completed purchase A purchase has been successfully completed by the end customer. When you [acquire checkout information](/docs/checkout/getcheckoutinformation) the state of the Checkout has transferred to `PurchaseCompleted` and the invoice status is one of the values described in [`data.purchase.result`](/docs/checkout/getcheckoutinformation#datapurchaseresult). ### Invoice status update An invoice has been approved or rejected by Walley's anti-fraud system (if that feature is configured on your account), or the Invoice required the end customer to digitally sign a credit agreement and this has been completed by the end customer. When you [acquire checkout information](/docs/checkout/getcheckoutinformation) the invoice status has transferred to one of the values described in [`data.purchase.result`](/docs/checkout/getcheckoutinformation#datapurchaseresult). If the invoice was `Cancelled` before the notification callback arrived, the invoice is considered `Cancelled` regardless of the `data.purchase.result` value. ### Pay Link is cancelled If using the checkout as a [Pay Link](/docs/checkout/paylink/overview) and a `checkoutAbortedRedirectPageUri` is provided at [Initialize Checkout](/docs/checkout/initcheckout), a notification callback will be sent if the cancel button is called. The customer will be redirected to the redirect page and a notification will be triggered. ## Idempotency and retries The Checkout will attempt to notify the provided notification URI multiple times with increasing backoff time until a HTTP status code 200 is received in the response. Our retry mechanism is built in a way that we guarantee at-least-once-delivery and the notification URI endpoint must therefore support being called multiple times without side effects. We send the notification callback instantly. If your endpoint does not answer with a `200 OK` status, we retry after each of the following delays, measured from the previous attempt: - 5 seconds - 10 seconds - 3 minutes - 1 hour - 4 hours - 8 hours - 16 hours - 24 hours The last retry falls about 53 hours after the first attempt. If your endpoint has still not answered with a `200 OK` status by then, we handle it manually and contact you before retrying again. --- # Apple Pay Source: https://dev.walleypay.com/docs/checkout/optional/apple-pay.md Walley Checkout supports Apple Pay as a payment method. To enable Apple Pay, you need to upload a domain verification file and then contact Walley for activation. ## Domain verification To use Apple Pay on the web, you must verify your domain with Apple. This involves downloading a verification file from the Apple Developer portal and hosting it on your website. This action is not required if you are using Walley Pay Link. This file must be accessible at the following URL: `https://example.com/.well-known/apple-developer-merchantid-domain-association`. Replace `example.com` with your domain name. ### Steps to verify your domain 1. Download our domain verification file Download our domain verification file. 2. Upload the downloaded file to the `.well-known` directory on your web server. 3. Ensure the file is publicly accessible by visiting `https://example.com/.well-known/apple-developer-merchantid-domain-association` in your web browser. 4. Contact Walley support for activation ### Important notes - Ensure that your website is served over HTTPS, as Apple Pay requires a secure connection. - The verification file must remain accessible on your server as long as you want to accept Apple Pay payments. - If you change your domain or hosting provider, you may need to repeat the verification process. - If you encounter issues during the verification process, double-check the file's URL and ensure it is correctly placed in the `.well-known` directory. --- # Client-side API Source: https://dev.walleypay.com/docs/checkout/optional/clientapi.md After the script walley-checkout-loader.js has been loaded it will be possible to interact with the iframe using the provided API. The API functions are exposed via the global object window.walley.checkout.api. ## Suspend and resume flow If you call any Checkout Backend API's while the checkout is visible, you must call suspend before you make the backend call, and after retrieving the answer, call resume to enable the checkout again. ```javascript // Suspend the Checkout, showing a spinner... window.walley.checkout.api.suspend(); // ... then do a back end call and wait for the answer... // ... and finally resume the Checkout. window.walley.checkout.api.resume(); ``` ## API reference | Function | Parameters      | Description | | ----------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **suspend** | `publicToken` (optional string) | Sets the Checkout iframe in suspend mode. This results in all inputs and buttons being disabled and a spinner to be shown. If `publicToken` is not specified all Checkout iframes on the page will be suspended. | | **resume** | `publicToken` (optional string) | Resumes the Checkout to its normal state after a suspend. This results in data being loaded from the Checkout backend to stay up to date with any changes. If `publicToken` is not specified all Checkout iframes on the page will be resumed. | --- # Client-side events Source: https://dev.walleypay.com/docs/checkout/optional/clientevents.md To provide a better customer experience, you can listen to custom client-side events and take appropriate action. All events are dispatched using the global document object as target and cannot be cancelled or bubbled. :::info Important Do not rely on client-side events for business critical functionality. Use the api to retrieve information. For example: 1. Instead of relying only on `walleyCheckoutPurchaseCompleted`, listen for the Completed Purchase [callback](/docs/checkout/notificationcallback). 1. When receiving a `walleyCheckoutCustomerUpdated`, [get checkout information](/docs/checkout/getcheckoutinformation) of what has been updated. ::: ## Javascript examples ```javascript // Start listening to the customer updated event document.addEventListener("walleyCheckoutCustomerUpdated", listener); // Start listening to the locked event document.addEventListener("walleyCheckoutLocked", listener); // Start listening to the unlocked event document.addEventListener("walleyCheckoutUnlocked", listener); // Start listening to the resumed event document.addEventListener("walleyCheckoutResumed", listener); // Start listening to the purchase completed event document.addEventListener("walleyCheckoutPurchaseCompleted", listener); // Start listening to the shipping updated event document.addEventListener("walleyCheckoutShippingUpdated", listener); // Start listening to the CRM updated event document.addEventListener("walleyCheckoutCrmUpdated", listener); // Start listening to the voucher updated event document.addEventListener("walleyCheckoutVoucherUpdated", listener); // Start listening to the validation failed event document.addEventListener("walleyCheckoutOrderValidationFailed", listener); // Start listening to the payment aborted event document.addEventListener("walleyCheckoutPaymentAborted", listener); ``` ## Description of available events | Event | Description | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **walleyCheckoutCustomerUpdated** | Occurs when the Checkout client-side detects any change to customer information, such as a changed email, mobile phone number or delivery address. This event is also fired the first time the customer is identified. | | **walleyCheckoutLocked** | Occurs when no user input should be accepted, for instance during processing of a purchase. | | **walleyCheckoutUnlocked** | Occurs after a locked event when it is safe to allow user input again. For instance after a purchase has been processed (regardless of whether the purchase was successful or not). | | **walleyCheckoutResumed** | Occurs when the Checkout has loaded new data and is back in its normal state after a suspend. See section [Client-side API](/docs/checkout/optional/clientapi) for more details. | | **walleyCheckoutPurchaseCompleted** | Occurs when the purchase has been completed. | | **walleyCheckoutShippingUpdated** | Only available when [Delivery Module](/docs/checkout/delivery/introduction-delivery-module) is used. Indicates that the delivery selection has changed. | | **walleyCheckoutCrmUpdated** | Only available when [Loyalty Booster](/docs/checkout/loyalty-booster/loyalty-booster) is used. Occurs when the customer has changed any information for the CRM module, such as toggling to apply for membership. | | **walleyCheckoutVoucherUpdated** | Occurs when the voucher state on the order changes, for instance when a voucher is applied, removed or fails to redeem. The event is dispatched with an empty payload, so [get checkout information](/docs/checkout/getcheckoutinformation) to retrieve the updated order state. | | **walleyCheckoutOrderValidationFailed** | Occurs when [order validation](/docs/checkout/optional/validateorder) returns a non-2XX response. If a `clientPayload` object is returned in the validation response, it is sent as a `payload` parameter here. This can be useful if the client-side code needs information about why the validation failed. | | **walleyCheckoutPaymentAborted** | When the payment is aborted, a payload is sent to describe the reason and, if applicable, the error code. See payload specification below. | ### walleyCheckoutPaymentAborted payload ``` { reason: 'ERROR' | 'USER_CANCELLED', errorCode: 'AGE_RESTRICTED_CART' | 'DENIED' | 'UNKNOWN_ERROR' } ``` - `ERROR`: This reason could have many different causes, some of which can be identified by the error codes below: - `AGE_RESTRICTED_CART`: The purchase has been aborted due to items in the cart having age restrictions. - `DENIED`: The purchase cannot be completed using the selected payment method given the current conditions. - `UNKNOWN_ERROR`: This error code will be used for all other error scenarios. - `USER_CANCELLED`: This reason can occur when the user cancels the process. This can happen due to various reasons, such as a change of mind or an accidental click. The user can retry. --- # Advanced initialization Source: https://dev.walleypay.com/docs/checkout/optional/init-checkout-features.md This page lists every property you can send when you{" "} initialize a Checkout session, together with the nested objects, callbacks and URI templating they support. :::tip New to Walley Checkout? Start with [Initialize checkout](/docs/checkout/initcheckout) for the smallest request that creates a working session. Come back here when you need the complete property list. ::: ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "storeId": 123, "countryCode": "SE", "reference": "123456789", "redirectPageUri": "https://example.com/purchase-completed-confirmation-page", "checkoutAbortedRedirectPageUri": "https://example.com/back-to-your-shop", "appRedirectUri": "https://example.com/checkout?token={checkout.publictoken}", "merchantTermsUri": "https://example.com/merchant-purchase-terms", "notificationUri": "https://example.com/my-notification-endpoint", "validationUri": "https://example.com/my-validation-endpoint", "callback": { "callbackUri": "https://example.com/my-callback-endpoint", "callbackTypes": ["ValidateOrder", "PaymentFailed"] }, "profileName": "MyExampleProfile", "settlementReference": "shop1", "externalStoreId": "shop1", "actionReference": "MyActionReference", "cart": { "items": [ { "id": "10001", "description": "A product description", "unitPrice": 95.0, "unitWeight": 0.3, "quantity": 1, "vat": 25.0, "requiresElectronicId": true, "sku": "a unique alphanumeric code for article identification" }, { "id": "10002", "description": "Gift Card", "type": "GiftCard", "unitPrice": -100.0, "quantity": 1, "vat": 0.0 } ], "shippingProperties": { "height": 10, "width": 20, "isBulky": true } }, "fees": { "shipping": { "id": "shipping001", "description": "Shipping cost (incl. VAT)", "unitPrice": 59.0, "vat": 25.0 } }, "privateCustomerPrefill": { "email": "test@walleypay.se", "mobilePhoneNumber": "+46701234567", "nationalIdentificationNumber": "19520101-1234", "deliveryAddress": { "firstName": "John", "lastName": "Doe", "coAddress": "c/o Jane Doe", "address": "Sunny road 2", "address2": "Another address line if needed", "postalCode": "12345", "city": "Big Town", "countryCode": "SE" } }, "businessCustomerPrefill": { "organizationNumber": "5562000116", "buyer": { "firstName": "John", "lastName": "Doe", "email": "test@walleypay.se", "mobilePhoneNumber": "+46701234567" }, "invoiceReference": "ref", "invoiceTag": "tag", "deliveryAddress": { "companyName": "No 3 mining enterprise", "coAddress": "c/o Jane Doe", "address": "Rosenborgsgatan 4", "address2": "Another address line if needed", "postalCode": "16974", "city": "Solna" } }, "businessCustomerPreset": { "organizationNumber": "5562000116", "buyer": { "firstName": "John", "lastName": "Doe", "email": "test@walleypay.se", "mobilePhoneNumber": "+46701234567" }, "invoiceReference": "ref", "invoiceTag": "tag", "deliveryAddress": { "companyName": "No 3 mining enterprise", "coAddress": "c/o Jane Doe", "address": "Rosenborgsgatan 4", "address2": "Another address line if needed", "postalCode": "16974", "city": "Solna" } }, "customFields": [ { "id": "group1", "metadata": { "groupMeta": "content" }, "fields": [ { "id": "newsConsent", "name": "I agree to receive marketing communications", "type": "Checkbox", "value": true, "metadata": { "field1Meta": "field-newsletter-consent" }, "localizations": { "fi-FI": { "name": "Hyväksyn markkinointiviestinnän vastaanottamisen", "value": false, "metadata": { "field1Meta": "fi-field-newsletter-consent" } } } }, { "id": "comments", "name": "Any additional comments?", "type": "Text" } ] } ], "metadata": { "administrator": "John Doe", "someOtherData": [1, { "myObj": { "key": 1 } }] } } ``` This example sends `storeId`. To select the store with `salesSegment` instead, see [Selecting a store](#selecting-a-store). ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "91714012-6ae9-4780-a927-fe459bc95bf6", "data": { "privateId": "1eec44b5-66d3-4058-a31f-3444229fb727", "publicToken": "public-SE-7f1b3d2a2a73d348dfbd17d3965ff1458c249f84c695eac1", "expiresAt": "2017-12-07T07:16:49.8098107+00:00", "paymentUri": "https://checkout.uat.walleydev.com/p/npBc87EFB", "paymentQrCodeUri": "https://api.uat.walleydev.com/checkouts/paylinks/npBc87EFB/qrcode" }, "error": null } ``` Response where an invalid `storeId` was provided: ```http HTTP/1.1 400 Bad Request Content-Type: application/json { "id": "1da39a61-d3e1-4da5-a1a0-7a315ea66d2f", "data": null, "error": { "code": 400, "message": "Bad or faulty request. Please examine the errors property for details.", "errors": [ { "reason": "Store_Invalid", "message": "Invalid store id or country code." } ] } } ``` ## Request **Request headers** | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [how to generate the authorization header value](/docs/checkout/authorization). | **Request Body Properties** | Property | Required | Explanation | | ---------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **countryCode** | Yes | The country code to use. `SE`, `NO`, `FI`, `DK`, `DE`, `NL` and `EU` is supported. | | **storeId** | No `*` | Received from Walley Merchant Services. `*` Walley resolves the store from the `countryCode` and `salesSegment` in the request, so you only need `storeId` when that combination does not identify a single store. See [Selecting a store](#selecting-a-store). | | **externalStoreId** | No | Your own id of the store. This is sent to Voyado if you use them as a CRM system. It has a 50-character limit. | | **reference** | No | This is a reference to the order, like an order ID. The reference provided here will be shown to the customer on the invoice or receipt for the purchase. It has a 50-character limit. `**` See special note below regarding Vipps | | **salesSegment** | No | If you have at most one B2C and/or B2B store in the selected country, then you can use this property to select the store instead of providing a `storeId`. The valid values are `B2C` and `B2B`. | | **settlementReference** | No `*` | Set this if you would like to group your settlement reports based on this value. Can for example be used when you have several shops connected to one storeId and want purchases to be grouped by individual shops. It has a 50-character limit. `*` To use this feature you must contact Merchant Services to setup Settlement Settings on this specific Store ID | | **actionReference** | No | A reference to this specific checkout session. This will appear as a data property on the settlement report if the order is auto captured. If you manually capture the order you should set the actionReference on the capture call. Maximum 255 characters. | | **redirectPageUri** | No `*` | If set, the browser will redirect to this page once the purchase has been completed. Used to display a purchase confirmation page. Must be `https`. `*` Required if the Store is an [InStore type](/docs/checkout/optional/instore). | | **checkoutAbortedRedirectPageUri** | No | If set and rendering a [Pay Link](/docs/checkout/paylink/overview), a **go back** button will appear for the customer and if clicked, the checkout session will be deleted and the browser will redirect to this page. Must be `https`. | | **appRedirectUri** | No | Return URL for the Swedish BankID app-switch when the customer authenticates on the **same device**. Once authentication completes, the BankID app returns the customer to this URL. Accepts an absolute `https` URL or a custom app scheme (deep link), and supports the `{checkout.publictoken}` template. See [App redirect URI for BankID](#app-redirect-uri-for-bankid). | | **merchantTermsUri** | Yes | The page to which the Checkout will include a link for customers that wish to view the merchant terms for purchase. Must be `https`. | | **notificationUri** | Yes | The endpoint to be called whenever an event has occurred in the Walley Checkout that might be of interest. For example, this callback is typically used to create an order in the merchant's system once a purchase has been completed. Must be `https`. | | **validationUri** | No | Specify this uri when you want us to make a GET backend call to validate the articles during purchase. Must be `https`. This method is replaced with the more generic callback functionality described below, but may still be used. **Please use only one of the validation methods** | | **callback** | No | Specify this object when you want us to make a POST backend call for any of the specified callback types. See description below for more information. | | **profileName** | No | A name that refers to a specific [settings profile](/docs/checkout/optional/settingsprofiles). The profiles are setup by Merchant Services, please contact them for more information [help@walley.se](mailto:help@walley.se) | | **cart** | Yes | The initial Cart object with items to purchase. [Details below](#cart-object) | | **fees** | No | Shipping fee. [Details below](#fees-object-optional) | | **privateCustomerPrefill** | No | Prefilled private customer information. [Details below](#privatecustomerprefill-object-optional) | | **businessCustomerPrefill** | No | Prefilled business customer information. [Details below](#prefill-or-preset-of-a-business-customer) | | **businessCustomerPreset** | No | Preset business customer information. [Details below](#prefill-or-preset-of-a-business-customer) | | **customFields** | No | Custom inputs to be rendered inside the checkout. [Details below](#customfields-optional) | | **metadata** | No | Your own key/value data, carried with the session and returned when you [retrieve information about the checkout](/docs/checkout/getcheckoutinformation). [Details below](#metadata-object) | | **upsell** | No | Products offered to the customer on the purchase-completed view. See [Add upsell to your store](/docs/checkout/optional/upsell). | :::note `**` Special note regarding Vipps For Vipps purchases with settlements directly from Vipps using your own agreement, the `reference` field can be used to match the purchase with the settlement, if a `reference` is not provided the `orderId` will be used instead. The `reference` or `orderId` field is concatenated with a postfix of a dash `-` and 9 characters. For example a reference of `12345` might result in a settlement reference of `12345-An1c8BAlI`. This is also returned in the `externalPaymentReference` field in the response when [retrieving information about the checkout](/docs/checkout/getcheckoutinformation). ::: ### Selecting a store Every Checkout session belongs to one store. You can identify it in two ways. Walley resolves the store from the `countryCode` and `salesSegment` you send. When that combination matches a single store, leave `storeId` out. A merchant with one B2C store and one B2B store in Sweden sends `countryCode: "SE"` with `salesSegment: "B2C"` or `"B2B"`, and never needs a store ID. Send `storeId` when the combination does not identify a single store, for example when you run two B2C stores in the same market. `storeId` also takes precedence, so sending it is always unambiguous. | You send | Store used | | ------------------------------------- | ---------------------------------------------- | | `storeId` | That store | | `countryCode` and `salesSegment` | The single store matching both | | `countryCode` only | The single store in that country | ### Callback object The `callback` object allows you to handle certain events within the Checkout flow, for example validating the items are in stock or that the customer is allowed to purchase the items. This callback is synchronous and has a timeout of 10 seconds. It differs from the [notificationUri callback](/docs/checkout/notificationcallback) that is asynchronous and mainly used to notify you about completed purchases. | Property | Required | Explanation | | ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------- | | **callbackUri** | Yes | The endpoint to be called whenever any of the callback types occurs. Must accept POST requests. Must be `https`. | | **callbackTypes** | Yes | Currently `ValidateOrder` and `PaymentFailed` are supported. | The request body of the callback contains the callback type, along with the private id and public token. Use the private id to validate that the callback originates from Walley ```json // Example of request body for a callback { "type": "ValidateOrder", "body": { "checkoutId": "3350f4f2-809e-4103-a566-85e20280b76a", "publicToken": "public-SE-0a94436dba53edc468584935e7da524eb8d5d8feab85ed03" } } ``` #### ValidateOrder This callback is called just before payment to validate the purchase. See [ValidateOrder](/docs/checkout/optional/validateorder). #### PaymentFailed This callback will be called if a payment was unsuccessful, for instance if there was no money on the card or the user cancelled electronic verification. You can use this callback to undo any logic on your side that you made in the `ValidateOrder` callback. Exceptions for when we will not be sending this callback are: - If payment fails before the `ValidateOrder` callback. - If you respond with anything other than 2XX during the `ValidateOrder` callback. These callbacks have a timeout of 10 seconds. Right now, the Checkout doesn't use the callback's response for anything. ### App redirect URI for BankID When the customer authenticates with **Swedish BankID** on the **same device**, Walley passes `appRedirectUri` to BankID as the return URL. Once authentication completes, the BankID app switches the customer back to this URL, typically the page or app where the Checkout is running. They land on the confirmation page instead of being left in the BankID app. The return URL is **only** used when the customer authenticates on the same device. When the customer scans the QR code with BankID on another device, no app-switch occurs and `appRedirectUri` is not used. `appRedirectUri` is especially useful when the Checkout runs inside a native merchant app: a universal link (iOS), an app link (Android), or a custom app scheme such as `myapp://` lets the BankID app hand control back to your app instead of opening a new browser tab. Follow [BankID's best practices for the return URL](https://developers.bankid.com/how-to-guides/return-url). In particular, include a nonce or session identifier to mitigate session hijacking. ### Cart object The `cart` object contains an array of items with the following properties. At least one article must be included to initialize a checkout session. | Property | Required | Explanation | | ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **id** | Yes | The article id or equivalent. Max 50 characters. Values are trimmed from leading and trailing white-spaces. Shown on the invoice or receipt. | | **description** | Yes | Descriptions longer than 50 characters will be truncated. Values are trimmed from leading and trailing white-spaces. Shown on the invoice or receipt. | | **type** | No | An optional type of the article. Currently the only valid value is `GiftCard`. If specified, `unitPrice` must be negative, `quantity` must be 1, `vat` must be 0.0. Furthermore `unitWeight`, `requiresElectronicId`, `minimumAge` and `maximumAge` cannot be specified. Read more about [Gift Cards](/docs/checkout/common-use-cases/giftcards) | | **unitPrice** | Yes | The unit price of the article including VAT. Both positive and negative values allowed. Max 2 decimals, i.e. `100.00` | | **unitWeight** | No | The weight of the article. Only positive values are allowed (including zero) | | **quantity** | Yes | The quantity of the article. Allowed values are `1` to `99999999`. | | **vat** | Yes | The VAT of the article in percent. Allowed values are `0` to `100`. Max 2 decimals, i.e. `25.00` | | **requiresElectronicId** | No | To minimize the risk of a fraudulent purchase on credit products, it is possible to force the customer to strongly identify themselves at the point of purchase using electronic id such as Mobilt BankID. An example would be selling tickets that are delivered electronically. This feature does not validate the age of the customer and is supported for credit payments for B2C and B2B on the Swedish, Norwegian and Finnish markets. | | **minimumAge** | No | The minimum age allowed to purchase this product. Allowed values are `1` to `120`. When this property is set, we require the user to enter a civic number and verify it with electronic id before making the payment. If multiple items has different minimumAge, we use the oldest age. This feature is supported for B2C. | | **maximumAge** | No | The maximum age allowed to purchase this product. Allowed values are `1` to `120`. When this property is set, we require the user to enter a civic number and verify it with electronic id before making the payment. If multiple items has different maximumAge, we use the youngest age. This feature is supported for B2C. | | **sku** | No | A stock Keeping Unit is a unique alphanumeric code that is used to identify product types and variations. Maximum allowed characters are 1024. | The `shippingProperties` are optional and only relevant if a [Delivery Module](/docs/checkout/delivery/introduction-delivery-module) is used. It gives flexibility to customize what delivery methods should be available based on the items in the cart. Read more about how these properties are included when [Fetching Delivery Methods with nShift](/docs/checkout/delivery/nshift#custom-request-query-parameters), or [Fetching Delivery Methods with Custom Delivery Adapter](/docs/checkout/delivery/custom-adapter#get-delivery-methods). ### Fees object (optional) The `Fees` object allows you to set a shipping fee. The fee will be shown last on the receipt after all the cart items and also on the purchase confirmation page for a completed purchase. This object is optional and can be set after initialization of the checkout through the [Update fees endpoint](/docs/checkout/optional/updatefees). **Note** that if you are using [Custom Delivery Adapter](/docs/checkout/delivery/custom-adapter#get-delivery-methods) that the shipping fee is taken care of there instead. | Property | Required | Explanation | | --------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | **id** | Yes | An id of the fee item. Max 50 characters. Values are trimmed from leading and trailing white-spaces. Shown on the invoice or receipt. | | **description** | Yes | Descriptions longer than 50 characters will be truncated. Values are trimmed from leading and trailing white-spaces. Shown on the invoice or receipt. | | **unitPrice** | Yes | The unit price of the fee including VAT. Allowed values are `0` to `999999.99`. Max 2 decimals, i.e. `25.00` | | **vat** | Yes | The VAT of the fee in percent. Allowed values are `0` to `100`. Max 2 decimals, i.e. `25.00` | ### PrivateCustomerPrefill object (optional) You can use the `privateCustomerPrefill` object to share any information you have on the customer. We use this data to try and identify the customer, making their checkout faster. If we can't identify them, we'll ask the customer for more details. However, whether we identify the customer or not doesn't change the response or status code of the Initialize Checkout Session call. We recommend providing complete data when using prefill. #### Examples - If `email` and `mobilePhoneNumber` are provided and the combination is matched for a previously known customer, the user will be logged in and ready for purchase. - If `email` and `mobilePhoneNumber` are provided but the combination does not match a previously known customer, we will prompt the user for further identification details. - If `email` and `mobilePhoneNumber` are provided together with `nationalIdentificationNumber` we will try to identify the customer using these values by doing a lookup in an address registry. - If a complete `deliveryAddress` is provided the address will be set as the customer's delivery address. - If a non-complete `deliveryAddress` is provided the address will be shown upon initial identification for the customer if the customer chooses to not enter their national registration number. | Property | Required | Explanation | | -------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- | | **email** | No `*` | The customer's email address. | | **mobilePhoneNumber** | No `*` | The customer's mobile phone. When providing a number from a foreign country, it must have a valid prefix such as +46 or 0046. | | **nationalIdentificationNumber** | No | The customer's national identification number. | | **deliveryAddress** | No | Delivery Address ([see below](#deliveryaddress-object-b2c)) | `*` email and mobilePhoneNumber are required when identifying a user using a profile with DeliveryMode: Digital ### DeliveryAddress object (B2C) | Property | Required | Explanation | | --------------- | -------- | --------------------------------------------- | | **firstName** | No | First name | | **lastName** | No | Last name | | **coAddress** | No | Care of address | | **address** | No | Primary address row | | **address2** | No | Additional address row | | **postalCode** | No | Postal code | | **city** | No | City | | **countryCode** | No | Only used when shipping to multiple countries | ### Prefill or preset of a business customer You can use prefill and/or preset data to set up a business customer's details before showing the checkout page. Prefill information is like a suggestion; customers can change it. However, preset information can't be changed by the customer, so you must ensure it's correct. The prefill and preset objects are equal in structure and when the checkout combines the information from the two objects, the preset values are prioritized over the prefilled values. Though all object values are optional, there are validation rules enforced at initialization. If the combined object includes an organization number, you must also provide a full buyer's object to identify the customer. If the organization number is preset and we can't identify the business (or the buyer's object is missing), we'll give an error. However, if the organization number is prefilled and we can't identify, the customer will have to do the identification themselves. If the values marked with a `*` in the DeliveryAddress object are provided, we'll set the customer's delivery address after identifying them. If any of these values are preset, the customer won't be able to change the delivery address later. | Property | Required | Explanation | | ---------------------- | -------- | ----------------------------------------------------------- | | **organizationNumber** | No | The organization number of the company | | **buyer** | No | Buyer information (see below) | | **invoiceReference** | No | Shown on the invoice | | **invoiceTag** | No | Shown on the invoice | | **deliveryAddress** | No | Delivery Address ([see below](#deliveryaddress-object-b2b)) | ### Buyer object A buyer is the person performing a purchase on the behalf of the company | Property | Required | Explanation | | --------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | | **firstName** | No | The first name of the buyer | | **lastName** | No | The last name of the buyer | | **email** | No | The buyer's email address. | | **mobilePhoneNumber** | No | The buyer's mobile phone. When providing a number from a foreign country, it must have a valid prefix such as +46 or 0046. | ### DeliveryAddress object (B2B) | Property | Required | Explanation | | --------------- | -------- | ---------------------- | | **companyName** | No `*` | Name of the company | | **coAddress** | No | Care of address | | **address** | No `*` | Primary address row | | **address2** | No | Additional address row | | **postalCode** | No `*` | Postal code | | **city** | No `*` | City | If you provide any of the values marked with `*`, you must provide all of them to have a valid address. The exception is for Norway where `address` is optional. ### CustomFields (optional) The `customFields` array allows you to optionally provide a blueprint for fields of your choosing to be rendered inside the checkout. These can be things like consent for newsletter or comments. It will be rendered in it's own section after the payment methods. You can specify multiple groups that will be rendered as their own separate sections, and the `name` field will set the header. We recommend not to have a name present if you only have one group. Each group can contain fields. We currently support checkboxes, toggles and text fields. They may have a default value. Every group and field can also contain overriding localization information for markets with multiple languages, or to simplify with one configuration regardless of the current session language. Every level also supports a metadata object (see below for more information).
A custom fields section in the checkout holding a newsletter checkbox, a consent toggle and a free-text comment field
#### Group object | Property | Required | Explanation | | ----------------- | -------- | -------------------------------------------------------------------------------------------------- | | **id** | Yes | An id for the group. Max 50 characters. Values are trimmed from leading and trailing white-spaces. | | **name** | No | The header rendered above the group section | | **metadata** | No | A metadata object for the group (see below for more info) | | **localizations** | No | Specify a different name and metadata for other languages (specified with ISO language codes) | | **fields** | Yes | An array of fields to render (see below) | #### Fields object | Property | Required | Explanation | | ----------------- | -------- | --------------------------------------------------------------------------------------------------- | | **id** | Yes | An id for the field. Max 50 characters. Values are trimmed from leading and trailing white-spaces. | | **name** | Yes | The label for the field | | **type** | Yes | The type of field to be rendered. "Checkbox". "Toggle" or "Text" | | **value** | No | The default value for the field. A string for text fields and true/false for checkboxes and toggles | | **metadata** | No | A metadata object for the group (see below for more info) | | **localizations** | No | Specify a different name/value/metadata for other languages (specified with ISO language codes) | ### Metadata object The `metadata` object allows you to optionally provide custom metadata information in a key/value format of at most 6000 characters. Metadata is not processed by Walley but will be returned when [retrieving information about the checkout](/docs/checkout/getcheckoutinformation). This means that the `metadata` object can be used as an opaque reference for things that needs to be remembered without saving state locally. Each metadata key must be a string but the value can be any valid JSON type. ## Response | Property | Explanation | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **publicToken** | The `publicToken` is used to [render the Checkout iframe](/docs/checkout/renderiframe). The public token has a limited lifetime of 168 hours (7 days). | | **privateId** | The `privateId` is used to perform backend communication with the Checkout API for the given session. The `privateId` is used to [acquire information](/docs/checkout/getcheckoutinformation) for an ongoing or completed session for up to 90 days after it was created. The `privateId` is also used when modifying a session (e.g. cart update). Updates can be made for a session until it is completed or `expiresAt` has passed. | | **expiresAt** | The timestamp when this Checkout session will expire. After this timestamp the purchase cannot be completed, no updates to the cart can be performed and a new Checkout session must be initialized. | | **paymentUri** | A shortcut link to this Checkout session. Used when distributing a [Pay Link](/docs/checkout/paylink/) to a customer. | | **paymentQrCodeUri** | A QR code representation of `paymentUri`. The URL returns an image that can be embedded in the merchant's system. Note that this URL is publicly available so no auth is required. The URL supports the same [URL parameters](/docs/checkout/paylink/getting-started) as `paymentUri`. | ## Templating the uri values The `notificationUri`, `validationUri`, `redirectPageUri`, `appRedirectUri` and the `checkoutAbortedRedirectPageUri` properties can optionally be templated. A correctly templated specified URI will replace the variables with the real values for the given Checkout session when called. Allowed template values: | Uri | `{checkout.publictoken}` | `{checkout.id}` | | ----------------------------------- | ------------------------ | --------------- | | notificationUri | ✔️ | ✔️ | | validationUri | ✔️ | ✔️ | | redirectPageUri | ✔️ | ❌ | | appRedirectUri | ✔️ | ❌ | | checkoutAbortedRedirectPageUri | ✔️ | ❌ | The variable names `{checkout.id}` will be replaced by the `privateId` and `{checkout.publictoken}` will be replaced by `publicToken`. Note that the variables are **case-sensitive**. ### Examples | notificationUri | Will be transformed into | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [https://your-backend.com/checkout/`{checkout.id}/something`](https://your-backend.com/checkout/{checkout.id}/something) | [https://your-backend.com/checkout/1eec44b5-66d3-4058-a31f-3444229fb727/something](https://your-backend.com/checkout/1eec44b5-66d3-4058-a31f-3444229fb727/something) | | [https://your-backend.com/something/happened?reference=`{checkout.id}`](https://your-backend.com/something/happened?reference={checkout.id}) | [https://your-backend.com/something/happened?reference=1eec44b5-66d3-4058-a31f-3444229fb727](https://your-backend.com/something/happened?reference=1eec44b5-66d3-4058-a31f-3444229fb727) | | [https://your-backend.com/something/happened?reference=`{checkout.publictoken}`](https://your-backend.com/something/happened?reference={checkout.publictoken}) | [https://your-backend.com/something/happened?reference=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d](https://your-backend.com/something/happened?reference=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d) | | [https://your-backend.com/something/happened?id=`{checkout.id}&token={checkout.publictoken}`](https://your-backend.com/something/happened?id={checkout.id}&token={checkout.publictoken}) | [https://your-backend.com/something/happened?id=1eec44b5-66d3-4058-a31f-3444229fb727&token=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d](https://your-backend.com/something/happened?id=1eec44b5-66d3-4058-a31f-3444229fb727&token=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d) | | redirectPageUri | Will be transformed into | | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [https://your-frontend.com/thankyoupage?reference=`{checkout.publictoken}`](https://your-frontend.com/thankyoupage?reference={checkout.publictoken}) | [https://your-frontend.com/thankyoupage?reference=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d](https://your-frontend.com/thankyoupage?reference=public-SE-6d0ed138881fd548d8c7c81450d1c54483e257f4720e419d) | --- # In-store mode Source: https://dev.walleypay.com/docs/checkout/optional/instore.md Walley Checkout supports running in in-store mode. In-store mode is intended to be used on a tablet or computer in a physical store where merchandise is then collected at a drop off point inside the store. When running in in-store mode the following rules apply: - The "Remember me" feature is disabled. A customer cannot be remembered by the Checkout. - Autocomplete of fields in the browser running the in-store checkout must be disabled. See the documentation for your browser for more details. - Setting a delivery address is disabled as merchandise is collected in the store. - Merchant must provide a `redirectPageUri` when [initializing the Checkout](/docs/checkout/initcheckout). This page must support reloading the page or starting a new Checkout session with a new customer e.g by automatically reloading the page after some time or by providing a "next customer" button. In-store mode is configured per store id. Please contact Walley Merchant services to configure your store id as a in-store merchant. --- # Metric Events Source: https://dev.walleypay.com/docs/checkout/optional/metricevents.md Use Metric Events to create insights using your favorite analytics tool like Google Analytics :::info Events can fire more than once These events are intended to create analytic insights and make it possible to track the customer journey in Walley Checkout. Events might be triggered more than once for a session, and you will have to cater for this in your analytics tool ::: ## Examples ```javascript /* Javascript event listeners using DOM */ document.addEventListener("walleyCheckoutMetric", (event) => { console.log("WALLEY CHECKOUT METRIC", event.detail); // Example payload. Note this is an object and you need to parse this according to event payload in the table below const payload = event.detail.payload; // See event types in table below const type = payload.type; // Send to your analytics tool, example with Google Analytics gtag("event", type, { app_name: "MyWebSite", value: payload, }); }); ``` ## Example event object ```javascript { // public token for the session emitting the event "token": "public-SE-000000000000000000000000000000000000000000000000", "payload": { // This is the type described below "type": "PaymentOptionSelected", // Payload according to event type "paymentOption": { "paymentMethodName": "PartPayment", "paymentOptionId": 6 } } } ``` ## Event definitions The following describes the payload object of each emitted event ### Initialized The Checkout was successfully Initialized, occurs right before rendering ``` "payload": { "type": "Initialized" } ``` ### InView The Checkout has been rendered and its call-to-action (CTA) is within the viewport of the user ``` "payload": { "type": "InView" } ``` ### CustomerIdentified The customer has been successfully identified by the user (not by prefill or preset by merchant) ``` "payload": { "type": "CustomerIdentified" } ``` ### DeliveryAddressChanged The delivery address has been updated. Occurs automatically when a customer is identified, or when a user changes it manually ``` "payload": { "type": "DeliveryAddressChanged" } ``` ### ShippingMethodSelected A shipping method (or a sub-choice of a shipping method) has been selected by the user. Occurs only when shipping is used in the checkout. ``` "payload": { "type": "ShippingMethodSelected" } ``` ### PaymentCategorySelected A payment category has been selected by the user ``` "payload": { "type": "PaymentCategorySelected", "category": "postDelivery" } ``` ### PaymentMethodSelected A payment method has been selected by the user, or default value set when payment category is selected ``` "payload": { "type": "PaymentMethodSelected", "paymentMethod": "DirectInvoice" } ``` ### PaymentOptionSelected Occurs when a sub-choice of a payment method has been selected, for example duration of payment method ``` "payload": { "type": "PaymentOptionSelected", "paymentOption": { "paymentMethodName": "PartPayment", "paymentOptionId": 6 } } ``` ### CommittedToPurchase The user has clicked the Complete purchase CTA button ``` "payload": { "type": "CommittedToPurchase" } ``` ### SCARequested The user has been presented with a dialogue stating that Strong Customer Authentication is required for this purchase ``` "payload": { "type": "SCARequested" } ``` ### SCAStarted The user is either redirected to SCA when in NO, FI, DK. When using BankID in SE this is not triggered since it is done on device or by scanning QR code. ``` "payload": { "type": "SCAStarted" } ``` ### SCACanceled The user cancelled manually, or the SCA session timed out. ``` "payload": { "type": "SCACanceled" } ``` ### KALPRequested The user has been presented with a dialogue stating that KALP (Household calculation) is required to continue. ``` "payload": { "type": "KALPRequested" } ``` ### KALPCanceled The KALP was cancelled by the user ``` "payload": { "type": "KALPCanceled" } ``` ### KALPSubmitted The KALP was successfully submitted ``` "payload": { "type": "KALPSubmitted" } ``` ### PurchaseFailed The purchase failed. This could be due to several reasons including credit check denied or fraud rules. We cannot reveal the reason to this due to privacy and secrecy. ``` "payload": { "type": "PurchaseFailed" } ``` ### PurchaseCompleted The purchase was successfully completed. ``` "payload": { "type": "PurchaseCompleted" } ``` ### CustomerFeedback The user gave feedback about the purchase. ``` "payload": { "type": "CustomerFeedback", "customerSatisfied": true } ``` ### WidgetPartPaymentLinkClicked The user clicked the link in the part payment widget ``` "payload": { "type": "WidgetPartPaymentLinkClicked", "amount": 5000 } ``` --- # PayPal Source: https://dev.walleypay.com/docs/checkout/optional/paypal.md Walley Checkout supports PayPal as a redirect-based payment method for private customers. The customer approves the payment in PayPal and then returns to Walley Checkout while the result is confirmed. ## Availability | Property | Value | | --- | --- | | Customer type | Private customers (B2C) | | Checkout flow | One-time purchases | | Markets | All markets where Walley Checkout is available. PayPal is enabled by default for new merchants in Germany and the Netherlands. Contact Walley Merchant Services to activate it in other markets. | | Currency | The currency configured for the selected store and market | | Minimum amount | `0.01` in the checkout currency, with a maximum of two decimal places | PayPal appears in the checkout only when it is enabled in the selected [settings profile](/docs/checkout/optional/settingsprofiles) and the store has completed PayPal onboarding. It is not available for business customers, tokenized payments, or subscriptions. ## Prerequisites Before PayPal can be activated for your store, you need: - A PayPal Business account onboarded through Walley's PayPal partner setup. - A PayPal merchant payer ID registered on your Walley store. - PayPal enabled in the settings profile used by the store. The merchant payer ID is store configuration. Do not include it in Checkout API requests or expose it in client-side code. ## How to get started 1. Contact [Walley Merchant Services](/support) to confirm that PayPal is included in your agreement and available for your market. 2. Complete the PayPal merchant onboarding coordinated by Walley. 3. Provide the resulting PayPal merchant payer ID through the agreed onboarding channel. 4. Ask Merchant Services to configure PayPal for your test and production stores and settings profiles. 5. Complete a test purchase and verify the result through the standard Checkout notification flow before going live. ## Integrate PayPal PayPal uses the standard Walley Checkout integration and requires no PayPal-specific API properties. Once PayPal is enabled, initialize and render Checkout as usual. Select the configured B2C store, use a unique `reference` for each checkout, and provide an HTTPS `notificationUri` for completed purchases. Walley Checkout manages the customer journey to and from PayPal. See [Initialize checkout](/docs/checkout/initcheckout) for a minimal request and [Advanced initialization](/docs/checkout/optional/init-checkout-features) for the complete request model. ## Payment flow 1. The customer selects PayPal in the Walley Checkout iframe. 2. The customer is sent to PayPal to log in and approve the payment. 3. The customer returns to Walley Checkout. 4. When the purchase is complete, Walley calls your `notificationUri`. 5. Retrieve the checkout and create or update the order in your system. Treat the [purchase notification](/docs/checkout/notificationcallback) as the reliable completion signal. Do not use the browser redirect as proof of payment. After the notification, [retrieve the checkout](/docs/checkout/getcheckoutinformation) and confirm that `data.status` is `PurchaseCompleted`. The `data.purchase.paymentName` value is `PayPal`. ## Cancellations and pending payments If the customer cancels or leaves the PayPal approval flow, Walley Checkout cancels the active attempt. Do not create an order based on the browser return or cancellation page. Retrieve the checkout when you need to determine its current status. ## Captures and refunds Manage a completed PayPal order through Walley's standard order flow: - Use [Capture order](/docs/manage/orders/capture) when you deliver the goods or service. - Use [Refund order](/docs/manage/orders/refund) for full or partial refunds. Do not capture or refund the transaction directly in the PayPal dashboard. Performing post-purchase operations through Walley keeps the Walley order and the PayPal transaction synchronized. --- # Settings profiles Source: https://dev.walleypay.com/docs/checkout/optional/settingsprofiles.md Walley Checkout supports a concept of settings profiles to allow merchants to control which features can be used by the end customer. The profiles are setup by Merchant Services [help@walley.se](mailto:help@walley.se) and each profile is given a unique name that is used by the Merchant when initializing the Checkout. The following is a subset of the features that can be set using profiles. Please contact Merchant Services [help@walley.se](mailto:help@walley.se) for additional information. - Enable or disable payment methods (according to contract) - Set a custom name of the "Account" payment method, like `TheStore Account` - Set the DeliveryMode so the Checkout can be used for services where nothing is physically delivered `DeliveryMode: Digital`, or in a traditional e-commerce where something is delivered physically `DeliveryMode: Physical` - Allow invoices to be auto activated upon creation (requires supporting workflow in merchant´s backend) - Allow customers to identify themselves without a national registration number (using only delivery address) - Prohibit customers from setting a delivery address different from the registered address (for example when selling merchandise that requires legal age) - Enforce a minimum age for purchases, ranging from `1` to `120` years. If set, the user must provide and confirm their civic number with an electronic ID when identifying. - Enforce a maximum age for purchases, ranging from `1` to `120` years. If set, the user must provide and confirm their civic number with an electronic ID when identifying. --- # Update cart Source: https://dev.walleypay.com/docs/checkout/optional/updatecart.md The Update Cart request will replace the current cart. If you update the Cart while the Checkout is visible, use the Checkout Client API's to invoke suspend before your operation and resume afterward. :::info Important This operation is only available while the purchase is still in progress. ::: While the checkout is suspended, the cart can be updated by calling the Checkout API from your backend: ```http PUT /checkouts/{checkoutId}/cart HTTP/1.1 ``` :::note[API Reference] See **Update cart** for the request schema, property descriptions, examples and error reasons. ::: ## Cart items The request replaces the whole cart, so send the complete set of items rather than a delta. The `id` and `description` values are trimmed of leading and trailing white-space before they are stored. :::note Cart Validation The cart cannot consist entirely of items with negative `unitPrice` values. At least one item in the cart must have a non-negative unit price. ::: **Gift cards.** Set `type` to `GiftCard` to add a gift card to the cart. Give it a negative `unitPrice`, a `quantity` of `1` and a `vat` of `0.0`. Leave out `unitWeight`, `shipping`, `requiresElectronicId`, `minimumAge` and `maximumAge`. A cart can hold several gift cards, but no two of them can share the same `id`, `description` and `unitPrice`, so give each gift card its own `id`. Read more about [Gift Cards](/docs/checkout/common-use-cases/giftcards). **Strong identification.** Set `requiresElectronicId` on an item to force the customer to identify themselves with electronic id, such as Mobilt BankID, at the point of purchase. This lowers the risk of a fraudulent purchase on credit products, for example when selling tickets that are delivered electronically. It does not validate the age of the customer, and it is supported for credit payments for B2C and B2B on the Swedish, Norwegian and Finnish markets. **Age limits.** Set `minimumAge` or `maximumAge` on an item to require the customer to enter a civic number and verify it with electronic id before paying. When items carry different limits, the oldest `minimumAge` and the youngest `maximumAge` apply. Age limits are supported for B2C. ## Shipping properties The `shippingProperties` is optional and only relevant if a [Delivery Module](/docs/checkout/delivery/introduction-delivery-module) is used. It consists of key-value pairs that will set shipping properties. Each key must be a string, and the value can be a string, a boolean, a number or null. The request replaces the whole set, so omit a key to remove that property. If you send a key with a null value, the key stays and Walley stores its value as null. To remove every shipping property, send `shippingProperties` as null or as an empty object. ## Error responses The error reasons this endpoint can return are listed per status code in the API Reference. The [Error codes](/docs/checkout/error-codes) page explains the HTTP status codes used across the Checkout API. --- # Update checkout Source: https://dev.walleypay.com/docs/checkout/optional/updatecheckout.md The Update checkout request will replace the entire checkout state. If you update the Checkout while the Checkout is visible, use the Checkout Client API's to invoke suspend before your operation and resume afterward. You can also update the objects individually: [cart](/docs/checkout/optional/updatecart), shippingProperties, [fees](/docs/checkout/optional/updatefees), [shipping](/docs/checkout/delivery/ingrid?tab=update#extending-regular-walley-api-requests), [reference](/docs/checkout/optional/updateorderreference), [metadata](/docs/checkout/optional/updatemetadata) :::info Important This operation is only available while the purchase is still in progress. ::: While the checkout is suspended, the checkout can be updated by calling the Checkout API from your backend: ```http PUT /checkouts/{checkoutId} HTTP/1.1 ``` :::note[API Reference] See **Update checkout** for the request schema, property descriptions, examples and error reasons. ::: ## Replace semantics :::info Important The Update checkout PUT request will replace the checkout state. Providing `null` to (or omitting) the optional properties `shippingProperties`, `shipping`, `fees` or `metadata` will remove the existing value. `reference`, `settlementReference` and `upsell` are the exceptions. Omit them, or send `null`, and the existing values stay. ::: Only `cart` is required for a Checkout session that results in an order. `shippingProperties`, `shipping`, `fees`, `reference`, `settlementReference`, [`upsell`](/docs/checkout/optional/upsell) and `metadata` are all optional. ## Cart :::note Cart Validation The cart cannot consist entirely of items with negative `unitPrice` values. At least one item in the cart must have a non-negative unit price. ::: The item constraints are the same as for the dedicated endpoint. See [Update cart](/docs/checkout/optional/updatecart#cart-items) for gift cards, strong identification and age limits. ## Fees :::info If the [Delivery Module](/docs/checkout/delivery/introduction-delivery-module) is used, the customer selects delivery method inside Walley Checkout and the `fees.shipping` object is obsolete. ::: To set the shipping fee, add a `shipping` object to the fees object of the request. The `shipping` object can be `null` to remove the shipping fee for the current Checkout. Keep the combination of `id` and `description` unique within the Checkout session, cart articles included. That keeps every line distinct on the invoice and the receipt. Walley trims leading and trailing white-space from both values. ## Shipping and shipping properties `shippingProperties` replaces any existing value. It consists of key-value pairs that will set shipping properties. Each key must be a string but the value can be string, boolean or number. See [Extending regular Walley API requests](/docs/checkout/delivery/ingrid?tab=update#extending-regular-walley-api-requests) to learn more about how to update checkout when using Ingrid. ## References and metadata `reference` is a reference to the order, such as an order ID. It is not shown to the customer, but it can be correlated with the PurchaseIdentifier that the customer does see. Set `settlementReference` if you would like to group your settlement reports based on this value. It requires Settlement Settings to be set up on the Store ID by Merchant Services. See [Init Checkout Features](/docs/checkout/optional/init-checkout-features) for details. `metadata` replaces any existing metadata. Each key in the object must be a string but the value can be any valid JSON value. :::info This endpoint cannot be used to update the reference after a purchase. Use [Update order reference](/docs/checkout/optional/updateorderreference) once the purchase is completed. ::: ## Error responses The error reasons this endpoint can return are listed per status code in the API Reference. The [Error codes](/docs/checkout/error-codes) page explains the HTTP status codes used across the Checkout API. --- # Update fees Source: https://dev.walleypay.com/docs/checkout/optional/updatefees.md The Update fees request will replace the current fees. If you update the fees while the Checkout is visible, use the Checkout Client API's to invoke suspend before your operation and resume afterward. The fee is optional but will be shown last on the receipt after all the cart items if present and be presented separately on the thank you-page. :::info If the [Delivery Module](/docs/checkout/delivery/introduction-delivery-module) is used, the customer selects delivery method inside Walley Checkout and the `fees.shipping` object and this entire endpoint are obsolete. ::: :::info Important This operation is only available while the purchase is still in progress. ::: While the checkout is suspended, the fees can be updated by calling the Checkout API from your backend: ```http PUT /checkouts/{checkoutId}/fees HTTP/1.1 ``` :::note[API Reference] See **Update fees** for the request schema, property descriptions, examples and error reasons. ::: ## Setting the shipping fee To set the shipping fee, add a `shipping` object to the fees object of the request. The shipping object can be `null` to remove the shipping fee for the current Checkout. Keep the combination of `id` and `description` unique within the Checkout session, cart articles included. That keeps every line distinct on the invoice and the receipt. Walley trims leading and trailing white-space from both values. ## Error responses The error reasons this endpoint can return are listed per status code in the API Reference. The [Error codes](/docs/checkout/error-codes) page explains the HTTP status codes used across the Checkout API. --- # Update metadata Source: https://dev.walleypay.com/docs/checkout/optional/updatemetadata.md The Update metadata request will replace the current metadata. :::info Important This operation is only available while the purchase is still in progress. ::: The metadata can be updated by calling the Checkout API from your backend: ```http PUT /checkouts/{checkoutId}/metadata HTTP/1.1 ``` :::note[API Reference] See **Update metadata** for the request schema, examples and error reasons. ::: ## Metadata body Each key in the object must be a string but the value can be any valid JSON value. Key casing is preserved. Providing an empty body will remove any existing metadata. ## Error responses The error reasons this endpoint can return are listed per status code in the API Reference. The [Error codes](/docs/checkout/error-codes) page explains the HTTP status codes used across the Checkout API. --- # Update order reference Source: https://dev.walleypay.com/docs/checkout/optional/updateorderreference.md In addition to update an order reference in the initialize checkout and order validation calls, it is also possible to update the order reference for a Checkout session after a purchase has been successfully completed :::info Important You can only update the Order Reference once after the purchase has been completed, and it must be done before the order is captured. ::: The order reference is updated by calling the Checkout API from your backend: ```http PUT /checkouts/{checkoutId}/reference HTTP/1.1 ``` :::note[API Reference] See **Update order reference** for the request schema, examples and error reasons. ::: ## The reference value This is a reference to the order, like an order ID. If you update the reference after completing the purchase, the customer might not see it. However, you can still match it with the PurchaseIdentifier the customer sees. ## Error responses The error reasons this endpoint can return are listed per status code in the API Reference. The [Error codes](/docs/checkout/error-codes) page explains the HTTP status codes used across the Checkout API. --- # Add upsell to your store Source: https://dev.walleypay.com/docs/checkout/optional/upsell.md Offer extra products to the customer once their purchase is complete. Let Walley Checkout render the upsell inside the iframe, or build your own UI and call Reauthorize. :::info Important Auto-activated invoices cannot be upsold. Custom upsell using Reauthorize works for orders with status `NotActivated` or `PartActivated`. For in-checkout upsell, see [Availability](#availability). ::: ## Choose your integration | Option | Who renders the UI | When to pick it | | ------------------------------------- | ------------------------- | -------------------------------------------------------------------------------- | | [**In-checkout upsell**](#in-checkout-upsell) | Walley Checkout iframe | Sweden, credit purchases and Swish on a Walley-managed Swish account. | | [**Custom upsell using Reauthorize**](#custom-upsell-using-reauthorize) | Your own post-checkout UI | Credit purchases. Use when you need full control or upsell is decided post-checkout. | --- ## In-checkout upsell :::info In-checkout upsell is only allowed for Checkout sessions that create an order, which is the default. If the session uses a [settings profile](/docs/checkout/optional/settingsprofiles) set up for another purpose, such as subscriptions or identification, sending upsell items is rejected with `400 Bad Request`. ::: ### How it works 1. Pass an `upsell.items` array on the [Initialize Checkout](/docs/checkout/optional/init-checkout-features) request. Max **10 items**. 2. The customer completes their purchase as usual. 3. On the purchase-completed view, Walley Checkout renders the items as cards (image, description, price, **Add** button) together with a countdown for the offer's [time limit](#upsell-properties). 4. When the customer taps **Add**, Walley appends the article to the order. For credit purchases the order is reauthorized automatically. For Swish, the customer approves the extra payment in the Swish app. No merchant call required. 5. Accepted items appear as extra rows with `type: "Upsell"` in the order. Read them from [Get Checkout Information](/docs/checkout/getcheckoutinformation) under `order.items` once the offer has expired. ### Availability - **Country**: Sweden (`SE`) only. - **Payment method**: Walley credit purchases, and Swish when the purchase is made on a Walley-managed Swish account. - **Order state**: not activated. If the order is auto-activated, no upsell is shown. If any of the above is not met the `upsell` block is silently omitted from the completed view — the rest of the checkout is unaffected. If you activate the order before the time limit has expired, the customer can no longer add items and the offer closes. Wait until the time limit has expired before activating the order, fully or partly. ### Before you integrate - **Using `redirectPageUri`?** When it is set, the customer is redirected as soon as the purchase is complete, before the upsell view is shown. The redirect cannot be delayed. To show the upsell, render the checkout again on your redirect page, or leave out `redirectPageUri`. - **No checkout notification is sent when an item is added.** Neither the [notificationUri callback](/docs/checkout/notificationcallback) nor any checkout event fires for upsell. If you subscribe to [webhooks](/docs/webhooks/orders#walleyorderreauthorized), a `walley:order:reauthorized` webhook is sent each time an item is added. The time limit is the reliable signal: once it has expired, the order can no longer change. Fetch the final order after that. - **The `validationUri` is not called before an upsell item is added.** Stock and price are not re-validated, so only offer items you can deliver at the price you sent. ### Adding upsell items at init Extend your existing [Initialize Checkout](/docs/checkout/optional/init-checkout-features) request with an `upsell` object: ```http POST /checkouts HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "storeId": 123, "countryCode": "SE", "reference": "123456789", "merchantTermsUri": "https://example.com/terms", "notificationUri": "https://example.com/notifications", "cart": { "items": [ /* primary cart items */ ] }, "upsell": { "timeLimitInSeconds": 300, "items": [ { "id": "10101", "description": "Premium gift wrapping", "quantity": 1, "unitPrice": 49.0, "vat": 25.0, "sku": "GIFTWRAP-PREMIUM", "imageUrl": "https://cdn.example.com/img/giftwrap.jpg" }, { "id": "10102", "description": "Extended 2-year warranty", "quantity": 1, "unitPrice": 199.0, "vat": 25.0, "imageUrl": "https://cdn.example.com/img/warranty.jpg" } ] } } ``` ### `upsell` properties | Property | Required | Explanation | | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **items** | Yes | The products to offer. See [`upsell.items[]` properties](#upsellitems-properties). | | **timeLimitInSeconds** | No | How long the offer stays open, counted from purchase completion. Range `60`–`300`, default `300`. The customer sees a countdown. Once it has expired, nothing more can be added. Not allowed when `items` is empty. | ### `upsell.items[]` properties | Property | Required | Explanation | | --------------- | -------- | ---------------------------------------------------------------------------------------------- | | **id** | Yes | Article id. Max 50 characters. Shown on the invoice. | | **description** | Yes | Short product description shown on the upsell card and the invoice. Truncated to 50 characters. | | **quantity** | Yes | Allowed values `1`–`99999999`. | | **unitPrice** | Yes | Unit price including VAT. Max 2 decimals. Range `0.01`–`999999.99`. | | **vat** | Yes | VAT in percent. Max 2 decimals. Range `0`–`100`. | | **imageUrl** | Yes | Absolute **HTTPS** URL to the product image. Max 2048 characters. Rendered in the upsell card. | | **sku** | No | Stock Keeping Unit. Max 1024 characters. | A maximum of **10** upsell items can be sent per checkout. ### Updating upsell items Upsell items can be changed with [Update Checkout](/docs/checkout/optional/updatecheckout) until the customer commits to payment. Omit `upsell`, or send `null`, to keep the current items. Send `"items": []` to clear them. An `upsell` object without `timeLimitInSeconds` resets the time limit to `300`. ### Reading back what the customer accepted When the customer adds an upsell item, Walley appends it to the order. Once the time limit has expired, [Get Checkout Information](/docs/checkout/getcheckoutinformation) returns the final order under `order.items` — accepted upsell rows show up alongside the original cart rows with `type` set to `Upsell`: ```json { "order": { "orderId": "...", "totalAmount": 248.0, "items": [ /* original cart rows */ { "id": "10101", "description": "Premium gift wrapping", "quantity": 1, "unitPrice": 49.0, "vat": 25.0, "sku": "GIFTWRAP-PREMIUM", "type": "Upsell" } ] } } ``` - Each offered item can be bought once. - Identical offered items (same `id`, `description`, `unitPrice`, `vat` and `sku`) are shown as separate upsell cards. If the customer adds more than one, they are merged into one row in `order.items` with the summed quantity. - An upsell row is never merged with a cart row, even if they share the same `id`. Accepted items are already on the Walley invoice — no further merchant call is required. ### When an upsell fails - **Credit purchase denied**, for example by the credit check: the item is not added, the original order is unaffected and the offer closes for the rest of the checkout. - **Swish declined or cancelled** in the Swish app: the item is not added and the customer is not charged. No notification is sent in either case. An item missing from `order.items` is the only signal. --- ## Custom upsell using Reauthorize It’s possible to include your own upsell functionality after the purchase is complete in the checkout. This is done with a call to [Reauthorize](/docs/manage/orders/reauthorize) with the added products of the customer's choice or a larger amount than the original.
An example post-checkout upsell page offering additional products
### How to get started 🚀 1. When the purchase is completed and the [checkout information](/docs/checkout/getcheckoutinformation) is fetched, it will return an `orderId`. 2. Use the `orderId` for calling the [Reauthorize](/docs/manage/orders/reauthorize) endpoint, remember to send along all existing article rows with the new upsell articles if you want the old articles to show on the new invoice. If you only want to adjust the amount, sending in an amount is enough. This will return a `201` or `202` response depending on if a credit check is needed or not. The response headers will contain a `Location` header with a path to the order. 3. Use this url path to verify that the order has successfully been reauthorized. In the case where a credit check happens (201), you will need to poll on the endpoint you received in the `Location header` to await that the reauthorize finalizes. --- # Validate order Source: https://dev.walleypay.com/docs/checkout/optional/validateorder.md To verify that the articles are in stock when completing a purchase, you can provide a validation URI in the Initialize a Checkout session request. If provided, this URI will be called before the purchase is completed. During this validate call your backend can (optionally) create an order and send the order reference back in the response as json. Note that this order should _not_ be considered completed on your side since the purchase is not completed yet. Please read up on the [Handle Purchase Callbacks](/docs/checkout/notificationcallback) section since the notification callback is _the only valid place_ to consider a purchase to be successful. If an order reference is provided in the response it will be shown on the thank you page. :::info Important Even if the validate call succeeds (2xx, e.g. 200 OK), the purchase might not be completed. For example, the credit check on the customer might be rejected. The validate call can be performed multiple times if the user tries again. ::: If this call returns a non-2xx http status code, we will stop the purchase and emit a `walleyCheckoutOrderValidationFailed` frontend event, read more in section [Client-side events](/docs/checkout/optional/clientevents). We will follow redirects, e.g. 301. This call has a timeout of 10 seconds, if the call does not return a response within this timeout the purchase will not be completed and the customer will be shown a message and given the opportunity to try again. This endpoint might be called several times. For example, when the end customer fails the credit check and chooses to purchase by card or direct bank transfer instead, there will be multiple calls to this endpoint. ```http POST /validation-uri-provided-in-initialize HTTP/1.1 Host: yourdomain.se ``` Response with a reference: ```http HTTP/1.1 200 OK Content-Type: application/json { "orderReference": "123456789" } ``` Response with custom error: ```http HTTP/1.1 400 Bad Request Content-Type: application/json { "title": "This is the validation title", "message": "This is the message containing details about the validation error" } ``` Response with custom client payload: ```http HTTP/1.1 400 Bad Request Content-Type: application/json { "clientPayload": { "myId": 12345678, "myErrorCode": "ERR_SOMETHING_USEFUL" } } ``` Response with custom error and client payload: ```http HTTP/1.1 400 Bad Request Content-Type: application/json { "title": "This is the validation title", "message": "This is the message containing details about the validation error", "clientPayload": { "myId": 12345678, "myErrorCode": "ERR_SOMETHING_USEFUL" } } ``` :::info Important Using this feature increases the time to complete a purchase, causing longer wait times for the end customer. If your e-commerce system supports reservation functionality, consider using that instead. Reservation locks the articles in the customer's cart when visiting the Checkout page, preventing purchases of out-of-stock items. ::: ## Request properties There are no request properties. ## Response properties **Properties for successful response** | Property | Required | Explanation | | ------------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **orderReference** | No | Order reference to the order just created during the validate call. This can later be used to track the purchase with merchant services. It has a 50-character limit. | **Properties for unsuccessful response** | Property | Required | Explanation | | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **title** | No | The title of the validation failure displayed in the Checkout. Truncated to a maximum of 512 characters. | | **message** | No | The message with a more descriptive text why the validation failed, and how the customer should proceed. Truncated to a maximum of 512 characters. | | **clientPayload** | No | The `clientPayload` object allows you to optionally provide custom validation result information in a key/value format. Client Payload is not processed by Walley but will be sent as a `payload` parameter on the `walleyCheckoutOrderValidationFailed` [client-side event](/docs/checkout/optional/clientevents). | There is a default validation error title and message that is shown if the non-2xx response is empty or if not both `title` and `message` are specified in the response. The title and message will appear the following way. The validation title and message shown above the pay button --- # Order administration Source: https://dev.walleypay.com/docs/checkout/orderAdministration.md After an order has been placed, it is time to activate the order rows and perhaps perform returns and adjustments. This is done through our Management API or manually through our Merchant Hub. ## Order administration You use the same token for authentication when calling our Management API to administer your orders as you did to initialize and get checkout information. If the token has expired, acquire a new one. | Call | Explanation | | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- | | [Capture / Part capture orders](/docs/manage/orders/capture) | When you are ready to ship items to your customers. Results in an activated or partly activated order | | [Refund / Part refund orders](/docs/manage/orders/refund) | When a return is made you use this call to refund money to the end customer. | | [Cancel orders](/docs/manage/orders/cancel) | This is used to cancel all rows on an order that has not yet been activated. | --- # Overview Source: https://dev.walleypay.com/docs/checkout/overview.md Walley offers several ways to accept payments, from a fully embedded Checkout in your web shop to hosted payment pages and recurring payments. Explore the products below and find the integration that fits your business.

🛒 Checkout payments

Embed Walley Checkout in your web shop. Initialize a session, render the iframe and let the customer complete the purchase without leaving your site.

🔗 Pay Link

Send a ready-to-pay Checkout to your customer as a link or SMS. A fully hosted payment page with no integration into your own site required.

🔁 Tokenized payments

Store a payment token when the customer makes a purchase and charge it later. Built for subscriptions and recurring payments.

🧩 Widgets

Boost conversion on your product pages with embeddable widgets that promote part payment options and show available payment methods.

## Common use cases Recipes for scenarios that many merchants build on top of Checkout payments.

📦 Inventory validation

Verify stock before the purchase is completed.

🎁 Gift cards

Let customers pay part of the order with a gift card.

🏷️ Discounts

Apply discount codes to the cart inside the Checkout.

## Extend your Checkout Modules that add functionality inside the Checkout iframe.

🚚 Delivery Module

Let customers choose shipping options directly in the Checkout, via Ingrid, nShift or a custom adapter.

💜 Loyalty Booster

Connect your loyalty program, via Voyado or a custom adapter, and reward members at purchase.

## Before you integrate Make sure you have completed the [prerequisites](/docs/checkout/prerequisites) and know which [environments and endpoints](/docs/checkout/endpoints) to use. --- # Abort paylink Source: https://dev.walleypay.com/docs/checkout/paylink/abort-paylink.md After a Pay Link is sent, it is possible to abort it via an api call. Once it is done, that checkout session is aborted and cannot be reused. A notification callback will be sent, and when fetching the checkout, the status will be Aborted. :::info Important You cannot abort a Pay Link when the user is [committed](/docs/checkout/getcheckoutinformation#datastatus) to a purchase, or if the purchase has already been completed. You will get HTTP error code 409 if committed, or custom error code 900 if already completed. ::: ## Abort Pay Link examples ```http DELETE /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727 HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "f5f4e86d-95b1-4c1a-8ad0-1d5907236bd7", "data": null, "error": null } ``` ## Request properties **Request headers** | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [how to generate the authorization header value](/docs/checkout/authorization). | --- # Distribute Pay Link Source: https://dev.walleypay.com/docs/checkout/paylink/distribute.md It is possible to send a Pay Link to a customer. This enables customers to receive a ready-to-pay checkout session where they can finalize the purchase on their own device by identifying themselves and selecting a payment option After the customer has received the Pay Link, the rest of the flow will be the same as for a [regular Checkout session](/docs/checkout/initcheckout) i.e. the notification callback to your system will be performed once the purchase is successful and if you have implemented the validate call it will be performed as usual. The customer will get a text message similar to this: An example text message containing a Pay Link To customize the text sent to the customer, please Contact Walley Merchant Services for configuration. ## Distribute Pay Link request To distribute a Pay Link you must first create the Checkout session as you normally do by following the [Basic Steps here](/docs/checkout/initcheckout) Once you have created a Checkout session it can be distributed to an end customer by issuing a POST request as per below: ```http POST /checkouts/1eec44b5-66d3-4058-a31f-3444229fb727/paylink HTTP/1.1 Host: api.uat.walleydev.com Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... Content-Type: application/json { "destination": { "mobilePhoneNumber": "0701740635" } } ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "f5f4e86d-95b1-4c1a-8ad0-1d5907236bd7", "data": null, "error": null } ``` The request body should contain a json object with the receivers mobile telephone number. :::info Currently the only distribution type available is by mobile phone number. ::: ## Request properties **Request headers** | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [how to generate the authorization header value](/docs/checkout/authorization). | **Request properties** | Property | Required | Explanation | | --------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **destination.mobilePhoneNumber** | Yes | The recipient's mobile phone number. Supports foreign phone numbers if country prefix is added. If no country prefix is supplied, the current countries prefix will automatically be added, i.e. `+46730` and `0730` are both accepted as start of a valid phone number in Sweden. | ## Error responses | Error code | Error Reason | Cause | | ---------- | ------------------------- | ----------------------------------------------------------------------------------------------- | | **400** | Validation_Error | The request contains properties with invalid values. Details are provided in the response body. | | **503** | Could not notify customer | The service provider to push a Pay Link returned an error or was unavailable. | --- # Getting started Source: https://dev.walleypay.com/docs/checkout/paylink/getting-started.md To use the Pay Link you must first create the Checkout session as you normally do by Init Checkout session. When the session has been created you use the `paymentUri` from the response of the initialize checkout request and redirect the user browser to that URI. ## Optional query parameters You can add some parameters to the `paymentUri` you have received before you redirect the user. e.g. https://checkout.walleypay.com/p/bXjYxk?showCart=false&lang=en-SE | Parameter | Type | Explanation | | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **showCart** | boolean | This controls whether the cart will be shown in the paylink. Default: true | | **lang** | string | This parameter specifies the language in which you would like to view the content. The valid language options are based on the locale, such as en-SE, sv-SE, fi-FI, etc. It is important to note that only the languages available for the [current market](/docs/checkout/languages) can be specified. If an invalid or missing value is provided, the default language for that market will be used instead. | ## Cancellation option If providing a `checkoutAbortedRedirectPageUri` in the initialize checkout request, a **go back** button will be shown for the customer. If pressed, the customer will be redirected to that redirect page. Once that is done, that checkout session is aborted and cannot be reused. A [notification callback](/docs/checkout/notificationcallback) will be sent if that button is used. When [fetching the checkout](/docs/checkout/getcheckoutinformation), the `status` will be `Aborted`. It is also possible to use the [Abort Pay Link API](/docs/checkout/paylink/abort-paylink) to abort the current checkout session. --- # Overview Source: https://dev.walleypay.com/docs/checkout/paylink/overview.md The Pay Link offers a ready-to-pay Checkout session to be presented in a fully hosted environment. The page includes the cart with a summary, and the regular Checkout iframe in one single, responsive page. This allows you to prepare a Checkout session in advance and redirect the users browser to the Pay Link so the customer can complete their purchase there. It's also possible to use our distribution API to push the Pay Link to a users mobile phone by SMS. An example hosted Pay Link page with the cart and payment methods --- # Payment types Source: https://dev.walleypay.com/docs/checkout/payment-types.md The Checkout can be configured to offer multiple different payment types for the end customer. Below follows a brief explanation of the different possible payment types available. | Payment Type | Description | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Direct Invoice | This payment type will send an invoice by email to the end customer. | | Account | The end customer's aggregated purchases during a month period will be invoiced in the end of the month. Notification fees from Walley can apply to this payment option. | | Invoice | B2B only. A pre-evaluated credit reservation has been setup in advance, like a virtual credit card. The credit can be used by pre-authorized persons either by SSN or Pin code. | | Part Payment | Splits the payment over several months. Either interest free or annuity payments. Disabled for amounts lower than 1000 SEK for B2C customers. | | Campaign | A Buy-Now-Pay-Later payment option. | | Card | The end customer pays directly with VISA or MasterCard. | | Trustly | The end customer signs into the bank to do a transfer using the Trustly user interface | | Swish | B2C, SE only. The end customer pays directly using the Swish app. | | MobilePay | B2C, DK/FI only. The end customer pays directly using the MobilePay app. | | Vipps | B2C, NO only. The end customer pays directly using the Vipps app. | | iDEAL/Wero | B2C, NL only. The end customer pays directly using iDEAL/Wero. | | PayPal | B2C. Available in all markets where Walley Checkout is available. Enabled by default for new merchants in DE and NL and available on request in other markets. See the [PayPal guide](/docs/checkout/optional/paypal). | | ApplePay | The end customer pays directly with using Apple Pay. For details on how to integrate Apple Pay, see the [Apple Pay integration guide](/docs/checkout/optional/apple-pay) | --- # Prerequisites Source: https://dev.walleypay.com/docs/checkout/prerequisites.md First of all you will need access to our environments. Contact Walley Merchant Services to acquire access to our Merchant Hub where you can create new API credentials to get started. To get hold of API keys - login to Merchant Hub in [Test](https://merchanthub.aks.uat.walleydev.com) or [PROD](https://merchanthub.walleypay.com) and create one [as described here](/docs/merchanthub/access/apikeys) **[help@walley.se](mailto:help@walley.se)**
**[+46 10 161 01 25](tel:+46101610125)** Once you have the credentials follow these steps: 1. [Initialize a Checkout session](/docs/checkout/initcheckout) 2. [Render the Checkout iframe on your page](/docs/checkout/renderiframe) 3. [Set up a callback notification endpoint](/docs/checkout/notificationcallback) to which the Walley Checkout will send notifications for events that occur in the Checkout 4. [Acquire information about a Checkout session](/docs/checkout/getcheckoutinformation) to obtain information about the customer, delivery address, delivery contact details and the purchase 5. [Manage the order](/docs/checkout/orderAdministration) perform captures/part captures/refunds/part refunds and cancels of orders :::warning IMPORTANT For security reasons, all communication with the Checkout API must be performed from your backend. Checkout sessions should never be initialized from client side code, as this would mean that clients using the Checkout could acquire your authentication credentials. ::: --- # Render iframe Source: https://dev.walleypay.com/docs/checkout/renderiframe.md Place this script on the pages where you want the Checkout to appear. :::info Before you start You need the `publicToken` from [Initialize checkout](/docs/checkout/initcheckout) and the loader URL for your environment from [Endpoints](/docs/checkout/endpoints). ::: ```html ``` To render the Walley Checkout, use a ` ``` ## Script element attributes | Attribute | Explanation | | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **src** | See endpoints in [Checkout Environment Endpoints](/docs/checkout/endpoints) | | **data-token** | The widget token received when initializing the widget session. **NB!** The token should be reused for all Part payment widgets until it expires. | | **data-widget** | The name of the widget. In this case `part-payment`. | | **data-amount** | The price of the item. **NB!** To avoid decimals the amount must be multiplied by 100, e.g. _1234.50_ becomes _123450_. Allowed values are 1 to 99999999. | | **data-lang** | (optional) The display language. [Available languages](/docs/checkout/languages). | | **data-padding** | (optional) Set this to `none` to cancel out the left and right padding inside the iframe (by adjusting its margins and width). | | **data-container-id** | (optional) Set this to the id of an element on the page and the iframe will render inside this element instead of immediately above the script element of the loader script. Put the container element somewhere above the script element. This is to make sure the container element is loaded before trying to populate it with the iframe. | | **data-action-color** | (optional) Set this to a hexadecimal color code to change the background color of call to action buttons, formatted as the following example `#582f87`. Button text color will automatically be set to dark gray instead of white if not enough contrast according to WCAG 2.0 level AA for large text. | | **data-action-text-color** | (optional) Set this to override the automatic text color of call to action buttons. Valid values are `black`, `white`, `#000000` and `#ffffff`. Other hexadecimal color values are also valid, but will be interpreted as either black or white (and instead of black, the actual text color will be dark gray) | | **data-logo-alignment** | (optional) Controls the horizontal alignment of the logo. Valid values are `left`, `center`, and `right`. Defaults to `left` if not specified. | | **data-logo-variant** | (optional) Specifies which logo variant to display. Valid values are `color` and `black`. Defaults to `black` if not specified. | | **data-font-size** | (optional) Sets the base font size for the widget content. Valid values are `small`, `medium`, and `large`. Defaults to `small` (multiplier 1). `medium` uses multiplier 1.25, and `large` uses multiplier 1.5. | ## Update the Part payment widget First, set the `data-amount` attribute. ```html ``` Then call the JavaScript client-side API to update. ```javascript // Update the widget with the new data window.walley.checkout.api.update(); ``` If the amount is updated, the `data-amount` script element attribute should be set to the new value. Thereafter a call to the `update` event of the `window.walley.checkout.api` must be made. --- # Payment method logos widget Source: https://dev.walleypay.com/docs/checkout/widgets/payment-method-logos-widget.md The Payment method logos widget can be placed on a merchant’s page to show customers which payment methods are available before they enter checkout. This helps build trust, increase transparency, and reduce drop-off by clearly communicating supported payment options. The widget can be added to product pages, cart pages, or any other point in the purchase journey where you want to highlight payment alternatives. The payment method logos widget in a merchant page footer ## Render the Payment method logos widget iframe To display the widget, place the following script on the pages where you want it to appear. By default, the widget will render as an iframe at the script’s position in the DOM. You can also use the data-container-id attribute to target a specific element where the widget should be injected. ```html ``` ## Script element attributes | Attribute | Required | Default | Explanation | | ------------------ | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ | | **src** | Yes | - | See endpoints in [Checkout Environment Endpoints](/docs/checkout/endpoints) | | **data-token** | Yes | - | The widget token received when initializing the widget session. **NB!** The token should be reused for all widgets until it expires. | | **data-widget** | Yes | - | The name of the widget. In this case `payment-method-logos`. | | **data-alignment** | No | center | The alignment of the widget. Valid values are `left`, `center`, and `right`. | | **data-icon-size** | No | small | The size of the icons displayed in the widget. Valid values are `small`, `medium`, and `large`. | | **data-dark-mode** | No | false | Set this to `true` to enable dark mode styling for the widget. | --- # Widgets Source: https://dev.walleypay.com/docs/checkout/widgets/widgets.md Widgets are small components that can be used in any place of your website to enhance the customer experience around payments and checking out. They can for example be used to boost sales on a specific product by showing alternatives to pay already on the product detail view. The part payment widget on a product page, showing a monthly amount --- # Asynchronous operations Source: https://dev.walleypay.com/docs/manage/concepts/asynchronous-operations.md Every write to the Management API is accepted first and applied a moment later. Build for that and your integration stays correct under retries, timeouts, and race conditions. ## What 202 Accepted means Capture, refund, cancel, and reauthorize answer with `202 Accepted`, an empty body, and a `Location` header pointing at the order. Reauthorizing to a higher amount is the one exception, and it is covered [further down](#the-one-exception-reauthorizing-to-a-higher-amount). ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 ``` `202` means Walley has taken the request and will apply it. It does not mean the change is live. For a few seconds afterward, Merchant Hub, settlement data, and this API can all still show the order as it was before your call. So do not treat a `202` as "the order now looks like X". Treat it as "the change is on its way". :::warning Do not read back immediately Fetching the order right after a `202` usually returns the old version. Use one of the two patterns below instead. ::: ## Reading the result ### If you have a correlationId When you have the action's `correlationId` from a webhook, pass it to [Get order](/docs/manage/orders/get). Walley returns the order only once that action has been applied, so you never read a stale version. ```bash curl "https://api.uat.walleydev.com/manage/orders/{{orderId}}?correlationId={{correlationId}}" \ -H "Authorization: Bearer {{accessToken}}" ``` Until the action lands, the call returns `404 Not Found`. Retry after at least 3 seconds. ### If you do not have a correlationId Wait up to a minute before fetching, and keep the read off your customer's critical path. This suits reporting jobs, nightly reconciliation, and anything else that is not time sensitive. ## Retrying safely Retries are expected. Two rules keep them from doing damage. **Send an idempotency key on every write.** Generate a UUID v4 per operation and send it as `Walley-Idempotency`. If the response never arrives, repeat the exact same request with the same key and Walley applies the operation once. See [Idempotency](/docs/manage/idempotency). ```http Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 ``` **Know which failures are worth retrying.** | Response | What happened | What to do | | -------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | | `403` | Missing permission, or the order has not finished syncing yet. | Retry after at least 3 seconds. If it persists, check your access. | | `404` | Order not found, it has not finished syncing, or a `correlationId` you passed has not been applied yet. | Retry after at least 3 seconds. | | `409` | A request with the same idempotency key is already running. | Wait, then read the order back. Do not send a new key. | | `422` | The request conflicts with the state of the order. | Do not retry. Fix the request. See [Errors](/docs/manage/errors). | A `403` or `404` right after an order was created is usually the sync delay, not a real problem. ## The one exception: reauthorizing to a higher amount Raising an order's total needs a fresh credit check, and that can involve the customer. So [Reauthorize order](/docs/manage/orders/reauthorize) answers `201 Created` instead of `202`, with a `Location` header pointing at a status resource. ```http HTTP/1.1 201 Created Location: /manage/orders/b6be7ec0-311b-490d-8856-af8d00c783b5/reauthorize/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 ``` Poll that URL until `status` is `Completed` or `Failed`. ```json { "data": { "id": "ca81364e-895f-4250-bdb2-a9dafa13c4bc", "orderId": "b2be7nc0-351b-890d-8856-af8d00a783b5", "status": "Completed", "createdAt": "2023-01-17T12:09:27.029057+00:00" }, "links": {}, "metaData": {} } ``` `Failed` means the credit check was declined or Walley needed more household income data. The order keeps its original amount, so nothing is left half applied. Lowering the amount or keeping it the same returns `202` like every other write. ## A checklist for your integration - Treat `202` as accepted, not applied - Send `Walley-Idempotency` on every capture, refund, cancel, and reauthorize - Retry `403` and `404` after at least 3 seconds, never `422` - Reuse the same idempotency key when you retry - Poll the status URL when a reauthorize returns `201` - Never block a customer-facing screen on a read-back ## Next steps - [Order lifecycle](/docs/manage/concepts/order-lifecycle) covers which actions a status allows - [Errors](/docs/manage/errors) lists the responses and what each one calls for --- # Order lifecycle Source: https://dev.walleypay.com/docs/manage/concepts/order-lifecycle.md Every order carries a status, and that status decides which actions Walley accepts. Read this page once and the state rules on each endpoint will make sense. ## Where orders come from An order can reach the Management API from more than one place. Whichever route created it, the statuses and actions below work the same way. - A customer completes a [Walley Checkout](/docs/checkout/introduction) session - An [authorization in the tokenized flow](/docs/checkout/tokenization/authorization) succeeds - An [AddInvoice](/docs/paymentsApi/integration/creating-purchases/addinvoice) call is made in the Payments API Each of these raises a [`walley:order:created` webhook](/docs/webhooks/orders). ## The main path An order starts uncaptured. You capture items as you ship them, and the order moves toward `Activated`. If you never capture, it expires on the date in `expiresAt`. ```mermaid stateDiagram-v2 [*] --> NotActivated: Order is created NotActivated --> PartActivated: Capture some of the items NotActivated --> Activated: Capture the whole order PartActivated --> Activated: Capture what is left NotActivated --> Expired: expiresAt passes, nothing captured Activated --> Returned: Refund the whole order ``` Capturing is what triggers payout. Once an order is fully captured, the amount is marked for payout to your bank account and the order joins the reconciliation report. ## Order statuses The `status` field on the order tells you where it is. | Status | What it means | | ---------------- | --------------------------------------------------------------------------------------------------- | | `NotActivated` | The order exists and nothing is captured yet. It expires at `expiresAt`. | | `PartActivated` | Some items are captured and some are not. | | `Activated` | Every item is captured. The amount is marked for payout. | | `Returned` | The order has been fully refunded. | | `Expired` | The order passed `expiresAt` without being captured. You can still cancel it. | | `OnHold` | Walley has not yet made a decision on the order. Wait for the [`walley:order:authorized` webhook](/docs/webhooks/orders). | | `Closed` | The order is settled and no longer open for changes. Capture and reauthorize both reject it. | ## Item statuses Each entry in `items` carries its own status, so a `PartActivated` order holds a mix of them. | Status | What it means | | -------------- | ---------------------------------------------------------------- | | `NotActivated` | Not captured yet. | | `Activated` | Captured. `captureId` and `capturedAt` are set. | | `Returned` | Refunded. `refundedAt` is set. | | `Canceled` | Canceled before capture. It will not be delivered, and it is never settled or paid out. On a direct payment method, the customer is refunded for it. | | `Expired` | The order expired before this item was captured. | ## What each status allows Before you call an endpoint, check the order status against this table. | Action | Allowed on | Notes | | --------------------------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------ | | [Get order](/docs/manage/orders/get) | Any status | Reading is always safe. | | [Capture order](/docs/manage/orders/capture) | `NotActivated`, `PartActivated` | Rejected on `Closed` and `Expired`. | | [Reauthorize order](/docs/manage/orders/reauthorize) | `NotActivated`, `PartActivated` | Raising the amount works on credit payment methods only, not on prepaid. | | [Refund order](/docs/manage/orders/refund) | `Activated`, `PartActivated` | You can only refund what has been captured. | | [Cancel order](/docs/manage/orders/cancel) | `NotActivated`, `PartActivated`, `Expired` | Cancels every uncaptured item. This cannot be undone. | Calling an endpoint against the wrong status returns `422` with an error code that names the problem. See [Errors](/docs/manage/errors). ## Two things worth knowing **Capture and cancel are one-way.** A capture settles the items you shipped and a cancel releases the ones you did not. Neither has an undo. To give money back after a capture, refund the order. **An order that has not been captured will expire.** Check `expiresAt` on the order and capture before that date. An expired order can no longer be captured, only canceled. ## Next steps - [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) explains why a status change is not visible the moment you get a response - [Errors](/docs/manage/errors) covers the responses you get when a status blocks an action --- # Errors Source: https://dev.walleypay.com/docs/manage/errors.md The Management API draws its responses from one small set of HTTP status codes, and each one means the same thing wherever you meet it. This page defines them and says what to do next, so you can handle them in one place. Which codes a given endpoint can return is listed at the bottom. ## Status codes | Code | What it means | What to do | | ----- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | | `200` | The request succeeded and the body carries the result. | Nothing. | | `201` | A reauthorization to a higher amount started and needs a credit check. | Poll the URL in the `Location` header. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations). | | `202` | Walley accepted the write and will apply it shortly. | Do not read the order back immediately. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations). | | `401` | The token is missing, expired, or invalid. | Request a new access token. See [Authentication](/docs/manage/getting-started/authentication). | | `403` | Your credentials do not cover this store, or the order has not finished syncing. | Check the store your API key covers. If the order was just created, retry after at least 3 seconds. | | `404` | No order matches that id, the order has not finished syncing, or you passed a `correlationId` whose action has not been applied yet. | Check the id. Otherwise retry after at least 3 seconds. See [Get order](/docs/manage/orders/get) for the `correlationId` case. | | `409` | A request with the same idempotency key is already running. | Wait, then read the order back. Reuse the same key if you retry. See [Idempotency](/docs/manage/idempotency). | | `422` | The request conflicts with the state of the order or breaks a validation rule. | Do not retry. Read the error code in the response and fix the request. | :::note A 403 or 404 right after a purchase is usually the sync delay Walley applies order changes asynchronously, so a brand new order can answer `403` or `404` for a few seconds before it is readable. Retry once after 3 seconds before treating it as a real failure. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations). ::: ## Handling 422 A `422` carries an error code that names the exact rule you hit. The codes are specific to the endpoint, so look them up where you called: - [Capture order error codes](/docs/manage/orders/capture#error-codes) - [Refund order error codes](/docs/manage/orders/refund#error-codes) - [Reauthorize order error codes](/docs/manage/orders/reauthorize#error-codes) Most of them fall into three groups. **The amount does not add up.** When you send `items`, `amount` has to equal their total. Amounts take at most 2 decimals. **The order is in the wrong state.** You cannot capture a captured order, refund a fully refunded one, or touch an order that is closed or expired. Check the status first with [Order lifecycle](/docs/manage/concepts/order-lifecycle). **An item could not be matched.** Partial captures and refunds match the items you send against the items on the order. Send `unitPrice` and `quantity` at minimum, and the more fields you send, the more likely the match is unique. ## Which endpoints return what | Endpoint | Success | Also possible | | ---------------------------------------------------- | ------- | -------------------------------- | | [Get order](/docs/manage/orders/get) | `200` | `401`, `403`, `404` | | [Capture order](/docs/manage/orders/capture) | `202` | `401`, `403`, `404`, `409`, `422` | | [Refund order](/docs/manage/orders/refund) | `202` | `401`, `403`, `404`, `409`, `422` | | [Cancel order](/docs/manage/orders/cancel) | `202` | `401`, `403`, `404`, `409` | | [Reauthorize order](/docs/manage/orders/reauthorize) | `202` | `201`, `401`, `403`, `404`, `409`, `422` | ## Next steps - [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) covers retries and idempotency in full - [Order lifecycle](/docs/manage/concepts/order-lifecycle) covers which actions a status allows --- # Auditing headers Source: https://dev.walleypay.com/docs/manage/getting-started/auditing-headers.md

To provide more detailed auditing in our products it is possible to use optional HTTP headers to provide information about the origination of the request made towards the API.

Since the auditing information could be displayed to users of the Walley products, we recommend only posting human readable, nonsensitive information in these headers. ## Performed by To provide information identifying the user or person that performed the action resulting in the request towards the API, use the Walley-Performed-By HTTP header. The value posted could be any information identifying the user, e.g. a name, a username or an email. ```http Walley-Performed-By: firstname.lastname@walley.se ``` ## Originated from To provide information about the origin of the request towards the API, use the Walley-Originated-From HTTP header. The value posted could be any information identifying the origin of the request, e.g. the name of the system integrating with the API, an end user system, a company or store name. ```http Walley-Originated-From: Walley Checkout ``` --- # Authentication Source: https://dev.walleypay.com/docs/manage/getting-started/authentication.md To protect your data and users, Walley uses Microsoft Azure AD B2C as an authentication service provider. To gain access to the API you must identify your application against this service to obtain a token that you use to identify your application against our APIs. > Microsoft Azure AD B2C follows the OAuth2 standard. To integrate with the Walley API, you use the **Client Credentials** flow. > [Read more about the Client Credentials flow](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) --- # Endpoints Source: https://dev.walleypay.com/docs/manage/getting-started/endpoints.md The endpoints used throughout this documentation will point to the testing endpoints to avoid mistakes. You must make sure to use production endpoints once you move to production. ## Testing endpoints 🧪 | Product | Endpoint | Description | | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | | Management API | `https://api.uat.walleydev.com/manage` | Manage orders, access control, settlements, onboarding | | Authentication Endpoint | `https://api.uat.walleydev.com/oauth2/v2.0/token` | Read about [Authentication](/docs/manage/getting-started/authentication) | ## Production endpoints 🚀 | Product | Endpoint | Description | | ----------------------- | ------------------------------------------- | ------------------------------------------------------------------------ | | Management API | `https://api.walleypay.com/manage` | Manage orders, access control, settlements, onboarding | | Authentication Endpoint | `https://api.walleypay.com/oauth2/v2.0/token` | Read about [Authentication](/docs/manage/getting-started/authentication) | --- # Overview Source: https://dev.walleypay.com/docs/manage/getting-started/overview.md The Management API is how your systems act on a Walley order once it has been created. Capture it when you ship, refund it when goods come back, change it before it leaves the warehouse, and read its current state whenever you need to. It works the same way no matter which Walley product created the order. ## What you can do

🔎 Get order

Read an order and everything on it: items, addresses, invoices and current status. Start here when you need to know what an order accepts next.

📦 Capture order

Confirm what you ship, in full or item by item. Capturing is what triggers the payout and creates the invoice for the customer.

💸 Refund order

Give money back after capture, for the whole order, for single items, or as an adjustment when you only need to correct the amount.

✏️ Reauthorize order

Change the items or the amount before anything is captured. Use it to add, remove or replace rows while the order is still in the warehouse.

🚫 Cancel order

Release every item you have not captured. The customer is not charged and the reservation is returned.

## Common use cases Recipes that walk through a real scenario end to end, from the first call to the final state of the order.

📃 Change an order

Adjust items and amounts before delivery.

🚚 Deliver in parts

Ship what you have and keep the rest reserved.

↩️ Refund a delivered order

Return goods and pay the customer back.

## Start here 1. [Quickstart](/docs/manage/getting-started/quickstart) takes you from credentials to your first response in about five minutes. 2. [Endpoints](/docs/manage/getting-started/endpoints) lists the test and production base URIs. 3. [Authentication](/docs/manage/getting-started/authentication) walks through the OAuth2 client credentials flow. You create the API key in [Merchant Hub](/docs/merchanthub/access/apikeys). 4. [Order lifecycle](/docs/manage/concepts/order-lifecycle) explains the statuses that decide which of the actions above an order accepts. 5. [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) explains why a change is not visible the moment Walley accepts it, and how to retry safely. ## Getting access Your organization needs access to the Management API before you can create an API key. Contact Merchant Services to get set up. :::info Contact Merchant Services **[help@walley.se](mailto:help@walley.se)**
**[+46 10 161 01 25](tel:+46101610125)** ::: --- # Quickstart Source: https://dev.walleypay.com/docs/manage/getting-started/quickstart.md Go from credentials to your first response in about five minutes. You will create an API key, exchange it for an access token, and read an order from the test environment. ## Before you start You need: - Access to the test Merchant Hub at [merchanthub.aks.uat.walleydev.com](https://merchanthub.aks.uat.walleydev.com) with permission to manage access - An order id from the test environment. Pick one in Merchant Hub, or take the `OrderId` from a [`walley:order:created` webhook](/docs/webhooks/orders) - A terminal with `curl` Every example below points at the test environment. Production has its own Merchant Hub, hostnames, and scope, and keys from one environment do not work in the other. See [Merchant Hub environments](/docs/merchanthub/environments) and [Endpoints for test and production](/docs/manage/getting-started/endpoints). ## 1. Create an API key In the test Merchant Hub, open the menu under your name in the top right and select **Manage Organization**. Select **Create new**, then **Api key**. Fill out the form and select **Create**. Copy the client id and secret into a password manager before you close the dialog. :::warning The secret is shown once Walley cannot recover a lost secret. If you lose it, create a new key. ::: ## 2. Get an access token Exchange the client id and secret for a token. Replace `{{clientId}}` and `{{clientSecret}}` with your own values. ```bash curl -X POST https://api.uat.walleydev.com/oauth2/v2.0/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id={{clientId}}" \ -d "client_secret={{clientSecret}}" \ -d "scope=705798e0-8cef-427c-ae00-6023deba29af/.default" ``` You get back a token and its lifetime in seconds: ```json { "token_type": "Bearer", "expires_in": 3599, "ext_expires_in": 3599, "access_token": "bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE..." } ``` Cache the token and reuse it until `expires_in` runs out. To get a new one, repeat the same request. For the full flow, see [Authentication](/docs/manage/getting-started/authentication). ## 3. Read an order Call the Get order endpoint with the token in an `Authorization` header. ```bash curl https://api.uat.walleydev.com/manage/orders/{{orderId}} \ -H "Authorization: Bearer {{accessToken}}" ``` A `200 OK` response carries the order under `data`: ```json { "data": { "id": "853f3f82-ab12-47c3-9d97-af17009852cd", "reference": "MX_220921_111434", "paymentMethod": "Invoice", "totalAmount": 2459.49, "currency": "SEK", "status": "Activated", "salesSegment": "B2C", "countryCode": "SE", "customer": {}, "items": [], "invoices": [] }, "links": {}, "metaData": {} } ``` The `status` field decides what you can do next. See [Order lifecycle](/docs/manage/concepts/order-lifecycle). ## Where to go next | You want to | Read | | ------------------------------------------ | ------------------------------------------------------------------------ | | Know which actions an order allows | [Order lifecycle](/docs/manage/concepts/order-lifecycle) | | Understand why a change is not visible yet | [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) | | Confirm a shipment and trigger payout | [Capture order](/docs/manage/orders/capture) | | Give money back | [Refund order](/docs/manage/orders/refund) | | Change an order before shipping | [Reauthorize order](/docs/manage/orders/reauthorize) | | Handle a failed request | [Errors](/docs/manage/errors) | --- # Idempotency Source: https://dev.walleypay.com/docs/manage/idempotency.md :::tip Retry safely with an idempotency key A response you never receive, because of a network problem for example, leaves you unsure whether the request went through. Retrying it blind risks doing the same thing twice. Generate a v4 UUID and send it as the `Walley-Idempotency` header on every unique operation: `Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0` Retry with the same key and Walley applies the operation only once. ::: --- # Cancel order Source: https://dev.walleypay.com/docs/manage/orders/cancel.md When order items should no longer be delivered to the end customer, use this endpoint to cancel every remaining item that has not yet been captured. :::danger Canceling cannot be undone Once you cancel, the remaining items are released for good. There is no way to bring them back, so check the order before you call this. Canceled items should not be delivered to the customer. If the order used a direct payment method, the customer is refunded the amount of the canceled rows. ::: :::note Works on `NotActivated`, `PartActivated`, and `Expired` orders Captured items are unaffected. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what each status allows. ::: ```http POST /manage/orders/{{orderId}}/cancel HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json /* Optional body */ { "actionReference": "test-cancelref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` | Http status code | Description | | ---------------- | ------------------------------------------------------------------- | | 202 | Cancel accepted | | 401 | Token missing, expired, or invalid | | 403 | No permission for this store, or the order has not finished syncing | | 404 | Order not found, or the order has not finished syncing | | 409 | A request with the same idempotency key is already in progress | See [Errors](/docs/manage/errors) for what to do about each of these. ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------- | -------- | ----------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------- | | **actionReference** | No | A reference to this specific cancellation. | string | This will be visible in the order events and searchable in the Merchant Hub. Maximum 255 characters. | ### Response A successful cancel answers `202 Accepted` with an empty body and a `Location` header pointing at the order. :::note The cancel is not live yet `202` means Walley accepted the request, not that it has been applied. Reading the order back right away usually returns the old version. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for how to read the result and retry safely. ::: --- # Capture order Source: https://dev.walleypay.com/docs/manage/orders/capture.md When order items are ready to be delivered to the end customer they should be captured. Use this endpoint to capture the entire order, part capture individual items, or a specific quantity of items of an order. :::note Works on `NotActivated` and `PartActivated` orders Any other status is rejected. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what each status allows, and [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for why a brand new order can answer `403` or `404` for a few seconds. ::: ## Examples ### Full capture You can capture the entire order by specifying the amount to capture. This only allows for the full amount left on the order to be captured. If you are doing a part capture, you will have to provide [items in the request](/docs/manage/orders/models/capture-item) that partial captures can be matched against. ```http POST /manage/orders/{{orderId}}/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "description": "Capture description", "actionReference": "test-captureref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Part capture You can capture part of the order by providing order items, specifying quantity to capture. :::note Items are matched on a best effort basis The more data you send, the more likely it is that Walley finds a unique article. If no unique match can be made, the request fails. `unitPrice` and `quantity` are required. ::: ```http POST /manage/orders/{{orderId}}/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "actionReference": "test-captureref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2 } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Part capture by amount You can also capture part of the order by providing an amount only, omitting the items. The 'description' field can be used to provide a description. If omitted, left blank or null a default value will be used. :::danger Capturing by amount discards the line items This is available on B2C stores only. Capturing by amount replaces every line item already on the order. The customer sees less detail, and you can no longer capture against the original items. There is no way back once you do it. ::: ```http POST /manage/orders/{{orderId}}/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "description": "capture description", "actionReference": "test-captureref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Full or part capture while replacing items You have the option to fully or partially capture an order while simultaneously replacing the ordered items. This can be achieved by specifying the new items and including a parameter to override the default matching behavior. :::note Set `replaceItems` to `true` Without it, the existing items on the order are not overwritten. On a partial capture, the remaining uncaptured amount is consolidated into a single uncaptured row without VAT. You can call this endpoint again to add more items. Send every field so the new items show up correctly on the invoice. ::: ```http POST /manage/orders/{{orderId}}/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "actionReference": "test-captureref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1, "vat": 25 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2, "vat": 25 } ], "replaceItems": true } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` | Http status code | Description | | ---------------- | ------------------------------------------------------------------------------------------- | | 202 | Capture accepted | | 401 | Token missing, expired, or invalid | | 403 | No permission for this store, or the order has not finished syncing | | 404 | Order not found, or the order has not finished syncing | | 409 | A request with the same idempotency key is already in progress | | 422 | Validation or state error. See [error codes](/docs/manage/orders/capture#error-codes) | See [Errors](/docs/manage/errors) for what to do about each of these. ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------- | -------- | -------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------- | | **amount** | Yes | The amount to capture. Must match provided total summary of order items being captured. | number | Maximum 2 decimals | | **description** | No | A description for the capture. This will be visible in the order history and on the invoice. | string | Visible on invoices if applicable. Maximum 50 characters. | | **actionReference** | No | A reference to this specific capture. This will be visible on settlement files for reconciliation. | string | This will appear as a data property on the settlement report. Maximum 255 characters. | | **items** | No | The article items and quantity to capture. | array | [Capture Item](/docs/manage/orders/models/capture-item) | ### Response A successful capture or part capture answers `202 Accepted` with an empty body and a `Location` header pointing at the order. :::note The capture is not live yet `202` means Walley accepted the request, not that it has been applied. Reading the order back right away usually returns the old version. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for how to read the result and retry safely. ::: ### Error codes | Code | Message | | ---------------------------------------------- | ---------------------------------------------------------------------------------------------- | | CAPTURE_ITEMS_AMOUNT_NOT_EQUAL_TO_TOTAL_AMOUNT | When items are provided, amount must equal to total sum of the items | | CAPTURE_DESCRIPTION_TOO_LONG | Description has a max limit of 50 characters | | CAPTURE_AMOUNT_MUST_NOT_BE_NEGATIVE | The amount to be captured must be zero or greater | | CAPTURE_AMOUNT_TOO_LARGE | The amount to be captured cannot be larger than the sum of all items | | CAPTURE_AMOUNT_HAS_TOO_MANY_DECIMALS | The amount to be captured cannot have more than 2 decimals | | CAPTURE_ORDER_ALREADY_CAPTURED | A captured order cannot be captured again | | CAPTURE_AMOUNT_GREATER_THAN_INVOICE_AMOUNT | The amount to be captured cannot be larger than the current order amount | | CAPTURE_ITEMS_UNITPRICE_HAS_TOO_MANY_DECIMALS | The UnitPrice of an item in the items list has too many decimals | | CAPTURE_INVALID_INVOICE_STATUS | You cannot capture an order in state closed or expired | | CAPTURE_ITEMS_MISSING_ID | When replacing items Id has to be set | | CAPTURE_ACTIVATION_OF_INVOICE_DENIED | Capture was denied because the order or customer state does not allow the order to be captured | --- # Extend order Source: https://dev.walleypay.com/docs/manage/orders/extend.md Order items that have not been activated will expire on the expiration date of the order. If you need to extend the expiration date on the order you should use this endpoint. ## Extend order To extend an order, call the extend endpoint. The response will contain an updated order model. :::note Works on `NotActivated` and `PartActivated` orders Any other status is rejected. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what each status means. ::: ### Example ```http POST /manage/orders/{{orderId}}/extend HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | 202 | Order extended | | 401 | Unauthorized, token verification needed. See: [Authentication](/docs/manage/getting-started/authentication) for more information | | 403 | No permission for this store | | 404 | Order not found | | 409 | Request with same idempotency key already in progress | ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | ### Response The response will be `202 Accepted` for a successful extension. --- # Get order Source: https://dev.walleypay.com/docs/manage/orders/get.md To retrieve details about a specific order using our management api, you need to perform a GET request to the orders endpoint while providing the order's id. :::note A recent change may not show up yet Order updates are applied asynchronously, so a fetch straight after a write can return the old version. - If you have the action `correlationId` from a webhook, include it in the query. Walley returns the order only once that action has been applied. - Otherwise, wait up to 1 minute before fetching, and keep the read off your customer's critical path. - Retry `403` and `404` after at least 3 seconds. Right after a purchase, both usually mean the order is still syncing. [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) covers this in full. ::: ```http GET /manage/orders/{{orderId}}?correlationId={{correlationId}} HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Content-Type: application/json Authorization: Bearer {{accessToken}} ``` ```json { "data": { "id": "853f3f82-ab12-47c3-9d97-af17009852cd", "reference": "MX_220921_111434", "paymentMethod": "Invoice", "totalAmount": 2459.49, "currency": "SEK", "status": "Activated", "salesSegment": "B2C", "countryCode": "SE", "productCode": "DI_001", "placedAt": "2022-09-21T11:14:35.7900411+00:00", "expiresAt": null, "customer": { "type": "Person", "name": "Vilma Lundqvist", "firstName": "Vilma", "lastName": "Lundqvist", "registrationNumber": "490331***5", "countryCode": "SE", "coAddress": "c/o Vilma Lundqvist", "addressLine1": "Päronallén 30", "addressLine2": null, "city": "Åsarna", "postalCode": "429 67", "email": "test@walley.se", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567" }, "deliveryAddress": { "addressLine1": "Päronallén 30", "addressLine2": null, "city": "Åsarna", "coAddress": "c/o Vilma Lundqvist", "receiverName": "Vilma Lundqvist", "countryCode": "SE", "email": "test@walley.se", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "429 67" }, "invoiceAddress": { "addressLine1": "Päronallén 30", "addressLine2": null, "city": "Åsarna", "coAddress": "c/o Vilma Lundqvist", "receiverName": "Vilma Lundqvist", "countryCode": "SE", "email": "test@walley.se", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "429 67" }, "items": [ { "articleNumber": "9364", "description": "3:Flyte Buckminster Bordslampa", "price": 237.22, "totalPrice": 474.44, "vatRate": 12.0, "currency": "SEK", "quantity": 2, "status": "Activated", "captureId": "117573228", "capturedAt": "2022-09-21T11:14:35.7900411+00:00", "refundedAt": null }, { "articleNumber": "10000", "description": "Rabatt 10%", "price": -393.78, "totalPrice": -393.78, "vatRate": 25.0, "currency": "SEK", "quantity": 1, "status": "Activated", "captureId": "117573228", "capturedAt": "2022-09-21T11:14:35.7900411+00:00", "refundedAt": null }, { "articleNumber": "3570", "description": "designletter mugg F", "price": 228.17, "totalPrice": 2281.7, "vatRate": 25.0, "currency": "SEK", "quantity": 10, "status": "Activated", "captureId": "117573228", "capturedAt": "2022-09-21T11:14:35.7900411+00:00", "refundedAt": null }, { "articleNumber": "2552", "description": "1:Mumin Mugg 30 cl, Snorkfröken Lila", "price": 157.5, "totalPrice": 787.5, "vatRate": 6.0, "currency": "SEK", "quantity": 5, "status": "Returned", "captureId": "117573228", "capturedAt": null, "refundedAt": "2022-09-21T11:15:02.2884003+00:00" }, { "articleNumber": "8484", "description": "papperspåse", "price": 144.46, "totalPrice": 288.92, "vatRate": 12.0, "currency": "SEK", "quantity": 2, "status": "Returned", "captureId": "117573228", "capturedAt": null, "refundedAt": "2022-09-21T11:16:27.8328129+00:00" }, { "articleNumber": "3755", "description": "1:Cotton Matta 75x200 cm, Raincoat Yellow", "price": 105.21, "totalPrice": 105.21, "vatRate": 12.0, "currency": "SEK", "quantity": 1, "status": "Returned", "captureId": "117573228", "capturedAt": null, "refundedAt": "2022-09-21T11:16:27.8328129+00:00" }, { "articleNumber": "1156", "description": "3:Nature Ostkupa", "price": 97.35, "totalPrice": 97.35, "vatRate": 12.0, "currency": "SEK", "quantity": 1, "status": "NotActivated", "captureId": null, "capturedAt": null, "refundedAt": null } ], "invoices": [ { "invoiceNumber": "117573228", "paymentStatus": "NotPaid", "totalAmount": 2362.14, "createdAt": "2022-09-21T11:14:35.8582677+00:00", "dueDate": "2022-10-31T23:59:59+01:00" } ] }, "links": { "self": { "method": "GET", "href": "/orders/853f3f82-ab12-47c3-9d97-af17009852cd", "query": "" }, "refund": { "method": "POST", "href": "/orders/853f3f82-ab12-47c3-9d97-af17009852cd/refund", "query": "" } }, "metaData": {} } ``` ## Data Model ### Request #### Request path | Path | Required | Explanation | | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **orderId** | Yes | The id of the order that is requested | | **correlationId** | No | The correlation ID of an action. If specified, the order is only returned if it was affected by this action, otherwise a 404 Not Found response is returned. | #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | ### Response #### Possible responses | Http status code | Description | | ---------------- | ---------------------------------------------------------------------------------------- | | 200 | The order is returned in `data` | | 401 | Token missing, expired, or invalid | | 403 | No permission for this store, or the order has not finished syncing | | 404 | Order not found, the order has not finished syncing, or the `correlationId` has not been applied yet | See [Errors](/docs/manage/errors) for what to do about each of these. #### Response body from 200 OK This is the main structure of the response object: ```json { "data": {}, "links": {}, "metaData": {} } ``` `response.data` object follows the structure: --- # Account Source: https://dev.walleypay.com/docs/manage/orders/models/account.md ## Account ### Example ```json { "accounts": [ { "accountId": "37872256", "purchaseIdentifier": "83629195", "moved": false, "currentInvoice": { "invoiceNumber": "83629195", "paymentStatus": "NotPaid", "totalAmount": 700.38, "invoiceState": "First", "createdAt": "2021-05-12T06:22:01.9099393+02:00", "dueDate": "2021-06-30T23:59:59+02:00", "sentAt": null }, "invoices": [ { "invoiceNumber": "83629195", "paymentStatus": "NotPaid", "totalAmount": 700.38, "invoiceState": "First", "createdAt": "2021-05-12T06:22:01.9099393+02:00", "dueDate": "2021-06-30T23:59:59+02:00", "sentAt": null } ] } ] } ``` ### Properties | Property | Explanation | | ---------------------- | ------------------------------------------------------------ | | **accountId** | The account identifier | | **purchaseIdentifier** | The purchase identifier | | **moved** | If the debt was moved | | **currentInvoice** | The currently active invoice (notification) for this account | | **invoices** | An array of all invoices (notification) on this account | --- # Address Source: https://dev.walleypay.com/docs/manage/orders/models/address.md ## Address ### Example ```json { "addressLine1": "Finksvängen 38", "addressLine2": null, "city": "Malung", "coAddress": null, "receiverName": "Mats Edström", "countryCode": "SE", "email": "mats.edstrom@sink.walleydev.com", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "885 35" } ``` ### Properties | Property | Explanation | | ---------------- | -------------------------------------- | | **receiverName** | The address recepient | | **addressLine1** | First Address line | | **addressLine2** | Second Address line | | **coAddress** | C/O Address | | **city** | City | | **postalCode** | Postal Code | | **countryCode** | Country Code (ISO-3166-1 Alpha-2 Code) | | **email** | Email address | | **mobilePhone** | Mobile phone number | | **phoneNumber** | Phone number | --- # Buyer Info Source: https://dev.walleypay.com/docs/manage/orders/models/buyerInfo.md ## Buyer Info ### Example ```json { "firstName": "Mats", "lastName": "Edström", "registrationNumber": "980603***5", "email": "mats.edstrom@sink.walleydev.com", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567" } ``` ### Properties | Property | Explanation | | ---------------------- | ----------------------------- | | **firstName** | The first name | | **lastName** | The last name | | **registrationNumber** | The buyer registration number | | **email** | Email address | | **mobilePhoneNumber** | Mobile phone number | | **homePhoneNumber** | Home phone number | --- # Capture Item Source: https://dev.walleypay.com/docs/manage/orders/models/capture-item.md ## Capture Item ### Example ```json { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1 } ``` ### Properties | Property | Explanation | Type | Notes | | --------------- | ------------------------------------- | ------ | ----------------- | | **id** | Article id of the product | string | Max 50 characters | | **description** | Description of the product | string | Max 50 characters | | **unitPrice** | Price per product unit. Including VAT | number | Max 2 decimals | | **quantity** | Quantity per product | number | Integers only | Reading an order first? The response uses different field names for the same values. See [Sending an item back in a request](/docs/manage/orders/models/item#sending-an-item-back-in-a-request). --- # Customer Source: https://dev.walleypay.com/docs/manage/orders/models/customerDetails.md ## Customer ### Examples ```json { "type": "Person", "name": "Mats Edström", "firstName": "Mats", "lastName": "Edström", "registrationNumber": "980603***5", "countryCode": "SE", "addressLine1": "Finksvängen 38", "city": "Malung", "postalCode": "885 35", "email": "mats.edstrom@sink.walleydev.com", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567" } ``` ```json { "type": "Company", "name": "Norion Bank AB", "registrationNumber": "5565970513", "countryCode": "SE", "addressLine1": "Lilla Bommens Torg 11", "city": "Göteborg", "postalCode": "411 04", "email": "norion@sink.walleydev.com", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567", "buyer": { /*...*/ } } ``` ### Properties | Property | Explanation | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------- | | **type** | The type of customer `Person` or `Company` | | **name** | The full name or company name of the customer | | **firstName** | The first name | | **lastName** | The last name | | **registrationNumber** | The customers registration number | | **countryCode** | Country Code (ISO-3166-1 Alpha-2 Code) | | **addressLine1** | First Address line | | **city** | City | | **postalCode** | Postal Code | | **email** | Email address | | **mobilePhoneNumber** | Mobile phone number | | **homePhoneNumber** | Home phone number | | **buyer** | Buyer information when the customer is a company and if available. See [Buyer Info](/docs/manage/orders/models/buyerInfo) | --- # Event Source: https://dev.walleypay.com/docs/manage/orders/models/event.md ## Event ### Example ```json { "eventId": "return-360470899", "eventType": "ReturnMade", "occurredAt": "2021-02-25T16:31:06.5361857+01:00", "metaData": { "by": "test.testsson@walley.se", "originatedFrom": "MerchantHub", "returnedRows": [ { "originalQuantity": 4.0, "rowId": "MTUyMmRlc2lnbmxldHRlciBtdWdnIEYxNzAuNjc4MDM2ODI0MUZhbHNl", "groupId": "MTUyMmRlc2lnbmxldHRlciBtdWdnIEYxNzAuNjc=", "articleNumber": "1522", "description": "designletter mugg F", "price": 170.67, "totalPrice": 341.34, "vatRate": 25.0, "vatAmount": 68.27, "quantity": 2.0, "unit": "", "currency": "SEK" } ], "vatAmount": 324.52, "purchaseId": "80368241", "amount": 1622.62 } } ``` ### Properties | Property | Explanation | | -------------- | --------------------- | | **eventId** | The address recepient | | **eventType** | First Address line | | **occurredAt** | Second Address line | | **metaData** | C/O Address | #### `.metaData` | Property | Explanation | | ------------------ | -------------------------------------------------------------------------------------------- | | **by** | How triggered the event to occur | | **originatedFrom** | What system that triggered the event to occur | | **occurredAt** | Timestamp when event occurred | | **\*\*\*\*\*Rows** | Array of affected activatedRows/returnedRows. See [Row](/docs/manage/orders/models/row) | | **vatAmount** | Total VAT amount | | **purchaseId** | The purchase identifier | | **amount** | The affected amount | --- # ExampleOrderResponse Source: https://dev.walleypay.com/docs/manage/orders/models/exampleOrderResponse.md ```json { "data": { "id": "a2042556-7d8a-49e2-a810-ace200ca3041", "orderNumber": "12345", "merchantId": null, "storeId": 1158, "paymentMethod": "Invoice", "totalAmount": 31.98, "totalVat": 6.4, "currency": "SEK", "status": "NotActivated", "countryCode": "SE", "placedAt": "2021-03-05T13:16:08.7737385+01:00", "expiresAt": "2021-09-07T23:59:59+02:00", "customerDetails": { "type": "Person", "name": "Hans Ulrik Ekman", "firstName": "Hans Ulrik", "lastName": "Ekman", "customerId": 8260387, "registrationNumber": "5205081218", "countryCode": "SE", "addressLine1": "Sjöblads Väg 39 III", "city": "Beddingestrand", "postalCode": "41103", "email": "autodata@walley.se", "mobilePhoneNumber": "+46701234567" }, "deliveryAddress": { "addressLine1": "Sjöblads Väg 39", "addressLine2": null, "city": "Beddingestrand", "coAddress": null, "receiverName": "Hans Ulrik Ekman", "countryCode": "SE", "email": "autodata@walley.se", "mobilePhone": "+46701234567", "phoneNumber": null, "postalCode": "41103" }, "invoiceAddress": { "addressLine1": "Sjöblads Väg 39 III", "addressLine2": null, "city": "Beddingestrand", "coAddress": null, "receiverName": "Hans Ulrik Ekman", "countryCode": "SE", "email": "autodata@walley.se", "mobilePhone": "+46701234567", "phoneNumber": null, "postalCode": "41103" }, "events": [ { "eventId": "70528675-8fde-4e5d-b2eb-cd374496a470", "eventType": "Created", "occurredAt": "2021-03-05T13:16:08.7737385+01:00", "metaData": { "status": "NotActivated", "originatedFrom": "Walley Checkout", "amount": 31.98, "by": "coll_check" } }, { "eventId": "order-extended-0483826e-ae5e-4d0f-a053-fde0801fad88", "eventType": "Extended", "occurredAt": "2021-03-11T17:24:39.5468851+00:00", "metaData": { "originatedFrom": "MerchantHub", "by": "test.testsson@walley.se" } } ], "tags": [ "all-all-all", "all-all-orderdetails", "all-9664-all", "all-9664-orderdetails", "5DFFF2F1-all-all", "5DFFF2F1-all-orderdetails", "5DFFF2F1-9664-all", "5DFFF2F1-9664-orderdetails" ], "purchases": [ { "data": { "purchaseId": "80378000", "rows": [ { "rowId": "MTExMTFJdGVtIG9uZTUuMDA4MDM3ODAwMEZhbHNl", "groupId": "MTExMTFJdGVtIG9uZTUuMDA=", "articleNumber": "11111", "description": "Item one", "price": 5.0, "originalPrice": 5.0, "totalPrice": 5.0, "vatRate": 25.0, "currency": "SEK", "quantity": 1, "unit": "", "purchaseId": "80378000", "addedAt": "2021-03-05T13:16:08.7737385+01:00", "activatedAt": null, "status": "NotActivated", "vatAmount": 1.0 } ] }, "links": { "activate": { "method": "POST", "href": "/orders/a2042556-7d8a-49e2-a810-ace200ca3041/activate", "query": "" }, "cancel": { "method": "POST", "href": "/orders/a2042556-7d8a-49e2-a810-ace200ca3041/cancel", "query": "" }, "update": { "method": "PATCH", "href": "/orders/a2042556-7d8a-49e2-a810-ace200ca3041/purchases/80378000", "query": "" } }, "metaData": {} } ], "accounts": [] }, "links": { "self": { "method": "GET", "href": "/orders/a2042556-7d8a-49e2-a810-ace200ca3041", "query": "" } }, "metaData": {} } ``` --- # Invoice Source: https://dev.walleypay.com/docs/manage/orders/models/invoice.md ## Invoice ### Example ```json { "invoiceNumber": "117573228", "paymentStatus": "NotPaid", "totalAmount": 3553.99, "createdAt": "2022-09-21T11:14:35.8582677+02:00", "dueDate": "2022-10-31T23:59:59+01:00" } ``` ### Properties | Property | Explanation | | ----------------- | ----------------------------------------------------------------------------------- | | **invoiceNumber** | The invoice number | | **paymentStatus** | It shows if the endcustomer have paid the order, `NotPaid`, `PartiallyPaid`, `FullyPaid` | | **totalAmount** | The amount the endcustomer should pay | | **createdAt** | The time in UTC the invoice was created | | **dueDate** | The time in UTC invoice must be paid by | --- # Item Source: https://dev.walleypay.com/docs/manage/orders/models/item.md ## Item ### Example ```json { "articleNumber": "9364", "description": "3:Flyte Buckminster Bordslampa", "price": 237.22, "totalPrice": 474.44, "vatRate": 12.0, "currency": "SEK", "quantity": 2, "status": "Activated", "captureId": "117573228", "capturedAt": "2022-09-21T11:14:35.7900411+00:00", "refundedAt": null } ``` ### Properties | Property | Explanation | | ----------------- | --------------------------------------------------------------------- | | **articleNumber** | Article id | | **description** | Description | | **price** | Price | | **totalPrice** | Total price | | **vatRate** | VAT Rate | | **currency** | Currency | | **quantity** | Quantity | | **status** | Possible values: Activated, NotActivated, Returned, Canceled, Expired | | **captureId** | If captured, The id of the capture | | **capturedAt** | If captured, Time of capture | | **refundedAt** | If refunded, Time of refund | ### Sending an item back in a request Items you send to capture, refund, or reauthorize use different field names from the items you read here. You cannot take an item out of a response and post it back unchanged. | Read from a response | Send in a request | Notes | | -------------------- | ----------------- | ---------------------------------------- | | `articleNumber` | `id` | Same article, different property name. | | `description` | `description` | Unchanged. | | `price` | `unitPrice` | Both are per unit and include VAT. | | `vatRate` | `vat` | Both are a rate, not an amount. | | `quantity` | `quantity` | Unchanged. | `totalPrice`, `currency`, `status`, `captureId`, `capturedAt`, and `refundedAt` are read only. Leave them out of requests. For the full request models, see [Capture Item](/docs/manage/orders/models/capture-item), [Refund Item](/docs/manage/orders/models/refund-item), and [Reauthorize Item](/docs/manage/orders/models/reauthorize-item). --- # OrderBase Source: https://dev.walleypay.com/docs/manage/orders/models/orderBase.md **Example** ```json { "id": "853f3f82-ab12-47c3-9d97-af17009852cd", "reference": "MX_220921_111434", "paymentMethod": "Invoice", "totalAmount": 2362.36, "currency": "SEK", "status": "Activated", "salesSegment": "B2C", "countryCode": "SE", "productCode": "DI_001", "placedAt": "2022-09-21T11:14:35.7900411+02:00", "expiresAt": null, "customer": { /*...*/ }, "deliveryAddress": { /*...*/ }, "invoiceAddress": { /*...*/ }, "items": [ /*...*/ ], "invoices": [ /*...*/ ] } ``` | Property | Explanation | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **id** | The id of the order | | **reference** | The order number/reference set by merchant at point of purchase | | **paymentMethod** | The method used by the end customer to perform the Purchase. `Invoice`, `Account`, `Installment`, `AdvanceInvoice`, `Swish`, `Amex`, `Dankort`, `Vipps`, `Card`, `MobilePay`, `BankTransfer`, `LoyalPay`, `VippsMobilePay`, `ApplePay` | | **totalAmount** | The total amount of the order excluding financial fees | | **currency** | The currency of the order | | **status** | The status of the entire order. `NotActivated`, `Activated`, `PartActivated`, `Returned`, `Expired`, `OnHold`, `Closed` | | **salesSegment** | The type of endcustomer that made the order, `B2C`, `B2B` | | **countryCode** | The country code of the market where the order was placed | | **productCode** | The product code used for the payment method | | **placedAt** | Timestamp in UTC of when the order was placed | | **expiresAt** | Timestamp in UTC of when the order expires if not activated | | **customer** | Customer specific details. See [Customer](/docs/manage/orders/models/customerDetails) | | **deliveryAddress** | Delivery address. See [Address](/docs/manage/orders/models/address) | | **invoiceAddress** | Invoicing address. See [Address](/docs/manage/orders/models/address) | | **items** | All items of the order See [Items](/docs/manage/orders/models/item) | | **invoices** | List of invoices the end customer has been notified. See [Invoice](/docs/manage/orders/models/invoice) | --- # Purchase Source: https://dev.walleypay.com/docs/manage/orders/models/purchase.md ## Purchase ### Example ```json { "data": { "purchaseId": "80368241", "rows": [ /* ... */ ] }, "links": { "update": { "method": "PATCH", "href": "/orders/c75f9525-ac1a-484e-8f9e-acd800cd1e3d/purchases/80368241", "query": "" } }, "metaData": {} } ``` ### Properties | Property | Explanation | | -------------- | ---------------------------------------------------- | | **purchaseId** | The purchase identifier | | **rows** | Array of [Rows](/docs/manage/orders/models/row) | | **links** | Links to actions | | **metaData** | Metadata about the purchase | --- # Reauthorize Item Source: https://dev.walleypay.com/docs/manage/orders/models/reauthorize-item.md ## Reauthorize Item ### Example ```json { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1, "vat": 25 } ``` ### Properties | Property | Explanation | Type | Notes | | --------------- | ------------------------------- | ------ | --------------------------------- | | **id** | The article id. | string | will default to - if not provided | | **description** | The description of the article. | string | | | **unitPrice** | The unit price of the article. | number | will default to 0 if not provided | | **quantity** | The quantity of the article. | number | | | **vat** | The vat rate of the article. | number | will default to 0 if not provided | Reading an order first? The response uses different field names for the same values. See [Sending an item back in a request](/docs/manage/orders/models/item#sending-an-item-back-in-a-request). --- # Refund Item Source: https://dev.walleypay.com/docs/manage/orders/models/refund-item.md ## Refund Item ### Example ```json { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1, "vat": 25, "type": "purchase" } ``` ### Properties | Property | Explanation | Type | Notes | | --------------- | ------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **id** | Article id of the product | string | Max 50 characters | | **description** | Description of the product | string | Max 50 characters | | **unitPrice** | Price per product unit. Including VAT | number | Max 2 decimals. Should be negative when adding a fee | | **vat** | VAT rate | number | Not required. Defaults to zero. Set it on fees and discounts you **add** when refunding | | **quantity** | Quantity per product | number | Integers only | | **type** | Whether the row refunds a purchase, or adds a fee, a discount, or a replacement | string | Not required. `purchase`, `fee`, `discount`, or `replacement`. Defaults to `purchase` when omitted. See [Replacement article](/docs/manage/orders/refund#replacement-article) | Reading an order first? The response uses different field names for the same values. See [Sending an item back in a request](/docs/manage/orders/models/item#sending-an-item-back-in-a-request). --- # Response Source: https://dev.walleypay.com/docs/manage/orders/models/response.md This is the main structure of the response object: ```json { "data": [], "links": {}, "metaData": {} } ``` --- # Row Source: https://dev.walleypay.com/docs/manage/orders/models/row.md ## Row ### Example ```json { "rowId": "ODAxMzE6U3RyaW5nIFZpdHJpbnNrw6VwIDc4eDMweDQyIGNtLCBWaXQxMjguNTM4MDM2ODI0MUZhbHNl", "groupId": "ODAxMzE6U3RyaW5nIFZpdHJpbnNrw6VwIDc4eDMweDQyIGNtLCBWaXQxMjguNTM=", "articleNumber": "8013", "description": "1:String Vitrinskåp 78x30x42 cm, Vit", "price": 128.53, "originalPrice": 128.53, "totalPrice": 128.53, "vatRate": 25.0, "currency": "SEK", "quantity": 1, "unit": "", "purchaseId": "80368241", "addedAt": "2021-04-29T13:26:48.8534534+02:00", "activatedAt": "2021-04-29T13:26:48.8534534+02:00", "status": "Activated", "vatAmount": 25.71 } ``` ### Properties | Property | Explanation | | ----------------- | ----------------------------------------------- | | **rowId** | Row identifier unique per row for each purchase | | **groupId** | Row group identifier unique per row | | **articleNumber** | Article id | | **description** | Description | | **price** | Price | | **originalPrice** | Original Price | | **totalPrice** | Total Price | | **vatRate** | VAT Rate | | **currency** | Currency | | **quantity** | Quantity | | **unit** | Unit | | **purchaseId** | Purchase Identifier | | **addedAt** | Added at timestamp | | **activatedAt** | Activated at timestamp | | **status** | Status of the row | | **vatAmount** | VAT Amount | --- # Reauthorize order Source: https://dev.walleypay.com/docs/manage/orders/reauthorize.md Order items that have not yet been captured can be changed with the reauthorize endpoint. Already captured items won't be affected by the reauthorize call. :::note Raising the amount has extra conditions Only credit payment methods allow an increase, and only on orders with status `NotActivated` or `PartActivated`. Prepaid options do not support raising the amount after the original purchase. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what each status allows. ::: ## Examples ### Reauthorize order with items ```http POST /manage/orders/{{orderId}}/reauthorize HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "actionReference": "test-captureref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1, "vat": 25 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2, "vat": 25 } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Reauthorize order with amount ```http POST /manage/orders/{{orderId}}/reauthorize HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 280.0, "actionReference": "test-captureref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Reauthorize order with increased amount Orders in the state `NotActivated` can be increased using the reauthorize endpoint. When an order is reauthorized with an increased amount, an additional credit check is required. The endpoint will return a 201 status code with a location header to check the status of the reauthorize call. This process may potentially involve authorization from the customer. ```http POST /manage/orders/{{orderId}}/reauthorize HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 380.0, "actionReference": "test-captureref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 2, "vat": 25 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2, "vat": 25 } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ```http HTTP/1.1 201 Created Location: /manage/orders/b6be7ec0-311b-490d-8856-af8d00c783b5/reauthorize/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ```
These HTTP status codes are valid for the POST `reauthorize` request. | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------- | | 201 | Reauthorization started and needs a credit check. Poll the `Location` header. See [Get reauthorized status](#get-reauthorized-status) | | 202 | Reauthorization accepted | | 401 | Token missing, expired, or invalid | | 403 | No permission for this store, or the order has not finished syncing | | 404 | Order not found, or the order has not finished syncing | | 409 | A request with the same idempotency key is already in progress | | 422 | Validation or state error. See [error codes](/docs/manage/orders/reauthorize#error-codes) | See [Errors](/docs/manage/errors) for what to do about each of these.
### Get reauthorized status Use this endpoint to poll for the status of a reauthorized call that responded with a 201 status code. Retrieve `reauthorizeId` from the location header in the 201 response. ```http GET /manage/orders/{{orderId}}/reauthorize/{{reauthorizeId}} HTTP/1.1 ``` ```http HTTP/1.1 200 OK Content-Type: application/json { "data": { "id": "ca81364e-895f-4250-bdb2-a9dafa13c4bc", "orderId": "b2be7nc0-351b-890d-8856-af8d00a783b5", "status": "Completed", "createdAt": "2023-01-17T12:09:27.029057+00:00" }, "links": {}, "metaData": {} } ``` | Http status code | Description | | ---------------- | ------------------------------ | | 200 | Reauthorize found | | 404 | Order or reauthorize not found |
## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------- | -------- | ----------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------- | | **amount** | Yes | The new amount to authorize. If you send order items, it must match their total. | number | Maximum 2 decimals | | **description** | No | A description for the reauthorization. Used as the description when you send no order items. | string | Visible on invoices if applicable. Maximum 50 characters | | **actionReference** | No | A reference to this specific reauthorization. | string | This will appear as a data property on the settlement report. Maximum 255 characters. | | **items** | No | The article items and quantity to authorize. | array | [Reauthorize Item](/docs/manage/orders/models/reauthorize-item) | If you are doing a reauthorize with items, you will have to provide [items in the request](/docs/manage/orders/models/reauthorize-item).
### Response `202 Accepted` indicates a successful reauthorization when the amount is the same or lower than the original order.
`201 Created` indicates that an additional status check is needed when the reauthorization amount is higher than the original order. :::note The reauthorization is not live yet `202` means Walley accepted the request, not that it has been applied. Reading the order back right away usually returns the old version. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for how to read the result and retry safely. ::: #### Response body | Property | Explanation | Type | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | | **id** | The id of the reauthorization | string | | **orderId** | The orderId affected by the reauthorization | string | | **status** | `Completed` for a successfully completed reauthorize. `Failed` for example when a credit check was denied or additional household income data was needed. | string | | **createdAt** | The timestamp of the reauthorization | date |
### Error codes #### Change order | Code | Message | | --------------------------------------------------------------------- | -------------------------------------------------------------- | | REAUTHORIZE_ORDER_ALREADY_CAPTURED | You cannot reauthorize an already fully captured order | | REAUTHORIZE_MATCHING_ARTICLES_WITH_DIFFERENT_VAT | Request inclueds identical articles with mismatched VAT | | REAUTHORIZE_ARTICLE_EXISTS_BUT_OTHER_INFORMATION | Request inclueds identical articles with mismatched unit price | | REAUTHORIZE_ORDER_INCREASE_ABOVE_CURRENT_TOTAL_AMOUNT_IS_NOT_ALLOWED | Total amount must be less than or equal to original amount | | REAUTHORIZE_AMOUNT_MUST_BE_GREATER_THAN_ZERO | Total amount must be positive | | REAUTHORIZE_AMOUNT_MUST_MATCH_SUM_OF_ARTICLES | Total amount must match article amount | | REAUTHORIZE_AMOUNT_HAS_TOO_MANY_DECIMALS | Total amount have too many decimals | | REAUTHORIZE_DESCRIPTION_TOO_LONG | Description have a max limit of 50 characters | | REAUTHORIZE_ID_TOO_LONG | Item Id have a max limit of 50 characters | | REAUTHORIZE_UNIT_PRICE_HAS_TOO_MANY_DECIMALS | Item Unit Price has too many decimals | | REAUTHORIZE_QUANTITY_MUST_BE_GREATER_THAN_ZERO | Item Quantity must be greater than zero | | REAUTHORIZE_VAT_MUST_BE_GREATER_THAN_ZERO | Item Vat must be greater than zero | | REAUTHORIZE_INVALID_INVOICE_STATUS | You cannot reauthorize an order in state closed or expired | | REAUTHORIZE_INCREASED_AMOUNT_NOT_AVAILABLE_FOR_PREPAID_PAYMENT_METHOD | It is not possible to increase order amount on prepaid orders | --- # Refund order Source: https://dev.walleypay.com/docs/manage/orders/refund.md If an end customer requires money back as compensation or after returning an item. Use this endpoint to refund the entire order, part refund individual items, a specific quantity of items of an order or as an adjustment amount. :::note Works on `Activated` and `PartActivated` orders You can only refund what has been captured. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what each status allows. ::: ## Examples ### Full refund You can refund the entire order by specifying the amount to refund. This only allows for the full amount left on the order that has been captured. If you are doing a part refund, you will have to provide [items in the request](/docs/manage/orders/models/refund-item) that partial refund can be matched against. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "description": "Refund description", "actionReference": "test-refundref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Part refund with articles You can refund part of the order by providing order items, specifying quantity to refund. :::note Items are matched on a best effort basis The more data you send, the more likely it is that Walley finds a unique article. If no unique match can be made, the request fails. Always send `unitPrice` and `quantity`. ::: ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "actionReference": "test-refundref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1, "type": "purchase" }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2, "type": "purchase" } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Adding fees Additional fees can be added when refunding (e.g. If you would like to add a return-fee or similar). - Added fees needs to have the **vat** property set, otherwise it will default to 0. - When adding fees, the amount set should be the total of items + fees. - It is not possible to increase the total order value with fees. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 75, "actionReference": "test-refundref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 100, "quantity": 1, "vat": 25, "type": "purchase" }, { "id": "10002", "description": "Return fee", "unitPrice": -25, "quantity": 1, "vat": 25, "type": "fee" } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Adding discounts Discounts can be added to a refund request to give back money at the same time as refunding. - Added discounts needs to have the **vat** property set, otherwise it will default to 0. - Discounts should be added with a positive unit price. - It is not possible to decrease the total order value with discounts below 0. - When adding discounts, the amount set should be the total of items + discounts. - Discounts can be combined with fees. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 150, "actionReference": "test-refundref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 100, "quantity": 1, "type": "purchase" }, { "id": "32455", "description": "Discount-50-sale", "unitPrice": 50, "quantity": 1, "vat": 25, "type": "discount" } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Removing fees Fees can be removed when refunding. When removing fees, the fee should be **provided with a positive unit price**. The removed fee should also be added into the total refunded amount. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 125, "actionReference": "test-refundref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 100, "quantity": 1, "vat": 25, "type": "purchase" }, { "id": "10002", "description": "Return fee", "unitPrice": 25, "quantity": 1, "vat": 25, "type": "fee" } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Part refund by amount You can also perform a partial refund by amount only. This will result in a new line item on the order with a negative value. The adjustment amount will be applied to the most recent capture available on the order. The 'description' field can be used to provide a descriptive text on the adjustment. If omitted, left blank or null a default value will be used. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 285.0, "description": "refund description", "actionReference": "test-refundref-123" } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ### Replacement article To replace a refunded article, add an article of type 'replacement' without increasing the total order amount. ```http POST /manage/orders/{{orderId}}/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Content-Type: application/json { "amount": 20, "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 100, "quantity": 1, "vat": 25, "type": "purchase" }, { "id": "10002", "description": "Shoes", "unitPrice": -80, "quantity": 1, "vat": 25, "type": "replacement" } ] } ``` ```http HTTP/1.1 202 Accepted Location: /manage/orders/1b1f5ef6-92n1-4b46-b1dc-ae2e00c4c315 /* No body */ ``` ## Data Model ### Request #### Request path | Path | Required | Explanation | | ----------- | -------- | -------------------------------------------------------- | | **orderId** | Yes | The id of the order where a refund is to be carried out | #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------- | -------- | ------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------- | | **amount** | Yes | The amount to refund. Must match provided total summary of order items being refunded. | number | Maximum 2 decimals | | **description** | No | A description for the refund. This will be visible in the order history and on the invoice. | string | Visible on invoices if applicable. Maximum 50 characters | | **actionReference** | No | A reference to this specific refund. This will be visible on settlement files for reconciliation. | string | This will appear as a data property on the settlement report. Maximum 255 characters. | | **items** | No | The article items and quantity to refund. | array | [Refund Item](/docs/manage/orders/models/refund-item) |
### Response A successful refund or part refund answers `202 Accepted` with an empty body and a `Location` header pointing at the order. :::note The refund is not live yet `202` means Walley accepted the request, not that it has been applied. Reading the order back right away usually returns the old version. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for how to read the result and retry safely. ::: #### Possible responses | Http status code | Description | | ---------------- | ------------------------------------------------------------------------------------ | | 202 | Refund accepted | | 401 | Token missing, expired, or invalid | | 403 | No permission for this store, or the order has not finished syncing | | 404 | Order not found, or the order has not finished syncing | | 409 | A request with the same idempotency key is already in progress | | 422 | Validation or state error. See [error codes](/docs/manage/orders/refund#error-codes) | See [Errors](/docs/manage/errors) for what to do about each of these.
### Error codes | Code | Message | | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | REFUND_AMOUNT_MUST_BE_POSITIVE | The amount that is refunded cant have a negative value | | REFUND_AMOUNT_MUST_MATCH_SUM_OF_ARTICLES | When items are provided, amount must equal to total sum of the items | | REFUND_DESCRIPTION_TOO_LONG | Description have a max limit of 50 characters | | REFUND_ORDER_ALREADY_FULLY_REFUNDED | You cannot refund an already fully refunded order | | REFUND_UNMATCHED_RETURN_ARTICLES | Items provided for part refund can't be found on order. The provided values for id, description and unitprice must match the order item values exactly. | | REFUND_AMOUNT_HAS_TOO_MANY_DECIMALS | The amount to be refunded has too many decimals | | REFUND_VAT_HAS_TOO_MANY_DECIMALS | The VAT rate given has too many decimals | | REFUND_ITEM_ID_TOO_LONG | Item id has a max limit of 50 characters | | REFUND_ITEM_DESCRIPTION_TOO_LONG | Item description has a max limit of 50 characters | | REFUND_ITEM_QUANTITY_MUST_BE_POSITIVE | Item quantity must be positive | | REFUND_ITEM_UNITPRICE_HAS_TOO_MANY_DECIMALS | Item Unit Price has too many decimals | | REFUND_ITEM_FEE_OR_DISCOUNT_ID_AND_DESCRIPTION_REQUIRED | Fees and discounts must have an id and a description | | REFUND_REPLACEMENT_ITEM_QUANTITY_INVALID | When processing a refund and a replacement for the same item within a single request, the replacement quantity cannot exceed the refund quantity | --- # Search orders Source: https://dev.walleypay.com/docs/manage/orders/search.md The Merchant Hub provides an API over a powerful search engine to let you do fast reliable searches of all your orders and customers. ## Searching To perform a search for orders or attached properties to orders, a GET request is performed against the `/manage/orders` endpoint. ### Simple search The default response is a list of orders sorted by created date descending. There is a limit that is defaulted to 10 orders per page. ```http GET /manage/orders HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Content-Type: application/json Authorization: Bearer {{accessToken}} ``` ```json { "data": [ { "id": "c75f9525-ac1a-484e-8f9e-acd800cd1e3d", "orderNumber": "MX_210223_132648", "merchantId": "5DFFF2F1", "storeId": 9664, "paymentMethod": "Invoice", "totalAmount": 2168.88, "totalVat": 433.78, "currency": "SEK", "status": "Activated", "countryCode": "SE", "placedAt": "2021-04-29T13:26:48.8534534+02:00", "expiresAt": null, "customerDetails": { "type": "Person", "name": "Mats Edström", "firstName": "Mats", "lastName": "Edström", "customerId": 8271403, "registrationNumber": "9806039955", "countryCode": "SE", "addressLine1": "Finksvängen 38", "city": "Malung", "postalCode": "885 35", "email": "mats.edstrom@sink.walleydev.com", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567" }, "deliveryAddress": { "addressLine1": "Finksvängen 38", "addressLine2": null, "city": "Malung", "coAddress": null, "receiverName": "Mats Edström", "countryCode": "SE", "email": "mats.edstrom@sink.walleydev.com", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "885 35" }, "invoiceAddress": { "addressLine1": "Finksvängen 38", "addressLine2": null, "city": "Malung", "coAddress": null, "receiverName": "Mats Edström", "countryCode": "SE", "email": "mats.edstrom@sink.walleydev.com", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "885 35" }, "tags": [ "all-all-all", "all-all-orderdetails", "all-9664-all", "all-9664-orderdetails", "5DFFF2F1-all-all", "5DFFF2F1-all-orderdetails", "5DFFF2F1-9664-all", "5DFFF2F1-9664-orderdetails" ] }, { "id": "ec3375c9-8a66-46e3-97cb-acd800cd049e", "orderNumber": "MX_210223_132624", "merchantId": "5DFFF2F1", "storeId": 9664, "paymentMethod": "Invoice", "totalAmount": 31.18, "totalVat": 6.24, "currency": "SEK", "status": "Activated", "countryCode": "SE", "placedAt": "2021-04-29T13:26:27.0930646+02:00", "expiresAt": null, "customerDetails": { "type": "Person", "name": "Petra Ekblom", "firstName": "Petra", "lastName": "Ekblom", "customerId": 8271402, "registrationNumber": "9501059589", "countryCode": "SE", "addressLine1": "Rönnsvängen 6", "city": "Öxnevalla", "postalCode": "348 47", "email": "petra.ekblom@sink.walleydev.com", "mobilePhoneNumber": "+46731234567", "homePhoneNumber": "+46731234567" }, "deliveryAddress": { "addressLine1": "Rönnsvängen 6", "addressLine2": null, "city": "Öxnevalla", "coAddress": null, "receiverName": "Petra Ekblom", "countryCode": "SE", "email": "petra.ekblom@sink.walleydev.com", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "348 47" }, "invoiceAddress": { "addressLine1": "Rönnsvängen 6", "addressLine2": null, "city": "Öxnevalla", "coAddress": null, "receiverName": "Petra Ekblom", "countryCode": "SE", "email": "petra.ekblom@sink.walleydev.com", "mobilePhone": "+46731234567", "phoneNumber": "+46731234567", "postalCode": "348 47" }, "tags": [ "all-all-all", "all-all-orderdetails", "all-9664-all", "all-9664-orderdetails", "5DFFF2F1-all-all", "5DFFF2F1-all-orderdetails", "5DFFF2F1-9664-all", "5DFFF2F1-9664-orderdetails" ] } ], "links": { "self": { "method": "GET", "href": "/manage/orders?page=1&perPage=10", "query": "page=1&perPage=10" }, "next": { "method": "GET", "href": "/manage/orders?page=2&perPage=10", "query": "page=2&perPage=10" } }, "metaData": { "totalNumberOfRecords": 32672, "numberOfPages": 3268, "currentPage": 1, "range": { "from": 1, "to": 10 } } } ``` | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | 200 | OK | | 401 | Unauthorized, token verification needed. See: [Authentication](/docs/manage/getting-started/authentication) for more information | | 403 | No permission for this store | | 404 | Search not found | ### Using search phrases To perform a search with a search phrase you include a `query` parameter in the request querystring. Almost anything on the order can be searched for, including `Order Number`, `Purchase Identifier` or a Customers data like `Reg no`, `name`, `email`, `phone`, `address` The following request performs a search with the phrase `ABC123`: ```text /manage/orders?query=ABC123 ``` ### Using filters Use filters for a search if you want to filter for a specific property or maybe a period of time like all orders placed between two dates. To use filters add one or several `filter` parameters to the request querystring. ```text /manage/orders?query=ABC123&filter=status:["activated"]&filter=storeId:["1158"]&filter=placedAt:["2021-03-01","2021-03-04"] ``` #### Filter examples | Example | Description | | --------------------------------------------- | -------------------------------------------------------------------- | | `filter=status:["Activated", "NotActivated"]` | Return only orders that are in status Activated or NotActivated | | `filter=storeId:["1158", "1433"]` | Return only orders for stores 1158 and 1433 | | `filter=placedAt:["2021-03-01","2021-03-04"]` | Return only orders that are placed between 2021-03-01 and 2021-03-04 | | `filter=placedAt:["","2021-03-04"]` | Return only orders that are placed before 2021-03-04 | ### Pagination Add the `perPage` querystring parameter to control how many orders come back, and `page` to control which page you get. The following request will return page 2 of all pages when there are 30 orders per page: ```text /manage/orders?query=ABC123&page=2&perPage=30 ``` #### Paging metadata The `metaData` object of the response provides information about the paging and total values. ```json { "metaData": { "totalNumberOfRecords": 32672, "numberOfPages": 3268, "currentPage": 1, "range": { "from": 1, "to": 10 } } } ``` | Property | Description | | ------------------------ | -------------------------------------------------------------- | | **totalNumberOfRecords** | The total number of records that matched the current criteria | | **numberOfPages** | The total number of pages available | | **currentPage** | The currently displayed page | | **range** | The from and to positions of search results currently returned | #### Following links ```json { "links": { "self": { "method": "GET", "href": "/manage/orders?page=2&perPage=30", "query": "page=2&perPage=30" }, "next": { "method": "GET", "href": "/manage/orders?page=3&perPage=30", "query": "page=3&perPage=30" }, "prev": { "method": "GET", "href": "/manage/orders?page=1&perPage=30", "query": "page=1&perPage=30" } } } ``` ### Sorting Sorting for a specific property of the response can be accomplished by adding the `sort` querystring property. Valid values are property name followed by `-asc` or `-desc` for ascending or descending sort. ```text /manage/orders?query=ABC123&sort=paymentMethod-desc ``` #### Sortable fields Currently sortable fields are | Field | Description | | ------------------------ | --------------------------------------------------- | | **PlacedAt** | Timestamp when the order was placed | | **ExpiresAt** | Timestamp when the order expires if not activated | | **OrderNumber** | The order number | | **StoreId** | The merchant store id | | **customerDetails.name** | The name of the customer | | **Status** | The status of the order | | **PaymentMethod** | The payment method of the order | | **TotalAmount** | The total amount of the order, excl. financial fees | ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | ### Response `response.data` object is an array of the following structure: #### links `response.links` See [following links section](#following-links) #### metaData `response.metaData` See [paging metadata](#paging-metadata) --- # Create API secret Source: https://dev.walleypay.com/docs/manage/organization/apisecrets/create.md To access the Walley API, a valid token is required, which can be obtained using a client ID and API secret. The initial secret is generated within the Merchant Hub. However, additional secrets can be generated using the API. Create the first secret in the Merchant Hub. After that, use this endpoint for the rest. An organization can hold two active secrets at a time. :::warning The secret is shown once The response is the only place you will ever see `apiSecret`. Store it somewhere safe before you close the response. ::: ## Example ```http POST /manage/organizations/{{orgId}}/apisecrets HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Content-Type: application/json Authorization: Bearer {{accessToken}} { "label": "Name of secret", "expirationDate": null } ``` ```json { "entityId": "83119b40-4a7d-454d-beda-26647f89e2fc", "metadata": { "clientId": "6a8efa5b-378b-44f5-bfc6-3b5d61f0d314", "apiSecret": "CR6qTkUAkKxwCWx7UwJgN7XX59sLzCwGdQu9TKyAbmWGBRWAkBd9NRBeFz2D", "expiresAt": "2020-01-01T00:00:00.0000000+00:00" } } ``` ## Data Model ### Request #### Request path | Path | Required | Explanation | | --------- | -------- | -------------------------------------------------------------------------------- | | **orgId** | Yes | The id of the organization, to obtain the `orgId` please contact help@walley.se. | #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------ | -------- | ------------------------------------------------------------------------------------------ | ------ | ----- | | **label** | No | Only a text that makes it easier to tell secrets apart. | string | | | **expirationDate** | No | A date between creation and 99 years in the future. The default is 6 months from creation. | date | | ### Response The response will be `201 Created` for a successful creation. #### Possible responses | Http status code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | 201 | Secret created | | 401 | Unauthorized, token verification needed. See: [Authentication](/docs/manage/getting-started/authentication) for more information | | 403 | No permission for this organization | | 422 | Error code: TooManyAppPasswords, Not allowed to add 3 passwords. You can only add a maximum of 2 passwords. | #### Response body from 201 Created | Property | Explanation | Type | Notes | | ---------------------- | ------------------------------------------------------------------------------ | ------ | ----- | | **entityId** | The id to identify the secret. | string | | | **metadata.clientId** | The client id is used in the authentication to retrieve a jwt token. | string | | | **metadata.apiSecret** | The api secret is used in the authentication to retrieve a jwt token. | string | | | **metadata.expiresAt** | The date the secret expires and cannot be used to retrieve any more jwt tokens. | string | | --- # Overview Source: https://dev.walleypay.com/docs/manage/organization/overview.md The manage organization APIs let you control API secrets within your organization --- # Add store credit Source: https://dev.walleypay.com/docs/manage/storecredit/post.md Use this endpoint to add store credit to a customer's account. Store credit can be used for loyalty rewards, compensation, trade-ins, or other scenarios where the customer should receive credit to use on future purchases. The transaction will be deducted from the next settlement. :::info The customer needs an active credit reservation Store credit only reaches a customer who has an **active credit reservation** with Walley. Without one, the request is rejected. ::: ## Example ```http POST /manage/storecredits HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Content-Type: application/json Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 { "amount": 150.00, "actionReference": "loyalty-reward-2024-001", "description": "Loyalty reward", "storeId": 12345, "integrationId": "customer-abc-123" } ``` ```http HTTP/1.1 202 Accepted /* No body */ ``` ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/manage/getting-started/authentication) for how to generate the Bearer token value | #### Request body | Property | Required | Explanation | Type | Notes | | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | ------ | -------------------------------------------------------------------------- | | **amount** | Yes | The store credit amount to add to the customer's account | number | Decimal | | **actionReference** | Yes | A unique reference for this action, used for tracking and auditing | string | Displayed in the settlement file | | **description** | Yes | A description of the store credit, such as "Loyalty reward", "Phone trade-in", or "Goodwill compensation" | string | Displayed on future invoices and in the My Walley app | | **storeId** | Yes | The store the store credit is associated with | number | Integers only | | **integrationId** | Yes | The merchant's identifier for the customer (integration ID) | string | | ### Response Adding store credit answers `202 Accepted` with an empty body. `202` means Walley accepted the request, not that it has been applied. See [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) for what that means. #### Error responses | Http status code | Code | Description | | ----------------- | -------------------------------- | -------------------------------------------------------------------- | | `400 Bad Request` | `RESERVATION_NOT_ACTIVE` | The customer does not have an active credit reservation | | `400 Bad Request` | `REQUEST_INVALID` | The request body failed validation | | `404 Not Found` | | No customer found for the given `integrationId` and `storeId` | | `409 Conflict` | `STORECREDIT_ALREADY_IN_PROCESS` | A request with the same idempotency key is already being processed | See [Errors](/docs/manage/errors) for what to do about each of these. --- # Fully deliver an order Source: https://dev.walleypay.com/docs/manage/usecases/delivery/full-deliver.md Use this request when you ship the entire order to the customer ## Use case The entire order has been picked and packed and you are about to ship it to the customer. When the order is fully captured, the... - state of the order will be `Activated` in Walley's system. - amount will be marked for payout to your bank account - order will be a part of the reconciliation report ## Endpoints used [Capture order](/docs/manage/orders/capture#full-capture) ## Example The following request will capture the order with id `abcdef-12345-1234-5555-6666` to marked it as fully delivered or "Activated". ```http POST /manage/orders/abcdef-12345-1234-5555-6666/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json { "amount": 285.0, "description": "Capture description", "actionReference": "test-captureref-123" } ``` --- # Partly deliver an order Source: https://dev.walleypay.com/docs/manage/usecases/delivery/partly-deliver.md Use this request when you only ship part of the order to the customer ## Use case Only part of the order can be shipped to the customer but you still want to ship them now and ship the rest of the order later. When the order is partly captured, the... - state of the order will be `Part Activated` in Walley's system. - amount that has been captured will be marked for payout to your bank account - captured amount will be a part of the reconciliation report ## Endpoints used [Part capture order](/docs/manage/orders/capture#part-capture) ## Example The following request will partly capture the order with id `abcdef-12345-1234-5555-6666` using amount and items. ```http POST /manage/orders/abcdef-12345-1234-5555-6666/capture HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json { "amount": 285.0, "actionReference": "test-captureref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2 } ] } ``` --- # Refund an order with a fee Source: https://dev.walleypay.com/docs/manage/usecases/post-delivery/refund-order-with-fee.md Use this request when you want to charge the customer for a fee when making a refund ## Use case Part of, or the entire order has been returned by the customer and you want the money to be refunded. When the order is refunded, the... - state of the order will be `Activated` or `Part activated` in Walley's system if part of the order is refunded. - the funds excluding the fee will automatically be paid out to the customer - the returned article(s) and the fee will be a part of the reconciliation report - if no payment has been made the customer gets a new invoice with the fee amount One or more fees can be added, but the total fee amount is not allowed to be greater than the value of the article(s) being returned. ## Endpoints used [Refund order](/docs/manage/orders/refund) ## Example The following request will refund the order with id `abcdef-12345-1234-5555-6666` ```http POST /manage/orders/abcdef-12345-1234-5555-6666/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json { "amount": 285.0, "description": "Refund description", "actionReference": "test-refundref-123", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 300, "quantity": 1, "vat": 25, "type": "purchase" }, { "id": "fee", "description": "Return fee", "unitPrice": -15, "quantity": 1, "vat": 25, "type": "fee" } ] } ``` --- # Refund an order Source: https://dev.walleypay.com/docs/manage/usecases/post-delivery/refund-order.md Use this request when you want to refund the full amount or part of an order amount ## Use case Part of, or the entire order has been returned by the customer and you want the money to be refunded. When the order is refunded, the... - state of the order will be `Returned` in Walley's system if the entire order is refunded. - state of the order will be `Activated` or `Part activated` in Walley's system if part of the order is refunded. - the funds will automatically be paid out to the customer - the amount will be a part of the reconciliation report ## Endpoints used [Refund order](/docs/manage/orders/refund) ## Example The following request will refund the order with id `abcdef-12345-1234-5555-6666` ```http POST /manage/orders/abcdef-12345-1234-5555-6666/refund HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json { "amount": 285.0, "description": "Refund description", "actionReference": "test-refundref-123" } ``` --- # Cancel an order Source: https://dev.walleypay.com/docs/manage/usecases/pre-delivery/cancel-order.md Use this request to cancel an order before it has been shipped so the entire amount is refunded to the customer ## Use case The customer contacts you, regrets the order and wants the money to be refunded or any invoices to be voided. Once the order is canceled: - Every uncaptured item on it gets the item status `Canceled`. See [Order lifecycle](/docs/manage/concepts/order-lifecycle) for what that means. - The order value is refunded to the customer if the order was paid with Swish, card, Trustly or another direct payment method like Vipps or Mobile Pay. :::info The money takes a few hours to a few days to arrive How long depends on the payment method and on the customer's bank. ::: ## Endpoints used [Cancel order](/docs/manage/orders/cancel) ## Example The following request will cancel the order with id `abcdef-12345-1234-5555-6666`. ```http POST /manage/orders/abcdef-12345-1234-5555-6666/cancel HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} ``` --- # Change an order Source: https://dev.walleypay.com/docs/manage/usecases/pre-delivery/change-order.md Use this request to change an order before it has been shipped to the customer ## Use case The customer contacted you prior to shipping the order and you want to change the order so the customer is charged correctly. This could for example be due to a discount not being applied, an article that was not in stock anymore or that the customer wanted another quantity of an item. In some cases the change might be rejected because we cannot extend the original order amount. This might be the case for a direct payment method like Swish or card, but it can also be true if the customer is not allowed the new amount within the current credit check. ## Endpoints used [Re-authorize order](/docs/manage/orders/reauthorize) ## Example The following request will update the order with id `abcdef-12345-1234-5555-6666`. :::info Send the items even though they are optional The customer sees what changed on the order. Without the items, they only see a new amount. ::: ```http POST /manage/orders/abcdef-12345-1234-5555-6666/reauthorize HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json { "amount": 285.0, "actionReference": "this-will-be-shown-on-reconciliation-reports", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 1 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2 } ] } ``` --- # Upsell an order Source: https://dev.walleypay.com/docs/manage/usecases/pre-delivery/upsell-order.md Use this request to increase the amount of an order before it has been shipped to the customer ## Use case The customer contacted you prior to shipping the order and wants to add an item that they missed or wanted to add to the order. In some cases the change might be rejected because we cannot extend the original order amount due to lack of space for reserved credit amount. :::info Prepaid payment methods are not supported Raising the amount works on credit payment methods only. ::: ## Endpoints used [Reauthorize order with increased amount](/docs/manage/orders/reauthorize#reauthorize-order-with-increased-amount) ## Example The following request will update the order with id `abcdef-12345-1234-5555-6666`. :::info Send the items even though they are optional The customer sees what changed on the order. Reauthorizing by amount alone leaves the rows out. ::: In this example, the order is reauthorized with an additional quantity of `1` on the article `10001` which increases the orders amount with `95`. ```http POST /manage/orders/abcdef-12345-1234-5555-6666/reauthorize HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer {{accessToken}} Walley-Idempotency: 03304b06-cb33-4f78-bcea-86cb4b202ba0 Content-Type: application/json //Upsell on an order with original order amount: 285.0 { "amount": 380.0, "actionReference": "this-will-be-shown-on-reconciliation-reports", "items": [ { "id": "10001", "description": "Shoes", "unitPrice": 95, "quantity": 2 }, { "id": "10002", "description": "T-Shirt", "unitPrice": 95, "quantity": 2 } ] } ``` --- # Digital Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/fi/digital.md Here you can find and download digital Walley material for the Finnish market.
Walley instore digital horisontal 16_9 fi Walley instore digital horisontal 16_9 fi Walley instore digital horisontal 16_9 fi

| Type | Size | | | ------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | | Screen - Horisontal | 16:9 | Download here | | Screen - Vertical | 16:9 | Download here | | Tablet | 420x595 | Download here | --- # Printed Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/fi/printed.md Here you can find and download printed Walley material for the Finnish market. ### A5 Poster Walley instore digital horisontal 16_9 fi   | File type | | | ------------- | --------------------------------------------------------------------------------------------------------------- | | Printable PDF | Download here |
### Stickers Walley instore print a5 sticker fi Walley instore print circle sticker fi Walley instore print square sticker fi   | Type | | | ------ | ---------------------------------------------------------------------------------------------------------------------------- | | A5 | Download here | | Cicle | Download here | | square | Download here |
### Logo Download Walley Logo

### Fonts We use the Google font DM Sans in our digital and printed material Google Fonts DM Sans - Light italic - Regular - Medium - Bold --- # Digital Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/no/digital.md Here you can find and download digital Walley material for the Norwegian market.
Walley instore digital horisontal 16_9 fi Walley instore digital horisontal 16_9 fi Walley instore digital horisontal 16_9 fi

| Type | Size | | | ------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | | Screen - Horisontal | 16:9 | Download here | | Screen - Vertical | 16:9 | Download here | | Tablet | 420x595 | Download here | --- # Printed Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/no/printed.md Here you can find and download printed Walley material for the Norwegian market. ### A5 Poster Walley instore digital horisontal 16_9 no   | File type | | | ------------- | --------------------------------------------------------------------------------------------------------------- | | Printable PDF | Download here |
### Stickers Walley instore print a5 sticker no Walley instore print circle sticker no Walley instore print square sticker no   | Type | | | ------ | ---------------------------------------------------------------------------------------------------------------------------- | | A5 | Download here | | Cicle | Download here | | square | Download here |
### Logo Download Walley Logo

### Fonts We use the Google font DM Sans in our digital and printed material Google Fonts DM Sans - Light italic - Regular - Medium - Bold --- # Instore material Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/overview.md # Instore material Here you find Walley Instore material. As the Instore material refers to a landing page on our site the end customer can easily find our terms and conditions. Please make sure you download the correct material depending on how you would like to display it – digital screens or printed out. Walley instore digital horisontal 16_9 se --- # Digital Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/se/digital.md Here you can find and download digital Walley material for the Swedish market.
Walley instore digital horisontal 16_9 se Walley instore digital horisontal 16_9 se Walley instore digital horisontal 16_9 se

| Type | Size | | | ------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- | | Screen - Horisontal | 16:9 | Download here | | Screen - Vertical | 16:9 | Download here | | Tablet | 420x595 | Download here | --- # Printed Source: https://dev.walleypay.com/docs/marketingAssets/instore-material/se/printed.md Here you can send and download printed Walley material for the Swedish market. ### A5 Poster Walley instore digital horisontal 16_9 se   | File type | | | ------------- | --------------------------------------------------------------------------------------------------------------- | | Printable PDF | Download here |
### Stickers Walley instore print a5 sticker se Walley instore print circle sticker se Walley instore print square sticker se   | Type | | | ------ | ---------------------------------------------------------------------------------------------------------------------------- | | A5 | Download here | | Cicle | Download here | | square | Download here |
### Logo Download Walley Logo

### Fonts We use the Google font DM Sans in our digital and printed material Google Fonts DM Sans - Light italic - Regular - Medium - Bold --- # Merchant Campaign English Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/en/merchantCampaignEnglish.md These are generic banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package - buy now pay later Download here



--- # Black Week Package Finland 2025 Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/fi/blackWeekFinland.md These are Black Week banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package - Black week 2025 Download here









--- # Merchant Campaign Finland Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/fi/merchantCampaignFinland.md These are generic banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package FI_banners.zip
Banner package (monthly) FI_banners_monthly.zip
Banner package (additional formats) FI_banners_maksa_erissä_additional_formats.zip




--- # Black Week Package Norway 2025 Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/no/blackWeekNorway.md These are Black Week banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package - Black week 2025 Download here









--- # Merchant Campaign Norway Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/no/merchantCampaignNorway.md These are generic banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package Download here




--- # Black Week Package Sweden 2025 Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/se/blackWeekSweden.md These are Black Week banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package - Black week 2025 Download here









--- # Merchant Campaign Sweden Source: https://dev.walleypay.com/docs/marketingAssets/merchantCampaign/se/merchantCampaignSweden.md These are generic banners for Walley, which can be used in your marketing campaigns. The banners are available in different sizes and formats to suit various platforms and placements.
Banner package - buy now pay later Download here
Banner package - buy now pay in January (kostnadsfri) Download here
Banner package - buy now pay in November (kostnadsfri) Download here
Banner package - buy now pay in December (kostnadsfri) Download here
## Previews Januari campaign banner Betala senare campaign banner September campaign banner September campaign banner --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/accept.md ## Accept of agreement in checkout `[Checkbox]` Jag har læst og accepterer Walleys Almindelige Betingelser For Faktura. ### Hyperlinks Almindelige Betingelser For Faktura: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/paymentinfo/account.md ## Payment information in checkout – Aggregated invoice `[Logo]` Når du vælger samlefaktura for virksomheder, modtager du dine varer, før du betaler.Du alle kjøp som er gjort under samme måned på en samlet faktura. --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Når du vælger betaling på faktura for virksomheder, modtager du dine varer, før du betaler. --- # Shop terms & conditions – Aggregated invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/terms/aggregated_invoice.md ## Shop terms & conditions – Aggregated invoice ### Samlingsfaktura for virksomheder I samarbejde med Walley tilbyder vi betaling med samlefaktura for virksomheder. Alle dine køb foretaget i samme måned samles på en faktura, som sendes den efterfølgende måned. Faktura indebærer, at du først betaler efter at have modtaget varerne. Forfaldsdatoen kan variere og fremgår af den faktura som sendes til virksomheden. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet.Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` ### Hyperlinks Almindelige Betingelser For Faktura: [https://cdn.walleypay.com/terms/Terms_B2B_DK.pdf](https://cdn.walleypay.com/terms/Terms_B2B_DK.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbejde med Walley tilbyder vi betaling med Walley Checkout. Walley Checkout samler alle de vigtige betalingsmåder i en og samme løsning – vælg mellem kortbetaling, faktura eller delbetaling (betalingsmulighederne kan variere over tid). Du bestemmer selv, hvilken betalingsmåde du vil bruge ved kassen, inden du bekræfter købet. Faktura indebærer, at du først betaler efter at have modtaget varerne. Forfaldsdatoen kan variere og fremgår af den faktura som sendes til virksomheden. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet. Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` ### Hyperlinks Almindelige Betingelser For Faktura: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2b/terms/invoice.md ## Shop terms & conditions – Invoice ### Faktura for virksomheder I samarbejde med Walley tilbyder vi betaling på faktura for virksomheder. Faktura indebærer, at du først betaler efter at have modtaget varerne. Du kan derefter vælge enten at betale hele beløbet på en gang eller opdele det i mindre rater. Forfaldsdatoen kan variere og fremgår af den faktura som sendes til virksomheden. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet.Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` ### Hyperlinks Almindelige Betingelser For Faktura: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/accept.md ## Accept of agreement in checkout `[Checkbox]` Jeg har læst og accepterer Walleys almene vilkår for faktura og kontokredit, Standardiserad Europeisk Kosumentkreditinformation samt bekræfter, at jeg har læst Walleys håndtering af personoplysninger. ### Hyperlinks Almene vilkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Standardiserad Europeisk Kosumentkreditinformation: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Walleys håndtering af personoplysninger: [walleypay.com/data-protection](https://walleypay.com/data-protection) --- # Calculations Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/calculations.md ## Calculations ### Calculation of monthly cost for account. You can use the following algorithm to calculate the products part payment cost (in the end customers native currency): `(Product cost / Number of months) + (Product cost * Interest rate) + Monthly fee` For example: A product worth 200 DKK, divided on 12 months, an interest rate of 1,6583%, and a monthly fee of 35 DKK would give the algorithm: `(200 / 12) + (200 * 1,6583%) + 35 = 55 DKK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 DKK. ### Calculating monthly cost to display on the checkout page The same algorithm can be applied on the checkout page, but the two occurrences of product cost needs to be replaced by the total purchase amount including shipping fee: `(Total purchase amount / Number of months) + (Total purchase amount * Interest rate) + Monthly fee` For example: The customer orders two products worth 195 DKK and a shipping fee of 59 DKK is added. This algorithm would then apply: `(449 / 12) + (449 * 1,6583%) + 35 = 80 DKK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 DKK. ### Calculation of monthly cost for interest free part payment. The formula used to calculate the cost is as follows: `(Order sum + (Invoice fee * months)) / months` Here's an example: if the total basket value is 3456 DKK, it would give the following calculation: `(3456 + (35 * 12)) / 12 = 323kr/month` Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 DKK, a first invoices lowest amount to pay would be 323 + 295 = 618 DKK. ### Calculation of monthly cost for annuity payment The formula used to calculate the cost is the following: `CapitalDebt * (MonthlyInterestRate / ((1 + MonthlyInterestRate) ^ Months - 1)) + CapitalDebt * MonthlyInterestRate + InvoiceFee` Here's an example: if the total basket value is 3456 DKK, it would give the following calculation: `3456 _ (1,6583% / ((1 + 1,6583%) ^ 24 - 1)) + 3456 _ 1,6583% +35 = 215 DKK/month` PLEASE NOTE Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 DKK, a first invoices lowest amount to pay would be 215 + 295 = 510 DKK. Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 DKK. --- # Order Confirmation Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/orderconfirmation.md ## Order Confirmation This text can be added to your order confirmation email that you distribute to the end customer ### Betaling Information om din betaling sendes i en separat e-mail. Du kan allerede nu logge ind på [MyWalley](https://my.walley.dk/). Med MyWalley kan du se alle dine køb og sætte en faktura på pause, hvis du ønsker at returnere eller forlænge betalingsperioden. --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/paymentinfo/account.md ## Payment information in checkout - Account `[Logo]` Når du vælger delbetaling får du dine varer hjem, inden du betaler. Alle dine køb foretaget i løbet af en måned samles på en faktura. Du kan derefter vælge at betale hele beløbet på en gang eller opdele betalingen i mindre dele. --- # Payment Information – Campaign Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/paymentinfo/campaign.md ## Payment information in checkout – Campaign `[Logo]` ### Køb nu – betal senere! Alle køb indtil den `` foretaget i forbindelse med denne kampagne giver dig forlænget betalingstid indtil den ``. Der beregnes et kampagnegebyr på ``. ### Placeholders `` - The agreed campaign length, `` - The agreed due date `` - The agreed campaign fee, e.g. "39 kr" --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Når du vælger faktura får du dine varer hjem, inden du betaler. Du kan derefter vælge at betale hele beløbet på én gang eller at dele betalingen op i mindre dele. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` Når du vælger afbetalingskampagne får du dine varer hjem, inden du betaler. Du modtager en faktura i måneden efter du har foretaget dit køb. Overhold din afbetaling ved at betale det faste beløb, som fremgår af din faktura. --- # Shop terms & conditions – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/terms/account.md ## Shop terms & conditions – Account ### Delbetaling I samarbejde med Walley tilbyder vi delbetaling. Faktura eller delbetaling indebærer, at du først betaler efter at have modtaget varerne. Du kan derefter vælge enten at betale hele beløbet på en gang eller opdele det i mindre rater. Forfaldsdatoen kan variere og fremgår af den faktura eller delbetalingsfaktura, som sendes til dig. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet. En kreditprøvning udføres og indebærer i nogle tilfælde, at en kreditvurdering foretages. Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` og `SECCI`. På [my.walley.dk](https://my.walley.dk) kan du se alle dine fakturaer fra Walley. ### Hyperlinks Almene vilkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Standardiserad Europeisk Kosumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_DK.pdf](https://cdn.walleypay.com/terms/SECCI_DK.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbejde med Walley tilbyder vi betaling med Walley Checkout. Walley Checkout samler alle de vigtige betalingsmåder i en og samme løsning – vælg mellem MobilePay, direkte bank- og kortbetaling, faktura eller delbetaling (betalingsmulighederne kan variere over tid). Du bestemmer selv, hvilken betalingsmåde du vil bruge ved kassen, inden du bekræfter købet. Faktura eller delbetaling indebærer, at du først betaler efter at have modtaget varerne. Du kan derefter vælge enten at betale hele beløbet på en gang eller opdele det i mindre rater. Forfaldsdatoen kan variere og fremgår af den faktura eller delbetalingsfaktura, som sendes til dig. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet. En kreditprøvning udføres og indebærer i nogle tilfælde, at en kreditvurdering foretages. Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` og `SECCI. På [my.walley.dk](https://my.walley.dk) kan du se alle dine fakturaer fra Walley. ### Hyperlinks Almene vilkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Standardiserad Europeisk Kosumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_DK.pdf](https://cdn.walleypay.com/terms/SECCI_DK.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/terms/invoice.md ## Shop terms & conditions – Invoice ### Faktura I samarbejde med Walley tilbyder vi faktura og delbetaling. Faktura eller delbetaling indebærer, at du først betaler efter at have modtaget varerne. Du kan derefter vælge enten at betale hele beløbet på en gang eller opdele det i mindre rater. Forfaldsdatoen kan variere og fremgår af den faktura eller delbetalingsfaktura, som sendes til dig. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet. En kreditprøvning udføres og indebærer i nogle tilfælde, at en kreditvurdering foretages. Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` og `SECCI. På [my.walley.dk](https://my.walley.dk) kan du se alle dine fakturaer fra Walley. ### Hyperlinks Almene vilkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Standardiserad Europeisk Kosumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_DK.pdf](https://cdn.walleypay.com/terms/SECCI_DK.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/denmark/b2c/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Afbetalingskampagner I samarbejde med Walley tilbyder vi faktura ved specielle afbetalingskampagner. Når du vælger denne betalingsmåde, sender Walley fakturaen til dig med forfaldstid sidst på måneden. Faktura eller delbetaling indebærer, at du først betaler efter at have modtaget varerne. Du kan derefter vælge enten at betale hele beløbet på en gang eller opdele det i mindre rater. Forfaldsdatoen kan variere og fremgår af den faktura eller delbetalingsfaktura, som sendes til dig. Leveringsmåden og eventuelle gebyrer, der påløber, vises i kassen, inden du bekræfter købet. En kreditprøvning udføres og indebærer i nogle tilfælde, at en kreditvurdering foretages. Ved forsinket eller udebleven betaling debiteres et gebyr samt morarente. De fuldstændige vilkår for Walley finder du her: `Vilkår` og `SECCI`. På [my.walley.dk](https://my.walley.dk) kan du se alle dine fakturaer fra Walley. ### Hyperlinks Almene vilkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_DK.pdf](https://cdn.walleypay.com/terms/Terms_DK.pdf) Standardiserad Europeisk Kosumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_DK.pdf](https://cdn.walleypay.com/terms/SECCI_DK.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/accept.md ## Accept of agreement in checkout `[Checkbox]` I have read and accept Walley's General terms and conditions for invoice. ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms_B2B\_{SE|NO|FI|DK}.pdf` --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/paymentinfo/account.md ## Payment information in checkout – Aggregated invoice `[Logo]` When choosing aggregated invoice for companies as the payment method, you receive your goods before you pay. All your purchases in a month will be will be gathered in one invoice. --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` When you select invoice for companies as the payment method, you receive your goods before you pay. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` When choosing instalment payments via invoice for companies as the payment method, you receive your goods before you pay. Walley will send the invoice to you the following month. --- # Shop terms & conditions – Aggregated invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/terms/aggregated_invoice.md ## Shop terms & conditions – Aggregated invoice ### Aggregated invoice for companies Together with Walley, we offer an aggregated invoice solution as a payment method for companies. All your purchases during a given month will be gathered in one invoice. When selecting invoice, you receive your goods before you pay. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the link: Terms & Conditions` ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms_B2B\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout Together with Walley, we offer payments with Walley Checkout. Walley Checkout gives you all the desired payment methods in one solution - choose between direct bank- and card payment, invoice or payment in instalments (payment options may vary from time to time). Walley Checkout lets you decide your preferred payment method before confirming the purchase. When selecting invoice, you receive your goods before you pay. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the link: `Terms & Conditions` ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms_B2B\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/terms/invoice.md ## Shop terms & conditions – Invoice ### Invoice solution for companies Together with Walley, we offer invoice as a payment method for companies. When selecting invoice, you receive your goods before you pay. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the link: `Terms & Conditions` ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms_B2B\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2b/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Instalment payments for companies Together with Walley, we offer instalment payments via invoice as a payment method for companies. When selecting invoice, you receive your goods before you pay. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the link: `Terms & Conditions ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms_B2B\_{SE|NO|FI|DK}.pdf` --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/accept.md ## Accept of agreement in checkout `[Checkbox]` I hereby confirm that I have read and accept Walley's general terms for invoice and credit accounts, Standard European Consumer Credit Information. I have also taken part of Walley's information on data protection. ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms\_{SE|NO|FI|DK}.pdf` Standard European Consumer Credit Information: `https://cdn.walleypay.com/terms/SECCI\_{SE|NO|FI|DK}.pdf` Walley's information on data protection: [walleypay.com/data-protection](https://walleypay.com/data-protection) --- # Calculations Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/calculations.md ## Calculations ### Calculation of monthly cost for account. You can use the following algorithm to calculate the products part payment cost (in the end customers native currency): `(Product cost / Number of months) + (Product cost * Interest rate) + Monthly fee` For example: A product worth 9,95 € , divided on 12 months, an interest rate of 1,6583 %, and a monthly fee of 3,00 € would give the algorithm: `(9,95 / 12) + (9,95 * 1,6583 %) + 3,00 = 4,00 € per month` (The actual lowest amount to pay in the example would be 4,00 € per month, but the lowest accepted payment is 5 €) ### Calculating monthly cost to display on the checkout page The same algorithm can be applied on the checkout page, but the two occurrences of product cost needs to be replaced by the total purchase amount including shipping fee: `(Total purchase amount / Number of months) + (Total purchase amount * Interest rate) + Monthly fee` For example: The customer orders two products, each worth 19,90 € and a shipping fee of 5,95 € is added. This algorithm would then apply: `(45,75 / 12) + (45,75 * 1,6583 %) + 3,00 = 7,58 € per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 5 €. ### Calculation of monthly cost for annuity payment The formula used to calculate the cost is the following: `CapitalDebt * (MonthlyInterestRate / ((1 + MonthlyInterestRate) ^ Months - 1)) + CapitalDebt * MonthlyInterestRate + InvoiceFee` Here's an example: if the total basket value is 321,8€, it gives the following: `321,8 * (1,6583% / ((1 + 1,6583%) ^ 24 - 1)) + 321,8 * 1,6583% +3,00 = 19,37€ per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 5 €. --- # Order Confirmation Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/orderconfirmation.md ## Order Confirmation This text can be added to your order confirmation email that you distribute to the end customer For more information on how you can promote our app [download our app kit](https://cdn.walleypay.com/banner/walley-appkit.zip) ### Payment Information about your payment will be sent in a separate email from Walley. You can already log in to [MyWalley](https://my.walleypay.de/) or download the Walley app on the App Store or Google Play. With the Walley app, you can quickly and easily pay, pause an invoice if you want to return or extend the payment period. If you activate notifications in the app, you will also be reminded when it's time to pay. --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/paymentinfo/account.md ## Payment information in checkout - Account `[Logo]` When you select account as the payment method, you receive your goods before you pay. All your purchases during a given month will be gathered in one invoice. You can then choose to pay the whole amount at once or to break up the payments into smaller instalments. --- # Payment Information – Campaign Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/paymentinfo/campaign.md ## Payment information in checkout – Campaign `[Logo]` ### Buy now – pay later! All purchases up to and including `` made with this campaign give you extended payment time until the ``. A campaign fee of `` is added. ### Placeholders `` - The agreed campaign length, `` - The agreed due date `` - The agreed campaign fee, e.g. "3 €" --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` When you select invoice as the payment method, you receive your goods before you pay. You can then choose to pay the whole amount at once or to break up the payment into smaller instalments. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` När du väljer att dela upp din betalning får du hem dina varor innan du betalar. Du får en faktura månaden som följer efter ditt köp. Följ din delbetalning genom att betala in det fasta beloppet som framgår på din faktura. --- # Shop terms & conditions – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/terms/account.md ## Shop terms & conditions – Account ### Account Together with Walley, we offer instalment payments via invoice. When you select this payment method, you receive your goods before you pay. All your purchases during a given month will be gathered in one invoice. You can then choose to pay the whole amount at once or to break up the payments into smaller instalments. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. A credit check is carried out, which in some cases requires credit information. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the links: `Terms & Conditions` and `SECCI`. ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms\_{SE|NO|FI|DK}.pdf` Standard European Consumer Credit Information: `https://cdn.walleypay.com/terms/SECCI\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout Together with Walley, we offer payments with Walley Checkout. Walley Checkout gives you all the desired payment methods in one solution – choose between Swish, Vipps, Mobilepay, direct bank- and card payment, invoice or payment in instalments (payment options may vary from time to time). Walley Checkout lets you decide your preferred payment method before confirming the purchase. When selecting invoice or instalment payments, you receive your goods before you pay. You can then choose to pay the whole amount at once or to break up the payments into smaller instalments. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. A credit check is carried out, which in some cases requires credit information. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the links: `Terms & Conditions` and `SECCI`. ### The Walley app With the Walley app, you get a clear overview of all your purchases and payments – right on your phone. You can manage your payments in whatever way suits you and your budget best. Move your due date, split a purchase into installments or connect your bank account to pay instantly, on the due date or by direct debit. By activating notifications, you’ll get reminders for upcoming payments. The app is free to download and free to use. #### Download the Walley App here: - [**App Store**](https://apps.apple.com/se/app/walley/id1569382782) - [**Google Play**](https://play.google.com/store/apps/details?id=com.walleypay.app) ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms\_{SE|NO|FI|DK}.pdf` Standard European Consumer Credit Information: `https://cdn.walleypay.com/terms/SECCI\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/terms/invoice.md ## Shop terms & conditions – Invoice ### Invoice Together with Walley, we offer invoice and instalment payments.When selecting invoice or instalment payments, you receive your goods before you pay. You can then choose to pay the whole amount at once or to break up the payments into smaller instalments. Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. A credit check is carried out, which in some cases requires credit information. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the links: `Terms & Conditions` and `SECCI`. ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms\_{SE|NO|FI|DK}.pdf` Standard European Consumer Credit Information: `https://cdn.walleypay.com/terms/SECCI\_{SE|NO|FI|DK}.pdf` --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/english/b2c/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Instalment payment campaigns Together with Walley we offer invoices for special instalment payment campaigns. When selecting invoice or instalment payments, you receive your goods before you pay. You can then choose to pay the whole amount at once or to break up the payments into smaller instalments. To follow the instalment plan you need to pay the amount stated on the invoice each month Due date can vary and is presented on the invoice sent to you. Delivery method and possible fees added is shown in the checkout before confirming the purchase. A credit check is carried out, which in some cases requires credit information. In the event of delayed or missed payments, a penalty fee and penalty interest is charged. To see the full terms and conditions for Walley use the links: `Terms & Conditions` and `SECCI`. ### Hyperlinks General terms and conditions for invoice: `https://cdn.walleypay.com/terms/Terms\_{SE|NO|FI|DK}.pdf` Standard European Consumer Credit Information: `https://cdn.walleypay.com/terms/SECCI\_{SE|NO|FI|DK}.pdf` --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/accept.md ## Accept of agreement in checkout `[Checkbox]` Olen tutustunut Walley:n laskun yleisiin ehtoihin ja hyväksyn ne. ### Hyperlinks Laskun yleiset ehdot: [https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf](https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf) --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/paymentinfo/account.md ## Payment information in checkout – Aggregated invoice `[Logo]` Kun valitset Walleyin koontilaskun yrityksille, kaikki kuukauden aikana tehdyt ostot kootaan yhdelle laskulle. --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Kun valitset maksutavaksi laskun, saat tuotteet itsellesi ennen maksamista. Laskutus tapahtuu yhteistyössä Walley:n kanssa. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` Valitessanne Walley osamaksun yrityksille, saatte erillisen laskun jokaisesta ostoksesta tilausta seuraavassa kuussa. --- # Shop terms & conditions – Aggregated invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/terms/aggregated_invoice.md ## Shop terms & conditions – Aggregated invoice ### Walleyin koontilasku yrityksille Tarjoamme yhdessä Walley:n kanssa yrityksille laskutusmahdollisuutta. Kaikki saman kuukauden ostot kootaan yhdelle laskulle, joka lähetetään asiakkaalle postitse seuraavassa kuussa. Palvelusta peritään laskutuslisä. Myöhästyneestä tai maksamattomasta laskusta peritään muistutusmaksu ja viivästyskorko. Saat näkyviin Walleyin yrityksille tarkoitetun koontilaskutuksen ehdot kokonaisuudessaan seuraavasta linkistä: `Ehdot` ### Hyperlinks Laskun yleiset ehdot: [https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf](https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout Tarjoamme mahdollisuuden maksaa laskulla yhteistyössä Walley:n kanssa. Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Myöhästyneestä tai maksamattomasta laskusta peritään muistutusmaksu ja viivästyskorko. Saat näkyviin Walleyin laskun ehdot kokonaisuudessaan seuraavasta linkistä: `Ehdot` ### Hyperlinks Laskun yleiset ehdot: [https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf](https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2b/terms/invoice.md ## Shop terms & conditions – Invoice ### Walleyin laskuratkaisu Tarjoamme yhdessä Walley:n kanssa yrityksille mahdollisuutta maksaa laskulla. Kun valitset maksutavaksi laskun, saat tuotteet itsellesi ennen maksamista. Myöhästyneestä tai maksamattomasta laskusta peritään muistutusmaksu ja viivästyskorko. Saat näkyviin Walleyin laskun ehdot kokonaisuudessaan seuraavasta linkistä: `Ehdot` ### Hyperlinks Laskun yleiset ehdot: [https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf](https://cdn.walleypay.com/terms/Terms_B2B_FI.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/accept.md ## Accept of agreement in checkout `[Checkbox]` Hyväksyn Walley:n yleiset lasku-, tililuotto- ja osamaksuehdot itseäni sitoviksi sekä vahvistan lukeneeni Walley in henkilötietojen käsittelyä koskevan käytännön. ### Hyperlinks Yleiset lasku-, tililuotto- ja osamaksuehdot: [https://cdn.walleypay.com/terms/Terms_FI.pdf](https://cdn.walleypay.com/terms/Terms_FI.pdf) Vakiomuotoiset eurooppalaiset kuluttajaluottotiedot: [https://cdn.walleypay.com/terms/SECCI_FI.pdf](https://cdn.walleypay.com/terms/SECCI_FI.pdf) Walleyin henkilötietojen käsittelystä: [walley.fi/tietosuojasta](https://walley.fi/tietosuojasta) --- # Calculations Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/calculations.md ## Calculations ### Calculation of monthly cost for account. You can use the following algorithm to calculate the products part payment cost (in the end customers native currency): `(Product cost / Number of months) + (Product cost * Interest rate) + Monthly fee` For example: A product worth 9,95 € , divided on 12 months, an interest rate of 1,6583 %, and a monthly fee of 3,00 € would give the algorithm: `(9,95 / 12) + (9,95 * 1,6583 %) + 3,00 = 4,00 € per month` (The actual lowest amount to pay in the example would be 4,00 € per month, but the lowest accepted payment is 5 €) ### Calculating monthly cost to display on the checkout page The same algorithm can be applied on the checkout page, but the two occurrences of product cost needs to be replaced by the total purchase amount including shipping fee: `(Total purchase amount / Number of months) + (Total purchase amount * Interest rate) + Monthly fee` For example: The customer orders two products, each worth 19,90 € and a shipping fee of 5,95 € is added. This algorithm would then apply: `(45,75 / 12) + (45,75 * 1,6583 %) + 3,00 = 7,58 € per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 5 €. ### Calculation of monthly cost for annuity payment The formula used to calculate the cost is the following: `CapitalDebt * (MonthlyInterestRate / ((1 + MonthlyInterestRate) ^ Months - 1)) + CapitalDebt * MonthlyInterestRate + InvoiceFee` Here's an example: if the total basket value is 321,8€, it gives the following: `321,8 * (1,6583% / ((1 + 1,6583%) ^ 24 - 1)) + 321,8 * 1,6583% +3,00 = 19,37€ per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 5 €. --- # Order Confirmation Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/orderconfirmation.md ## Order Confirmation This text can be added to your order confirmation email that you distribute to the end customer For more information on how you can promote our app [download our app kit](https://cdn.walleypay.com/banner/walley-appkit.zip) ### Maksaminen Walley lähettää tiedot ostoksesi maksamiseen liittyen erillisessä sähköpostiviestissä. Voit jo nyt kirjautua [MyWalley](https://my.walley.fi/) -sivuille, tai ladata Walley -sovelluksen [App Storesta](https://apps.apple.com/no/app/walley/id1569382782) tai [Google Playsta](https://play.google.com/store/apps/details?id=com.walleypay.app). Walley -sovelluksessa voit nähdä yleiskatsauksen laskuistasi, siirtää eräpäiviä ja pysäyttää laskutuksen, jos olet palauttanut tuotteita. Jos otat ilmoitukset käyttöön saat myös muistutuksen, kun on aika maksaa lasku. --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/paymentinfo/account.md ## Payment information in checkout - Account `[Logo]` Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). --- # Payment Information – Campaign Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/paymentinfo/campaign.md ## Payment information in checkout – Campaign `[Logo]` ### Placeholders `` - The agreed campaign length, `` - The agreed due date `` - The agreed campaign fee, e.g. "3 €" --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). --- # Shop terms & conditions – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/terms/account.md ## Shop terms & conditions – Account ### Lasku ja Tililuotto Tarjoamme mahdollisuuden maksaa laskulla yhteistyössä Walley:n kanssa. Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). Kun valitset laskulla tai tililuotolla maksamisen, voit tehdä tilauksen ainoastaan väestörekisterissä olevaan vakituiseen osoitteeseesi. Sinun tulee olla vähintään 18-vuotias tilaushetkellä ja Walley tekee luottotietojesi tarkastuksen tilauksen yhteydessä. Viivästyneistä maksuista veloitetaan lainmukaiset muistutusmaksut ja perintäkulut sekä korkoa viivästyneeltä ajalta. Saat täydelliset ehdot ja tiedot Walley Laskusta ja Tililuotosta seuraavista linkeistä:`Ehdot`ja `SECCI` ### Hyperlinks Yleiset lasku-, tililuotto- ja osamaksuehdot: [https://cdn.walleypay.com/terms/Terms_FI.pdf](https://cdn.walleypay.com/terms/Terms_FI.pdf) Vakiomuotoiset eurooppalaiset kuluttajaluottotiedot: [https://cdn.walleypay.com/terms/SECCI_FI.pdf](https://cdn.walleypay.com/terms/SECCI_FI.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout Yhteistyössä Walleyn kanssa tarjoamme maksuvaihtoehdot Walley Checkoutissa. Walley Checkout kokoaa kaikki tärkeät maksutavat yhteen ja samaan ratkaisuun - valitse MobilePay, suora pankki- ja korttimaksu, lasku tai osamaksu (maksuvaihtoehdot voivat vaihdella ajan myötä). Päätät kassalla, mitä maksutapaa haluat käyttää, ennen kuin vahvistat ostoksen. Laskulla tai osissa maksu tarkoittaa, että saat tavarat ennen maksamista. Voit joko maksaa koko summan kerralla tai jakaa sen pienempiin osiin. Eräpäivät voivat vaihdella ja ne näkyvät sinulle lähetetyllä laskulla. Toimitustavat ja mahdolliset lisämaksut näkyvät kassalla ennen ostoksen vahvistamista. Laskun hyväksymisen yhteydessä luottotietosi tarkistetaan. Jos maksu viivästyy tai jää tekemättä, peritään viivästyskorot ja muistutusmaksut ehtojen mukaisesti. Walleyn täydelliset ehdot ja SECCI löytyvät täältä: Käyttöehdot ja SECCI. ### Walley-sovellus Walley-sovelluksella saat selkeän yleiskuvan kaikista ostoistasi ja maksuistasi – suoraan puhelimeesi. Voit hallita maksuja sinulle sopivalla tavalla ja oman budjettisi mukaan. Voit siirtää eräpäivää, jakaa ostoksen useampaan maksuerään ja päättää itse haluatko maksaa heti, eräpäivänä tai käyttää automatisoitua maksamista. Kun otat ilmoitukset käyttöön, saat muistutuksia tulevista maksuista. Sovellus on ilmainen ladata ja käyttää. #### Lataa Walley-sovellus täältä: - [**App Store**](https://apps.apple.com/se/app/walley/id1569382782) - [**Google Play**](https://play.google.com/store/apps/details?id=com.walleypay.app) ### Hyperlinks Yleiset lasku-, tililuotto- ja osamaksuehdot: [https://cdn.walleypay.com/terms/Terms_FI.pdf](https://cdn.walleypay.com/terms/Terms_FI.pdf) Vakiomuotoiset eurooppalaiset kuluttajaluottotiedot: [https://cdn.walleypay.com/terms/SECCI_FI.pdf](https://cdn.walleypay.com/terms/SECCI_FI.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/terms/invoice.md ## Shop terms & conditions – Invoice ### Lasku ja Tililuotto Tarjoamme mahdollisuuden maksaa laskulla yhteistyössä Walley:n kanssa. Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). Kun valitset laskulla tai tililuotolla maksamisen, voit tehdä tilauksen ainoastaan väestörekisterissä olevaan vakituiseen osoitteeseesi. Sinun tulee olla vähintään 18-vuotias tilaushetkellä ja Walley tekee luottotietojesi tarkastuksen tilauksen yhteydessä. Viivästyneistä maksuista veloitetaan lainmukaiset muistutusmaksut ja perintäkulut sekä korkoa viivästyneeltä ajalta. Saat täydelliset ehdot ja tiedot Walley Laskusta ja Tililuotosta seuraavista linkeistä:`Ehdot`ja `SECCI` ### Hyperlinks Yleiset lasku-, tililuotto- ja osamaksuehdot: [https://cdn.walleypay.com/terms/Terms_FI.pdf](https://cdn.walleypay.com/terms/Terms_FI.pdf) Vakiomuotoiset eurooppalaiset kuluttajaluottotiedot: [https://cdn.walleypay.com/terms/SECCI_FI.pdf](https://cdn.walleypay.com/terms/SECCI_FI.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/finland/b2c/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Lasku ja Tililuotto Tarjoamme mahdollisuuden maksaa laskulla yhteistyössä Walley:n kanssa. Kun valitset maksutavaksi laskun ja sinulle myönnetään laskumahdollisuus, saat tilatut tavarat itsellesi ennen niiden maksamista. Voit maksaa koko laskun summan kerralla tai, jos sinulle myönnetään mahdollisuus maksaa tililuotolla, jakaa maksun pienempiin osiin maksamalla vähintään laskulla näkyvän vähimmäissumman eräpäivään mennessä. Laskun osissa maksaminen edellyttää, että laskun saatuasi allekirjoitat luottosopimuksen Walley:n kanssa kirjautumalla Omille Sivuille osoitteessa [my.walley.fi](https://my.walley.fi). Kun valitset laskulla tai tililuotolla maksamisen, voit tehdä tilauksen ainoastaan väestörekisterissä olevaan vakituiseen osoitteeseesi. Sinun tulee olla vähintään 18-vuotias tilaushetkellä ja Walley tekee luottotietojesi tarkastuksen tilauksen yhteydessä. Viivästyneistä maksuista veloitetaan lainmukaiset muistutusmaksut ja perintäkulut sekä korkoa viivästyneeltä ajalta. Saat täydelliset ehdot ja tiedot Walley Laskusta ja Tililuotosta seuraavista linkeistä: `Ehdot`ja `SECCI` ### Hyperlinks Yleiset lasku-, tililuotto- ja osamaksuehdot: [https://cdn.walleypay.com/terms/Terms_FI.pdf](https://cdn.walleypay.com/terms/Terms_FI.pdf) Vakiomuotoiset eurooppalaiset kuluttajaluottotiedot: [https://cdn.walleypay.com/terms/SECCI_FI.pdf](https://cdn.walleypay.com/terms/SECCI_FI.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/accept.md ## Accept of agreement in checkout `[Checkbox]` Jeg godkjenner Walleys Alminnelige vilkår faktura. ### Hyperlinks Alminnelige vilkår faktura: [https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf](https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf) --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/paymentinfo/account.md ## Payment information in checkout – Aggregated invoice `[Logo]` Når du velger samlefaktura for bedrifter får du varene levert før du gjør din betaling. Du får alle kjøp som er gjort under samme måned på en samlet faktura. --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Når du velger faktura for bedrifter får du varene levert før du gjør din betaling. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` Når dere velger delbetaling for bedrift få du varene levert før du gjør din betaling. Du får en faktura per kjøp. Fakturaen sendes måneden etter kjøpet. --- # Shop terms & conditions – Aggregated invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/terms/aggregated_invoice.md ## Shop terms & conditions – Aggregated invoice ###Samlefaktura for bedrifter I samarbeid med Walley tilbyr vi betaling via samlefaktura for bedrifter. Alle kjøp som er gjort samme måned samles på en faktura, som sendes påfølgende måned. Faktura innebærer at du får varene leverert før du betaler. Forfallsdatoen kan variere, og angis på fakturan som sendes til dere. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. Ved forsinket eller uteblitt betaling debiteres en avgift samt forsinkelsesrente. Fullstendige vilkår for Walley finner du her: `Vilkår`. ### Hyperlinks Alminnelige vilkår faktura: [https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf](https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbeid med Walley tilbyr vi betaling med Walley Checkout. Walley Checkout samler alle de viktigste betalingsmåtene i en og samme løsning - velg mellom kortbetaling, faktura eller delbetaling (betalingsalternativene kan variere over tid (betalingsalternativene kan variere over tid). Dere bestemmer selv hvilken betalingsmåte dere ønsker å benytte i kassen, før dere bekrefter kjøpet. Faktura eller delbetaling innebærer at du får varene leverert før du betaler. Forfallsdatoen kan variere, og angis på fakturan som sendes til dere. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. Ved forsinket eller uteblitt betaling debiteres en avgift samt forsinkelsesrente. Fullstendige vilkår for Walley finner du her: `Vilkår` ### Hyperlinks Alminnelige vilkår faktura: [https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf](https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/terms/invoice.md ## Shop terms & conditions – Invoice ###Faktura för företag I samarbete med Walley erbjuder vi betalnig med faktura för företag. Faktura innebär att du får levererat varorna innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura som skickas till företaget. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor`. ### Hyperlinks Alminnelige vilkår faktura: [https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf](https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2b/terms/partpayment.md ##Shop terms & conditions – Fixed Part Payment ### Delbetaling for bedrift I samarbeid med Walley tilbyr vi delbetaling for bedrift. Delbetaling innebærer at du får varene leverert før du betaler. Forfallsdatoen kan variere, og angis på fakturan som sendes til dere. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. Ved forsinket eller uteblitt betaling debiteres en avgift samt forsinkelsesrente. Fullstendige vilkår for Walley finner du her: `Vilkår` ### Hyperlinks Alminnelige vilkår faktura: [https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf](https://cdn.walleypay.com/terms/Terms_B2B_NO.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/accept.md ## Accept of agreement in checkout `[Checkbox]` Jeg har benyttet meg av og aksepterer Walleys Alminnelige villkår for faktura og kontokredit, standard europeisk brukerkreditinformasjon og bekrefter herved og ha lest Walleys handtering av personopplysninger. ### Hyperlinks Alminnelige villkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_NO.pdf](https://cdn.walleypay.com/terms/Terms_NO.pdf) Standard europeisk brukerkreditinformasjon: [https://cdn.walleypay.com/terms/SECCI_NO.pdf](https://cdn.walleypay.com/terms/SECCI_NO.pdf) Walleys handtering av personopplysninger: www.walley.no/personvern --- # Calculations Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/calculations.md ## Calculations ### Calculation of monthly cost for account. You can use the following algorithm to calculate the products part payment cost (in the end customers native currency): `(Product cost / Number of months) + (Product cost * Interest rate) + Monthly fee` For example: A product worth 200 NOK, divided on 12 months, an interest rate of 1,6583%, and a monthly fee of 35 NOK would give the algorithm: `(200 / 12) + (200 * 1,6583%) + 35 = 55 NOK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 NOK. ### Calculating monthly cost to display on check-out page The same algorithm can be applied on the checkout page, but the two occurrences of product cost needs to be replaced by the total purchase amount including shipping fee: `(Total purchase amount / Number of months) + (Total purchase amount * Interest rate) + Monthly fee` For example: The customer orders two products worth 195 NOK and a shipping fee of 59 NOK is added. This algorithm would then apply: `(449 / 12) + (449 * 1,6583%) + 35 = 80 NOK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 NOK. ### Calculation of monthly cost for interest free part payment. The formula used to calculate the cost is as follows: `(Order sum + (Invoice fee * months)) / months` Here's an example: if the total basket value is 3456 NOK, it would give the following calculation: `(3456 + (35 * 12)) / 12 = 323kr/month` Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 NOK, a first invoices lowest amount to pay would be 323 + 295 = 618 NOK. ### Calculation of monthly cost for annuity payment The formula used to calculate the cost is the following: `CapitalDebt * (MonthlyInterestRate / ((1 + MonthlyInterestRate) ^ Months - 1)) + CapitalDebt * MonthlyInterestRate + InvoiceFee` Here's an example: if the total basket value is 3456 NOK, it would give the following calculation: `3456 _ (1,6583% / ((1 + 1,6583%) ^ 24 - 1)) + 3456 _ 1,6583% +35 = 215 NOK/month` PLEASE NOTE Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 NOK, a first invoices lowest amount to pay would be 215 + 295 = 510 NOK. Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 NOK. --- # Order Confirmation Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/orderconfirmation.md ## Order Confirmation This text can be added to your order confirmation email that you distribute to the end customer For more information on how you can promote our app [download our app kit](https://cdn.walleypay.com/banner/walley-appkit.zip) ### Betaling Informasjon om din betaling sendes i en separat mail fra Walley. Du kan allerede nå logge inn på [MyWalley](https://my.walley.no/) eller laste ned Walley-appen fra [App Store](https://apps.apple.com/no/app/walley/id1569382782) eller [Google Play](https://play.google.com/store/apps/details?id=com.walleypay.app). Med Walley -appen kan du se alle dine kjøp og pause en faktura om du vil returnere en vare eller forlenge betalingstiden. Om du aktiverer notifikasjoner i appen blir du påminnet når betalingsfristen nærmer seg. --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/paymentinfo/account.md ## Payment information in checkout - Account `[Logo]` Når du velger konto får du varene tilsendt hjem før du betaler. Du får alle kjøp som er gjort under samme måned på en samlet faktura. Du kan deretter velge å betale hele beløpet med en gang eller dele opp betalingen i mindre deler. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se my.walley.no. --- # Payment Information – Campaign Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/paymentinfo/campaign.md ## Payment information in checkout – Campaign `[Logo]` ### Kjøp nå – betal senere! Alle kjøp t.o.m. `` som er utført i forbindelse med denne kampanjen gir deg betalingsutsettelse til ``. Kampanjegebyr på `` kommer i tillegg. ### Placeholders `` - The agreed campaign length, `` - The agreed due date `` - The agreed campaign fee, e.g. "39 kr" --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` Når du velger faktura får du varene tilsendt hjem før du betaler. Du kan deretter velge å betale hele beløpet med en gang eller dele opp betalingen i mindre deler. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se my.walley.no. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/paymentinfo/partpayment.md ## Payment information in checkout - Fixed part payment `[Logo]` Når du velger delbetaling får du varene tilsendt hjem før du betaler. En faktura sendes måneden som følger etter ditt kjøp. Følg din avbetalingsplan ved å betale inn det faste beløpet som fremkommer på din faktura. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se my.walley.no. --- # Shop terms & conditions – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/terms/account.md ## Shop terms & conditions – Account ### Konto I samarbeid med Walley tilbyr vi delbetaling via konto. Konto innebærer at du får varene hjem til deg før du betaler. Du kan deretter velge om du vil betale hele beløpet med en gang, eller om du ønsker å dele det opp i mindre deler. Forfallsdatoen kan variere, og angis på faktura eller delbetalingsanvisningen som sendes til deg. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se [my.walley.no](https://my.walley.no). En kredittvurdering vil bli utført, og dette innebærer at dine kredittopplysninger blir innhentet. Ved forsinkelser eller manglende betaling blir det bli lagt til en forsinkelsesavgift samt forsinkelsesrenter. Fullstendige vilkår for Walley finner du her: `Vilkår` og `SECCI. På [my.walley.no](https://my.walley.no) kan du se alle fakturaene dine fra Walley. ### Hyperlinks Alminnelige villkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_NO.pdf](https://cdn.walleypay.com/terms/Terms_NO.pdf) Standard europeisk brukerkreditinformasjon: [https://cdn.walleypay.com/terms/SECCI_NO.pdf](https://cdn.walleypay.com/terms/SECCI_NO.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbeid med Walley tilbyr vi betaling med Walley Checkout. Walley Checkout samler alle de viktigste betalingsmåtene i en og samme løsning - velg mellom Vipps, kortbetaling, faktura eller delbetaling (betalingsalternativene kan variere over tid). Du bestemmer selv hvilken betalingsmåte du ønsker å benytte i kassen, før du bekrefter kjøpet. Faktura eller delbetaling innebærer at du får varene hjem til deg før du betaler. Du kan deretter velge om du vil betale hele beløpet med en gang, eller om du ønsker å dele det opp i mindre deler. Forfallsdatoen kan variere, og angis på faktura eller delbetalingsanvisningen som sendes til deg. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se [my.walley.no](https://my.walley.no). En kredittvurdering vil bli utført, og dette innebærer at dine kredittopplysninger blir innhentet. Ved forsinkelser eller manglende betaling blir det bli lagt til en forsinkelsesavgift samt forsinkelsesrenter. Fullstendige vilkår for Walley finner du her: `Vilkår` og `SECCI`. ### Walley-appen Med Walley-appen får du oversikt over alle kjøp og betalinger – direkte på mobiltelefonen din. Her kan du administrere betalingene dine på den måten som passer deg og lommeboken din best. Du kan flytte forfallsdatoen fremover, dele et kjøp eller koble bankkontoen din til å betale umiddelbart, på forfallsdatoen eller via AvtaleGiro. Ved å aktivere varsler vil du motta påminnelser for kommende betalinger. Appen er gratis å laste ned og bruke. #### Last ned Walley-appen her: - [**App Store**](https://apps.apple.com/se/app/walley/id1569382782) - [**Google Play**](https://play.google.com/store/apps/details?id=com.walleypay.app) ### Hyperlinks Alminnelige villkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_NO.pdf](https://cdn.walleypay.com/terms/Terms_NO.pdf) Standard europeisk brukerkreditinformasjon: [https://cdn.walleypay.com/terms/SECCI_NO.pdf](https://cdn.walleypay.com/terms/SECCI_NO.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/terms/invoice.md ## Shop terms & conditions – Invoice ### Faktura I samarbeid med Walley, tilbyr vi faktura og delbetaling. Betale senere innebærer at du får varene hjem til deg før du betaler. Du kan deretter velge om du vil betale hele beløpet med en gang, eller om du ønsker å dele det opp i mindre deler. Forfallsdatoen kan variere, og angis på faktura eller delbetalingsanvisningen som sendes til deg. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se [my.walley.no](https://my.walley.no). En kredittvurdering vil bli utført, og dette innebærer at dine kredittopplysninger blir innhentet. Ved forsinkelser eller manglende betaling blir det bli lagt til en forsinkelsesavgift samt forsinkelsesrenter. Fullstendige vilkår for Walley finner du her: `Vilkår` og `SECCI`. På [my.walley.no](https://my.walley.no) kan du se alle fakturaene dine fra Walley. ### Hyperlinks Alminnelige villkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/WALLEY/Invoice_NO.pdf](https://cdn.walleypay.com/terms/WALLEY/Invoice_NO.pdf) Standard europeisk brukerkreditinformasjon: [https://cdn.walleypay.com/terms/SECCI_NO.pdf](https://cdn.walleypay.com/terms/SECCI_NO.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/norway/b2c/terms/partpayment.md ## Shop terms & conditions – Fixed Part Payment ### Delbetaling I samarbeid med Walley tilbyr vi fast delbetaling. Dele opp innebærer at du får varene hjem til deg før du betaler. Du kan deretter velge om du vil betale hele beløpet med en gang, eller om du ønsker å dele det opp i mindre deler. Forfallsdatoen kan variere, og angis på faktura eller delbetalingsanvisningen som sendes til deg. Følg din avbetalingsplan ved å betale inn det faste beløpet som fremkommer på din faktura. Leveringsmåten samt eventuelle avgifter vises i kassen før du bekrefter kjøpet. For å delbetale kjøpet kreves at du inngår en kredittavtale med Norion Bank AB (registrert innehaver av varemerket Walley) før fakturaen forfaller til betaling. Dette gjør du enkelt ved å signere og sende inn kredittavtalen, se [my.walley.no](https://my.walley.no). En kredittvurdering vil bli utført, og dette innebærer at dine kredittopplysninger blir innhentet. Ved forsinkelser eller manglende betaling blir det bli lagt til en forsinkelsesavgift samt forsinkelsesrenter. Fullstendige vilkår for Walley finner du her: `Vilkår` og `SECCI`. På [my.walley.no](https://my.walley.no) kan du se alle fakturaene dine fra Walley. ### Hyperlinks Alminnelige villkår for faktura og kontokredit: [https://cdn.walleypay.com/terms/Terms_NO.pdf](https://cdn.walleypay.com/terms/Terms_NO.pdf) Standard europeisk brukerkreditinformasjon: [https://cdn.walleypay.com/terms/SECCI_NO.pdf](https://cdn.walleypay.com/terms/SECCI_NO.pdf) --- # Overview Source: https://dev.walleypay.com/docs/marketingAssets/terms/overview.md The agreement texts should be used on your site to ensure that the customer has the possibility to read and understand the terms and how the payment option works before confirming the purchase. These texts are more detailed than the payment information descriptions Depending on which type of products you'll use, the agreement texts are different. In this section, you'll find all necessary agreement texts for all available languages. Please note that the agreement texts are divided into different parts and should be displayed in different ways on your site: - Shop terms and conditions (information page) – Should be placed under the payment terms in your webshop - Payment information in checkout – Should be places in the checkout when choosing the payment option invoice - Accept of agreement in checkout – The text that must be used when customer accepting the agreement for invoice --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/accept.md ## Accept of agreement in checkout `[Checkbox]` Jag har tagit del av och accepterar Walleys Allmänna villkor för faktura. ### Hyperlinks Allmänna villkor för faktura: [https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf](https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf) --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/paymentinfo/account.md ## Payment information in checkout – Aggregated invoice `[Logo]` När du väljer samlingsfaktura för företag får du dina varor levererade innan du betalar. Du får dessutom alla köp som gjorts under en månad samlade på en faktura. --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` När du väljer faktura för företag får du dina varor levererade innan du betalar. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` När du väljer delbetalning för företag får du dina varor levererade innan du betalar. Du får fakturan för delbetalning månaden efter ditt köp. --- # Shop terms & conditions – Aggregated invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/terms/aggregated_invoice.md ## Shop terms & conditions – Aggregated invoice ### Samlingsfaktura för företag I samarbete med Walley erbjuder vi betalning via samlingsfaktura för företag. Alla köp under samma månad samlas på en faktura, som skickas ut månaden efter köp. Faktura innebär att du får levererat varorna innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura som skickas till företaget. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor`. ### Hyperlinks Allmänna villkor för faktura: [https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf](https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbete med Walley erbjuder vi betalning med Walley Checkout. Walley Checkout samlar alla de viktiga betalsätten i en och samma lösning – välj mellan kortbetalning, faktura eller delbetalning (betalningsalternativen kan variera över tid). Du bestämmer själva vilket betalsätt du vill använda i kassan, innan du bekräftar köpet. Faktura eller delbetalning innebär att du får levererat varorna innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura som skickas till företaget. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor`. ### Hyperlinks Allmänna villkor för faktura: [https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf](https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf)Länk till CDN --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/terms/invoice.md ## Shop terms & conditions – Invoice ### Faktura för företag I samarbete med Walley erbjuder vi betalning med faktura för företag. Faktura innebär att du får levererat varorna innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura som skickas till företaget. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor`. ### Hyperlinks Allmänna villkor för faktura: [https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf](https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2b/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Delbetalning för företag I samarbete med Walley erbjuder vi delbetalning för företag. Delbetalning innebär att du får levererat varorna innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura som skickas till företaget månaden efter köpet. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor`. ### Hyperlinks Allmänna villkor för faktura: [https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf](https://cdn.walleypay.com/terms/Terms_B2B_SE.pdf) --- # Accept Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/accept.md ## Accept of agreement in checkout `[Checkbox]` Jag har tagit del av och accepterar Walleys Allmänna villkor för faktura och kontokredit, Standardiserad Europeisk Konsumentkreditinformation samt bekräftar att jag läst Walleys hantering av personuppgifter. ### Hyperlinks Allmänna villkor för faktura och kontokredit: [https://cdn.walleypay.com/terms/Terms_SE.pdf](https://cdn.walleypay.com/terms/Terms_SE.pdf) Standardiserad Europeisk Konsumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_SE.pdf](https://cdn.walleypay.com/terms/SECCI_SE.pdf) Walleys hantering av personuppgifter: www.walley.se/dataskydd --- # Calculations Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/calculations.md ## Calculations ### Calculation of monthly cost for account. You can use the following algorithm to calculate the products part payment cost (in the end customers native currency): `(Product cost / Number of months) + (Product cost * Interest rate) + Monthly fee` For example: A product worth 200 SEK, divided on 12 months, an interest rate of 1,6583%, and a monthly fee of 35 SEK would give the algorithm: `(200 / 12) + (200 * 1,6583%) + 35 = 55 SEK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 SEK. ### Calculating monthly cost to display on check-out page The same algorithm can be applied on the checkout page, but the two occurrences of product cost needs to be replaced by the total purchase amount including shipping fee: `(Total purchase amount / Number of months) + (Total purchase amount * Interest rate) + Monthly fee` For example: The customer orders two products worth 195 SEK and a shipping fee of 59 SEK is added. This algorithm would then apply: `(449 / 12) + (449 * 1,6583%) + 35 = 80 SEK per month` Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 SEK. ### Calculation of monthly cost for interest free part payment. The formula used to calculate the cost is as follows: `(Order sum + (Invoice fee * months)) / months` Here's an example: if the total basket value is 3456 SEK, it would give the following calculation: `(3456 + (35 * 12)) / 12 = 323kr/month` Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 SEK, a first invoices lowest amount to pay would be 323 + 295 = 618 SEK. ### Calculation of monthly cost for annuity payment The formula used to calculate the cost is the following: `CapitalDebt * (MonthlyInterestRate / ((1 + MonthlyInterestRate) ^ Months - 1)) + CapitalDebt * MonthlyInterestRate + InvoiceFee` Here's an example: if the total basket value is 3456 SEK, it would give the following calculation: `3456 _ (1,6583% / ((1 + 1,6583%) ^ 24 - 1)) + 3456 _ 1,6583% +35 = 215 SEK/month` PLEASE NOTE Please note that an origination fee is added to the first invoice. The standard set of instalment plans and their origination fees and interest rates can be found in the table below, however, please refer to your merchant agreement with Walley to get the correct origination fee amounts. Using the example amount above and an origination fee of 295 SEK, a first invoices lowest amount to pay would be 215 + 295 = 510 SEK. Please note that the amount to pay per month should be rounded up to the nearest integer, and the lowest amount is always 50 SEK. --- # Order Confirmation Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/orderconfirmation.md ## Order Confirmation This text can be added to your order confirmation email that you distribute to the end customer For more information on how you can promote our app [download our app kit](https://cdn.walleypay.com/banner/walley-appkit.zip) ### Betalning Information om din betalning skickas i ett separat mejl från Walley. Du kan redan nu logga in på [MyWalley](https://my.walley.se/) eller ladda ner Walley-appen på [App Store](https://apps.apple.com/se/app/walley/id1569382782) eller [Google Play](https://play.google.com/store/apps/details?id=com.walleypay.app). Med Walley-appen kan du snabbt och enkelt betala, pausa en faktura om du vill returnera eller förlänga betaltiden. Om du aktiverar notiser i appen blir du även påmind när det är dags att betala. --- # Payment Information – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/paymentinfo/account.md ## Payment information in checkout - Account `[Logo]` När du väljer konto får du hem dina varor innan du betalar. Du får dessutom alla dina köp som gjorts under en månad på en samlad faktura. Du kan sedan välja att betala hela beloppet på en gång eller dela upp betalningen i mindre delar. --- # Payment Information – Campaign Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/paymentinfo/campaign.md ## Payment information in checkout – Campaign `[Logo]` ### Köp nu – betala senare! Alla köp t.o.m. `` gjorda med denna kampanj ger dig förlängd betaltid till ``. Kampanjavgift på `` tillkommer. ### Placeholders `` - The agreed campaign length, `` - The agreed due date `` - The agreed campaign fee, e.g. "35 kr" --- # Payment Information – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/paymentinfo/invoice.md ## Payment information in checkout - Invoice `[Logo]` När du väljer faktura får du hem dina varor innan du betalar. Du kan sedan välja att betala hela beloppet på en gång eller dela upp betalningen i mindre delar. --- # Payment Information – Fixed part payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/paymentinfo/partpayment.md ## Payment information in checkout – Fixed part payment `[Logo]` När du väljer att dela upp din betalning får du hem dina varor innan du betalar. Du får en faktura månaden som följer efter ditt köp. Följ din delbetalning genom att betala in det fasta beloppet som framgår på din faktura. --- # Shop terms & conditions – Account Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/terms/account.md ## Shop terms & conditions – Account ### Konto I samarbete med Walley erbjuder vi delbetalning via konto. Konto innebär att alla dina köp under en månad samlas på en faktura, som skickas månaden efter dina köp. Du får hem dina varor innan du betalar. Förfallodatum kan skilja sig åt och framgår på den faktura eller delbetalningsavi som skickas till dig. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. En kreditprövning görs, som i vissa fall innebär att en kreditupplysning tas. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor` och `SECCI`. På [my.walley.se](https://my.walley.se) kan du se och betala alla dina fakturor från Walley. ### Hyperlinks Allmänna villkor för faktura och kontokredit: [https://cdn.walleypay.com/terms/Terms_SE.pdf](https://cdn.walleypay.com/terms/Terms_SE.pdf) Standardiserad Europeisk Konsumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_SE.pdf](https://cdn.walleypay.com/terms/SECCI_SE.pdf) --- # Shop terms & conditions – Walley Checkout Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/terms/checkout.md ## Shop terms & conditions – Walley Checkout ### Walley Checkout I samarbete med Walley erbjuder vi betalning med Walley Checkout. Walley Checkout samlar alla de viktiga betalsätten i en och samma lösning – välj mellan Swish, direktbank- och kortbetalning, faktura eller delbetalning (betalningsalternativen kan variera över tid). Du bestämmer själv vilket betalsätt du vill använda i kassan, innan du bekräftar köpet. Faktura eller delbetalning innebär att du får hem varorna innan du betalar. Du kan sedan välja att antingen betala hela beloppet på en gång eller dela upp det i mindre delar. Förfallodatum kan skilja sig åt och framgår på den faktura eller delbetalningsavi som skickas till dig. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. En kreditprövning görs, som i vissa fall innebär att en kreditupplysning tas. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor` och `SECCI`. ### Walley-appen Med Walley-appen får du en samlad översikt över alla dina köp och betalningar – direkt i mobilen. Här kan du hantera dina betalningar på det sätt som passar dig och din plånbok bäst. Du kan flytta fram förfallodatum, dela upp ett köp eller ansluta ditt bankkonto för att betala direkt, på förfallodagen eller via autogiro. Genom att aktivera notiser får du påminnelser inför kommande betalningar. Appen är kostnadsfri att ladda ner och använda. #### Ladda ner Walley-appen här: - [**App Store**](https://apps.apple.com/se/app/walley/id1569382782) - [**Google Play**](https://play.google.com/store/apps/details?id=com.walleypay.app) ### Hyperlinks Allmänna villkor för faktura och kontokredit: [https://cdn.walleypay.com/terms/Terms_SE.pdf](https://cdn.walleypay.com/terms/Terms_SE.pdf) Standardiserad Europeisk Konsumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_SE.pdf](https://cdn.walleypay.com/terms/SECCI_SE.pdf) --- # Shop terms & conditions – Invoice Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/terms/invoice.md ## Shop terms & conditions – Invoice ### Faktura I samarbete med Walley erbjuder vi faktura och delbetalning. Faktura innebär att du får hem varorna innan du betalar. Du kan sedan välja att antingen betala hela beloppet på en gång eller dela upp det i mindre delar. Förfallodatum kan skilja sig åt och framgår på den faktura eller delbetalningsavi som skickas till dig. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. En kreditprövning görs, som i vissa fall innebär att en kreditupplysning tas. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor` och `SECCI`. På [my.walley.se](https://my.walley.se) kan du se och betala alla dina fakturor från Walley. ### Hyperlinks Allmänna villkor för faktura och kontokredit: [https://cdn.walleypay.com/terms/Terms_SE.pdf](https://cdn.walleypay.com/terms/Terms_SE.pdf) Standardiserad Europeisk Konsumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_SE.pdf](https://cdn.walleypay.com/terms/SECCI_SE.pdf) --- # Shop terms & conditions – Fixed Part Payment Source: https://dev.walleypay.com/docs/marketingAssets/terms/sweden/b2c/terms/partpayment.md ## Shop terms & conditions – Fixed part payment ### Delbetalning I samarbete med Walley erbjuder vi faktura vid speciella delbetalningskampanjer. Delbetalningskampanj innebär att du får hem varorna innan du betalar. Du kan sedan välja att antingen betala hela beloppet på en gång eller dela upp det i mindre delar. Följ din delbetalning genom att betala in det fasta beloppet som framgår på din faktura. Förfallodatum kan skilja sig åt och framgår på den faktura eller delbetalningsavi som skickas till dig. Leveranssätt samt eventuella avgifter som tillkommer visas i kassan innan du bekräftar köpet. En kreditprövning görs, som i vissa fall innebär att en kreditupplysning tas. Vid försenad eller utebliven betalning debiteras en förseningsavgift samt dröjsmålsränta. Fullständiga villkor för Walley hittar du här: `Villkor` och `SECCI`. På [my.walley.se](https://my.walley.se) kan du se och betala alla dina fakturor från Walley. ### Hyperlinks Allmänna villkor för faktura och kontokredit: [https://cdn.walleypay.com/terms/Terms_SE.pdf](https://cdn.walleypay.com/terms/Terms_SE.pdf) Standardiserad Europeisk Konsumentkreditinformation: [https://cdn.walleypay.com/terms/SECCI_SE.pdf](https://cdn.walleypay.com/terms/SECCI_SE.pdf) --- # Authentication Source: https://dev.walleypay.com/docs/mcp-server/authentication.md To protect your data and users, Walley uses Microsoft Azure ADB2C as an authentication service provider. To gain access to the API you must identify your application against this service to obtain a token that you use to identify your application against our APIs. > Microsoft Azure ADB2C follows the standard OAuth2 and for integrating with Walley api you use the **Client Credentials** flow. > [Read more about it](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) --- # MCP Server Source: https://dev.walleypay.com/docs/mcp-server/overview.md Connect your AI assistant to Merchant Hub with the Model Context Protocol (MCP). Search orders, look up settlements, and list transactions by asking in plain language, from the tools you already use. :::preview Beta The MCP Server is in beta. Tools and endpoints may change without prior notice. Your feedback helps us shape it, so tell us what works and what doesn't. ::: :::tip Have a use case in mind? We want to hear how you plan to use the MCP Server. If you need more tools or a different way of working with your data, [contact us](/support) and we'll look at it together. ::: ## Why connect Merchant Hub to your AI assistant? Today, getting the full picture of an order means logging in to Merchant Hub, then switching to your ERP, order management system, and e-commerce platform to piece it together. That takes time, and the answer lives in four places. With MCP, your team works in one place. Connect the Merchant Hub MCP Server alongside MCP servers for your ERP, OMS, and e-commerce platform, and your assistant can pull data from all of them in the same conversation. Ask a question, compare records across systems, spot discrepancies, and get insights across your whole system landscape without leaving the chat. Some examples of what that looks like in practice: - Compare the payout in a Walley settlement with the corresponding invoices in your ERP. - Find orders that are activated in Merchant Hub but still open in your OMS. - Ask why a customer's order shows a different amount in your webshop than in Merchant Hub. ## What is MCP? The [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that lets AI assistants call external systems through a defined set of capabilities called **tools**. The Walley MCP Server exposes Merchant Hub operations as MCP tools. Any MCP-compatible client, such as Microsoft 365 Copilot, GitHub Copilot in VS Code, or your own chat bot, can then work with your merchant data in a conversation. ## Before you start You need: - A Merchant Hub account with access to the data you want to work with. See [Permissions](#permissions). - An MCP client that supports HTTP transport. - Credentials for one of the [authentication methods](#authentication) below. ## Environments | Environment | MCP endpoint | | :---------- | :-------------------------------------------------- | | Test | `https://merchanthub-mcp.aks.uat.walleydev.com/mcp` | | Production | `https://mcp.merchanthub.walleypay.com/mcp` | ## Authentication The MCP Server supports two ways to authenticate: - **Browser flow.** For interactive use. Your MCP client opens a browser where you sign in with your Merchant Hub account. [Contact us](/support) to have this enabled for your organization. - **Client credentials flow.** For automated integrations. Use a client ID and secret to request a Bearer token with the OAuth 2.0 Client Credentials grant. The [Authentication](/docs/mcp-server/authentication) page describes how to request a token with the client credentials flow. ## Connecting your AI client The MCP Server uses [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) transport. The exact configuration depends on your client, but every client needs the same two values: - **URL.** The MCP endpoint for your environment from the [Environments](#environments) table. - **Headers.** An `Authorization` header with your Bearer token. ### Example: VS Code and GitHub Copilot 1. Open `.vscode/mcp.json` in your workspace, or your VS Code user settings. 2. Add the server configuration. Replace `YOUR_ACCESS_TOKEN` with a token from the [Authentication](/docs/mcp-server/authentication) page. ```json { "servers": { "walley-merchanthub": { "type": "http", "url": "https://merchanthub-mcp.aks.uat.walleydev.com/mcp", "headers": { "Authorization": "Bearer YOUR_ACCESS_TOKEN" } } } } ``` 3. Start the server from VS Code. The tools listed below appear in your assistant. ## Available tools Once connected, your AI assistant can use these tools: | Tool | Description | | :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | | `SearchOrder` | Search orders with pagination, sorting, and full-text filtering. Supports date filters on `placedAt` and `expiresAt`. | | `GetOrderById` | Fetch a single order by its ID. | | `SearchSettlement` | Search settlements (reports) with pagination, sorting, and full-text filtering. Supports date filters on `startDate`, `endDate`, and `paidOutAt`. | | `GetSettlementTransactions` | Fetch the transactions for a settlement by its ID, with pagination support. | ## Usage examples Once connected, you can ask your assistant things like: - _"Show me orders placed in the last 7 days"_ - _"Find order 12345 and show me its details"_ - _"Search for orders with status 'Activated'"_ - _"Show me settlements paid out this month"_ - _"List the transactions for settlement ABC-123"_ ## Permissions The MCP Server uses the same permissions as Merchant Hub. Which tools are available, and which data they return, depends on the permissions of the authenticated user. If a tool returns an authorization error, check the user's permissions under **Manage Organization** in Merchant Hub. See [User and group management](/docs/merchanthub/access/usersgroups) for details. ## Data security :::warning Your data goes to the AI model When you use the MCP Server with an AI assistant, order and settlement data is sent to the AI model for processing. This data can include personal and sensitive information. You are responsible for making sure it is not leaked or exposed to unauthorized parties. That includes evaluating the AI tools and models you connect, complying with applicable data protection regulations such as GDPR, and restricting access to authorized personnel. Walley is not responsible for data handling that happens outside the MCP Server itself. ::: --- # Amended regulations for credit marketing in Sweden Source: https://dev.walleypay.com/docs/merchant-guide/credit-marketing-guidelines.md Starting from March 1, 2025, new regulations will apply to how credit can be marketed in Sweden. The aim is to reduce the risk of over-indebtedness by making it clearer to customers that credit entails costs. In advertisements or credit offers, a clear warning must be displayed in the form of text and a warning triangle. Here we present Walley's interpretation of the directives and how the requirements can be implemented. The information on this page is provided for informational purposes only and does not constitute legal advice. Always consult a qualified legal expert for advice tailored to your specific situation. Swedish Consumer Agency example of warning text ## Which situations require a specific disclosure? ### Mandatory Disclosure The disclosure must be present if an individual offer is presented and a effective interest rate example must be shown. Example: - Pay 200 SEK/month for 12 months ### Non-Mandatory Disclosure If credit is only mentioned as a payment option without being actively marketed, no disclosure is required. Example: - Pay with Walley - Buy now, pay later with Walley ## How Should the Disclosure Be Implemented? ### Product Listing (PLP) On product listing pages (such as category pages and search results) where installment payment is mentioned, Walley suggests displaying the disclosure in a general manner, for example, in a banner. ### Product Page (PDP) On product pages where installment payment is offered, there are two ways to display the disclosure: - In connection with a complete price example. - Via a link leading to detailed credit terms. - Pages Marketing Credit - If a page is about credit without being linked to a specific purchase, the disclosure must be clearly visible. ### Checkout In the checkout, there are two options for presenting the disclosure: - A general section applicable to all payment methods. - A disclosure that becomes visible only when the customer selects a credit-based payment method, such as installment payment. ### Instore, telephone and physical materials - Printed Materials - For physical marketing, such as brochures, product sheets, and posters, the disclosure must be included. For verbal marketing, such as telemarketing, the warning should be replaced with the word "note" to emphasize the importance of the information. ## Walley Checkout Example implementation Walley Checkout Example with the warning triangle and text ## Walley Part Payment Widget Example implementation Walley Part Payment Widget Example with the warning triangle and text ## More information https://publikationer.konsumentverket.se/produkter-och-tjanster/finansiella-tjanster/kovfs-20251-konsumentverkets-foreskrifter-om-naringsidkares-upplysningsskyldighet-vid-marknadsforing-av-konsumentkrediter --- # Overview Source: https://dev.walleypay.com/docs/merchant-guide/legal-compliance-overview.md This section provides legal and compliance documents for merchants using Walley's services. ## Ethics Policy Below you can find the ethics policy documents in both Swedish and English: ### Swedish Version Walley - Etisk Policy (Swedish) - PDF ### English Version Walley - Ethics Policy (English) - PDF --- # Overview Source: https://dev.walleypay.com/docs/merchant-guide/merchant-guidelines-overview.md This section provides an overview of the guidelines that merchants must follow when using Walley's services. The guidelines cover various aspects of the merchant's relationship with Walley ## Marketing of Credit in SE [Amended regulations for credit marketing in Sweden](/docs/merchant-guide/credit-marketing-guidelines) ## Terms and Conditions [General terms and conditions for merchants](/docs/marketingAssets/terms/overview) --- # Managing API keys Source: https://dev.walleypay.com/docs/merchanthub/access/apikeys.md An API key is what your integration uses to get access tokens for Walley's APIs. Create and remove keys on the API keys tab in Manage Organization. ## Before you start - You need the **Api key Management** permission. - Open **Manage Organization**. Select your name in the top right and pick it from the menu. - Read [Authentication](/docs/authentication) to see how the key is exchanged for an access token. ## Create an API key By default, your organization can have up to 10 active API keys at the same time. 1. Open the **API keys** tab. 2. Select **Create new** and then **Api key**. If your organization has no keys yet, the tab shows a **Create Api key** button instead. 3. Optionally, enter a **Key label** so you can tell the key apart from the others. 4. Choose the **Expiration time**. The key stops working after that time. 5. Select **Create**. 6. Copy the **Client ID** and **Secret** from the dialog and store them in a safe location. The secret is shown only once, and you need both to get an access token. :::warning Rotate keys before they expire Set a short expiry and rotate keys at least once a year, more often if you can. Rotate before the expiry date so your integration never stops working. ::: ## Remove an API key :::warning Removing a key cannot be undone Any integration that uses the key stops working as soon as you remove it. ::: 1. Find the key in the list. 2. Select **Remove** on that row. 3. Confirm the removal. --- # Managing users and groups Source: https://dev.walleypay.com/docs/merchanthub/access/usersgroups.md Invite the people in your organization to the Merchant Hub and use groups to decide which views and which stores each of them can see. ## Before you start - Open **Manage Organization**. Select your name in the top right and pick it from the menu. - To invite users, you need the **Access Management** permission. ## How access works - A user belongs to one or more groups and gets the combined permissions of all of them. - A group's permissions decide which areas its members can use. One group might have read access to orders while another has read and write access. - A group also decides which stores its members can see. Users who need both B2C and B2B stores can be members of both groups. The permission areas are Access Management, Order Management, Paylink Management, Report Management, Api key Management, Webhook Management, Store Management, Dashboard Management, and Developer Logs. Each page in this section says which one it needs. ## Invite a user 1. Select **Invite user**. 2. Enter the person's name and email address. 3. Choose the group the user should belong to. 4. Select **Send invite**. The person receives an email with a link that is valid for 7 days. The invite user dialog with fields for name, email, and group ## Resend or delete an invite Pending invites are listed under **Users** on the **Pending users** tab, together with their expiry dates. 1. Open the action menu on the right side of the row. 2. Select **Resend** to send the invitation again, **Copy invite link** to share it yourself, or **Delete** to remove it. The pending users tab with an action menu open on one invite ## Create a group 1. Select **Create new** and then **Group**. 2. Enter a name for the group. 3. Select **Create Group**. 4. Select **Set Group Permission**. 5. Tick the permissions the group should have. The create group dialog with a name field ## Add a user to a group Only users who have accepted their invite can be added to a group. 1. Open the **Groups** tab. 2. Select the group you want to edit. 3. Choose the user in the dropdown in the top right and select **Add user**. A group page with the add user dropdown in the top right ## Next steps - Create [API keys](/docs/merchanthub/access/apikeys) for your integration. - Subscribe to order events with [webhooks](/docs/merchanthub/access/webhooks). --- # Managing webhooks Source: https://dev.walleypay.com/docs/merchanthub/access/webhooks.md A webhook tells Walley where to send updates about your orders. Create, test, and manage webhooks on the Webhooks tab in Manage Organization. ## Before you start - You need the **Webhook Management** permission. - Open **Manage Organization**. Select your name in the top right and pick it from the menu. - Read the [webhooks overview](/docs/webhooks/overview) for the events you can subscribe to and how to verify the signature. ## Create a webhook 1. Select **Create new** and then **Webhook**. 2. Fill in the webhook details: - The HTTPS endpoint Walley should call - The events you want to subscribe to - The stores that should generate the events - The authentication to use 3. Select **Create**. 4. Copy the HMAC key from the dialog that opens and store it safely. You need it to verify incoming webhooks. Hover over an event or store to see more details in a tooltip. ## Test a webhook 1. Open the menu on the right side of the webhook's row. 2. Select **Test configuration**. 3. Choose the event to test. 4. Select **Test**. A dialog shows the response code from your endpoint. A successful test returns 200. ## Disable or enable a webhook 1. Open the menu on the right side of the webhook's row. 2. Select **Disable** or **Enable**. ## Delete a webhook :::warning Deleting a webhook cannot be undone Walley stops sending events to the endpoint as soon as you delete it. ::: 1. Open the menu on the right side of the webhook's row. 2. Select **Delete**. The webhooks tab listing configured webhooks with a menu on each row ## Failed webhooks A failed webhook is an event that Walley could not deliver to your endpoint. Review them on the **Failed webhooks** tab. 1. Tick the webhooks you want to resend or delete, or tick the checkbox in the header to select all. 2. Select **Resend** or **Delete**. The failed webhooks tab with checkboxes on each row and resend and delete buttons Select a row to open the details of a failed webhook. The details dialog for a failed webhook --- # Crediting fees on a notification Source: https://dev.walleypay.com/docs/merchanthub/account/creditfees.md A notification is the invoice or payment notice that Walley sends to your customer. If your agreement allows it, you can credit the administrative fees Walley added to it. ## Before you start Your organization must be allowed to credit fees. If you are unsure, contact Walley Merchant Services at help@walley.se. ## Credit fees 1. Open a notification that has fees added by Walley. 2. Select **Credit fees**. 3. In the dialog, tick the fees to credit. 4. Select **Credit**. --- # Extending a notification Source: https://dev.walleypay.com/docs/merchanthub/account/extendNotification.md A notification is the invoice or payment notice that Walley sends to your customer. Extend it to give the customer more time to pay. ## Before you start - A notification can be extended only once. - How many days you can extend by depends on your agreement with Walley. ## Extend a notification 1. Open the notification. 2. Select **Extend**. 3. Select **Yes** to confirm. ## Next steps - [Resend the notification](/docs/merchanthub/account/resend) if the customer did not receive it. - [Credit fees](/docs/merchanthub/account/creditfees) that Walley added to the notification. --- # Resending a notification Source: https://dev.walleypay.com/docs/merchanthub/account/resend.md A notification is the invoice or payment notice that Walley sends to your customer. Resend it when the customer did not receive the first one or has misplaced it. :::info Postal fee Resending by post adds an extra fee. ::: ## Resend a notification 1. Open the notification. 2. Select **Resend**. 3. Select **Send by email** or **Send by post**. 4. Select **Send**. ## Next steps - [Extend the notification](/docs/merchanthub/account/extendNotification) if the customer needs more time to pay. --- # Developer Logs Source: https://dev.walleypay.com/docs/merchanthub/developerLogs/overview.md The Developer Logs record every request your organization makes to the Walley API, together with the response. Use them to review your API traffic and track down unexpected responses. ## Before you start The **Developer Logs** tab appears in the top menu only for users whose group has the Developer Logs permission. 1. Open **Manage Organization**. Select your name in the top right and pick it from the menu. 2. Enable the **Developer Logs** permission for the group. See [Managing users and groups](/docs/merchanthub/access/usersgroups#create-a-group). ## Read the logs Each API call is a row in the table. The Developer Logs table listing API calls with their timestamps and response codes Select a row to see the full request and response. The details dialog for one API call showing the request and the response --- # Merchant Hub environments Source: https://dev.walleypay.com/docs/merchanthub/environments.md The Merchant Hub runs in a test environment and a production environment. Use the test environment to try things out without touching real orders. | Environment | URL | | :---------- | :----------------------------------------------------------------------------- | | Test | [merchanthub.aks.uat.walleydev.com](https://merchanthub.aks.uat.walleydev.com) | | Production | [merchanthub.walleypay.com](https://merchanthub.walleypay.com) | --- # Merchant Hub FAQ Source: https://dev.walleypay.com/docs/merchanthub/faq.md Short answers to the questions we hear most about the Merchant Hub. Each answer links to the page with the full story. ## What is the Merchant Hub? The Merchant Hub is where you see and manage every order your customers place with Walley. You can activate, edit, return, extend, and cancel orders, handle the notifications sent to your customers, download settlements, and generate reports. The order and settlement operations are also available through the [Management API](/docs/manage/getting-started/quickstart), so you can automate those workflows. ## How do I get access? Walley Merchant Services invites the first administrator in your organization. That administrator can then invite and manage users without contacting Walley. Contact help@walley.se if you are the administrator and have not received an invitation. See [Logging in](/docs/merchanthub/login). ## How do I change the language? Not yet. Menus and buttons are in English. Your own data, such as article descriptions, is shown in the language it was entered in. ## How do I control who sees what? Access is controlled by groups. A user belongs to one or more groups and gets the combined permissions of all of them. Each group has permissions for specific areas, such as read or write access to orders, and access to specific stores. A contact centre group might see only your B2C stores, for example, while another group handles B2B. See [Managing users and groups](/docs/merchanthub/access/usersgroups). ## How can I see what happened to an order? Open the order from the order search. The timeline at the bottom of the order details lists every event, newest first, with a timestamp, who initiated it, and through which system. The most common events are: | Event | Description | | -------------------- | ---------------------------------------------------------- | | Order created | The order was created | | Rows activated | Rows were activated, and by whom | | Return made | A full or partial return was made | | Rows changed | Rows on the order were changed | | Notification created | A notification was created for the order | | Notification sent | A notification was sent to the customer | ## What are the different order statuses? | Status | Shown as | Description | | -------------------- | ------------------- | ------------------------------------------------------------------------------------------------------- | | `NotActivated` | Not activated | The order is not yet activated and is not ready to be shipped | | `PartActivated` | Partly activated | Some rows of the order are activated and ready to be shipped, while others are not | | `Activated` | Activated | Every row is activated and ready to be shipped. Activated orders are included in payouts | | `Returned` | Returned | Every row of the order has been returned by the customer | | `Expired` | Expired | The time to activate the order ran out. You can still [extend](/docs/merchanthub/orders/extendOrder) it | | `OnHold` | On hold | The order needs signing under a credit agreement, or is under a short fraud investigation | | `VerificationNeeded` | Verification needed | The order needs a signed credit agreement before it can be activated | | `Closed` | Closed | The order is settled and no longer open for changes | The first column is the name the search uses, the second is what the order list shows. See [Searching for orders](/docs/merchanthub/search#field-queries) for how to filter on status. ## What is a notification? A notification is the invoice or payment notice that Walley sends to your customer. You can [extend](/docs/merchanthub/account/extendNotification), [resend](/docs/merchanthub/account/resend), or [credit fees on](/docs/merchanthub/account/creditfees) a notification from the Merchant Hub. ## What can I search for? Almost anything stored on an order: order number, email address, national registration number, name, or address. You can also filter on specific fields, such as `storeId:1158 AND status:Activated`. See [Searching for orders](/docs/merchanthub/search) for the full syntax and the list of searchable fields. ## Who do I contact for help? - Questions about the Merchant Hub and your orders: Walley Merchant Services at help@walley.se. - Questions about getting Pay Link or new stores set up: delivery@walley.se. --- # Walley Merchant Hub Source: https://dev.walleypay.com/docs/merchanthub/intro.md The Merchant Hub is where you manage your Walley orders, users, API keys, webhooks, Pay Links, and reports. When you become a Walley customer, you are invited with your company email address. Explore the areas below and find what you need.

📦 Orders

Find any order and act on it. Activate what you ship, edit or add articles, register returns, extend the activation time, or cancel.

🔗 Pay Link

Send a pre-filled checkout to a customer as a text message or a link. When the customer pays, the purchase becomes an order like any other.

💰 Reports

Download settlements as CSV or PDF, follow your sales per currency, and generate custom reports for any period and set of stores.

🔐 Manage Organization

Invite users, decide with groups who sees which stores, and create the API keys and webhooks your integration needs.

## Common tasks The things most merchants do every week, step by step.

✅ Activate an order

Tell Walley the goods are on their way and get paid.

↩️ Return articles

Register what the customer sent back, in full or per article.

🧾 Resend a notification

Send the invoice again by email or post.

📊 Generate a custom report

Settlements, transactions, or orders for a period you choose.

🔑 Create an API key

Get the credentials your integration uses to call Walley's APIs.

🔔 Set up a webhook

Let Walley call your system when an order changes.

🛠️ Review API traffic

See every request and response in the Developer Logs.

## Before you start 1. [Log in](/docs/merchanthub/login) with your invitation. Use the [test environment](/docs/merchanthub/environments) to try things out without touching real orders. 2. Take the [quick guide](/docs/merchanthub/quickguide) through the four views you will use most. 3. Keep the [FAQ](/docs/merchanthub/faq) handy for order statuses and other common questions. ## Getting access Walley Merchant Services invites the first administrator in your organization. That administrator can then invite everyone else. Contact us if you have not received an invitation. :::info CONTACT DETAILS **[help@walley.se](mailto:help@walley.se)**
**[+46 10 161 01 25](tel:+46101610125)** ::: --- # Logging in Source: https://dev.walleypay.com/docs/merchanthub/login.md Log in to the Merchant Hub with your user name and password. Every user has a personal login, so the order history always shows who did what. ## Before you start You need an invitation from an administrator in your organization. If your organization is new to Walley, Merchant Services invites the first administrator. Contact help@walley.se if that is you. ## Log in 1. Open the Merchant Hub for the [environment](/docs/merchanthub/environments) you want to use. 2. Enter your user name and password. 3. Select **Log in**. If the credentials are wrong, the page tells you what went wrong. The Merchant Hub login form with user name, password, and a forgot password link ## Reset your password 1. Select **Forgot your password?**. 2. Enter your email address. 3. Enter the verification code that Walley sends to that address and choose a new password. ## Next steps - Take the [quick guide](/docs/merchanthub/quickguide) through the main views. - Invite your colleagues in [Managing users and groups](/docs/merchanthub/access/usersgroups). --- # Activating an order Source: https://dev.walleypay.com/docs/merchanthub/orders/activation.md Activate an order when the goods are ready to ship. Activation tells Walley that the customer will receive the goods, moves the order out of NotActivated, and includes the amount in your next payout. ## Before you start The order must have status `NotActivated` or `PartActivated`. See [order statuses](/docs/merchanthub/faq#what-are-the-different-order-statuses). ## Activate an order 1. Find the order in the [order search](/docs/merchanthub/search) and open it. 2. Select **Activate**. 3. In the dialog, tick the articles to activate. If an article has a quantity above one, you can activate part of the quantity. 4. Select **Activate**. The order status changes to `Activated`, or to `PartActivated` if you left some articles out. ## Part activation If you activate only some of the articles, the order becomes `PartActivated` and you can activate the rest later. This is useful when some items are on back order and ship at a later date. For invoice orders, Walley sends the customer a [notification](/docs/merchanthub/faq#what-is-a-notification) every time you activate. ## Next steps - [Edit or add articles](/docs/merchanthub/orders/adjustments) before or after activation. - [Return articles](/docs/merchanthub/orders/returns) the customer sends back. --- # Editing and adding articles Source: https://dev.walleypay.com/docs/merchanthub/orders/adjustments.md After an order is created you can change its articles, add new ones, and add fees or discounts. A fee or discount is an amount on its own row, not tied to a specific article. ## Before you start What you can do depends on the order status: | Order status | Possible actions | | -------------- | ------------------------------------------------- | | `NotActivated` | Add article, fee, or discount. Edit articles | | `Activated` | Add article, fee, or discount | To open the editor, open the order and select **Edit**. Every procedure below starts from the editor. ## Add an article The article's **Description** is shown on the customer's invoice. 1. Select **Add article**. 2. Fill in the article details. 3. Select **Add**. 4. When you have added all articles, select **Update Order**. ## Add a discount or fee Enter the discount as a positive amount. It is shown as negative on the order. 1. Select **Add fee** or **Add discount**. 2. Fill in the details. The article number is set to `Fee` or `Discount` automatically. 3. Select **Add**. 4. When you are done, select **Update Order**. ## Edit an article 1. Select the pen icon on the article's row. 2. Change the details. 3. Select **Apply**. 4. When you are done, select **Update Order**. :::info Activated orders On an `Activated` order, changes to activated rows are recorded as an adjustment, while changes to rows that are not activated replace the row. ::: ## Next steps - [Activate the order](/docs/merchanthub/orders/activation) when the goods are ready to ship. - [Return articles](/docs/merchanthub/orders/returns) the customer sends back. --- # Cancelling an order Source: https://dev.walleypay.com/docs/merchanthub/orders/cancelOrder.md Cancel an order when the goods will not be shipped. Cancelling releases every row that is not yet activated. ## Before you start The order must have status `NotActivated`, `PartActivated`, `Expired`, or `OnHold`. :::warning Cancelling cannot be undone Cancelled rows cannot be activated later. ::: ## Cancel an order 1. Find the order in the [order search](/docs/merchanthub/search) and open it. 2. Select **Cancel**. 3. Select **Yes** to confirm. The dialog reminds you that every article that is not activated will be cancelled. Every row that is not activated is cancelled, whatever the order status was. A `PartActivated` order keeps its activated rows and becomes `Activated`. For the other statuses, every row is cancelled and the order can no longer be activated. --- # Extending an order Source: https://dev.walleypay.com/docs/merchanthub/orders/extendOrder.md Extend an order to give yourself more time to activate it. An order can be extended up to 180 days from the purchase date. ## Before you start - The order must have status `NotActivated` or `Expired`. - How many days you can extend by depends on your agreement with Walley. ## Extend an order 1. Find the order in the [order search](/docs/merchanthub/search) and open it. 2. Select **Extend**. 3. Select **Yes** to confirm. The order's expiry date moves forward. The extend order confirmation dialog --- # Returning articles Source: https://dev.walleypay.com/docs/merchanthub/orders/returns.md When a customer sends back one or more articles, register a return on those articles. The return adjusts the order and refunds any money the customer has already paid. ## Before you start The order must have status `Activated` or `PartActivated`. Find it in the [order search](/docs/merchanthub/search) and open it. ## Return specific articles 1. Select **Edit**. 2. Select the return arrow on the right side of the article's row. 3. If the article has a quantity above one, set the quantity to return and select **Return**. 4. Select **Update Order**. To reverse a return before that, select **Undo** on the row. The order is now partly returned. ## Return the whole order 1. Select **Edit**. 2. Select **Return all** at the top of the table. 3. Select **Update Order**. The order status changes to `Returned`. :::info Timeline Partly returned rows are shown in the timeline only while the order is not fully returned. ::: --- # Partner Portal Source: https://dev.walleypay.com/docs/merchanthub/partnerportal.md The Walley Partner Portal has been shut down. Its successor is the Merchant Hub. If you have questions, contact Walley Merchant Services at help@walley.se. - [Open the Merchant Hub](https://merchanthub.walleypay.com/) - [Read the Merchant Hub FAQ](/docs/merchanthub/faq) ## Bambora and Worldline users Log in to the Worldline merchant portal to handle your purchases, or contact Worldline support. - [Worldline merchant portal](https://merchant.bambora.com/auth/signin) - [Worldline support](https://www.bambora.com/sv/se/customer-service/) --- # Creating a Pay Link Source: https://dev.walleypay.com/docs/merchanthub/paylink/create.md Create a Pay Link in four steps: enter the articles, review the details, send the link, and wait for the customer to pay. ## Before you start - You need the **Paylink Management** permission. - Your stores must be set up for Pay Link. See the [Pay Link overview](/docs/merchanthub/paylink/overview#before-you-start). - Select **Pay Link** in the top menu. The list shows every Pay Link your permissions give you access to. ## Enter the articles 1. Select **Create new** and then **Pay Link**. 2. Choose the currency. 3. Enter the articles. The customer sees them in the checkout. 4. Select **Next**. ## Review the Pay Link details 1. Choose the store the purchase should be registered on. 2. Optionally, enter an order number so you can find the order later. 3. Choose the delivery method, [remote](#remote-delivery) or [in-store](#in-store-delivery). 4. Select **Create**. :::info Delivery method and auto activation The delivery method you choose overrides the store's default activation behaviour for this checkout. ::: ## Send the Pay Link to the customer When the Pay Link is created, a dialog offers two ways to share it. Send it as a text message, or copy the link and send it by email or another channel. To send a text message: 1. Enter the customer's mobile phone number in the **Send Pay Link** dialog. 2. Select **Send**. ## The customer completes the purchase The customer opens the link in a browser on any device and pays. An order is created, and a link to it appears on the Pay Link details page. :::info Refresh to see the new state The Pay Link page does not update on its own. Select **Refresh Pay Link** to see the new state and the link to the order. ::: ## Delivery methods ### Remote delivery Use this for distance sales, for example over the phone or by email. [Activate the order](/docs/merchanthub/orders/activation) when you ship the goods. ### In-store delivery Use this when the customer takes the goods right away, for example in your physical store. The order is activated when the customer completes the purchase. ## Create a Pay Link from a bookmark You can prefill fields by adding query parameters to the Pay Link URL. Save the URL as a browser bookmark for configurations you use often, or share it with colleagues. ``` https://merchanthub.walleypay.com/new-paylink?articleNumber=123&description=Item1&country=SE&deliveryMethod=Remote&lock=deliveryMethod ``` This example prefills the article number, description, country code, and delivery method, and locks the delivery method so it cannot be changed by mistake. ### Lock a field Add `lock=FIELD_NAME` to stop a field from being changed. Repeat it to lock several fields: ``` &lock=deliveryMethod&lock=country ``` ### Fields you can prefill and lock | Field | Description | | ---------------- | ------------------------------------------------------------------------------------- | | `articleNumber` | The article or SKU number. | | `description` | The article name shown to the customer in the checkout. | | `unitPrice` | The price per unit in the selected currency, for example `99.00`. | | `vatRate` | The VAT rate as a percentage, for example `25`. | | `quantity` | The number of units. Defaults to 1. | | `country` | The two-letter country code, for example `SE`, `NO`, or `FI`. | | `deliveryMethod` | `Remote` for distance sales or `In-store` for goods handed over on the spot. | ## Next steps - Follow the purchase in [Pay Link states](/docs/merchanthub/paylink/statuses). --- # Pay Link overview Source: https://dev.walleypay.com/docs/merchanthub/paylink/overview.md A Pay Link is a pre-filled checkout you send to a customer. The customer opens the link, pays, and the purchase becomes an order in the Merchant Hub like any other. ## When to use a Pay Link - Charge for extra services after the original purchase. - Sell articles that are not in your web shop, such as spare parts. - Take in-store purchases with strong customer authentication. ## Before you start - You need the **Paylink Management** permission. - Your stores must be set up for Pay Link. That is normally already the case if you use Walley Checkout. If not, contact delivery@walley.se. ## How it works 1. [Enter the articles](/docs/merchanthub/paylink/create#enter-the-articles). 2. [Review the Pay Link details](/docs/merchanthub/paylink/create#review-the-pay-link-details). 3. [Send the Pay Link to the customer](/docs/merchanthub/paylink/create#send-the-pay-link-to-the-customer). 4. [The customer completes the purchase](/docs/merchanthub/paylink/create#the-customer-completes-the-purchase). 5. An order is created. See [Pay Link states](/docs/merchanthub/paylink/statuses) for what each state means for shipping the goods. --- # Pay Link states Source: https://dev.walleypay.com/docs/merchanthub/paylink/statuses.md A Pay Link moves through these states. Only Completed means the customer has paid and you can hand over or ship the goods. | State | Shown as | What it means | Can the goods be handed over? | | -------------------- | ------------------- | ------------------------------------------------------------------------------------------ | ----------------------------- | | `Pending` | Pending | The Pay Link is created but the customer has not opened it yet. No order exists. | No | | `CustomerIdentified` | Customer identified | The customer has opened the Pay Link and identified themselves, but has not paid. | No | | `CommittedToPayment` | Payment in progress | The customer has started to pay. Wait for the Pay Link to complete. | No | | `Completed` | Completed | The customer has paid and an order is created. | Yes | | `Expired` | Expired | The customer did not pay within the allowed time. The Pay Link can no longer be completed. | No | | `Aborted` | Aborted | The customer or a Merchant Hub user aborted the Pay Link. | No | The Pay Link list shows the open states by default. Use the status filter to include expired and aborted links. --- # Quick guide to the Merchant Hub Source: https://dev.walleypay.com/docs/merchanthub/quickguide.md A tour of the four views you will use most. The numbers in each screenshot match the list below it. ## Order search The order search view with numbered callouts for the search field, bulk actions, order table, column picker, and user menu 1. Search field with filters for date, status, store, and more. See [Searching for orders](/docs/merchanthub/search). 2. Bulk actions. Tick the checkboxes to choose which orders the action applies to. 3. Orders matching your search. 4. Column picker. Opens a side panel where you choose which columns the table shows. 5. User menu with links to **Manage Organization**, the FAQ, and log out. ## Order details The order details view with numbered callouts for the header, actions, articles, timeline, totals, customer information, email buttons, and invoice links 1. Order header with the status and details of the order as a whole. 2. Actions you can perform on the order. Which ones you see depends on the order status. 3. Order articles. 4. Timeline of everything that has happened to the order. 5. Order totals and how much of the order is not yet activated. 6. Customer information. 7. Buttons to change the email address on the order and to copy it to your clipboard. 8. Links to the order's invoices, if the order has any. ## Manage Organization The Manage Organization view with numbered callouts for the organization summary, the users and groups tabs, the invite user button, and the add group button 1. Your organization and how many users and groups it has. 2. Users or groups, depending on the selected tab. Select a row to open that user or group and change its permissions. 3. Button to invite a user to your organization. 4. Button to create a new group. ## Reports The reports view with numbered callouts for the search field, the sales summary cards, the report list, and the download buttons 1. Search field that works like the one in order search. Use it to choose the periods you want to see. 2. Summary cards with total sales per currency. Filter them by currency. 3. Reports matching your search. 4. Download icons for CSV and PDF. --- # Custom reports Source: https://dev.walleypay.com/docs/merchanthub/reports/custom-reports.md Generate a report for a period and a set of stores of your choice, then download it as CSV. ## Before you start - You need the **Report Management** permission with read access to settlements for the stores you include. - Custom reports cover transactions settled by Walley only. ## Report types | Report type | What it contains | | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Settlement Summary** | Aggregated data from every settlement in the period. Can include the settlement reference. | | **Transactions** | Every transaction in the period, including those not yet settled. Can include the settlement reference and action reference. | | **Transaction Details** | Detailed information about purchases and returns in the period. This report contains a lot of data and takes longer to generate. | | **Merged** | Every settlement transaction merged into one file. Can include the settlement reference and action reference. | | **Company Customer Credit Limits**| An overview of each company customer's credit [reservation](/docs/paymentsApi/integration/reservations) and how much of it is still available. | | **Orders** | Every order placed in the period. | ## Generate a report 1. Select **Generate report**. The **Create custom report** dialog opens. 2. Fill in the dialog: - A name for the report - The report type - The period, up to one year - Optionally, the stores to include. Leave it empty to include all stores. 3. Select **Generate report**. 4. When the status is `Done`, select **Csv** to download the report. Generating takes a few minutes. Select **Refresh reports** to update the status. A report can be `Generating`, `Done`, or `Failed`, and stays available for 90 days. Use **Show reports from the last** to choose how far back the list goes. --- # Reports overview Source: https://dev.walleypay.com/docs/merchanthub/reports/overview.md The reports page shows your settlements and a summary of your sales over any period you choose. Select Reports in the top menu to open it. ## Settlements Each settlement in the table has a CSV and a PDF download icon in the **Download** column. Select the format you want. The search field at the top filters the settlements. It works like the [order search](/docs/merchanthub/search). ## Summaries The cards below the search field show total net sales, total compensation, and total adjustments, together with the total payout in each currency. Use the **Currency** filter to show one currency at a time. ## Next steps - Generate a [custom report](/docs/merchanthub/reports/custom-reports) for a specific period and set of stores. --- # Searching for orders Source: https://dev.walleypay.com/docs/merchanthub/search.md Select Orders in the top menu to search every order your groups give you access to. Type anything you know about the order, or narrow the result with filters and field queries. ## Free text search The search field matches almost anything stored on an order, for example: - An order number or reference - An email address - A customer's name or national registration number - An address The result is ranked, so the orders the search considers most relevant come first. ## Exact search If a search returns more than you want, make it exact. Either tick the **Exact match** checkbox, or put quotes around the text: `"01234567"` matches that string and nothing else. ## Wildcards Add `*` to match part of a word. `*gmail.com` finds every order with a value that ends in gmail.com. ## Search with AI Select **Search with AI** and describe what you are looking for in plain language, in English or your own language. The search turns your description into filters and a query. AI results may be inaccurate, so check the filters it applied before you act on the result. ## Quick filters Use the dropdown filters next to the search field to filter by created date, expiry date, notification due date, store, or order status. ## Field queries When the filters are not enough, query a specific field in the search box. The syntax is `field:value`, and you can combine queries with `AND` and `OR`. | Query | Finds | | ------------------------------------ | ------------------------------------- | | `storeId:1158` | All orders for store 1158 | | `storeId:1158 AND status:Activated` | Activated orders for store 1158 | | `storeId:1158 OR storeId:9664` | Orders for either store | | `totalAmount:>2000 AND currency:SEK` | Orders in SEK with a total above 2000 | ### Searchable fields | Field | Description | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | storeId | The id of your store. | | orderNumber | The order number, or reference, of the order. | | currentPurchase.purchaseId | The purchase id of the order. | | connectedPurchases.purchaseId | The purchase id of a purchase connected to the order. | | paymentMethod | The payment method. `Invoice` `Account` `Installment` `Swish` `Card` `MobilePay` `BankTransfer` | | totalAmount | The total amount of the purchase. | | notActivatedAmount | The amount that is not yet activated. | | currency | The currency code. `SEK` `NOK` `DKK` `EUR` | | status | The order status. `NotActivated` `Activated` `PartActivated` `Returned` `Expired` `OnHold` `VerificationNeeded` `Closed`. See [order statuses](/docs/merchanthub/faq#what-are-the-different-order-statuses). | | placedAt | The date the order was placed. | | expiresAt | The date the order expires if it is not activated. | | customerDetails.name | The full name of the customer. | | customerDetails.firstName | The first name of the customer. | | customerDetails.lastName | The last name of the customer. | | customerDetails.registrationNumber | The registration number of the customer. | | customerDetails.countryCode | The country code of the customer's address. | | customerDetails.addressLine1 | The first address line of the customer's address. | | customerDetails.addressLine2 | The second address line of the customer's address. | | customerDetails.city | The city of the customer's address. | | customerDetails.postalCode | The postal code of the customer's address. | | customerDetails.email | The email address of the customer. | | customerDetails.mobilePhoneNumber | The mobile phone number of the customer. | | deliveryAddress.addressLine1 | The first address line of the delivery address. | | deliveryAddress.addressLine2 | The second address line of the delivery address. | | deliveryAddress.coAddress | The c/o line of the delivery address. | | deliveryAddress.receiverName | The receiver name of the delivery address. | | deliveryAddress.city | The city of the delivery address. | | deliveryAddress.postalCode | The postal code of the delivery address. | | deliveryAddress.countryCode | The country code of the delivery address. | | rows.articleNumber | The article number of a row on the order. | | rows.description | The description of a row on the order. | | rows.purchaseId | The purchase id that a row on the order belongs to. | ## Next steps - Open an order to [activate it](/docs/merchanthub/orders/activation), [edit its articles](/docs/merchanthub/orders/adjustments), or [make a return](/docs/merchanthub/orders/returns). - The same search works for settlements on the [reports page](/docs/merchanthub/reports/overview). --- # Setup Merchant Source: https://dev.walleypay.com/docs/onboarding/create.md This describes the request used to create or update a Merchant and add stores to that merchant ### Example ```json POST /manage/onboarding HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... { "Merchant": { "Name": "Selling Company Group", "OrganizationNumber": "9912139814", "VatRegistrationCode": "SE991213981401", "CountryCode": "SE", "ContactInformation": { "Name": "John Doe", "Address": { "AddressLine1": "Street address 11", "City": "Gothenburg", "PostalCode": "41103", "CountryCode": "SE" }, "Phone": "+46730000111", "Email": "contact@sellingcompanygroup.com", "WebsiteUrl": "https://sellingcompanygroup.com" }, "InvoiceInformation": { "Address": { "AddressLine1": "Street address", "City": "Gothenburg", "PostalCode": "41103", "CountryCode": "SE" }, "Email": "invoice@sellingcompanygroup.com" } }, "Stores": [ { "Template": "Checkout", "SalesSegment": "B2C", "CountryCode": "SE", "OrganizationNumber": "9912139814", "VatRegistrationCode": "SE9912139815", "LegalName": "Selling Company AB", "PresentationName": "sellingthings.se", "SalesCategory": "Retail", "LogoUrl": "https://cdn.walleypay.com/logo/walley-black.svg", "ContactInformation": { "Address": { "AddressLine1": "StreetAddress 12", "PostalCode": "41103", "City": "Gothenburg", "CountryCode": "SE" }, "WebsiteUrl": "https://sellingthings.se", "CustomerServicePhoneNumber": "+46123456789", "CustomerServiceEmail": "hello@sellingthings.se" } }, { "Template": "Checkout", "SalesSegment": "B2B", "CountryCode": "NO", "OrganizationNumber": "9912139815", "VatRegistrationCode": "SE9912139815", "LegalName": "Selling Company AB", "PresentationName": "sellingthings-to-retailers.no", "SalesCategory": "Retail", "LogoUrl": "https://cdn.walleypay.com/logo/walley-white.svg", "ContactInformation": { "Address": { "AddressLine1": "StreetAddress 12", "PostalCode": "1110", "City": "Oslo", "CountryCode": "NO" }, "WebsiteUrl": "https://sellingthings-to-retailers.no", "CustomerServicePhoneNumber": "+479123456789", "CustomerServiceEmail": "hello@sellingthings-to-retailers.no" } } ] } ``` ```json { "results": [ { "id": 999998, "salesSegment": "B2C", "countryCode": "SE", "status": 200 }, { "salesSegment": "B2B", "countryCode": "NO", "status": 500 } ], "data": { "merchantId": "00000000-0000-0000-0000-000000000001", "authentication": { "clientId": "00000000-0000-0000-0000-000000000002", "secretKey": "KKEuuKzybLH6WBUpHszV", "secretExpire": "2024-02-25T09:03:13.8472589+00:00" } }, "links": { "stores": { "method": "GET", "href": "/organizations/00000000-0000-0000-0000-000000000001/stores" } } } ``` :::info Idempotency Basically, given the same merchant OrganizationNumber and CountryCode code, stores provided in the request will be setup in addition to already existing stores. The information on existing stores and on the merchant will NOT be updated when you call this endpoint a second time. ::: ## Data Model ### Request ##### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | ##### Request body | Property | Required | Explanation | | ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Merchant** | Yes | The [Merchant](/docs/onboarding/models/merchant-req) is the selling company. | | **Stores** | Yes | Array of [Store](/docs/onboarding/models/merchant-req). Stores represent the selling point, e.g. B2C in SE, B2B in SE have two separate stores. One merchant can have several stores. | | **ApiSecretExpiration** | No | Used to control how long the expiration time on the secret should be, allowed values SixMonths, OneYear, TwoYears, Unlimited. Default value is TwoYears. | ### Response The response is wrapped in a [Response object containing data, links, results and metadata](/docs/onboarding/models/data-response) | Property | Explanation | | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **data.merchantId** | The MerchantId of the created or updated merchant in Walleys system | | **data.authentication.clientId** | The ClientId part of the authentication to be used by partner to act on behalf of the create or updated merchant. Used to obtain a token from the Authentication Service.
** Will only be returned for the first call for each merchant ** | | **data.authentication.secretKey** | Secret key part of the authentication to be used by partner to act on behalf of the create or updated merchant. Used to obtain a token from the Authentication Service.
** Will only be returned for the first call for each merchant ** | | **data.authentication.secretExpire** | The datetime when the secret will expire. | | **results.id** | Id of created store | | **results.salesSegment** | Sales segment of created store | | **results.countryCode** | Country code of created store | | **results.status** | Status code, similar to HttpStatusCodes.

200 OK - Store is created, everything is ok
409 Conflict - Store with this salessegment and countrycode already exists, store not created.
500 Error - Store not created due to an error
202 Accepted - Store is partially created. The store is ready for purchases, but walley needs to a manual adjustment (could be a problem with the logo provided, for example). | ### Validation | Validation | Explanation | | ----------------------- | ------------------------------------------------------------------------ | | **Required variables** | All mandatory properties must be present in the request | | **Organization number** | Organization number / Company registration number must be a valid format | --- # Get Store Source: https://dev.walleypay.com/docs/onboarding/get-store.md This describes the request used to create a Merchant and add stores to that merchant ### Get store by id ```json GET /manage/stores/{storeId} HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```json { "data": { "id": "9684", "name": "Test Company", "countryCode": "SE", "salesSegment": "B2C" }, "links": {}, "metaData": {} } ``` ## Data Model ### Request ##### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | ##### Request query parameters | Property | Required | Explanation | | ----------- | -------- | -------------------------- | | **storeId** | Yes | The id of the store to get | ### Response The response is wrapped in a [Response object containing data, links and metadata](/docs/onboarding/models/data-response) | Property | Explanation | | ---------------- | -------------------------------------- | | **id** | Store identifier | | **name** | Store name, used for human readability | | **countryCode** | Country code of the store | | **salesSegment** | SalesSegment type "B2B" or "B2C" | --- # List Stores Source: https://dev.walleypay.com/docs/onboarding/list-stores.md This describes the request used to create a Merchant and add stores to that merchant ### List stores for current organization ```json GET /manage/stores HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```json { "data": [ { "id": "9684", "name": "Test Company", "countryCode": "SE" "salesSegment": "B2C" }, { "id": "9685", "name": "Test Company", "countryCode": "SE" "salesSegment": "B2B" }, { "id": "9688", "name": "Test Company", "countryCode": "SE", "salesSegment": "B2C" } ], "links": {}, "metaData": {} } ``` ### List stores for a sub organization ```json GET /manage/organizations/{organizationId}/stores HTTP/1.1 Host: api.uat.walleydev.com // (Please note! Different hostname in production) Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```json { "data": [ { "id": "9684", "name": "Test Company", "countryCode": "SE", "salesSegment": "B2C" }, { "id": "9685", "name": "Test Company", "countryCode": "SE", "salesSegment": "B2B" }, { "id": "9688", "name": "Test Company", "countryCode": "SE", "salesSegment": "B2C" } ], "links": {}, "metaData": {} } ``` ## Data Model ### Request ##### Request headers | Header | Required | Explanation | | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | Instructions on how to generate the Bearer token value can be found [here](/docs/manage/getting-started/authentication) | ##### Request query parameters | Property | Required | Explanation | | ------------------ | ----------------- | ------------------------------------------------------ | | **organizationId** | Yes if applicable | The specific Organization identifier to get stores for | ### Response The response is wrapped in a [Response object containing data, links and metadata](/docs/onboarding/models/data-response) | Property | Explanation | | ---------------- | -------------------------------------- | | **id** | Store identifier | | **name** | Store name, used for human readability | | **countryCode** | Country code of the store | | **salesSegment** | SalesSegment type "B2B" or "B2C" | --- # Address Source: https://dev.walleypay.com/docs/onboarding/models/address-req.md ## Address ### Example ```json { "AddressLine1": "Street address", "AddressLine2": "Floor 2, building C", "City": "Gothenburg", "PostalCode": "41103", "CountryCode": "SE" } ``` #### Properties | Property | Required | | ---------------- | -------- | | **AddressLine1** | Yes | | **AddressLine2** | No | | **City** | Yes | | **PostalCode** | Yes | | **CountryCode** | Yes | --- # Response wrapper Source: https://dev.walleypay.com/docs/onboarding/models/data-response.md ## Response wrapper ### Example ```json { "data": { /* response data object */ }, "links": { /* links to resources related to this resource */ }, "metaData": { /* additional metadata like number of hits etc. */ } } ``` ### Properties | Property | Explanation | | ------------ | ------------------------------------------------------- | | **data** | This is an object containing the response object. | | **links** | Links to additional resources related to this resource. | | **metaData** | Additional metadata like number of hits etc. | --- # Merchant Source: https://dev.walleypay.com/docs/onboarding/models/merchant-req.md ## Merchant ### Example ```json { "Name": "Selling Company Group", "OrganizationNumber": "9912139814", "VatRegistrationCode": "SE991213981401", "CountryCode": "SE", "ContactInformation": { "Name": "John Doe", "Address": { "AddressLine1": "Street address 11", "City": "Gothenburg", "PostalCode": "41103", "CountryCode": "SE" }, "Phone": "+46730000111", "Email": "contact@sellingcompanygroup.com", "WebsiteUrl": "https://sellingcompanygroup.com", } "InvoiceInformation": { "Address": { "AddressLine1": "Street address", "City": "Gothenburg", "PostalCode": "41103", "CountryCode": "SE" }, "Email": "invoice@sellingcompanygroup.com" } } ``` ### Merchant Properties | Property | Required | Explanation | | ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | | **Name** | Yes | Name of the selling company. | | **OrganizationNumber** | Yes | Organization number / Company registration number of the selling company. [See validation](#organizationnumber-validation) | | **VatRegistrationCode** | Yes | VAT registration number of the selling company. [See validation](#vatregistrationcode-validation) | | **CountryCode** | Yes | CountryCode of residence. `AT`, `BE`, `BG`, `CA`, `CY`, `CZ`, `DE`, `DK`, `EE`, `ES`, `FI`, `FR`, `GB`, `GR`, `HR`, `HU`, `IE`, `IS`, `IT`, `LI`, `LT`, `LU`, `LV`, `MT`, `NL`, `NO`, `PL`, `PT`, `RO`, `SE`, `SI`, `SK`, `US` | | **ContactInformation** | Yes | Contact information. See [ContactInformation](#contactinformation-properties) | | **InvoiceInformation** | Yes | Invoice information. See [InvoiceInformation](#contactinformation-properties) | ### ContactInformation properties | Property | Required | Explanation | | -------------- | -------- | ------------------------------------------------------ | | **Name** | Yes | The name of the contact person | | **Address** | Yes | Company address. See [Address](#address) | | **Phone** | Yes | Phone of the selling company. | | **Email** | Yes | Email of the selling company. Type [Address](#address) | | **WebsiteUrl** | Yes | Website url of the selling company. | ### InvoiceInformation properties | Property | Required | Explanation | | ----------- | -------- | --------------------------------------------------------------- | | **Address** | Yes | Invoicing address. See [Address](#address) | | **Email** | No | Email of the selling companys invoice department or equivalent. | ### OrganizationNumber validation | Market | Validation method | | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SE | 10 digits where the last digit is a checksum digit that is calculated from the previous 9 digits. This is done using the Luhn algoritm. This is the same method being used for civig registration numbers in Sweden. To differ civic numbers from company registration numbers (org. number), digit 3 and 4 are always > 20. [See more details here](https://sv.wikipedia.org/wiki/Organisationsnummer) | | NO | 9 digits where the last digit is a checksum digit that is calculated by multiplying fixed weight numbers and calculating the rest using Modulo 11. [See more details on brreg.no](https://www.brreg.no/om-oss/registrene-vare/om-enhetsregisteret/organisasjonsnummeret/) | | FI | 8 digits where the last digit is a checksum digit that is calculated by multiplying fixed weight numbers and calculating the rest using Modulo 11. [See more details on finlex.fi](http://www.finlex.fi/sv/laki/ajantasa/2001/20010288) | | DK | 8 digits where the last digit is a checksum digit that is calculated by multiplying fixed weight numbers and calculating the rest using Modulo 11. |*All other markets | No validation. | ### VatRegistrationCode validation | Market | Validation method | | ------ | ------------------------------------------------------------------ | | SE | OrganizationNumber prefixed with SE and suffixed with 01 | | NO | OrganizationNumber prefixed with NO and optional suffixed with MVA | | FI | OrganizationNumber prefixed with FI | |*All other markets| Prefixed with 2 A-Z and followed by 5-12 regular characters.| --- # Store Source: https://dev.walleypay.com/docs/onboarding/models/store-req.md ## Store ### Example ```json { "Template": "Checkout", "SalesSegment": "B2C", "CountryCode": "SE", "OrganizationNumber": "9912139814", "VatRegistrationCode": "SE9912139815", "LegalName": "Selling Company AB", "PresentationName": "sellingthings.se", "SalesCategory": "Retail", "LogoUrl": "https://cdn.walleypay.com/logo/walley-black.svg", "ContactInformation": { "Address": { "AddressLine1": "StreetAddress 12", "PostalCode": "41103", "City": "Gothenburg", "CountryCode": "SE" }, "WebsiteUrl": "https://sellingthings.se", "CustomerServicePhoneNumber": "+46123456789", "CustomerServiceEmail": "hello@sellingthings.se" } } ``` #### Store Properties | Property | Required | Explanation | | ----------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Template** | Yes | The use of different templates are used to setup different type of integrations like Checkout or a custom PaymentsAPI integration. Currently available templates are `Checkout` and `Checkout_AutoActivate` which is used for digital products and is only available for B2C | | **SalesSegment** | Yes | Categorizes the type of store. `B2C`,`B2B` | | **CountryCode** | Yes | CountryCode of residence. `SE`,`NO`,`FI`,`DK`,`DE`,`NL`,`AT` | | **OrganizationNumber** | No | The organization number or company registration number of the store. Will use OrganizationNumber from [Merchant](./merchant-req) if not set | | **VatRegistrationCode** | No | The VAT registration code of the store. Will use VATRegistrationCode from [Merchant](./merchant-req) if not set. | | **LegalName** | Yes | The legal name of the store. | | **PresentationName** | Yes | The presentation name appears on communication with end customers, i.e. invoices, emails etc. | | **SalesCategory** | Yes | Categorizes the type of store. Preferably a MCC-code (ex `5732` for `Electronic Sales`) | | **LogoUrl** | No | Logo to be used in communication with the end customer like invoice header and Pay Link. Valid extensions are .svg and .png. | | **ContactInformation** | Yes | The contact information of the store. Details here appears to end customers for example contact details to customer service appears on invoices. See [ContactInformation](#contactinformation-properties). Will use merchant contact information, if not set. | #### ContactInformation Properties | Property | Required | Explanation | | ------------------------------ | -------- | ----------------------------------------------------- | | **Address** | No | Store address. See [Address](#address) | | **WebsiteUrl** | No | Website to the store. Must use HTTPS scheme | | **CustomerServicePhoneNumber** | No | Phone number to the customer service / contact center | | **CustomerServiceEmail** | No | Email to the customer service / contact center | --- # Overview Source: https://dev.walleypay.com/docs/onboarding/overview.md The Onboarding API is only to be used by partners to Walley that conduct their own AML/KYC process and agreements with merchants. These self-onboarded merchants are referenced as sub-merchants. A separate agreement between the partner and Walley will need to be in place before access is allowed to this API. ## Process Overview ### Setup merchant The partner initiates the setup of a merchant by performing a request against the Onboarding API with the details needed. Walley will automatically setup all the things needed to be able to start receiving payments from end customers. One Merchant can have several sub-stores that is used to distinguish selling market and type of store like B2B and B2C. --- # Auditing Headers Source: https://dev.walleypay.com/docs/paymentsApi/getting-started/auditing-headers.md

To provide more detailed auditing in our products it is possible to use optional HTTP headers to provide information about the origination of the request made towards the API.

Since the auditing information could be displayed to users of the Walley products, we recommend only posting human readable, nonsensitive information in these headers. ### Performed By To provide information identifying the user or person that performed the action resulting in the request towards the API, use the Walley-Performed-By HTTP header. The value posted could be any information identifying the user, e.g. a name, a username or an email. ```xml Walley-Performed-By: firstname.lastname@walley.se ``` ### Originated From To provide information about the origin of the request towards the API, use the Walley-Originated-From HTTP header. The value posted could be any information identifying the origin of the request, e.g. the name of the system integrating with the API, an end user system, a company or store name. ```xml Walley-Originated-From: Walley Checkout ``` :::info Please note Please note that using the Walley-Originated-From header without the Walley-Performed-By header can result in the SOAP username being displayed in some products. To avoid this, post an empty value in the Walley-Performed-By header instead. ::: --- # Web Service Authorization Source: https://dev.walleypay.com/docs/paymentsApi/getting-started/authorization.md

In order for the SOAP envelope to work according to the specification, it needs to be authorized using a username and a password. In addition to these two parameters, the AddInvoice request and the SetReservation request also needs the ClientIpAddress parameter to work properly. The ClientIpAddress should be the IP address of the customer performing the purchase at the partner's web shop.

You will receive a username and a password from your Partner Integration Manager at Walley after the agreement has been signed. You will receive different credentials for the test and production environment.

### Date and time formats All date and time data sent to Walley must follow the ISO 8601 standard. E.g. 2010-06-16 15:27:00. ### Text encoding The eCommerce services use UTF-8 as default encoding for all messages. ### Request parsing The API:s parse the request parameter values by node position and element name. Use the format specified by the WSDL to make sure all values are parsed correctly. ### Country code Country code follow the ISO 3166-1 alpha-2 standard, e.g. SE ### Currency code Currency code follow the ISO 4217 standard, e.g. SEK, NOK, EUR --- # Idempotent Requests Source: https://dev.walleypay.com/docs/paymentsApi/getting-started/idempotent-requests.md

The API supports idempotency for safely retrying requests that only should be performed once. This could be useful if responses are not received due to network connectivity problems. For example, if a response for a request to add an invoice is not received, you can retry the request with the same idempotency key again and be guaranteed that no more than one invoice is added.

We recommend that idempotency key is used in all write operations that might be retried. When retrying a read operation there is no harm in reading the latest data, and therefore we do not recommend using idempotency keys in read operations. ### Idempotency key To perform an idempotent request, add a HTTP header called "Walley-Idempotency-Key" with an unique identifier for the request. Subsequent requests with the same idempotency key will return the same result, including errors. As an example, add the following HTTP header to the request: ```xml Walley-Idempotency-Key: AD9ACA8B-AD55-45F9-870D-4DA896EAEE35 ``` An idempotency key is a unique value generated by the client which the server uses to recognize subsequent retries of the same request. We recommend that the key is a GUID. Keys are cached for 24 hours and new requests after that with the same key will be handled as new requests. ### Idempotency-specific errors When a subsequent request is received before the original request has been processed, the second request will result in an error with error code "IDEMPOTENCY_REQUEST_IN_PROGRESS", it is safe to retry with the same key at a later time. Responses are cached for 1 hour, after that a request with the same idempotency key will return an error "IDEMPOTENCY_RESPONSE_EXPIRED". If this happens make sure that the subsequent requests are sent within an hour. Results are only cached if the API has started processing the request. Errors while sending the request or authentication errors will not be cached, but validation errors will. If the same idempotency key is used for different type of requests then an error with error code "IDEMPOTENCY_MISS_MATCHING_REQUEST_TYPE" will be returned. If this happens, check the generation of keys to make sure that a unique key is generated and that the key is not reused for different requests. --- # General Information Source: https://dev.walleypay.com/docs/paymentsApi/getting-started/index.md The web services are implemented using Microsoft WCF and uses basic http binding for full interoperability. All communication with Walley services is encrypted using https. The Payment service is published through a web services description language (WSDL) file. The order of the parameters are of importance. Please note the order presented in each request. The parameter CountryCode must always be supplied, StoreId is optional as long as only one shop per country is used. Partners with multiple shops in the same country are required to submit the StoreId in each request. In all requests you can also send in a CorrelationId, which could be used to verify that the response is from the "correct" request. --- # Production and Test urls Source: https://dev.walleypay.com/docs/paymentsApi/getting-started/urls.md ### Production environment API URL's #### PaymentService The main API used for invoice handling (purchases, activations, returns etc.)\* https://ecommerce.collector.se/v3.0/PaymentServicev10.svc?wsdl #### InformationService API used for account & transaction information on existing invoices and customers https://eCommerce.collector.se/v3.0/informationservicev2.svc?wsdl \*For older versions of the API, please contact help@walley.se for assistance. ### Test environment API URL's #### PaymentService The main API used for invoice handling (purchases, activations, returns etc.)\* https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl #### InformationService API used for account & transaction information on existing invoices and customers https://eCommerceTest.collector.se/v3.0/informationservicev2.svc?wsdl \*For older versions of the API, please contact help@walley.se for assistance. ### Merchant Hub URL's Production environment: https://merchanthub.walleypay.com
Test environment: https://merchanthub.aks.uat.walleydev.com For access to the hub, please contact Merchant Services. ### References For further information regarding techniques etc. see references below. | Reference | Link | | :---------------------------- | :---------------------------------------------- | | W3Schools SOAP-Tutorial | http://www.w3schools.com/xml/xml_soap.asp | | ISO 3166 code | https://www.iso.org/iso-3166-country-codes.html | | ISO 8601 date and time format | http://www.iso.org/iso/date_and_time_format | --- # PaymentService Source: https://dev.walleypay.com/docs/paymentsApi/integration/commoninformation.md General for almost all requests is that an invoice number (InvoiceNumber) is needed to handle the request. The invoice number is generated by Walley in the AddInvoice method and returned in the response. This invoice number needs to be stored (together with your order) for further request of that invoice, for example when handling returns. ## Address | Parameter | Required | Type | Max | Description | | :---------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------- | | Firstname | | string | 50 | | | Lastname | | string | 50 | | | CompanyName | | string | 200 | | | Address1 | x* | string | 50 | *Required in all countries but Norway | | Address2 | | string | 50 | | | COAddress | | string | 50 | | | PostalCode | | string | 50 | | | City | | string | 50 | | | CountryCode | | string | 2 | | | Email | | string | 260 | The customer's email address. | | PhoneNumber | | string | 20 | The customer's phone number. Should always contain country code (eg. +46 xxx xxx xxx). | | MobilePhone | | string | 20 | The customer's mobile phone number. Should always contain country code (eg. +46 xxx xxx xxx). | ## InvoiceAddress Which parameters are required depends on several factors. For instance in case: - *The partner is configured to handle private person customers. - **The partner is configured to only handle company customers. - ***There are country specific rules. - ****The invoice is prepaid and validation is ignored. | Parameter | Required | Type | Max | Description | | :---------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Firstname | x* -** | string | 50 | *Required for private persons. **Forbidden for companies. | | Lastname | x* -** | string | 50 | *Required for private persons. **Forbidden for companies. | | CompanyName | -* x** | string | 200 | *Forbidden for private persons. **Required for companies. | | Address1 | x* x*** | string | 50 | *Required for private persons. ***Required in all countries but Norway. | | Address2 | | string | 50 | | | COAddress | | string | 50 | | | PostalCode | x | string | 50 | | | City | x | string | 50 | | | CountryCode | | string | 2 | | | Email | x**** | string | 260 | The customer's email address. ****Either email or mobile phone number is required, unless validation ignored. | | PhoneNumber | | string | 20 | The customer's phone number. Should always contain country code (eg. +46 xxx xxx xxx). | | MobilePhone | x**** | string | 20 | The customer's mobile phone number. Should always contain country code (eg. +46 xxx xxx xxx). ****Either email or phone number is required, unless validation ignored. | ## InvoiceRow | Parameter | Required | Type | Max | Description | | :---------- | :------- | :------ | :-- | :------------------------------------------------------ | | ArticleId | x | string | 50 | The ArticleId of the product. | | Description | x | string | 50 | The description of the product. | | Quantity | x | int | 8 | The quantity of the product. 1-99999999 (0 not allowed) | | UnitPrice | x | decimal | 6,2 | Price per unit incl. VAT. | | VAT | x | decimal | 6,2 | VAT in per cent | ## ArticleList | Parameter | Required | Type | Max | Description | | :---------- | :------- | :------ | :-- | :----------------------------- | | ArticleId | x | string | 50 | The ArticleId of the product | | Description | | string | 50 | The Description of the product | | Quantity | x | string | 8 | The quantity of the product | | UnitPrice | x | decimal | 6,2 | Price per unit incl. VAT. | ## IntegrationIds | Parameter | Required | Type | Max | Description | | :------------------------ | :------- | :----- | :-- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | IntegrationId | x | string | 50 | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). | | IntegrationId Description | x | string | 50 | A friendly description of the IntegrationId given. Shown on the invoice as the “buyer” instead of the IntegrationId value. Must be used in combination with IntegrationId. No separators should be used, for example: - , . | ## AuthorizedSignatory Can only be used for company | Parameter | Required | Type | Max | Description | | :------------------- | :------- | :------ | :-- | :-------------------------------------------------------------------------------------------------------------------------------------------------- | | Email | | string | 260 | Email to AuthorizedSignatory | | RegistrationNumber | | string | 12 | Reg. no for authorized signatory. If CompanyPersonalGuarantee is enabled, the reg. no in this parameter will be used as personal guarantee reg. no. | | UsePersonalGuarantee | | boolean | | Bool to inform if personal guarantee is accepted by end customer. | ## Buyer | Parameter | Required | Type | Max | Description | | :----------------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------ | | Firstname | | string | 50 | | | Lastname | | string | 50 | | | Email | | string | 256 | The customer's email address | | PhoneNumber | | string | 20 | The customer's phone number. Should always contain country code (eg. +46 xxx xxx xxx). | | MobilePhone | | string | 20 | The customer's mobile phone number. Should always contain country code (eg. +46 xxx xxx xxx). | | RegistrationNumber | | string | 20 | The civic RegistrationNumber of the buyer | --- # Add Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/creating-purchases/addinvoice.md The AddInvoice requests performs a credit check of the customer, and if approved, adds the invoice. Otherwise an error message is returned. Unless using the GetAddress/GetCompanyInformation method (only available in Sweden), this is the first step in creating an invoice. This method will return the Invoice number (InvoiceNumber) which should be stored and used when handling the order/invoice later (e.g. [CreditInvoice](/docs/paymentsApi/integration/purchase-administration/creditinvoice), [PartCreditInvoice](/docs/paymentsApi/integration/purchase-administration/partcreditinvoice), [AdjustInvoice](/docs/paymentsApi/integration/purchase-administration/adjustinvoice), [CancelInvoice](/docs/paymentsApi/integration/purchase-administration/cancelinvoice) etc). The created invoice then needs to be activated through the [ActivateInvoice](/docs/paymentsApi/integration/purchase-administration/activateinvoice) or [PartActivateInvoice](/docs/paymentsApi/integration/purchase-administration/partactivateinvoice) (The invoice can also be auto activated directly in the AddInvoice request, if the package is sent directly when ordered). The functionality Campaign Products, included in the AddInvoice request, allows you to customize and set up campaigns for your customers with special conditions of sale, e.g. campaigns with longer payment time, different invoice fees or specific transaction costs. To use this functionality, an agreement with Walley must be made. This method is available in the following countries: ### Request Parameters :::warning IMPORTANT Please note that the order of the parameters is of importance. The list below displays the expected order. ::: | Field | Occurs | nullable | Max | Type | Description | | ------------------------------------ | ------ | -------- | ---- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | ActivationOption | 1 | false | - | int | Different options for affecting a purchase.
Following values can be used (default value is 0):
0 = Purchase will be preliminary and must be
activated, by using the ActivateInvoice or through
the Walley Merchant Hub.
1 = Auto activation, will automatically active the
invoice so it can be sent out directly.
This can only be used when the order can be
delivered directly.
2 = Pre-Paid invoice. The purchase will be activated
first when an invoice is paid. Not used at the moment. | | AdditionalInformation | 1 | true | - | [AdditionalInformation[]](#additionalinformation) | Used depending on agreement with Walley. | | AuthorizedSignatory | 1 | False | - | [AuthorizedSignatory[]](../commoninformation.mdx#authorizedsignatory) | In case of a B2B purchase using part payment
Authorized (InvoiceType=5). This segment is used to send out a
Signatory digital signing task to the authorized signatory.
Nillable in case of B2C purchase. | | Buyer | 1 | true | - | [Buyer[]](../commoninformation.mdx#buyer) | This field is used for company purchases where the
details of the person making the purchase should be
sent in | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CostCenter | 1 | true | 50 | string | For companies that needs to specify a cost center. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for country. Needs to match country code of invoice address. | | Currency | 1 | false | 3 | string | Currency used during the purchase. Must be the same currency where the customer is registered, and the e-store owner is located. Currency code is a three-letter combination based on ISO 4217, for example: SEK, DKK, EUR. | | CustomerNumber | 1 | true | 20 | string | If the e-store wants to search for a customer by their
own customer id, this field can be used to specify
that number. Also shown on invoice. | | CustomerProxyIdentifier | 1 | true | 50 | string | The civic registration number of the proxy person. | | DeliveryAddress | 1 | true | - | [Address[]](../commoninformation.mdx#address) | The address where the product should be delivered
to. For private persons this must be the address
where the person is registered. | | ElectronicInvoiceDeliveryInformation | 1 | true | 1000 | string | Used for passing information about electronic invoice information.
Currently used for Finvoice in Finland.
Used in combination with InvoiceDeliveryMethod 8
Format:
IntermediatorAddress ; ReceiverAddress | | ForceApproveCreditCheck | 1 | true | - | bool | Validation of address information can be ignored if the purchase is prepaid | | IgnoreAddressValidationForPrepaid | 1 | true | - | bool | Used to ignore address validation on purchases made using prepaid payment methods. | | IntegrationId | 1 | true | 128 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). | | InvoiceAddress | 1 | true | - | [InvoiceAddress[]](../commoninformation.mdx#invoiceaddress) | The invoice address where the invoice should be
sent to. For private persons this must be the address
where the person is registered. | | InvoiceDeliveryMethod | 1 | false | - | int | The way to send the invoice. By default this is set by
Walley, but can be negotiated with Walley. If a
current invoice exists, the latest information will be
used next time the invoice is sent.
The Value can be:
1 = By post or in package based on invoice type.
2 = E-mail.
3 = Both by post and e-mail
8 = Electronic invoice delivery
16 = Suppress delivery of invoice
32 = Force mail (only used in combination with InvoiceType 0 and if agreed with Walley) | | InvoiceRows | 1 | false | - | [InvoiceRow[]](#invoicerow) | The articles that should be listed on the invoice and
contains the quantity and price of the article. | | InvoiceType | 1 | false | - | int | Specify the type of invoice to use.
The values (default value is 0) are:
0 = Invoice will be in the package and/or directly
sent with e-mail if InvoiceDeliveryMethod is set to e-
mail, Walley will not send this invoice to the
customer, you will send it as part of the package.
1 = Monthly invoice. Walley will send this invoice.
3 = Aggregated invoice. Walley will send the
invoice. All invoices incoming during the same
month with this flag will be aggregated to one
invoice.
4 = Interest free invoice. Walley will send the
invoice.
5 = Annuity invoice. Walley will send this invoice. | | OrderDate | 1 | false | - | datetime | The date that the costumer placed the order. | | OrderNumber | 1 | true | 20 | string | The order's identification can be used to search for a
specific order in the Walley Merchant Hub. | | PaymentInfo | 1 | true | - | [PaymentInfo](#paymentinfo) | Bank or invoice Information for payout. Cannot be used in combination with SettlementReference. | | ProductCode | 1 | true | 16 | string | The campaign product code. The product code is
determined by Walley. To use campaign products
an agreement with Walley must be made. | | PurchaseClassification | 1 | true | 50 | string | This field is used for an alternative credit evaluation. Contact Walley for more details. | | PurchaseType | 1 | true | - | int | The type of the purchase, to specify where the
purchase originates from. The value can be:
0 = E-Commerce
1 = InStore
2 = InvoicePayment
3 = P2P
4 = Telesales
5 = CreditCard
6 = DebitCard
7 = Cash | | Reference | 1 | true | 50 | string | The Reference that should be as a reference on an
invoice. Will only be used for companies. | | RegNo | 1 | true | 20 | string | The registration number of the customer. Either civic registration number or organization number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | RequireStrongCustomerVerification | 1 | true | - | bool | **This parameter is deprecated.**
Determines if the customer should be required to
authenticate themselves using some type of strong verification method. | | RequireUnknownRegistrationNumber | 1 | true | - | bool | Used to enable anonymous purchases, without known registration number. | | SalesPerson | 1 | true | 50 | string | Information about the sales person | | SettlementReference | 1 | true | 350 | string | Settlement reference added to the payment. Cannot be used in combination with PaymentInfo. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | | StoreReference | 1 | true | 50 | string | This field can be used for specifying a store reference | #### InvoiceRow | Parameter | Required | Type | Max | Description | | :----------- | :------- | :------ | :-- | :----------------------------------------------------------------- | | ArticleId | x | string | 50 | The ArticleId of the product. | | Description | x | string | 50 | The description of the product. | | Quantity | x | int | 8 | The quantity of the product. 1-99999999 (0 not allowed) | | QuantityUnit | - | string | 50 | The quantity unit of the product, e.g. pcs, meter, number, kg etc. | | UnitPrice | x | decimal | 6,2 | Price per unit incl. VAT. | | VAT | x | decimal | 6,2 | VAT in per cent | #### PaymentInfo | Parameter | Required | Type | Max | Description | | :---------------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------------------ | | ReceiverName | - | string | 64 | Name of the company | | ReceiverRegNumber | - | string | 64 | The organization number of receiving company | | PaymentReference | - | string | 350 | Reference added to the payment. OCR number must be no longer than 20 characters | | BankAccount | - | string | 50 | Bank account number. For bank account types with multiple parts "|" (pipe) is used as a delimiter. | | BankAccountType | - | int | | See below | #### AdditionalInformation | Parameter | Required | Type | Max | Description | | :---------------------------------------------------------------------------------------------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Key: PeppolId
Value: \ | - | string | 50 | The peppol id including prefix and address, separated by comma (:).
Used in combination with InvoiceDeliveryMethod 8.
Currently used in SE, NO and FI.
Example SE: 0007:2120000787 | | Key: BusinessToken
Value: \ | - | string | 50 | The token returned from the B2B identification API after purchase rights have been validated.
Only used after agreement with Walley. | | Key: ProxyEvaluation
Value: \ | - | string | 50 | Set to "Disabled" in order to override and ignore the proxy evaluation functionality. | #### BankAccountType - 0 - Bic Iban (DEUTDEFF DE99203205004989123456) - 1 - Iban (DE99203205004989123456) - 2 - Plusgiro, with OCR - 3 - Plusgiro, with message - 4 - Bankgiro, with OCR - 5 - Bankgiro, with message ### Response Parameters | Field | Occurs | nullable | Max | Type | Description | | -------------------------- | ------ | -------- | --- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | PaymentReference | 1 | true | 50 | string | The payment identification number. This is the id the
customer must use when they do a payment of an
invoice. Only returned if the invoice is auto activated. | | AvailableReservationAmount | 1 | true | 6,2 | decimal | The current available reservation amount. If no credit reservation is done, 0 will be returned. | | LowestAmountToPay | 1 | true | 6,2 | decimal | The lowest amount to pay on the invoice. Only returned
if the invoice is auto activated. | | TotalAmount | 1 | true | 6,2 | decimal | The total amount to pay for the invoice. Only returned if
the invoice is auto activated. | | InvoiceNumber | 1 | false | - | string | The invoice number of the invoice. | | InvoiceStatus | 1 | false | - | string | The status of the purchase. Values:
0 = On hold - Walley haven't approved the invoice
yet.
1 = Approved - The invoice is approved by Walley and
can be activated through the Activate invoice or
PartActivate invoice method or from the Walley
Merchant Hub.
2 = Activated - The product(s) is delivered and Walley
will buy the invoice. | | DueDate | 1 | true | - | datetime | The due date of the invoice. Only returned if the invoice
is auto activated. | | InvoiceUrl | 1 | true | - | string | If the invoice is auto activated and the invoice type is

direct invoice, the InvoiceUrl contains a url to theinvoice in a pdf file format. | ### Response Headers #### Walley-Decision-Category :::info This header is only applicable to Norwegian (`CountryCode: "NO"`) purchases. It will not be returned for any other market. ::: When a Norwegian purchase is completed, the HTTP response includes a `Walley-Decision-Category` header containing the credit decision outcome. | Header | Value | Description | | -------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Walley-Decision-Category` | `Green` | Purchase approved without conditions. No additional message needs to be shown to the customer. | | `Walley-Decision-Category` | `Yellow` | Purchase approved on conditions. You **must** display the required Norwegian copy shown [below](#addinvoice-required-confirmation-copy-yellow) to the customer on your order confirmation page. | Treat unknown values as `Green` so future categories do not break your integration. #### Required confirmation copy (Yellow) {#addinvoice-required-confirmation-copy-yellow} When `Walley-Decision-Category` is `Yellow`, the following Norwegian copy must be displayed to the customer on your order confirmation page: | Walley-Decision-Category | Copy (NO) | | ------------------------ | ---------------------- | | **Yellow** | **Kjøpet ditt ble godkjent med vilkår**
Kreditten din er innvilget. Basert på vår vurdering av din samlede økonomi vurderer vi denne kreditten som moderat risiko for deg. Ved en vesentlig renteøkning kan du måtte gjøre tilpasninger i økonomien. | ### Example Requests |   | Value | | ------------ | ---------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | AddInvoice | | Description: | The operation returns invoice information upon creation of an invoice. | | Notes: | N/A | #### Example for B2C ```xml USERNAME PASSWORD 127.0.0.1 0 AddInvoiceV10_B2C SE SEK Teststreet 1 C/O Address Test CIty SE nohmtest@walley.se FirstName LastName +461234567890 12345 Teststreet 1 C/O Address Test CIty SE nohmtest@walley.se FirstName LastName +461234567890 12345 1 ArticleId 1 Description 1 1 pcs 100 25 ArticleId 2 Description 2 2 meter 200 12 Article 1 Description 1 150 pcs 150 25 0 2020-02-01 O123456789 195109212224 1234 ``` ```xml // The response when the invoice is auto activated (ActivationOption 1). 0 AddInvoiceV10_B2C 2020-02-20T23:59:59 4576392 2 https://invoice-test.collectorbank.com/invoice?id=nsUNxLurjZDQ9ZsoGy8tp3my0dVdXBeE7v3LUHsgBwZ_uIy4RBzpNJoEB1aDE3fzFczjJt2SD3_8B69EvbiYqyseOYLbMFIJCe2T2Ru1vhKt_g8-yX-Kb1KqTkw4PjnO&language=sv-SE 50 100010078612551 100 ``` #### Example for B2B with Authorized Signatory and Buyer Information ```xml USERNAME PASSWORD 127.0.0.1 0 test@walley.se 4502198429 true test@walley.se Testare Testsson +460123456789 194901022188 8858 SE SEK Testcity Skuldman o Son, TEST AB SE test@walley.se 12345 Testcity Skuldman o Son, TEST AB SE test@walley.se 12345 1 10547 Linne 12 500 25 57389 Ring 3 250 6 5 2020-08-06 6005075764 1 Your Reference 5561234567 5050 9666 ``` ```xml // The response when the invoice is not activated (ActivationOption 0) 0 AddInvoiceV10_B2B 68308472 6 ``` ### Error Codes | Fault Code | Description | | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Walley for more help. | | VALIDATION_COUNTRY_CODE_REQUIRED | The CountryCode field was not present in the request. | | VALIDATION_ARTICLE_ID_REQUIRED | An article is missing its ArticleId. | | VALIDATION_QUANTITY_RANGE | The Quantity field was not within its allowed range. | | VALIDATION_SETTLEMENT_REFERENCE_LENGTH | The Settlement Reference field was not within its allowed range. | | INVALID_REGISTRATION_NUMBER | When the reg.no is not in a correct format. | | INTEGRATION_ID_AND_REGISTRATION_NUMBER_MUST_BE_EMPTY | Neither IntegrationId nor RegNo was set in the request. | | INVOICE_EXCEEDS_AVAILABLE_RESERVATION | The purchase sum of the invoice exceeds the available reservation amount. | | EMAIL_IS_MISSING | Include customer's email address in the request | | NOT_ALLOWED_TO_SEND_NOTIFICATION_BY_MAIL | The agreement with Walley does not allow invoices by regular post | | NOT_ALLOWED_TO_IGNORE_CREDIT_CHECK_WITH_UNKNOWN_REGISTRATION_NUMBER | The agreement with Walley does not allow to ignore credit check with unknown registration number | | PEPPOL_ID_INVALID | When the peppol id is not in correct format | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # Get Address Source: https://dev.walleypay.com/docs/paymentsApi/integration/creating-purchases/getaddress.md The GetAddress requests returns address information of a private customer based on the their national registration number. To use this functionality, an agreement with Walley must be made. When this service is used the following needs to be applied: - The service can only be used in the checkout and Walley needs to be the pre-chosen payment option. - If the payment type is changed from Walley this service should be hidden/disabled. - The button that submits the request cannot be named “Hämta adress” (“Get Address”) instead “Fortsätt” (“Proceed”) or equal should be used. This method is available in the following countries: ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | --------------- | ---------- | -------- | --- | ------ | --------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. Only “SE” allowed. | | RegNo | 1 | false | 12 | string | The customer civic registration number. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | --------------------- | --------------------------------------------------- | | BaseAddress | 1 | false | 50 | [Address[]](#address) | A list of addresses where the person is registered. | | CorrelationId | 1 | false | 50 | string | CorrelationID from the request if any. | | Firstname | 1 | false | 50 | string | First name of the customer. | | Lastname | 1 | false | 50 | string | Last name of the customer. | | RegNo | 1 | false | 12 | string | The customer civic registration number. | ### Address | Field | Req | Type | Description | | :---------- | :-- | :----- | :---------- | | Firstname | | string | | | Lastname | | string | | | Address1 | | string | | | Address2 | | string | | | COAddress | | string | | | PostalCode | | string | | | City | | string | | | CountryCode | | string | | ### Example Requests |   | Value | | ------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetAddress | | Description: | The operation returns address information of a customer based on a civic registration number. | | Notes: | Only available in Sweden for consumers. The service can only be used in the checkout and Walley needs to be the pre chosen payment option. If the payment type is changed this service should be hidden/disabled. The button that submits the request cannot be named “Hämta adress” / "Get address", instead “Fortsätt” / "Continue" or equal should be used. | ```xml USERNAME PASSWORD 127.0.0.1 GetAddressV10 SE 200001012384 1234 ``` ```xml Teststreet 1 c/o Testcity GetAddressV10 SE Test Sverige 12345 0001015536 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Get Company Information Source: https://dev.walleypay.com/docs/paymentsApi/integration/creating-purchases/getcompanyinformation.md The GetCompanyInformation request returns address information of a Company based on the their organizational registration number. To use this functionality, an agreement with Walley must be made. This method is available in the following countries: ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :-------------- | :--------- | :------- | :-- | :----- | :-------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. Only “SE” allowed. | | RegNo | 1 | false | 12 | string | The organizational registration number. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :----------------- | :--------- | :------- | :-- | :------------------------------------------ | :---------------------------------------------------------------------------- | | CompanyInformation | 1 | false | - | [CompanyInformation[]](#companyinformation) | Company Information, can occur one or multiple times depending on the company | | DunsNumber | 1 | false | 50 | string | DunsNumber | | Name | 1 | false | 50 | string | Company Legal Name | | PostalAddress | 1 | false | 50 | [Address[]](#address) | Postal Address of company branch | | RegistrationNumber | 1 | false | 50 | string | First name of the customer. | | VisitingAddress | 1 | false | 50 | [Address[]](#address) | Visiting address details. | | CorrelationId | 1 | false | 12 | string | CorrelationID from the request if any. | ### CompanyInformation | Field | Req | Type | Description | | :----------------- | :-- | :--------------------- | :---------------------------------------- | | DunsNumber | | string | DunsNumber | | Name | | string | Company Legal Name | | PostalAddress | | [Address[]](#address) | Postal Address of company branch | | RegistrationNumber | | string | First name of the customer. | | Type | | string | The address type (HeadOffice, Branch etc) | | VisitingAddress | | [Address[]](#address) | Visiting address details. | ### Address | Field | Req | Type | Description | | :--------- | :-- | :----- | :---------- | | Address | | string | | | City | | string | | | Country | | string | | | PostalCode | | string | | ### Example Requests |   | Value | | :----------- | :------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetCompanyInformation | | Description: | The operation returns a list of Addresses for the requested customer | | Notes: | N/A | ```xml USERNAME PASSWORD 127.0.0.1 123 SE 556597-0513 1234 ``` ```xml 777307328 Walley
Birger Jarlsgatan 12
Stockholm Sverige 114 34
5565970513 Branch
Birger Jarlsgatan 12
Stockholm Sverige 114 34
632405218 Walley
Box 11914
Göteborg Sverige 404 39
5565970513 HeadOffice
Lilla Bommens Torg 11
Göteborg Sverige 411 04
123
``` ## Error codes | Fault Code | Description | | :--------- | :---------- | --- # Get Products Source: https://dev.walleypay.com/docs/paymentsApi/integration/creating-purchases/getproducts.md This functionality returns a list of Products that currently can be used for the Partner. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :------ | :-------------------------------------------------------------------- | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for country. | | Amount | 1 | true | 6,2 | decimal | Total amount of purchase. Used to receive PurchasePreview information | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :--------------------- | :---------------------------------------------------------------------- | | CorrelationID | 1 | true | 50 | string | CorrelationID from the request if any. | | Products | 1 | true | 50 | [Product[]](#product) | List of Products that currently can be used for the Partner. See below. | ### Product | Parameter | Required | Type | Max | Description | | :----------------- | :------- | :------------------------------------ | :-- | :-------------------------------------------------------------------------------- | | InvoiceType | | int | | Invoice type that the product is valid for | | ProductCode | | string | | Product Code to use when using AddInvoice | | ProductDescription | | string | | Description of the Product | | PurchasePreview | | [PurchasePreview[]](#purchasepreview) | | Detailed information about the terms of the Product. See “PurchasePreview” below. | ### PurchasePreview | Parameter | Required | Type | Max | Description | | :--------------------------------- | :------- | :------- | :-- | :------------------------------------------------------------------------------ | | InitialNotificationFee | | decimal | 6,2 | The notification fee | | SecondaryNotificationFee | | decimal | 6,2 | The notification fee on account invoices. | | OriginationFee | | decimal | 6,2 | The origination fee, used on Interest Free and Annuity accounts. | | CampaignFee | | decimal | 6,2 | The campaign fee | | DueDate | | datetime | - | The due date of the invoice. | | CreditTime | | int | | TShows set months for part payment. Only used if InvoiceType = PartPayment (2). | | YearlyInterestRate | | decimal | 6,2 | Shows the yearly interest rate. | | LowestAmountToPay | | decimal | 6,2 | Shows the invoice's lowest amount to pay/month. | | MonthlyAmount | | decimal | 6,2 | Shows the monthly amount to pay. Used on Annuity account (InvoiceType=5) | | IsAllowedToSendNotificationByEmail | | decimal | 6,2 | Shows if the invoice is allowed to be sent by email. | | IsAllowedToSendNotificationByMail | | decimal | 6,2 | Shows if the invoice is allowed to be sent by regular mail. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetProducts | | Description: | The operation fetchs all products for the specified merchant | | Notes: | N/A | ```xml USERNAME PASSWORD 100 GetProductsV10 SE 1234 ``` ```xml GetProcuctsV10 0 DI_60_001 Walley Faktura 60 dagar 0 1 2020-06-19T23:59:59 40.00 true true 140.00 0 1 I_1_001 Konto (Faktura nästa månad via post) 0 1 29.00 true true 129.00 0 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Add Customer Proxy Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/addcustomerproxy.md This functionality is used for adding a proxy for a specified customer. It is aimed to be used for a customer who has a legal guardian and who is not allowed to make purchases of his/her own. The proxy will only be allowed to make purchases for that specified customer and store provided in the request. The proxy is then later used when making an AddInvoice request. Note that to use this functionality, an agreement with Walley must be made. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------------------- | :--------- | :------- | :-- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 4 | string | The country code (ISO 3166-1 alpha-2) for the country. | | CustomerRegistrationNumber | 1 | true | 50 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). Civic reg. numbers can be used for this but are not mandatory - as long as the value entered is unique. No separators should be used, for example: - , . Only nillable if RegNo is set (usage of RegNo is standard) | | ProxyExpiration | 1 | true | 50 | string | A friendly description of the IntegrationId given. Shown on the invoice as the “buyer” instead of the IntegrationId value if used. Must be used in combination with IntegrationId. No separators should be used, for example: - , . | | ProxyFriendlyName | 1 | false | 20 | string | The customer's registration number. | | ProxyRegistrationNumber | 1 | false | 20 | string | The customer's registration number. | | StoreId | 1 | true | 4 | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | :----------- | :---------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | AddCustomerProxy | | Description: | The operation adds proxy details to the specified customer and merchant | | Notes: | N/A | ```xml USERNAME PASSWORD SE 195001182046 2020-12-30T12:46:00.000+01:00 20000229-0393 1234 ``` ```xml dcda57a3-fd45-47e7-9565-bf4c907e4977 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Create Account Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/createaccount.md This operation creates a “blank” credit account. Mainly used for generating payment reference numbers. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for country. | | IntegrationId | 1 | true | 128 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). | | RegNo | 1 | true | 20 | string | The registration number of the customer. Either civic registration number or organization number. Only nillable if an IntegrationId is set andhas been assigned to the RegNo beforehand. | | StoreId | 1 | true | 4 | short | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :--------------- | :--------- | :------- | :-- | :----- | :----------------------------------------------------- | | CorrelationID | 1 | true | 50 | string | CorrelationID from the request if any. | | PaymentReference | 1 | true | 50 | string | The payment reference of the account existing/created. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | CreateAccount | | Description: | The operation creates an account for the specified customer | | Notes: | N/A | ```xml USERNAME PASSWORD CreateAccountV10 SE 3 195001182046 1234 ``` ```xml CreateAccountV10 100002389703450 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Customer information Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/index.md In this section you find all requests that concerns a specific Customer In this section you find all requests that concerns a specific Customer - Status of a specific invoice - Creating accounts - Adding and removing integrationId's - Adding and updating customer proxies - Set preferred language for a customer --- # Add IntegrationId Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/integrationids/addintegrationid.md This functionality is used to add IntegrationId's for a customer. This method is available in the following countries: ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :----------------------- | :--------- | :------- | :-- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 4 | string | The country code (ISO 3166-1 alpha-2) for the country. | | IntegrationId | 1 | true | 50 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). Civic reg. numbers can be used for this but are not mandatory - as long as the value entered is unique. No separators should be used, for example: - , . Only nillable if RegNo is set (usage of RegNo is standard) | | IntegrationIdDescription | 1 | true | 50 | string | A friendly description of the IntegrationId given. Shown on the invoice as the “buyer” instead of the IntegrationId value if used. Must be used in combination with IntegrationId. No separators should be used, for example: - , . | | RegNo | 1 | false | 20 | string | The customer's registration number. | | StoreId | 1 | true | 4 | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | AddIntegrationId | | Description: | The operation adds integrationId to the specified customer | | Notes: | N/A | ```xml USERNAME PASSWORD dcda57a3-fd45-47e7-9565-bf4c907e4977 SE ID_123456 Integration ID description 195001182046 1234 ``` ```xml dcda57a3-fd45-47e7-9565-bf4c907e4977 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Get IntegrationIds Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/integrationids/getintegrationids.md This functionality returns a list of IntegrationId's that exists for a customer. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :----------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | RegNo | 1 | false | 20 | string | The registration number. | | StoreId | 1 | true | 4 | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------- | :--------- | :------- | :-- | :------------------------------------------------------------- | :------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | IntegrationIds | 1 | true | - | [IntegrationIds[]](../../commoninformation.mdx#integrationids) | List of IntegrationIds. | ### Example Requests |   | Value | | :----------- | :------------------------------------------------------------------ | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetIntegrationIds | | Description: | The operation fetchs all IntegrationId's for the specified customer | | Notes: | N/A | ```xml USERNAME PASSWORD 0306c939-ec7c-4746-99a6-32c7acf69d3c SE 195001182046 1234 ``` ```xml 0306c939-ec7c-4746-99a6-32c7acf69d3c ID_123456 Integration ID description ``` ## Error codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # IntegrationIds Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/integrationids/integrationid.md This functionality is used to add IntegrationId's for a customer. IntegrationId's can be used for two things; civic registration number substitute or for purchase rights. This functionality is used to add IntegrationId's for a customer. IntegrationId's can be used for two things; civic registration number substitute or for purchase rights. This method is available in the following countries: ## Civic registration number substitute A unique identifier for the customer as a substitute for the civic registration number (RegNo) in AddInvoice. As an example, a customer number set by the merchant for a customer can be set as an IntegrationId, allowing the merchant to use this value in AddInvoice, instead of the RegNo. • Good for cases where the end customer's civic registration number isn’t allowed to be saved, but the merchants want to be able to make purchases without the customer submitting the civic registration number. In this case, IntegrationId can be used as a substitute for RegNo in AddInvoice (RegNo is left out) ## Purchase rights More than one IntegrationId can be assigned to a customer. Certain persons can be assigned to a customer image, making it possible for those persons only to make purchases for that specific company. For this to work properly, the IntegrationId's must be the civic registration numbers of the persons with the purchase rights. This allows for additional security, as electronic identification online (if used) and identification control instore can be applied. • For example, a company wants to allow 3 people to have the purchase rights for the company. Three separate civic registration numbers are assigned to the company using AddIntegrationId. In this case, IntegrationId must be used in combination with RegNo in AddInvoice, where RegNo is the organization number of the company customer, and IntegrationId is the civic registration number of the one with the purchase rights. --- # Remove IntegrationIds Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/integrationids/removeintegrationids.md This functionality is used to remove IntegrationId's on a customer. This functionality is used to remove IntegrationId's on a customer. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :----------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | IntegrationId | 1 | true | 50 | string | The integration ID that shall be removed | | RegNo | 1 | false | 20 | string | The registration number. | | StoreId | 1 | true | 4 | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | RemoveIntegrationIds | | Description: | The operation fetches all reservations | | Notes: | N/A | ```xml test 123456 953a0cc4-310f-4aa6-bd23-07b62103d0f9 SE ID_123456 195001182046 1234 ``` ```xml 953a0cc4-310f-4aa6-bd23-07b62103d0f9 ``` ## Error codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Set Preferred Language Source: https://dev.walleypay.com/docs/paymentsApi/integration/customer/setpreferredlanguage.md This operation sets a preferred notification language for specified customer. The notification language affects the printed invoice. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :-------------- | :--------- | :------- | :-- | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for country. | | LanguageCode | 1 | true | 5 | string | Desired customer notification language code (BCP-47). \* | | RegNo | 1 | true | 20 | string | The registration number of the customer. Either civic registration number or organization number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | StoreId | 1 | true | 4 | short | The StoreId used for identification of store. | Supported language codes are: - sv-SE - sv-FI - fi-FI - en-GB ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :------------------------------------- | | CorrelationID | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | setpreferredlanguage | | Description: | The operation fetches all reservations | | Notes: | N/A | ```xml USERNAME PASSWORD 127.0.0.1 SetPreferredLanguageV10 SE sv-FI 195001182046 1234 ``` ```xml SetPreferredLanguageV10 ``` ## Error codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :------------------------------------------- | :------------------------------------------------------------------------------------------- | | LANGUAGE_CODE_CHANGE_NOT_ALLOWED_FOR_PARTNER | The functionality to change preferred language is not set on merchant. Plase contact Walley. | --- # Error Codes Source: https://dev.walleypay.com/docs/paymentsApi/integration/error-codes.md ## Error Codes with Frontend message ### Sweden | Error code | Frontend message | | -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | DENIED_TO_PURCHASE, CREDIT_CHECK_DENIED, ADDRESS_NOT_FOUND, RESERVATION_NOT_APPROVED, DENIED_TO_PURCHASE_HHCPN | Tyvärr blev du inte godkänd att handla på faktura, var god välj ett annat betalningsalternativ. | | PURCHASE_AMOUNT_GREATER_THAN \_MAX_CREDIT_AMOUNT | Köpesumman är för stor för fakturaköp, var god minska värdet för varukorgen eller välj ett annat betalningsalternativ. | | INVALID_REGISTRATION_NUMBER | Det personnummer du har slagit in är felaktigt, var god kontrollera detta och försök igen. | | AGREEMENT_RULES_VALIDATION_FAILED | De personuppgifter du har angivit stämmer inte överens med dina folkbokföringsuppgifter, var god kontrollera detta och försök igen. | | UNHANDLED_EXCEPTION | Tekniskt fel, var god försök senare eller välj ett annat betalningsalternativ. | ### Norway | Error code | Frontend message | | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | DENIED_TO_PURCHASE, CREDIT_CHECK_DENIED, ADDRESS_NOT_FOUND, RESERVATION_NOT_APPROVED,DENIED_TO_PURCHASE_HHCPN | Dessverre ble du ikke godkjent for å handle på faktura, vennligst velg en annen betalingsmetode. | | PURCHASE_AMOUNT_GREATER_THAN \_MAX_CREDIT_AMOUNT | Verdien i handlekurven din er for stor for fakturabetaling, vennligst ta bort artikler eller velg en annen betalingsmetode. | | INVALID_REGISTRATION_NUMBER | Du har tastet inn feil fødsels og personnummer, vennligst kontroller tallene og forsøk igjen. | | AGREEMENT_RULES_VALIDATION_FAILED | Personopplysningene du har lagt inn samsvarer ikke med det som er registrert hos folkeregisteret. Vennligst kontroller dette og forsøk igjen. | | UNHANDLED_EXCEPTION | Teknisk feil. Vennligst prøv igjen senere eller velg en annen betalingsmetode. | ### Finland | Error code | Frontend message | | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | DENIED_TO_PURCHASE, CREDIT_CHECK_DENIED, ADDRESS_NOT_FOUND, RESERVATION_NOT_APPROVED, DENIED_TO_PURCHASE_HHCPN | Valitsemaasi maksutapaa ei hyväksytty. Ole hyvä ja valitse toinen maksutapa. | | PURCHASE_AMOUNT_GREATER_THAN \_MAX_CREDIT_AMOUNT | Ostosten yhteissumma on liian suuri voidaksesi maksaa laskulla. Poista tuotteita tai valitse toinen maksutapa. | | INVALID_REGISTRATION_NUMBER | Henkilötunnuksesi on virheellinen. Tarkista henkilötunnus ja yritä uudelleen. | | AGREEMENT_RULES_VALIDATION_FAILED | Antamasi henkilötiedot eivät vastaa väestörekisterin henkilötietoja. Tarkista ja yritä uudelleen. | | UNHANDLED_EXCEPTION | Tekninen vika. Ole hyvä ja yritä myöhemmin uudelleen tai valitse toinen maksutapa. | ### Denmark | Error code | Frontend message | | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | | DENIED_TO_PURCHASE, CREDIT_CHECK_DENIED, ADDRESS_NOT_FOUND, RESERVATION_NOT_APPROVED | Desværre blev du ikke godkendt for at handle på faktura, var venlig og vælg et andet betalingsalternativ. | | PURCHASE_AMOUNT_GREATER_THAN \_MAX_CREDIT_AMOUNT | Værdien på din indkøbskurv er for stor for at betale mod faktura. Venligst fjern artikler eller vælg et andet betalingsalternativ. | | INVALID_REGISTRATION_NUMBER | Det indtastede personnummer er forkert. Kontrollér venligst, og prøv igen. | | AGREEMENT_RULES_VALIDATION_FAILED | De angivne kontaktoplysninger stemmer ikke overens med dine oplysninger i folkeregisteret. Kontrollér venligst, og prøv igen. | | UNHANDLED_EXCEPTION | Teknisk fejl, venligst forsøg senere eller vælg et andet betalingsalternativ. | ### Germany and Austria | Error code | Frontend message | | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DENIED_TO_PURCHASE, CREDIT_CHECK_DENIED, RESERVATION_NOT_APPROVED | Leider wurden die Voraussetzungen für einen Kauf per Rechnung nicht erfüllt. Bitte wählen Sie eine andere Zahlungsalternative | | PURCHASE_AMOUNT_GREATER_THAN \_MAX_CREDIT_AMOUNT | Der Wert Ihres Warenkorbes übersteigt den zulässigen Kaufwert per Rechnung. Bitte reduzieren Sie die Anzahl der Waren oder wählen Sie eine andere Zahlungsalternative. | | UNHANDLED_EXCEPTION | Technischer Fehler. Bitte versuchen Sie es zu einem späteren Zeitpunkt erneut oder wählen Sie eine andere Zahlungsalternative. | ## All Error Codes | Error Code | Description | | |-------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------| | ACCOUNT_NOT_FOUND | Thrown when no account is found for the given request. | | | ACTIVATION_OF_INVOICE_DENIED | Activation of an invoice id denied. | | | ADDRESS_NOT_FOUND | Address can’t be found for the specified customer. | | | AGREEMENT_RULES_VALIDATION_FAILED | Something with the use of the API is against the agreement with Walley, please contact Walley for information. | | | ARTICLE_EXISTS_BUT_OTHER_INFORMATION | Two or more InvoiceRows have identical ArticleId and Description in combination, but with different UnitPrice or VAT. | | | ARTICLE_NOT_FOUND | An Article can’t be found. Both Article Id and description specified must be the same that was used during AddInvoice. If more than one article with the same article id but different unit price is added to the invoice, the unit price of the article must be specified. | | | ARTICLE_NOT_FOUND_BASED_ON_UNITPRICE | Can’t locate the specified article based on the specified unit price. Make sure an article with the specified unit price exists. | | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Walley for more information. | | | AUTHORIZED_SIGNATORY_NOT_VERIFIABLE | Could not match the registration number supplied in the CompanyRegNoAuthorizedSignatory field with the list of board members in the response from third party credit check supplier. | | | AUTHORIZED_SIGNATORY_REGISTRATION_NUMBER_NOT_VALID | Could not identify the input personal registration number. | | | AUTHORIZED_SIGNATORY_REGISTRATION_NUMBER_REQUIRED | The CompanyRegNoAuthorizedSignatory was not present in the request. | | | COUNTRYCODE_MISMATCH_WITH_CUSTOMER_ADDRESS | The specified country code for the customer's address doesn’t match the country code specified in the (base) request. | | | COUNTRYCODE_MISMATCH_WITH_DELIVERY_ADDRESS | The specified country code for the customer's delivery address doesn’t match the country code specified in the (base) request. | | | COUNTRYCODE_MISMATCH_WITH_INVOICE_ADDRESS | The specified country code for the customer's invoice address doesn’t match the country code specified in the (base) request. | | | CUSTOM_TEXT_KEY_LENGTH | The Key field was too long. | | | CUSTOM_TEXT_KEY_REQUIRED | The Key was not present in the request. | | | CUSTOM_TEXT_NOT_FOUND | No text string exists for the Key given. | | | CUSTOMER_NOT_FOUND | Customer is not found by the specified integrationId, or no commitment for the requested StoreId + RegNo exists. | | | CUSTOMER_PURCHASE_IN_PROGRESS | More than one purchase is being processed simultaneously for this customer. Please allow a moment and try again. | | | CREDIT_CHECK_DENIED | The credit check is not approved. | | | CREDIT_CHECK_UNAVAILABLE | Credit checks are temporary unavailable due to third party credit check supplier errors or downtime | | | DENIED_TO_PURCHASE | When a customer is denied to do purchase, for example blocked for purchase based on different reasons, please contact Walley for more information. | | | DENIED_TO_PURCHASE_HHCPN | When a customer is denied to do purchase, for example blocked for purchase based on different reasons, please contact Walley for more information. | | | DUE_DATE_OUT_OF_RANGE | The invoice cannot be created because the due date is out of range. | | | ORDER_DATE_OUT_OF_RANGE | The invoice cannot be created because the order date is out of range. | | | EMAIL_IS_MISSING | The delivery method was set to email but the Email field was not present in the request. | | | INFORMATION_KEY_NOT_VALID_FOR_THIS_CONTEXT | | | | INVALID_ACTIVATION_OPTION_VALUE | The ActivationOption field was not one of its allowed values. | | | INVALID_CLIENT_IP_ADDRESS | The Client IP Address was in the wrong format. | | | INVALID_COUNTRYCODE | Can be thrown when you try to request an address from another country than the one you are registered in. | | | INVALID_CREDIT_TIME_USAGE | Credit time can’t be used for the specific invoice type. | | | INVALID_CURRENCY_CODE | The specified currency can’t be used. This exception can be thrown if you are registered in a country where the specified currency is not allowed to be used. | | | INVALID_DELIVERY_ADDRESS_USAGE | Private customers aren’t allowed to have different invoice address and deliver address, they must be the same. | | | INVALID_HOUSE_NUMBER | The house number was in the wrong format (applies in Netherlands). | | | INVALID_INVOICE_STATUS | When you try to cancel a pending invoice that can’t be cancelled based on the stage it is in. | | | INVALID_PRODUCT_CODE | The specified product code can’t be used. This exception can be thrown if you are using a product code that is not active or expired, or if the product is not valid for the specified invoice type. | | | INVALID_QUANTITY | The quantity of an article is too low or too high compared to the quantity or quantity left on the article. | | | INVALID_REGISTRATION_NUMBER | When the reg.no is not in a correct format. | | | INVALID_TRANSACTION_AMOUNT | The amount may exceed the total invoice amount, or the number of decimals has more than two digits after decimal (Can only have two digits after decimal). | | | INVOICE_DUEDATE_ALREADY_EXTENDED | The due date of the invoice has already been extended. | | | INVOICE_EXCEEDS_AVAILABLE_RESERVATION | The purchase sum of the invoice exceeds the available reservation amount. | | | INVOICE_EXTENDED_DATE_IN_PAST | When you try to extend a due date by specifying a date in the past. | | | INVOICE_INVALID_TYPE | When an invoice may be of wrong type, some actions aren’t allowed to perform on specific invoices, for example: You can’t extend the due date on an invoice that is not of type Direct invoice. | | | INVOICE_NOT_FOUND | When the specified Invoice number can’t be found. When trying to credit an Invoice and when the invoice is already credited or not activated. | | | INVOICE_TYPE_IS_NOT_ALLOWED_TO_BE_USED | You aren’t allowed to use the specified invoice type. | | | INTEGRATION_ID_DESCRIPTION_LENGTH | The IntegrationIdDescription was too long. | | | INTEGRATION_ID_DESCRIPTION_NOT_ALPHANUMERIC | The IntegrationIdDescription contained characters not allowed. | | | INTEGRATION_ID_NOT_MATCHING | The integration ID does not match existing integration ID for the supplied registration number. | | | INTEGRATION_ID_NOT_UNIQUE | The Integration ID is not unique. | | | INTEGRATION_ID_OR_REGISTRATION_NUMBER_REQUIRED | Neither IntegrationId nor RegNo was set in the request. | | | LANGUAGE_CODE_CHANGE_NOT_ALLOWED_FOR_PARTNER | Not allowed to use the SetPreferredLanguage function. Contact Walley for more information. | | | LANGUAGE_CODE_CHANGE_NOT_ALLOWED_FOR_PARTNER_CUSTOMER_COMBINATION | Not allowed to use the SetPreferredLanguage function for the specified customer, as the customer has no relation to submitted StoreId. | | | LANGUAGE_CODE_NOT_SUPPORTED | Language code not supported. | | | LANGUAGE_CODE_MALFORMED | Language code has incorrect format. | | | MIXED_CURRENCY | The article's currency doesn’t match the currency on the invoice. | | | MOBILE_PHONE_IS_MISSING | The mobile phone is missing, which is needed because of the chosen notification type. | | | MOBILE_PHONE_NUMBER_INVALID | The customer's MobilePhone number is incorrectly formatted. Should always contain country code (e.g.. +46 xxx xxx xxx). | | | MOBILE_PHONE_NUMBER_INVALID | The mobile phone number is not correctly formatted. | | | NOT_ALLOWED_TO_SEND_NOTIFICATION_BY_EMAIL | You aren’t allowed to send the specific invoice type by e-mail. | | | NOT_ALLOWED_TO_SEND_NOTIFICATION_BY_MAIL | You aren’t allowed to send the specific invoice type by postal mail. | | | NOT_ALLOWED_TO_SEND_NOTIFICATION_BY_SMS | You aren’t allowed to send the specific invoice type by SMS. | | | ORDER_DATE_OUT_OF_RANGE | The invoice cannot be created because the order date is out of range. | | | PEPPOL_ID_INVALID | Peppol id has an invalid format | | PERSONAL_GUARANTEE_NOT_ENABLED | Personal guarantee is enabled in the request, but Walley has not enabled the signing functionality. | | | PERSONAL_GUARANTEE_NOT_ENABLED_FOR_INVOICE_TYPE | The chosen InvoiceType does not support purchases made on customers with a personal guarantee commitment. | | | PURCHASE_AMOUNT_GREATER_THAN_MAX_CREDIT_AMOUNT | The total amount of an invoice or reservation can't be greater than your maximum credit limit or the maximum credit limit for the country the purchase is made in. | | | PURCHASE_NOT_FOUND | An invoice can’t be found. | | | RESERVATION_NOT_ACTIVATED | The Reservation must be activated before use. | | | RESERVATION_NOT_APPROVED | Reservation is not approved. | | | RESERVATION_NOT_FOUND | There was no reservation for the specified customer. | | | RESERVATION_NOT_SIGNED | The reservation has not yet been signed by the customer. | | | TOTAL_AMOUNT_MUST_BE_POSITIVE | The amount of an invoice must be positive. | | | UNHANDLED_EXCEPTION | If an unhandled error occurs, an unhandled exception will be thrown. In cases of these errors contact Walley for help. | | | UNIQUE_ARTICLE_NOT_FOUND | When article with the same article id is found several times but have different unit prices. The unit price must be specified also to locate the specific article. | | | VALIDATION_ACTIVATION_OPTION_VALUE | The ActivationOption field was not one of its allowed values. | | | VALIDATION_ADDRESS1_LENGTH | The Address1 field was too long. | | | VALIDATION_ADDRESS2_LENGTH | The Address2 field was too long. | | | VALIDATION_AMOUNT_PARSING | The unit price or other kind of amount fields could not be parsed. Make sure the amount is a decimal value and the number of decimals doesn’t have more than two digits after decimal (Can only have two digits after decimal). | | | VALIDATION_AMOUNT_RANGE | The Amount field was not within its allowed range. | | | VALIDATION_AMOUNT_REQUIRED | The Amount field was not present in the request. | | | VALIDATION_ARTICLE_ID_LENGTH | The ArticleId field was too long. | | | VALIDATION_ARTICLE_ID_REQUIRED | An article is missing its ArticleId. | | | VALIDATION_ARTICLE_LIST_REQUIRED | The ArticleList field was not present in the request. | | | VALIDATION_BANK_ACCOUNT_LENGTH | The BankAccount field was too long. | | | VALIDATION_BANK_ACCOUNT_REQUIRED | The BankAccount field was not entered in the request. | | | VALIDATION_BANK_ACCOUNT_TYPE_OUT_OF_RANGE | The BankAccountType was out of range. Check the PaymentInfo contract for supported range and types. | | | VALIDATION_BANK_ACCOUNT_TYPE_REQUIRED | The BankAccountType was not present in the request. | | | VALIDATION_CELL_PHONE_NUMBER_LENGTH | The CellPhoneNumber field was too long. | | | VALIDATION_CITY_LENGTH | The City field was too long. | | | VALIDATION_CITY_REQUIRED | The City field was not present in the request. | | | VALIDATION_CLIENT_IP_ADDRESS_LENGTH | The ClientIpAddress field was too long. | | | VALIDATION_CLIENT_IP_ADDRESS_REQUIRED | The ClientIpAddress field was not present in the request. | | | VALIDATION_COADDRESS_LENGTH | The CoAddress field was too long. | | | VALIDATION_COMPANY_NAME_LENGTH | The CompanyName field was too long. | | | VALIDATION_COST_CENTER_LENGTH | The CostCenter field was too long. | | | VALIDATION_COUNTRY_CODE_LENGTH | The CountryCode field was too long. | | | VALIDATION_COUNTRY_CODE_REQUIRED | The CountryCode field was not present in the request. | | | VALIDATION_CREDIT_DATE_REQUIRED | The CreditDate field was not present in the request. | | | VALIDATION_CREDIT_TIME_OUT_OF_RANGE | Credit time is out of range, can only be between 0 and 99. | | | VALIDATION_CURRENCY_LENGTH | The Currency field was too long. | | | VALIDATION_CURRENCY_INVALID | The specified currency may not be supported or is of an incorrect format (ISO 4217). Currency need to be at least three characters long and follow ISO 4217, e.g. SEK, DKK, NOK and EUR etc. | | | VALIDATION_CURRENCY_REQUIRED | The Currency field was not present in the request. | | | VALIDATION_CUSTOMER_NUMBER_LENGTH | The CustomerNumber field was too long. | | | VALIDATION_DELIVERY_ADDRESS_REQUIRED | The DeliveryAddress field was not present in the request. | | | VALIDATION_DESCRIPTION_LENGTH | The Description field was too long. | | | VALIDATION_EMAIL_INVALID | The e-mail address is not a valid e-mail address. | | | VALIDATION_EMAIL_LENGTH | The Email field was too long. Can only be maximum of 256 characters. | | | VALIDATION_ERROR | Input data is not correct. | | | VALIDATION_FIRST_NAME_LENGTH | The FirstName field was too long. | | | VALIDATION_GENDER_VALUE | The Gender field was not one of its allowed values. | | | VALIDATION_INTEGRATION_ID_REQUIRED | The IntegrationId field was not present in the request. | | | VALIDATION_INVOICE_ADDRESS_REQUIRED | The InvoiceAddress field was not present in the request. | | | VALIDATION_INVOICE_DELIVERY_METHOD_VALUE | The InvoiceDeliveryMethod field was not one of its allowed values. | | | VALIDATION_INVOICE_NUMBER_LENGTH | The InvoiceNumber field was too long. | | | VALIDATION_INVOICE_NUMBER_REQUIRED | The InvoiceNumber field was not present in the request. | | | VALIDATION_INVOICE_ROW_REQUIRED | The InvoiceRow field was not present in the request. | | | VALIDATION_INVOICE_TYPE_VALUE | The InvoiceType field was not one of its allowed values. | | | VALIDATION_LAST_NAME_LENGTH | The LastName field was too long. | | | VALIDATION_ORDER_DATE_REQUIRED | The OrderDate field was not present in the request. | | | VALIDATION_ORDER_NUMBER_LENGTH | The OrderNo field was too long. | | | VALIDATION_PASSWORD_REQUIRED | The Password field was not present in the request. | | | VALIDATION_PAYMENT_REFERENCE_LENGTH | The PaymentReference field was too long. | | | VALIDATION_PAYMENT_REFERENCE_REQUIRED | The PaymentReference field was not present in the request. | | | VALIDATION_PHONE_NUMBER_LENGTH | The PhoneNumber field was too long. | | | VALIDATION_POSTAL_CODE_LENGTH | The PostalCode field was too long. | | | VALIDATION_POSTAL_CODE_REQUIRED | The PostalCode field was not present in the request. | | | VALIDATION_PRODUCT_CODE_LENGTH | The ProductCode field was too long. | | | VALIDATION_PURCHASE_TYPE_VALUE | The PurchaseType field was not within its allowed range. | | | VALIDATION_QUANTITY_RANGE | The Quantity field was not within its allowed range. | | | VALIDATION_QUANTITY_REQUIRED | An article is missing its Quantity. | | | VALIDATION_RECEIVER_NAME_LENGTH | The ReceiverName field was too long. | | | VALIDATION_RECEIVER_NAME_REQUIRED | The ReceiverName field was not present in the request. | | | VALIDATION_RECEIVER_REG_NUMBER_LENGTH | The ReceiverRegNumber field was too long. | | | VALIDATION_RECEIVER_REG_NUMBER_REQUIRED | The ReceiverRegNumber field was not present in the request. | | | VALIDATION_REFERENCE_LENGTH | The Reference field was too long. | | | VALIDATION_REGISTRATION_NUMBER_LENGTH | The RegNo field was too long. | | | VALIDATION_REGISTRATION_NUMBER_REQUIRED | The RegNo field was not present in the request. | | | VALIDATION_RESERVED_AMOUNT_PARSING | The ReservedAmount field could not be parsed. | | | VALIDATION_RESERVED_AMOUNT_RANGE | The ReservedAmount field was not within its allowed range. | | | VALIDATION_RESERVED_AMOUNT_REQUIRED | The ReservedAmount field was not present in the request. | | | VALIDATION_TOTAL_AMOUNT_MUST_BE_POSITIVE | Total amount for invoice rows must be higher than zero. | | | VALIDATION_UNIT_PRICE_PARSING | The UnitPrice field could not be parsed. | | | VALIDATION_UNIT_PRICE_RANGE | The UnitPrice field was not within its allowed range. | | | VALIDATION_USERNAME_REQUIRED | The Username field was not present in the request. | | | VALIDATION_VAT_PARSING | The Vat field could not be parsed. | | | VALIDATION_VAT_RANGE | The Vat field was not within its allowed range. | | | VALIDATION_VAT_REQUIRED | The Vat field was not present in the request. | | | IDEMPOTENCY_REQUEST_IN_PROGRESS | A request with an idempotency key was received while another request with the same idempotency key was already processing. | It is safe to retry. | | IDEMPOTENCY_RESPONSE_EXPIRED | A request was received with an idempotency key that has been used before, but the response has been purged from the cache. | | | IDEMPOTENCY_MISMATCHING_REQUEST_TYPE | A request with an idempotency key was received but another request with the same idempotency key has already been processed for a different request type. | | | PROXY_MISSING | Proxy was not present in request or proxy could not be found for the specified customer | | --- # Get Accounts Source: https://dev.walleypay.com/docs/paymentsApi/integration/informationservice/getaccounts.md The operation returns customer account (order) information of a customer based on customer number, integration number or civic registration number. It will return all accounts found on the current customer; approved, rejected, activated, closed etc. If no customer or account is found for the given request an exception will be returned. The account can be identified either by providing the CustomerNo, the IntegrationId or RegNo in the request, but never more than one of them in one request. ## Request Parameters | Field | Occurs | nullable | Max | Type | Description | | ------------- | ------ | -------- | --- | ------ | ------------------------------------------------------------------------------------------------------------------------ | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | CustomerNo | 1 | true | 50 | string | If the e-store wants to search for a customer by their own customer id, this field can be used to specify that number. | | IntegrationId | 1 | true | 128 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). | | RegNo | 1 | true | 12 | string | The customer civic registration number. | | StoreId | 1 | false | 50 | int | The StoreId used for identification of store. | ### Response Parameters | Field | Occurs | nullable | Max | Type | Description | | ------------- | ------ | -------- | --- | ----------------------- | ---------------------------------------------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | Accounts | 1 | true | 50 | [Accounts[]](#accounts) | A list of the accounts for the customer associated with the given request. See below for more information. | #### Accounts | Field | Occurs | nullable | Max | Type | Description | | ------------------- | ------ | -------- | --- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | InvoiceBalance | 1 | false | 6,2 | decimal | The current balance of the invoice. | | InvoiceStatus | 1 | false | - | string | The current status of the invoice. | | InvoiceType | 1 | false | - | string | The invoice type | | LatestInvoiceNo | 1 | true | 50 | string | The invoice number of the invoice. | | MovedToPaymentRef | 1 | true | - | string | If the invoice has been moved to another account, this is the new accounts payment reference. If the invoice has not been moved, this returns null. | | NotificationStopped | 1 | false | - | string | Returns true if the current invoice is stopped for notifications. Returns false if it is not stopped. | | PaymentReference | 1 | true | 50 | string | The invoices payment reference. | ### Example Requests |   | Value | | ------------ | :-------------------------------------------------------------------- | | Environment: | UAT | | Service: | InformationService | | URL: | https://ecommercetest.collector.se/v3.0/InformationServiceV2.svc?wsdl | | Function: | GetAccounts | | Description: | The operation returns a list of accounts for a specic customer. | | Notes: | N/A | ```xml USERNAME PASSWORD SE 195109212224 1234 ``` ```xml 230.00 Activated Direct Invoice Account 73237549 false 100002695034855 6750.00 Activated Pending Credit Account 72787668 false 6896.00 Activated Interest Free Account 72787676 false 100002676362358 0.00 Moved Direct Invoice Account 73281523 140000269632661 false 140000269632658 ``` ### Error Codes | Fault Code | Description | | :------------------- | :----------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Collector for more help. | | ACCOUNT_NOT_FOUND | No account found for Invoice Number. | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # Get Account Transactions Source: https://dev.walleypay.com/docs/paymentsApi/integration/informationservice/getaccounttransactions.md Retrieves the transactions of the account associated with the invoice number or payment reference given in request. If no account is found for the given request an exception will be returned. The account can be identified either by providing the InvoiceNo or the PaymentReference in the request, but not both. ## Request Parameters | Field | Occurs | nullable | Max | Type | Description | | ---------------- | ------ | -------- | --- | ------ | -------------------------------------------------------------------------------------- | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNo | 1 | true | 50 | int | The invoice number. Either InvoiceNo or PaymentReference must be set, but not both. | | PaymentReference | 1 | true | 50 | string | The payment reference. Either PaymentReference or InvoiceNo must be set, but not both. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ### Response Parameters | Field | Occurs | nullable | Max | Type | Description | | ------------- | ------ | -------- | --- | ------------------------------- | ------------------------------------------------------------------------------------------------ | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | Transactions | 1 | true | 50 | [Transactions[]](#transactions) | A list of transactions for the invoice associated with the given request. See below for details. | #### Transactions | Field | nullable | Type | Description | | --------------------------- | -------- | ------- | --------------------------------------------------------------- | | ArticleId | false | string | The ArticleId of the product. | | Currency | false | string | The Currency of the transaction | | Description | false | string | The description of the product. | | MovedFromAccount | true | string | The AccountNo the transaction has been moved from, if moved. | | MovedToAccount | true | string | The AccountNo the transaction has been moved to, if moved. | | OriginalCurrencyInformation | true | string | The original currency if not the same as specified in Currency. | | Quantity | false | int | The quantity of the product. | | TransactionDate | false | date | The date of the transaction. | | TransactionType | false | string | The type of the transaction, e.g. purchase, return etc. | | UnitPrice | false | decimal | Price per unit incl. VAT. | | VatRate | false | decimal | VAT in per cent. | ### Example Requests |   | Value | | ------------ | :-------------------------------------------------------------------------- | | Environment: | UAT | | Service: | InformationService | | URL: | https://ecommercetest.collector.se/v3.0/InformationServiceV2.svc?wsdl | | Function: | GetAccountTransactions | | Description: | The operation returns a list of accounts transactions for a specic invoice. | | Notes: | N/A | ```xml USERNAME PASSWORD SE 63049067 1234 ``` ```xml 456789 SEK Description 1 2020-07-04T01:00:16.787 Purchase 15.00 25.00 123456 SEK Description 1 2020-07-04T01:00:16.787 Purchase 15.00 25.00 ``` ### Error Codes | Fault Code | Description | | :------------------- | :----------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Collector for more help. | | ACCOUNT_NOT_FOUND | No account found for Invoice Number. | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # Get Current Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/informationservice/getcurrentinvoice.md Retrieves the current invoice of the account associated with the invoice number or payment reference given in the request. If no account is found for the given request an exception will be returned. If the specified account does not have an invoice created yet, only Currency, PaymentReferenceNo and, if a payment has been moved, MovedToPaymentRef are returned. The account can be identified either by providing the InvoiceNo or the PaymentReference in the request, but not both. ## Request Parameters | Field | Occurs | nullable | Max | Type | Description | | ---------------- | ------ | -------- | --- | ------ | -------------------------------------------------------------------------------------- | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNo | 1 | true | 50 | int | The invoice number. Either InvoiceNo or PaymentReference must be set, but not both. | | PaymentReference | 1 | true | 50 | string | The payment reference. Either PaymentReference or InvoiceNo must be set, but not both. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ### Response Parameters | Field | Occurs | nullable | Max | Type | Description | | ----------------- | ------ | -------- | --- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | CreditTime | 1 | false | 2 | int | The remaining credit time, in months, of the invoice. | | Currency | 1 | false | 3 | string | The Currency Code (ISO 4217 alpha-3) | | DueDate | 1 | false | - | datetime | The date the invoice is due. | | InvoiceNo | 1 | false | 50 | string | Invoice number of the latest invoice | | InvoiceURL | 1 | false | - | string | URL to the invoice | | LowestAmountToPay | 1 | false | 6,2 | decimal | Lowest amount to pay on the invoice. | | MovedToPaymentRef | 1 | true | - | string | If the invoice has been moved to another account, this is the new accounts payment reference. If the invoice has not been moved, this returns null. | | NotificationDate | 1 | false | - | datetime | The notification date of the invoice. | | NotificationType | 1 | false | - | string | The type of invoice, possible values see below. | | NumberOfReminders | 1 | false | 1 | int | Number of reminders if any. | | OrderNo | 1 | true | 20 | string | The invoice order number if any. | | PaymentPlan | 1 | true | 6,2 | decimal | The lowest amount to pay to stay on the current payment plan. | | PaymentReference | 1 | false | 50 | string | The invoices payment reference. | | PaymentStatus | 1 | false | - | string | Status of invoice payment, possible values see below. | | TotalAmount | 1 | false | 6,2 | decimal | Invoice total amount. | #### Notification Types - Direct Invoice - Direct Invoice Reminder - Invoice - Invoice Reminder - Part Payment - Part Payment Reminder - Credit Account Invoice - Credit Account Invoice Reminder - Interest Free - Interest Free Part Payment - Interest Free Part Payment Reminder - Annuity - Annuity Reminder #### Payment Status - In Debt - Not Paid - Partially Paid - Fully Paid ### Example Requests |   | Value | | ------------ | :-------------------------------------------------------------------- | | Environment: | UAT | | Service: | InformationService | | URL: | https://ecommercetest.collector.se/v3.0/InformationServiceV2.svc?wsdl | | Function: | GetCurrentInvoice | | Description: | The operation returns details of the Specified invoice. | | Notes: | N/A | ```xml USERNAME PASSWORD SE 73255093 1234 ``` ```xml 24 SEK 2021-01-31T23:59:59 73255093 https://minasidor-UAT.tmtf.se/invoice?id=....&language=sv-SE 1205.00 2020-02-01T10:23:43.073 Direct Invoice 0 7107026119 100002696235659 Not Paid 1205.00 ``` ### Error Codes | Fault Code | Description | | :------------------- | :----------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Collector for more help. | | INVOICE_NOT_FOUND | Specified Invoice could not be found. | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # Information Service Source: https://dev.walleypay.com/docs/paymentsApi/integration/informationservice/informationservice.md The InformationService is a service used for monitoring customer account statuses, retrieving current invoice information and for viewing account transactions on selected invoices. The usage of this functionality requires an agreement with Walley. --- # Activate Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/activateinvoice.md Activation of an invoice should be done when the goods are ready to be sent. This request fully activates the invoice. Normally an invoice needs to be activated within 90 days from placing an order. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | PaymentInfo | 1 | false | - | [PaymentInfo] | Bank or invoice Information for payout. Used in this request to replace the PaymentInfo sent in the AddInvoice request, if needed. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | #### PaymentInfo | Parameter | Required | Type | Max | Description | | :---------------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------------ | | ReceiverName | | string | 64 | Name of the company | | ReceiverRegNumber | | string | 64 | The organization number of receiving company | | PaymentReference | | string | 350 | Reference added to the payment. OCR number must be no longer than 20 characters | | BankAccount | | string | 50 | Bank account number. For bank account types with multiple parts "|" (pipe) is used as a delimiter. | | BankAccountType | | int | | | #### BankAccountType - 0 - Bic Iban (DEUTDEFF DE99203205004989123456) - 1 - Iban (DE99203205004989123456) - 2 - Plusgiro, with OCR - 3 - Plusgiro, with message - 4 - Bankgiro, with OCR - 5 - Bankgiro, with message ## Response | Field | min Occurs | nillable | Max | Type | Description | | ----------------- | ---------- | -------- | --- | -------- | ---------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | DueDate | 1 | false | 12 | datetime | The due date of the invoice. | | InvoiceUrl | 1 | false | 200 | string | The url to invoice in pdf format. | | LowestAmountToPay | 1 | false | 6,2 | decimal | The lowest amount to pay on the invoice. | | PaymentReference | 1 | true | 50 | string | The Reference that should be as a reference on an invoice. | | TotalAmount | 1 | false | 6,2 | decimal | The total amount to pay for the invoice. | ### Example Requests |   | Value | | ------------ | :-------------------------------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | ActivateInvoice | | Description: | The operation returns invoice information of a customer based on a civic registration number. | | Notes: | N/A | ```xml USERNAME PASSWORD ActivateInvoiceV10 SE 62366761 1234 ``` ```xml ActivateInvoiceV10 2020-05-31T23:59:59 https://minasidor-internaltest.collector.se/invoice?id=1_PYWD6cpApt4ADXWDVU19_lNsvkChyldlQByPOdGXy7avQ-n0_ndZB0PkBtkJHu3HhJCMET_Xw4QnsRDMoGLjo8EHotk28csYqUVyvBiHNIV5MDmZnAEKyfqvPHHPs7&language=sv-SE 710.00 100002387703056 710.00 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/creating-purchases/addinvoice) | Fault Code | Description | | :---------------- | :--------------------------------------- | | INVOICE_NOT_FOUND | The invoice number does not exist. | | | | --- # Adjust Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/adjustinvoice.md The operation AdjustInvoice is used for adjusting the total invoice amount. The adjusted amount can be both negative and positive. A negative adjustment amount cannot be greater than the amount of the invoice. To make several adjustments at the same time, several articles can be added. :::info Please Note That positive adjustments may lead to additional credit checks of the customer. ::: ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ---------------------- | ---------- | -------- | --- | --------------------------- | ----------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNo | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | InvoiceRows | 1 | false | - | [InvoiceRow[]](#invoicerow) | The articles that should be listed on the invoice and
contains the quantity and price of the article. | | PurchaseClassification | 1 | true | 50 | string | This field is used for an alternative credit evaluation. Contact Walley for more details. | | SettlementReference | 1 | true | 50 | string | Settlement reference added to the return. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | #### InvoiceRow | Parameter | Required | Type | Max | Description | | :----------- | :------- | :------ | :-- | :----------------------------------------------------------------- | | ArticleId | x | string | 50 | The ArticleId of the product. | | Description | x | string | 50 | The description of the product. | | Quantity | x | int | 8 | The quantity of the product. 1-99999999 (0 not allowed) | | QuantityUnit | - | string | 50 | The quantity unit of the product, e.g. pcs, meter, number, kg etc. | | UnitPrice | x | decimal | 6,2 | Price per unit incl. VAT. | | VAT | x | decimal | 6,2 | VAT in per cent | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | ------------ | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | AdjustInvoice | | Description: | AdjustInvoice is used to update an invoice | | Notes: | N/A | ```xml USERNAME PASSWORD AdjustInvoiceV10 SE 62366754 123456 Article 123456 10 pcs 100 25 123 Discount on article 123456 1 -100 25 1234 ``` ```xml AdjustInvoiceV10 ``` ### Error Codes | Fault Code | Description | | :------------------------------------- | :-------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Walley for more help. | | VALIDATION_COUNTRY_CODE_REQUIRED | The CountryCode field was not present in the request. | | VALIDATION_ARTICLE_ID_REQUIRED | An article is missing its ArticleId. | | VALIDATION_QUANTITY_RANGE | The Quantity field was not within its allowed range. | | VALIDATION_SETTLEMENT_REFERENCE_LENGTH | The Settlement Reference field was not within its allowed range. | | INVOICE_NOT_FOUND | The invoice number does not exist. | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # Anti Fraud Control Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/antifraud.md ## Anti Fraud Control **All** the invoices that are added using the AddInvoice function are controlled by our anti-fraud system. This is done to make sure the customer is legit and minimize the risk of fraud. In short, this is how it works. An invoice is created using AddInvoice method A normal credit check is done on the customer If approved, the invoice is received by the anti-fraud system which responds with InvoiceStatus 0 (OnHold) or 6 (Signing), depending of the requirements set by Walley based on the agreement After controlling the invoice, the anti-fraud system updates the status to either 1 (Preliminary) or 5 (Rejected) (Rejected only possible if initial status is 0/OnHold) A callback is made to a URL located on the merchant's domain What does this mean? If the status is 0 or 6, you should just wait until the invoice status is updated to either 1 or 5. The invoice can’t be activated unless the invoice's status is 1. If the system responds with status 5, the invoice is rejected and cancelled. In these cases you can’t activate the invoice. Please note that rejected orders should not be shipped! How long does it take for the anti-fraud system to respond? The majority of all responses are sent within a few seconds, but a callback can take up to 24 working hours in special cases. Keep in mind that when this happens, it normally means something's wrong and therefore our anti-fraud department need to make a manual control. Often this turns out to be a fraud and even though it takes a few hours, the wait is well worth it. Where does the system respond to? It responds with the invoice statuses to a callback located in your domain. This callback URL need to be username and password (Max length 50 characters) protected and the credentials need to be communicated to Collector. The callback uses basic HTTP authentication with Base64 encoding. Username and password must use characters in the ASCII character set. What will the callback URL look like? The request from the anti-fraud system to the callback URL will contain the following parameters: InvoiceNo OrderNo InvoiceStatus This request is sent with a GET web request and the string is appended to the receiving URL in the following format: ?InvoiceNo=[Invoicenumber]&OrderNo=[OrderNumber]&InvoiceStatus=[NewInvoiceStatus] To answer the question, the callback URL should therefore look like this: https://www.merchantwebpage.com/CollectorInvoiceStatus?InvoiceNo=123456&OrderNo=Order123&InvoiceStatus=1 When you have received the callback, you will need to have a logic implemented to match the invoice number and order number from the request to the one in your system and then update the invoice status thereafter. If all goes well, you can activate the invoice as soon as the order is ready to be shipped. If the invoice is rejected, you will need to cancel the invoice. InvoiceStatus index: Invoice Status Description - 0 OnHold (screening needed) - 1 Preliminary (Approved, can be activated) - 5 Rejected (Denied by Walley, can not be activated) - 6 Signing (Customer must sign the agreement with Walley) Response codes: Walley applies a retry functionality on the status change notification callbacks. Should the callback fail, Walley will run a series of retries; once every ten minute for ten times. Walley require a code equivalent to "OK" or a GONE response. The following response codes will be accepted as "OK": - Codes 200 - 299 - Code 410 (GONE) You therefore must return any of the above codes when a callback has been received successfully by your system. Examples of codes that will initiate retries on the callback: - 301 (moved) - 403 (Forbidden) - 404 (not found) - 500 (Internal server error) In some special cases, this control can be turned off. --- # Cancel Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/cancelinvoice.md Cancel a pending invoice (an invoice that is not yet activated). This functionality is non-reversible. This can be used if the order no longer shall be sent. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | ------------------------------------------------------ | | Username | 1 | false | 50 | string | The username usedf to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | ------------ | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | CancelInvoice | | Description: | The operation cancels a pending invoice. | | Notes: | N/A | ```xml USERNAME PASSWORD 127.0.0.1 CancelInvoiceV10 SE 62396765 1234 ``` ```xml CancelInvoiceV10 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Credit Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/creditinvoice.md Fully credits/returns the requested invoice. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------------- | ---------- | -------- | --- | -------- | --------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | CreditDate | 1 | false | - | datetime | The date of the return. | | SettlementReference | 1 | true | 350 | string | Settlement reference added to the return. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | ------------ | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | CreditInvoice | | Description: | The operation fully credits/returns the requested invoice. | | Notes: | N/A | ```xml USERNAME PASSWORD CreditInvoiceV10 SE 2020-04-21T15:06:58 62396758 1234 ``` ```xml CreditInvoiceV10 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Extend Due Date Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/extendduedateinvoice.md Extends the due date, in accordance to the partner agreement, for the requested invoice. Can be used once per invoice. Supported invoice types: - DirectInvoice To use this functionality, and agreement with Walley must be made. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :----------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :------- | :---------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | DueDate | 1 | false | - | datetime | The new extended Due Date of the invoice. | ### Example Requests |   | Value | | ------------ | :------------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | ExtendDueDate | | Description: | The operation returns new due date for an invoice based on invoice number. | | Notes: | N/A | ```xml USERNAME PASSWORD 123 SE 4576392 1234 ``` ```xml 123 2020-05-10T23:59:59 ``` ## Error codes | Fault Code | Description | | :--------- | :---------- | --- # Get Invoice Information Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/getinvoiceinformation.md This operation returns information about the specified invoice. This method is available in the following countries: ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :-------------- | :--------- | :------- | :-- | :----- | :-------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------ | :--------- | :------- | :-- | :----- | :------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | Status | 1 | true | 50 | string | The status of the invoice | #### Invoice Status - 0 = On hold - 1 = Preliminary - 2 = Canceled - 3 = Delivered - 4 = Expired - 5 = Rejected - 6 = Signing - 7 = Strong customer verification ### Example Requests |   | Value | | ------------ | :------------------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetInvoiceInformation | | Description: | The operation returns invoice information of a customer based on invoice number. | | Notes: | N/A | ```xml USERNAME PASSWORD 123 SE 63062459 1234 ``` ```xml 123 0 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Part Activate Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/partactivateinvoice.md This functionality is used when part delivering goods. Creates an active invoice for the requested articles. If any pending articles remain a new pending invoice will be created for those articles and returned in NewInvoiceNo (this NewInvoiceNo should be used when activating the invoice in the next shipment). ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ArticleList | 1 | false | - | [Article[]](#article) | The list of articles that should be activated. See below. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | PaymentInfo | 1 | false | - | [PaymentInfo[]](#paymentinfo) | Bank or invoice Information for payout. Used in this request to replace the PaymentInfo sent in the AddInvoice request, if needed. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | #### Article | Parameter* | Required | Type | Max | Description | | :---------- | :------- | :------ | :-- | :----------------------------- | | ArticleId | | string | 50 | The ArticleId of the product | | Description | | string | 50 | The Description of the product | | Quantity | x | string | 8 | The quantity of the product | | UnitPrice | | decimal | 6,2 | Price per unit incl. VAT. | *Please note that Quantity AND at least one of the parameters ArticleId, Description or UnitPrice must be specified. #### PaymentInfo | Parameter | Required | Type | Max | Description | | :---------------- | :------- | :----- | :-- | :------------------------------------------------------------------------------------------------ | | ReceiverName | | string | 64 | Name of the company | | ReceiverRegNumber | | string | 64 | The organization number of receiving company | | PaymentReference | | string | 350 | Reference added to the payment. OCR number must be no longer than 20 characters | | BankAccount | | string | 50 | Bank account number. For bank account types with multiple parts "|" (pipe) is used as a delimiter. | | BankAccountType | | int | | | #### BankAccountType - 0 - Bic Iban (DEUTDEFF DE99203205004989123456) - 1 - Iban (DE99203205004989123456) - 2 - Plusgiro, with OCR - 3 - Plusgiro, with message - 4 - Bankgiro, with OCR - 5 - Bankgiro, with message ## Response | Field | min Occurs | nillable | Max | Type | Description | | ----------------- | ---------- | -------- | --- | -------- | ----------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | DueDate | 1 | false | 12 | datetime | The due date of the invoice. | | InvoiceUrl | 1 | true | - | | The url to invoice in pdf format. | | LowestAmountToPay | 1 | false | 6,2 | decimal | The lowest amount to pay on the invoice. | | NewInvoiceNumber | 1 | true | 50 | string | The new invoice number with the articles that where not yet delivered. | | PaymentReference | 1 | true | 50 | string | The Reference that should be as a reference on an invoice. | | TotalAmount | 1 | false | 6,2 | decimal | The total amount to pay for the invoice. | ### Example Requests |   | Value | | ------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | PartActivateInvoice | | Description: | The operation acitvates parts of an pending invoice. For Direct invoice it returns invoice details for other invoice types only invoice no. | | Notes: | N/A | ```xml USERNAME PASSWORD ArticleId 1 Description 1 1 100 PartActivateInvoiceV10 SE 62366759 1234 ``` ```xml PartActivateInvoiceV10 2020-05-31T23:59:59 https://minasidor-internaltest.collector.se/invoice?id=xGyujJtJ8OrrSJw8Im9_CFMQp_DC3SVg_tm5pvmObJ-8D7XSdrLca_3Enh4ZU5WRo2kk6TRSzW0hkpa-6nO7dliJ1YrAV0oAKkYQ8iPDrO2yRols_6AL7q5fDF9Bw0zQ&language=sv-SE 110.00 62366760 100002387702959 110.00 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :----------------------- | :--------------------------------------- | | INVOICE_NOT_FOUND | The invoice number does not exist. | | UNIQUE_ARTICLE_NOT_FOUND | When article with the same article id is found several times but have different unit prices. The unit price must be specified also to locate the specific article. | --- # Part Credit Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/partcreditinvoice.md Credits the included articles on the requested invoice. Can only be used on already activated invoices. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------------- | ---------- | -------- | --- | --------------------- | --------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ArticleList | 1 | false | - | [Article[]](#article) | The list of articles that should be credited. See below. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | CreditDate | 1 | false | - | datetime | The date of the return. | | InvoiceNo | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | SettlementReference | 1 | true | 350 | string | Settlement reference added to the return. | | StoreId | 1 | true | 4 | int | The StoreId used for identification of store. | #### Article | Parameter* | Required | Type | Max | Description | | :---------- | :------- | :------ | :-- | :------------------------------------------------------------------------------------------------------------------- | | ArticleId | | string | 50 | The ArticleId of the product. | | Description | | string | 50 | The Description of the product. If included; needs to be identical with the description from the AddInvoice request. | | Quantity | x | string | 8 | The quantity of the product. | | UnitPrice | | decimal | 6,2 | Price per unit incl. VAT. | *Please note that Quantity AND at least one of the parameters ArticleId, Description or UnitPrice must be specified. ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | ------------ | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | PartCreditInvoice | | Description: | The request credits the articles on the requested invoice | | Notes: | N/A | ```xml USERNAME PASSWORD 123.456.789 82493 11 50 SE 2020-04-20 62396756 111 1234 ``` ```xml ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :----------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | UNIQUE_ARTICLE_NOT_FOUND | When article with the same article id is found several times but have different unit prices. The unit price must be specified also to locate the specific article. | | INVALID_QUANTITY | The quantity of an article is too low or too high compared to the quantity or quantity left on the article. | --- # Replace Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/replaceinvoice.md Change a pending invoice. This API will replace all current articles with the new specified articles. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ---------------------- | ---------- | -------- | --- | --------------------------- | ----------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNo | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | InvoiceRows | 1 | false | - | [InvoiceRow[]](#invoicerow) | The list of articles that shall replace current invoice rows. | | PurchaseClassification | 1 | true | 50 | string | This field is used for an alternative credit evaluation. Contact Walley for more details. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | #### InvoiceRow | Parameter | Required | Type | Max | Description | | :----------- | :------- | :------ | :-- | :----------------------------------------------------------------- | | ArticleId | x | string | 50 | The ArticleId of the product. | | Description | x | string | 50 | The description of the product. | | Quantity | x | int | 8 | The quantity of the product. 1-99999999 (0 not allowed) | | QuantityUnit | - | string | 50 | The quantity unit of the product, e.g. pcs, meter, number, kg etc. | | UnitPrice | x | decimal | 6,2 | Price per unit incl. VAT. | | VAT | x | decimal | 6,2 | VAT in per cent | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------- | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | InvoiceStatus | 1 | false | - | integer | Status of the invoice | | TotalAmount | 1 | false | - | decimal | Total amount of the invoice | ### Example Requests |   | Value | | ------------ | ------------------------------------------------------------------ | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | ReplaceInvoice | | Description: | The operation reaplaces all invoice rows an the specified invoice. | | Notes: | N/A | ```xml USERNAME PASSWORD ReplaceInvoiceV10 SE 62396765 Article 11 Description 11 11 pcs 11 25 1234 ``` ```xml 5659.00 ReplaceInvoiceV10 1 121 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------------------------------- | :------------------------------------------------------ | | VALIDATION_INVOICE_NUMBER_REQUIRED | The InvoiceNumber field was not present in the request. | --- # Send Invoice Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/sendinvoice.md Resends the invoice to the end customer. If invoice rows have been changed, SendInvoice also automatically creates a new updated invoice with remaining articles and send the new invoice to the customer. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | :-------------------- | :--------- | :------- | :-- | :----- | :---------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | InvoiceNumber | 1 | false | 50 | string | The invoice number previously returned in AddInvoice. | | InvoiceDeliveryMethod | 1 | false | 4 | int | The way to notify the end customer. 1 = regular post (may result in fees to partner) 2 = e-mail | | Email | 1 | false | 260 | string | The email address to the end customer. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | :------------------------- | :--------- | :------- | :-- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ | | AvailableReservationAmount | 1 | true | 6,2 | decimal | The current available reservation amount. If fixed credit reservation is not used, 0 will be returned. | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | DueDate | 1 | true | - | datetime | The due date of the invoice. Only returned if the invoice is auto activated. | | InvoiceUrl | 1 | true | 200 | string | The url to invoice in pdf format. | | LowestAmountToPay | 1 | true | 6,2 | decimal | The lowest amount to pay on the invoice. Only returned if the invoice is auto activated. | | NewInvoiceNumber | 1 | true | 50 | string | The invoice number of the notification if it differs from the invoice number posted in the request, otherwise null. | | PaymentReference | 1 | true | 50 | string | The payment identification number. This is the id the customer must use when they do a payment of an invoice. Only returned if the invoice is auto activated. | | TotalAmount | 1 | true | 6,2 | decimal | The total amount to pay for the invoice. Only returned if the invoice is auto activated. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | SendInvoice | | Description: | The operation resends an invoice based on invoice number. | | Notes: | N/A | ```xml USERNAME PASSWORD 123 SE merchant@walley.se 2 63062459 1234 ``` ```xml 0 123 2020-05-10T23:59:59 https://minasidor-ci.tmtf.se/invoice?id=7eUheaZelqAOQ53UuivAUbm8cMwrkC2PRd9GA_bVGYfzNRyxWeFPa55-A9KBeFfN4DacrNbVpv6cVVNXk3m12tElU8taLLnDAdzMN7j4d56Kj-nT5ajm4OCWb7Qj-rIN&language=sv-SE 3510.00 100002403531655 3510.00 ``` ## Error codes | Fault Code | Description | | :---------------- | :------------------------------------------------ | | INVOICE_NOT_FOUND | When the specified Invoice number can’t be found. | --- # Set order number Source: https://dev.walleypay.com/docs/paymentsApi/integration/purchase-administration/setordernumber.md Provides the possibility to set a new Order number for a specific invoice. The order number can be used to search for a specific order in the Walley Merchant Hub. The invoice number is the number returned in the AddInvoice response. :::info Please Note It is only possible to set a new order number on an invoice in state Pending. Activated invoices cannot be updated with a new order number. ::: ### Request Parameters | Field | Occurs | nullable | Max | Type | Description | | -------------- | ------ | -------- | --- | ------ | --------------------------------------------------------------------------------------------------------------- | | Password | 1 | false | 50 | string | The password used to authorize the request. | | Username | 1 | false | 50 | string | The username used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for country. | | InvoiceNo | 1 | false | 10 | string | The invoice number returned from AddInvoice | | NewOrderNumber | 1 | false | 20 | string | The order's new identification that can be used to search for a
specific order in the Walley Merchant Hub. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ### Response Parameters | Field | Occurs | nullable | Max | Type | Description | | ------------- | ------ | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | ------------ | -------------------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | SetOrderNumber | | Description: | The operation sets a new or updates an existing order number of an invoice | | Notes: | N/A | ```xml USERNAME PASSWORD dff41cfc-5c36-4c10-9573-3a2c4c695d31 SE 68223728 Order123456 1234 ``` ```xml dff41cfc-5c36-4c10-9573-3a2c4c695d31 ``` ### Error Codes | Fault Code | Description | | :--------------------------------- | :------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Walley for more help | | INVOICE_NOT_FOUND | The specified invoice number cannot be found | | VALIDATION_COUNTRY_CODE_REQUIRED | Country code is not provided in the request | | VALIDATION_INVOICE_NUMBER_REQUIRED | Invoice number is ont provided in the request | --- # Activate Reservation Source: https://dev.walleypay.com/docs/paymentsApi/integration/reservations/activatereservation.md This operation activates a customer's pending reservation, which is created by the SetReservation function. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | IntegrationId | 1 | true | 128 | string | The integration ID is used to uniquely identify customers. Civic reg. numbers can be used for this, but are not mandatory. As long as the value entered is unique. No separators should be used, for example: - , . Only nillable if Regno is set. | | RegNo | 1 | true | 50 | string | Either civic registration number or organization number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | -------- | ----------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | ValidUntil | 1 | true | - | datetime | Date until the reservation is valid, null means indefinite. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | ActivateReservation | | Description: | The operation activates a pending reservation | | Notes: | N/A | ```xml USERNAME PASSWORD ActivateReservationV10 SE 195001182046 1234 ``` ```xml 10460.00 ActivateReservationV10 10000.00 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Cancel Reservation Source: https://dev.walleypay.com/docs/paymentsApi/integration/reservations/cancelreservation.md This operation cancels a previously approved reservation. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | IntegrationId | 1 | true | 50 | string | The integration ID is used to uniquely identify customers. Civic reg. numbers can be used for this, but are not mandatory. As long as the value entered is unique. No separators should be used, for example: - , . Only nillable if Regno is set. | | RegNo | 1 | true | 50 | string | Either civic registration number or organization number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | CancelReservation | | Description: | The operation cancels a reservation | | Notes: | N/A | ```xml USERNAME PASSWORD CancelReservationV10 SE 195001182046 1234 ``` ```xml CancelReservationV10 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Get Reservations Source: https://dev.walleypay.com/docs/paymentsApi/integration/reservations/getreservations.md This functionality returns information about previously made reservations. Several reservations can be returned. ## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | StoreId | 1 | true | 4 | short | The StoreId used for identification of store. | | CorrelationId | 1 | true | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. | | IntegrationId | 1 | true | 128 | string | The integration ID is used to uniquely identify customers. Civic reg. numbers can be used for this, but are not mandatory. As long as the value entered is unique. No separators should be used, for example: - , . Only nillable if Regno is set. | | RegNo | 1 | true | 50 | string | Either civic registration number or organization number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | StoreId | 1 | true | - | int | The StoreId used for identification of store. | ## Response | Field | min Occurs | nillable | Max | Type | Description | | ------------- | ---------- | -------- | --- | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | Reservations | 1 | true | - | [Reservation[]](#reservation) | A list of reservations for the customer associated with the given request. See “Reservation” under “Types” for more information. | #### Reservation | Parameter | Type | Max | Description | | :------------------------- | :------- | :-- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | AvailableReservationAmount | decimal | 6,2 | Available amount left on the reservation. If the reservation is pending then this will be zero. | | CustomerName | string | 50 | The name of the Customer. | | CustomerRegNo | string | 50 | The registration number of the Customer. | | CustomerStatus | string | - | Blocking status for the customer, e.g. blocked for purchase etc. If empty, customer is not blocked. BLOCKED = The customer is now blocked from making purchases. | | PendingUntil | datetime | - | The date and time when a pending reservation will be removed if no activation of the reservation has been done. Only used when a reservation need to be activated with the ActivateReservation API. Null means the reservation don’t have a pending state (directly activated). | | ProductCode | string | 50 | ProcuctCode used when creating the reservation if any. | | ReservedAmount | decimal | 6,2 | The reserved amount. | | Status | string | - | Returns the handling status of a reservation, available statuses see below | | StoreId | int | - | The storeId for where the reservation is available | | ValidUntil | datetime | - | The date and time when the reservation will be removed. Only used when a reservation exists for a limited time period. Null means the reservation has no timelimit. | #### Status codes - NO_RESERVATION = There is no reservation. - PENDING = The reservation is still not active and must be activated with the ActivateReservation API. - SIGNING = The reservation need to be signed, e.g. the agreement needs to be signed, and then activated with the ActivateReservation API. - REQUIRE_STRONG_CUSTOMER_VERIFICATION = The reservation need to be signed using BankID. Reservation is then automatically activated. - ACTIVE = The reservation is activated and can be used. ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | GetReservation | | Description: | The operation fetchs all reservations for a customer | | Notes: | N/A | ```xml USERNAME PASSWORD GetReservationsV10 SE 195001182046 1234 ``` ```xml GetReservationsV10 10460.00 FirstName LastName 5001182046 10000.00 ACTIVE 1234 ``` ### Error Codes Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) | Fault Code | Description | | :--------- | :---------- | --- # Reservations Source: https://dev.walleypay.com/docs/paymentsApi/integration/reservations/index.md A reservation is a way for your company to reserve a specific amount on a specific customer. This way you can be sure that as long as you do not exceed the reservation amount, the purchase will be approved without doing a new credit check. Please note that you will need an extended agreement with Walley to use this functionality.

Here you'll find descriptions of the following requests:
SetReservation
To create a new reservation, or update an existing one.
ActivateReservation
Used for activation of a reservation in status pending or signing.
GetReservation
Fetches information on a previously made reservation.
CancelReservation
Cancels a previously approved reservation.

:::info Please Note That the StoreId parameter is mandatory to include in the request if you are selling to more than one country or having both consumers and companies as customers. This is used to distinguish between them. :::

--- # Set Reservation Source: https://dev.walleypay.com/docs/paymentsApi/integration/reservations/setreservation.md Creates a new, or modifies an existing, reservation for a customer. A reservation is a fixed credit limit that a customer can make purchases within (AddInvoice) without additional credit checks.

A new reservation is created if no existing reservation is found and the customer passes the automatic credit check. An already existing reservation can be increased by requesting a higher amount, or decreased by requesting a lower. In the case of an increase a new credit check is performed and if successful the reserved amount is modified to match the new value. Decreasing the reservation amount will lower the reserved amount without triggering a new credit check.

Note that Walley's policy rules affects the lowest and highest amounts for which reservations can be created and modified. Contact Walley for details regarding these limits.

This functionality is only available in the following countries: Sweden, Norway, Finland and Denmark. The usage of this functionality must be agreed upon with Walley. Any purchases/invoices made before a reservation will be calculated into the AvailableAmount of the reservation.

This method is available in the following countries:
## Parameters | Field | min Occurs | nillable | Max | Type | Description | | ------------------------------- | ---------- | -------- | --- | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Username | 1 | false | 50 | string | The username used to authorize the request. | | Password | 1 | false | 50 | string | The password used to authorize the request. | | ClientIpAddress | 1 | false | 50 | string | The IP address of the customer performing the purchase at the partner's web shop. | | AdditionalInformation | 1 | true | - | [AdditionalInformation[]](/docs/paymentsApi/integration/creating-purchases/addinvoice#additionalinformation) | Used depending on agreement with Walley. | | CompanyEmailAuthorizedSignatory | 1 | true | 100 | string | Email to authorized signatory. | | CompanyPersonalGuarantee | 1 | true | - | boolean | Reg. no for authorized signatory. If CompanyPersonalGuarantee is enabled, the reg. no in this parameter will be used as personal guarantee reg. no. | | CompanyRegNoAuthorizedSignatory | 1 | true | 12 | string | Reg. no for authorized signatory. If CompanyPersonalGuarantee is enabled, the reg. no in this parameter will be used as personal guarantee reg. no. | | CorrelationId | 1 | false | 50 | string | CorrelationID is sent back in the response. | | CountryCode | 1 | false | 2 | string | The country code (ISO 3166-1 alpha-2) for the country. Supported values: `"SE"`, `"NO"`, `"FI"`, `"DK"`. | | CurrencyCode | 1 | false | 2 | string | The ISO 4217 code representation for the currency. | | CustomerAddress | 1 | true | - | [Address[]](/docs/paymentsApi/integration/commoninformation#address) | The invoice address where the invoice should be sent to. For private persons this must be the address where the person is registered. | | CustomerNumber | 1 | true | 20 | string | If the e-store wants to search for a customer by their
own customer id, this field can be used to specify
that number. Also shown on invoice. | | Email | 1 | true | 100 | string | Customer's email address | | IntegrationId | 1 | true | 128 | string | The integration ID can be assigned to customers in order to uniquely identify customers (instead of using Civic reg no). | | IntegrationIdDescription | 1 | true | 128 | string | A friendly description of the IntegrationId given. Shown on the invoice as the "buyer" instead of the IntegrationId value. Must be used in combination with IntegrationId. No separators should be used, for example: - , . | | MobilePhone | 1 | true | 20 | string | The customer's cellphone number. Must begin with "+" and country code e.g. +46. | | PhoneNumber | 1 | true | 20 | string | The customer's phone number | | ProductCode | 1 | true | 20 | string | The campaign product code. The product code is
determined by Walley. To use campaign products
an agreement with Walley must be made. | | RegNo | 1 | true | 12 | string | The customer civic registration number. Only nillable if an IntegrationId is set and has been assigned to the RegNo beforehand. | | ReservedAmount | 1 | false | 6,2 | decimal | The requested amount to reserve. If an existing reservation is found that reservations amount will be increased or decreased to the amount you send in. | | StoreId | 1 | false | - | int | The StoreId used for identification of store. | ## Response The response indicates if the customer is approved for the credit amount requested. If the purchase is approved, proceed with the purchase by invoking AddInvoice. | Field | min Occurs | nillable | Max | Type | Description | | --------------- | ---------- | -------- | --- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CorrelationId | 1 | true | 50 | string | CorrelationID from the request if any. | | ReservedAmount | 1 | true | 6,2 | decimal | Total amount reserved. | | AvailableAmount | 1 | true | 6,2 | decimal | Available amount left on the reservation. | | ValidUntil | 1 | true | - | datetime | Date until the reservation is valid, null means indefinite. | | PendingUntil | 1 | true | - | datetime | The date and time when a pending reservation will be removed if no activation of the reservation has been done. Only used when a reservation need to be activated with the ActivateReservation API. Null means the reservation don’t have a pending state (directly activated). | | Status | 1 | true | - | string | Returns the handling status of a reservation, the status can be: PENDING = The reservation is still not active, must be activated with the ActivateReservation API. ACTIVE = The reservation is directly activated. NO_RESERVATION = There is no reservation. SIGNING = The reservation need to be signed, eg. by BankID. | | ReservationId | 1 | true | - | string | The reservation's unique id. | | Address | 1 | true | - | [InvoiceAddress[]](../commoninformation.mdx#invoiceaddress) | Contains the address of the customer. | ### Response Headers #### Walley-Decision-Category :::info This header is only applicable to Norwegian (`CountryCode: "NO"`) reservations. It will not be returned for any other market. ::: When a Norwegian reservation is created or modified, the HTTP response includes a `Walley-Decision-Category` header containing the credit decision outcome. | Header | Value | Description | | -------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Walley-Decision-Category` | `Green` | Reservation approved without conditions. No additional message needs to be shown to the customer. | | `Walley-Decision-Category` | `Yellow` | Reservation approved on conditions. You **must** display the required Norwegian copy shown [below](#setreservation-required-confirmation-copy-yellow) to the customer on your order confirmation page. | Treat unknown values as `Green` so future categories do not break your integration. #### Required confirmation copy (Yellow) {#setreservation-required-confirmation-copy-yellow} When `Walley-Decision-Category` is `Yellow`, the following Norwegian copy must be displayed to the customer on your order confirmation page: | Walley-Decision-Category | Copy (NO) | | ------------------------ | ---------------------- | | **Yellow** | **Kjøpet ditt ble godkjent med vilkår**
Kreditten din er innvilget. Basert på vår vurdering av din samlede økonomi vurderer vi denne kreditten som moderat risiko for deg. Ved en vesentlig renteøkning kan du måtte gjøre tilpasninger i økonomien. | ## Reservation status The reservation status type is an enumeration value. Defined values are: - ACTIVE (0) – The reservation is active and ready to be used. - PENDING (1) – The reservation is pending and need to be activated. - NO_RESERVATION (2) – There is no reservation. - SIGNING (3) – The reservation needs to be signed by end customer. ### Example Requests |   | Value | | :----------- | :----------------------------------------------------------------- | | Environment: | UAT | | Service: | PaymentService | | URL: | https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl | | Function: | SetReservation | | Description: | The operation create a reservation for the customer | | Notes: | N/A | ```xml USERNAME PASSWORD 127.0.0.1 SetReservationV10 SE SEK Teststreet 1 C/O Address Test City SE FirstName LastName 12345 test@walley.se +461234567890 195109212224 5000 1234 ``` ```xml
Teststreet 1 Test City SE test@walley.se FirstName LastName +461234567890 +4631987654321 12345
0 SetReservationV10 9652602 10000.00 SIGNING
``` ```xml USERNAME PASSWORD 127.0.0.1 person@company.com true 195109212224 SetReservationV10 SE SEK BOX 11914 Göteborg Walley SE 40439 test@walley.se +461234567890 556597-0513 5000 9666 ``` ```xml
Teststreet 1 C/O Address Test CIty SE test@walley.se FirstName LastName +461234567890 12345
-170.00 SetReservationV10 9652660 5000.00 ACTIVE
``` ## Error codes | Fault Code | Description | | :----------------------------- | :-------------------------------------------------------------------------------------------------- | | AUTHORIZATION_FAILED | Could not authorize the request, check your login credentials. Please contact Walley for more help. | | INVALID_REGISTRATION_NUMBER | When the reg.no is not in a correct format. | | PERSONAL_GUARANTEE_NOT_ENABLED | Personal guarantee is enabled in the request, but Walley has not enabled the signing functionality. | If the error code you are looking for is not in the list above Please see separate page [Error Codes](/docs/paymentsApi/integration/error-codes) --- # API Versions Source: https://dev.walleypay.com/docs/paymentsApi/integration/versions.md Below you can find the version history for our API-only integration API:s ### PaymentService | Release Date | Version | Docs | | :--------------- | :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------- | | ** 2020-04-28 ** | ** V10 (Current) ** | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV10.svc?wsdl) | | 2019-04-04 | V9 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV9.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV9ReferenceGuide.pdf) | | 2018-10-29 | V8 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV8.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV8ReferenceGuide.pdf) | | 2018-10-12 | V7 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV7.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV7ReferenceGuide.pdf) | | N/A | V6 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV6.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV6ReferenceGuide.pdf) | | N/A | V5 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV5.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV5ReferenceGuide.pdf) | | N/A | V4 | [WSDL](https://ecommercetest.collector.se/v3.0/PaymentServiceV4.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankPaymentServiceV4ReferenceGuide.pdf) | ### InvoiceService | Release Date | Version | Docs | | :----------- | :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------- | | N/A | V33 | [WSDL](https://ecommercetest.collector.se/v3.0/InvoiceServiceV33.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankInvoiceServiceV3.3ReferenceGuide.pdf) | | N/A | V32 | [WSDL](https://ecommercetest.collector.se/v3.0/InvoiceServiceV32.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankInvoiceServiceV3.2ReferenceGuide.pdf) | | N/A | V31 | [WSDL](https://ecommercetest.collector.se/v3.0/InvoiceServiceV31.svc?wsdl) [PDF](/files-paymentsapi/CollectorBankInvoiceServiceV3.1ReferenceGuide.pdf) | ### InformationService | Release Date | Version | Docs | | :----------- | :----------------- | :---------------------------------------------------------------------------- | | N/A | ** V2 (Current) ** | [WSDL](https://ecommercetest.collector.se/v3.0/InformationServiceV2.svc?wsdl) | --- # Payments API Source: https://dev.walleypay.com/docs/paymentsApi/paymentsapi.md When you want full control over your user interface and offer your customers credit payment options. This is recommended if you don't have a platform or is interested to have more control over the Checkout Page. --- # Go Live Checklist Source: https://dev.walleypay.com/docs/paymentsApi/test-and-go-live.md Before we can inspect and approve your integration, you need to ensure that all check boxes below have been marked. Depending on what functionality you'll use, not all of them may be mandatory. Please go through the list and if you have any questions, feel free to contact us! ### Your website { content: "Walley texts are inserted in your terms and condition page", isChecked: true, }, { content: "A checkbox is located in the checkout where the customer accepts Walley's terms and conditions", isChecked: true, }, { content: "Prevention of duplicate purchases in the checkout by disabling the purchase button during postback", isChecked: true, }, { content: "Link to the end customer agreements (credit terms and SECCI) and data protection policy are displayed", isChecked: true, }, { content: "Showing proper error messages when needed", isChecked: true }, ]; ### Test purchase { content: "A test purchase has been made which contained the correct order data and the VAT amount", isChecked: true, }, { content: "A test purchase has been made with a negative amount", isChecked: true, }, { content: "For B2C in the AddInvoice request, made sure the invoice and delivery addresses always are the same", isChecked: true, }, ]; ### AddInvoice { content: "Made sure you're adding the correct customer information: phone number, e-mail address and customer number", isChecked: true, }, { content: "The Description parameter has a maximum of 50 characters", isChecked: true, }, { content: "Correct invoice fee is sent", isChecked: true }, { content: "Correct values are sent for ActivationOption, InvoiceDeliveryMethod and InvoiceType", isChecked: true, }, { content: "The amounts are limited to a maximum of two decimals", isChecked: true, }, { content: "If applicable, the CorrelationId parameter is unique", isChecked: true, }, { content: "Made sure you're saving the response from the request properly (and handling the possible invoice statuses. See 'Anti-fraud control' under 'Creating invoices' for more information on the possible statuses)", isChecked: true, }, { content: ( <> Made sure you show correct frontend messages when purchase is denied with an error code specified in the Error codes section ), isChecked: true, }, ]; ### Callback { content: "If using the Anti-fraud callbacks - made sure you're recieving the callback from Walley when an invoice changes status to either preliminary or rejected", isChecked: true, }, ]; ### ActivateInvoice { content: "Sending the correct InvoiceNumber, fetched from the AddInvoice response", isChecked: true, }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, { content: "VERY IMPORTANT - made sure no products are delivered before you've received a successful response from the request", isChecked: true, }, ]; ### PartActivateInvoice { content: "Sending the correct InvoiceNumber, fetched from the AddInvoice response", isChecked: true, }, { content: "Sending the correct list of articles for activation equivalent to the order rows being delivered (if not all of them should be sent)", isChecked: true, }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, { content: "Made sure you're saving the response from the request properly, including the new invoice number (this will contain all non-activated invoice rows)", isChecked: true, }, { content: "VERY IMPORTANT - made sure no products are delivered before you've received a successful response from the request", isChecked: true, }, ]; ### AdjustInvoice { content: "Sending the correct InvoiceNumber to be adjusted", isChecked: true, }, { content: "Sending the correct order data with negative value", isChecked: true, }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, ]; ### CancelInvoice { content: "Sending the correct InvoiceNumber to be canceled", isChecked: true, }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, ]; ### CreditInvoice { content: "Sending the correct InvoiceNumber to be credited", isChecked: true, }, { content: "Sending the correct CreditDate", isChecked: true }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, ]; ### PartCreditInvoice { content: "Sending the correct InvoiceNumber to be part credited", isChecked: true, }, { content: "Sending the correct list of articles to be credited (if not all of them should be credited)", isChecked: true, }, { content: "If applicable: the CorrelationId parameter is unique", isChecked: true, }, ]; --- # Austria Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/austria.md ### Test persons Austria ### ✔️ Approved test persons | Status | Approved | Approved | Approved | | :---------------- | :--------------------- | :----------------- | :-------------------- | | **First name** | Renate | Alexander | Sonja | | **Last name** | Horak | Kende | Baliko | | **Address** | Dietrichgasse 37/Stg 2 | Ungargasse 20/1/15 | Erdberger Lände 12/22 | | **Zip code** | 1030 | 1030 | 1030 | | **City** | Wien | Wien | Wien | | **Gender** | Female | Male | Female | | **Date of birth** | 19470127 | 19740809 | 19680715 | Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :---------------- | :------------------- | :--------------- | :----------- | | **First name** | Susanne | Hildegard | Gabriele | | **Last name** | Attwenger | Andres | Kaiser | | **Address** | Mitterhoferstrasse 5 | 4910 | 6874 | | **Zip code** | 4690 | 80939 | 76133 | | **City** | Schwanenstadt | Ried im Innkreis | Bizau | | **Gender** | Female | Female | Female | | **Date of birth** | 19621201 | 19311112 | 19510303 | --- # Denmark Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/denmark.md ### Test persons Denmark ### ✔️ Approved test persons Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :--------------- | :----------- | :------------ | :----------- | | **First name** | Rejected01 | Rejected28 | - | | **Last name** | Denmark01 | Denmark28 | - | | **Address** | Havnegade 87 | Pilekrogen 69 | - | | **Zip code** | 7600 | 1453 | - | | **City** | Struer | København K | - | | **Civ. reg. no** | 0101990001 | 0101990028 | 0202990029 | --- # Finland Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/finland.md ### Test persons Finland ### ✔️ Approved test persons Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :--------------- | :---------------- | :---------------- | :----------- | | **First name** | Rejected0A | Rejected | - | | **Last name** | Finland0A | Finland | - | | **Address** | Kankaanpääntie 71 | Kankaanpääntie 73 | - | | **Zip code** | 94700 | 94700 | - | | **City** | KEMI | KEMI | - | | **Civ. reg. no** | 010199-010A | 010190-090K | 020299-012U | --- # Germany Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/germany.md ### Test persons Germany ### ✔️ Approved test persons | Status | Approved | Approved | Approved | | :---------------- | :---------- | :----------- | :------------ | | **First name** | Haralambie | Emro | Ekuran | | **Last name** | Pelemis | Djordjev | Bersnak | | **Address** | Jägersweg 6 | Dörperfeld 7 | Lerchenweg 12 | | **Zip code** | 49757 | 42555 | 23562 | | **City** | Werlte | Velbert | Lübeck | | **Gender** | Male | Male | Male | | **Date of birth** | 19781210 | 19700210 | 19520610 | Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :---------------- | :------------- | :--------------------- | :-------------- | | **First name** | Max | Max | Max | | **Last name** | Göx | Mayer-Dornfelder | Murkel | | **Address** | Kaiserstr. 217 | Freisinger Landstr. 74 | Riefstahlstr. 9 | | **Zip code** | 76133 | 80939 | 76133 | | **City** | Karlsruhe | München | Karlsruhe | | **Gender** | Male | Male | Male | | **Date of birth** | 19680209 | 20000208 | 19580207 | --- # The Netherlands Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/netherlands.md ### Test persons The Netherlands ### ✔️ Approved test persons | Status | Approved | | :------------- | :---------- | | **First name** | Myfirstname | | **Last name** | Mylastname | | **Address** | Mystreet 1 | | **Zip code** | 1234AB | | **City** | Mytown | Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | | :------------- | :------------- | | **First name** | Otherfirstname | | **Last name** | Otherlastname | | **Address** | Otherstreet 2 | | **Zip code** | 5555AB | | **City** | Mytown | --- # Norway Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/norway.md ### Test persons Norway ### ✔️ Approved test persons Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :--------------- | :------------ | :------------- | :----------- | | **First name** | Rejected49 | Rejected68 | - | | **Last name** | Norway49 | Norway68 | - | | **Address** | RADARVEIEN 22 | RADARVEIEN 100 | - | | **Zip code** | 1152 | 1152 | - | | **City** | OSLO | OSLO | - | | **Civ. reg. no** | 01019949849 | 01019949768 | 02029949959 | --- # Sweden Source: https://dev.walleypay.com/docs/paymentsApi/testpersons/sweden.md ### Test persons Sweden ### ✔️ Approved test persons Any civic reg. no. can be used for testing purposes, as long as it is in a standard format, and the test person is above 18 years of age. ### 🚫 Rejected test persons | Status | Not approved | Not approved | Not approved | | :--------------- | :----------- | :----------- | :----------- | | **First name** | Rejected00 | Rejected18 | - | | **Last name** | Sweden00 | Sweden18 | - | | **Address** | STORGATAN 2 | STORGATAN 3 | - | | **Zip code** | 84093 | 84093 | - | | **City** | HEDE | HEDE | - | | **Civ. reg. no** | 9901010000 | 9901010018 | 9902020024 | --- # Post-purchase Source: https://dev.walleypay.com/docs/post-purchase/overview.md The purchase is only the first step. After it, you ship and capture, you handle returns, and you match the payout against your books. These three APIs cover the rest of the order's life, and they work the same way no matter which Walley product created it.

📦 Management API

Act on an order once it exists. Capture what you ship, refund what comes back, change it before it leaves the warehouse, and read its current state whenever you need to.

💰 Settlements

Get the payout report that explains what Walley paid you and why. Fetch it with the Reports API or download it from Merchant Hub.

🔔 Webhooks

Let Walley call your system when something changes: an order is updated, an authorization comes through, a settlement is ready.

## Common tasks The scenarios most merchants build first, walked through end to end.

✏️ Change an order

Adjust items or amount before anything is captured.

🚚 Deliver an order

Capture on shipment, in full or in parts.

↩️ Refund a return

Give money back, in full or per item.

🧾 Reconcile a payout

Find a settlement and read the transactions on it.

## How the pieces fit together 1. A payment is created, by [Walley Checkout](/docs/checkout/overview), Pay Link, a token charge or the [Payments API](/docs/paymentsApi/getting-started/). 2. Your system acts on the order through the [Management API](/docs/manage/getting-started/overview). Capture is what triggers the payout. 3. [Webhooks](/docs/webhooks/overview) tell you when the order changes, including changes made in Merchant Hub or by Walley. 4. Captures, returns and fees land on a [settlement](/docs/reports/overview) that you reconcile against your ledger. ## Before you integrate - Both APIs use OAuth2 client credentials. Create the API key in [Merchant Hub](/docs/merchanthub/access/apikeys), then read [Management API authentication](/docs/manage/getting-started/authentication) or [Reports API authentication](/docs/reports/authentication). - Point at the test environment first. See [Management API endpoints](/docs/manage/getting-started/endpoints) and [Reports API endpoints](/docs/reports/endpoints). - Webhook URLs are registered in [Merchant Hub](/docs/merchanthub/access/webhooks), not through an API. - Changes are applied asynchronously. Read [Asynchronous operations](/docs/manage/concepts/asynchronous-operations) before you build retries, and [Order lifecycle](/docs/manage/concepts/order-lifecycle) to know which actions an order accepts. ## Getting access Your organization needs access to these services before you can create an API key. Contact Merchant Services to get set up. :::info CONTACT DETAILS **[help@walley.se](mailto:help@walley.se)**
**[+46 10 161 01 25](tel:+46101610125)** ::: --- # Authentication Source: https://dev.walleypay.com/docs/reports/authentication.md To protect your data and users, Walley uses Microsoft Azure AD B2C as an authentication service provider. To gain access to the API you must identify your application against this service to obtain a token that you use to identify your application against our APIs. > Microsoft Azure AD B2C follows the OAuth2 standard. To integrate with the Walley API, you use the **Client Credentials** flow. > [Read more about the Client Credentials flow](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) --- # Endpoints Source: https://dev.walleypay.com/docs/reports/endpoints.md The examples throughout this documentation point to the testing endpoints to avoid mistakes. Make sure to use the production endpoints when you move to production. ## Testing endpoints | Product | Endpoint | Description | | ----------------------- | ------------------------------------------------- | ------------------------------------------------ | | Reports API | `https://api.uat.walleydev.com/reports` | Base URI for fetching different kinds of reports | | Authentication endpoint | `https://api.uat.walleydev.com/oauth2/v2.0/token` | Read about [Authentication](./authentication) | ## Production endpoints | Product | Endpoint | Description | | ----------------------- | --------------------------------------------- | ------------------------------------------------ | | Reports API | `https://api.walleypay.com/reports` | Base URI for fetching different kinds of reports | | Authentication endpoint | `https://api.walleypay.com/oauth2/v2.0/token` | Read about [Authentication](./authentication) | --- # Overview Source: https://dev.walleypay.com/docs/reports/overview.md A settlement is the payout Walley makes to you, together with the report that explains it. The report lists every purchase, return, adjustment and fee for the period, so you can match the money in your bank account against the orders in your own system. ## Getting the data

🔎 Reports API

Find your settlements, read the transactions on each one and download the PDF. Best fit when you want the data in your ERP or accounting system.

📊 Merchant Hub

Download the PDF and CSV files by hand. Filter by period, payout date, currency, reference and store. No integration needed.

🔔 Settlement webhook

Subscribe to walley:settlement:created and let Walley tell you the moment a new settlement is ready to fetch.

## Start here 1. [How settlements work](/docs/reports/settlements-api/settlements) explains what moves a payout up or down, how often you are settled, and what the PDF and CSV files contain. 2. [Endpoints](/docs/reports/endpoints) lists the test and production base URIs. 3. [Authentication](/docs/reports/authentication) walks through the OAuth2 client credentials flow. You create the API key in [Merchant Hub](/docs/merchanthub/access/apikeys). 4. [Settlement search](/docs/reports/settlements-api/search) returns your settlements and the ID you need for every other call. --- # Settlement PDF Source: https://dev.walleypay.com/docs/reports/settlements-api/pdf.md Download the PDF report for each settlement made by Walley. Each settlement generates a PDF file that aggregates all transactions and fees (if any), giving you an overview of the transactions for the settlement period. Example of PDF settlement file ```http GET /reports/settlements/{{settlementId}}/file/pdf HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```http HTTP/1.1 200 OK /* PDF file */ ``` | Http status code | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------- | | 200 | Successful request | | 401 | Token missing, expired, or invalid. See [Authentication](/docs/reports/authentication) | | 403 | No permission for this store | | 404 | PDF not found | ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/reports/authentication) for how to generate the Bearer token value | ### Response ```text File stream ``` --- # Settlement search Source: https://dev.walleypay.com/docs/reports/settlements-api/search.md Find settlement reports for all your stores. Walley creates one settlement report each time a store is settled according to your agreement. ## Example ```http GET /reports/settlements?page=1&perPage=1 HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```json { "data": [ { "id": "1", "startDate": "2022-12-30T00:00:00", "endDate": "2022-12-30T00:00:00", "storeId": 1, "ingoingBalance": 0.0, "totalAmount": 100000.0, "currency": "SEK", "netSales": 100000.0, "paidOutAt": "2023-01-02T11:00:10.000000+01:00", "generatedAt": "2023-01-02T11:00:10.000000+01:00", "captured": 103000.0, "refunded": -3000.0, "reference": "2134", "compensations": 0.0, "adjustments": 0.0, "links": { "pdf": { "method": "GET", "href": "/reports/settlements/1/file/pdf", "query": "" }, "transactions": { "method": "GET", "href": "/reports/settlements/1/transactions", "query": "" } } } ], "links": { "self": { "method": "GET", "href": "/settlements?page=1&perPage=1", "query": "page=1&perPage=1" }, "next": { "method": "GET", "href": "/settlements?page=2&perPage=1", "query": "page=2&perPage=1" } }, "metaData": { "totalNumberOfRecords": 100, "numberOfPages": 100, "currentPage": 1, "range": { "from": 1, "to": 1 } } } ``` | Http status code | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------- | | 200 | Successful request | | 401 | Token missing, expired, or invalid. See [Authentication](/docs/reports/authentication) | | 409 | Request with same idempotency key already in progress | | 422 | Query with incorrect format | ## Data Model ### Request #### Request headers | Header | Required | Explanation | | ----------------- | -------- | -------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/reports/authentication) for how to generate the Bearer token value | #### Request querystrings | Parameter | Required | Explanation | | ----------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | **page** | No | Page of items that should be returned in request. Default is 1 | | **perPage** | No | Number of items to be returned in each request. Largest allowed value is 1000, default is 10 | | **query** | No | Used for free text search or specific property value search. See [Request examples](#request-examples) | #### Request examples The **query** parameter can be used in the request to filter settlement reports on the [properties](/docs/reports/settlements-api/search#properties). :::note `%20` is a URL-encoded space The example URLs below encode every space in the query as `%20`. ::: ##### By date and periods Reports that have **startDate** after the date 2022-12-17. This is equal to the search `startDate:>2022-12-17`. ```text /reports/settlements?query=startDate:>2022-12-17&page=1&perPage=30 ``` Reports that have **startDate** before the date 2022-12-17. This is equal to the search `startDate:<2022-12-17`. ```text /reports/settlements?query=startDate:<2022-12-17&page=1&perPage=30 ``` Reports with the **startDate** 2022-12-30 and **endDate** 2022-12-30. This is equal to the search `startDate:2022-12-30 AND endDate:2022-12-30`. ```text /reports/settlements?query=startDate:2022-12-30%20AND%20endDate:2022-12-30&page=1&perPage=30 ``` Reports between **startDate** 2022-12-01 and **endDate** 2022-12-08. This is equal to the search `startDate:>=2022-12-01 AND endDate:<=2022-12-08`. ```text /reports/settlements?query=startDate:>=2022-12-01%20AND%20endDate:<=2022-12-08&page=1&perPage=30 ``` ##### By currency Reports with the **currency** SEK. ```text /reports/settlements?query=currency:SEK&page=1&perPage=30 ``` ##### By store Reports from the **storeId** 4567. ```text /reports/settlements?query=storeId:4567&page=1&perPage=30 ``` ##### By settlement reference Reports with the **reference** 2134. ```text /reports/settlements?query=reference:2134&page=1&perPage=30 ``` ##### Combined properties Reports between the time period **startDate** 2022-12-01 and **endDate** 2022-12-08 with currency SEK. Equal to `startDate:>=2022-12-01 AND endDate:<=2022-12-08 AND currency:SEK`. ```text /reports/settlements?query=startDate:>=2022-12-01%20AND%20endDate:<=2022-12-08%20AND%20currency:SEK&page=1&perPage=30 ``` Reports from the **storeId** 1158 with currency SEK. Equal to `storeId:1158 AND currency:SEK`. ```text /reports/settlements?query=storeId:1158%20AND%20currency:SEK&page=1&perPage=30 ``` ### Response `response.data` object is an array of the following structure: ```json { "id": "1", "startDate": "2022-12-30T00:00:00", "endDate": "2022-12-30T00:00:00", "storeId": 1, "ingoingBalance": 0.0, "totalAmount": 100000.0, "currency": "SEK", "netSales": 100000.0, "paidOutAt": "2023-01-02T11:00:10.000000+01:00", "generatedAt": "2023-01-02T11:00:10.000000+01:00", "captured": 103000.0, "refunded": -3000.0, "reference": "2134", "compensations": 0.0, "adjustments": 0.0, "links": { "pdf": { "method": "GET", "href": "/reports/settlements/1/file/pdf", "query": "" }, "transactions": { "method": "GET", "href": "/reports/settlements/1/transactions", "query": "" } } } ``` ### Properties | Property | Explanation | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | **id** | The id of the settlement | | **startDate** | The start date of captures and refunds that are included in the settlements | | **endDate** | The end date of captures and refunds that are included in the settlements | | **storeId** | The id of the store that has been settled | | **ingoingBalance** | If the previous settlement had a negative balance, it is carried over to the following settlement | | **totalAmount** | The amount that will be paid out for the period | | **currency** | The currency of the settled purchases | | **netSales** | The net sales during the settled period | | **paidOutAt** | The date of the payout | | **generatedAt** | The date and time the settlement was generated | | **captured** | The captured amount during the settlement period | | **refunded** | The returned amount during the settlement period | | **reference** | The settlement reference (only shown for merchants with settlement reference option activated) | | **compensations** | The sum of all Walley fees for the settlement period | | **adjustments** | Settlement adjustments. See [Manual adjustment types](/docs/reports/settlements-api/settlement-types#manual-adjustment-types) | | **links.transactions** | The URL for retrieving all the settled transactions | | **links.pdf** | The URL for retrieving the settlement's PDF file. Depending on setup, it might not be available. | --- # Settlement types Source: https://dev.walleypay.com/docs/reports/settlements-api/settlement-types.md Definitions for all settlement transaction types ## Types | Name | Description | | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | Credited customer fees | A financial fee has been credited for the end customer by the merchant. The amount will be deducted from the payout. | | DirectPayment | A payment has been manually added to an end customer invoice and deducted from the payout. Only used when explicitly requested. | | PurchaseAmountAdjustment | An adjustment of the purchase amount has been registered. The amount will be adjusted on the payout. It can both be negative and positive. | | Purchase | A regular purchase has been registered. The amount will be paid out. | | Return | A return has been registered. The amount will be deducted from the payout. | | Kickback (%) | A percentage kickback added to the payout. Based on the agreement. | | Kickback | A fixed kickback added to the payout. Based on the agreement. | | Transaction fee, subject to VAT | A fixed fee per transaction. Deducted from the payout. | | Service fee, subject to VAT | A percentage fee of the transaction. Deducted from the payout. | | Fee for requested invoice print, subject to VAT | A fee for an invoice that was explicitly requested to be printed and sent by mail. The amount will be deducted from the payout. | | SettlementVatCost | The VAT amount on the fees that are subject to VAT. | ## Manual adjustment types Manual adjustments are performed by Walley's Financial Administration department. | Name | Description | | ------------------------------------- | ------------------------------------------------------------------------------------------------------ | | CostPerTransactionAdjustment | An adjustment of the transaction fee. | | DebtCollectionFeeAdjustment | An adjustment of the fee that is charged when withdrawing debts from debt collection. | | DepositAdjustment | An adjustment of a deposit. | | ExportedNotificationToPrintAdjustment | An adjustment of the fee for a printed invoice. | | FeeAdjustment | An adjustment of a financial fee. | | InvoicedAdjustment | An adjustment of a manually sent invoice. Will create a 0-adjustment together with another adjustment. | | KickbackAdjustment | An adjustment of a kickback that has been paid out, outside of the settlement. | | MixedAdjustment | An adjustment that is used to make other types of adjustments. | | ServiceFeeAdjustment | An adjustment of the service fee. | | VatAdjustment | An adjustment of the VAT. | --- # How settlements work Source: https://dev.walleypay.com/docs/reports/settlements-api/settlements.md You receive settlements according to your agreement with Walley. ## Frequency Available settlement frequency options are: - `Daily (business days)` - `Weekly` - `Monthly` ## How it works in practice ### Activation An invoice can be fully or partly activated, depending on whether you deliver the complete order or not. Activation is what the Management API calls [capture](/docs/manage/orders/capture). The settled amount equals the total amount of the activated order rows. All activations are specified in the settlement files. ### Returns An invoice can be fully or partially returned. The returned amount is deducted from the next settlement amount (activations minus returns). All returns are specified in the settlement files. ### Fees Depending on your agreement, fees are either deducted from the payout to the specified bank account or invoiced separately each month. The CSV settlement file always contains the full order amount, so the settlement sum corresponds to the amount in your ERP system. Whether the fees are shown in the CSV file depends on which file type specification is agreed and used (see [Report file type specification](#report-file-type-specification) below). ## Report retrieval There are two ways of getting the settlement files: 1. Download settlement data via the [Reports API](/docs/reports/endpoints). Access to the API is set up through the Merchant Hub; see [Authentication](/docs/reports/authentication) for how to get started. 2. Download the settlement files from the Merchant Hub. Log in, open **Reports** in the navigation menu, and filter the reports by date period, payout date, currency, reference, and store. You need the Read permission for `Report Management` to see the page, and the Write permission to download the settlement files. Contact Merchant Services for access to the Merchant Hub. ### Report file naming The CSV file name has the following format: ```text {Companyname}_{CountryCode}_{FromDate}-{ToDate}_settlement_{SettlementId}.csv ``` For example: `TestPartner 3.0_SE_170814-170815_settlement_48094.csv` This settlement contains data for the merchant "TestPartner 3.0" in Sweden, from the 14th and 15th of August 2017. ### Report file type specification See [Settlement types](/docs/reports/settlements-api/settlement-types) for details of the type specifications. Each settlement consists of two file types: one PDF and one or more CSV files. The PDF file aggregates all transactions and fees (if any), giving you an overview of the transactions for the settlement period as a specification of transaction types with an aggregated count to present the end balance. The CSV file contains information about each transaction. Walley offers two ways of generating the CSV file; see the examples below. #### CSV Regular The regular CSV file is the standard option. It lists transactions (Purchases, Returns, Adjustments, and so on), but no Walley fees or commission. File type example: Example of CSV file with all transactions for the period #### CSV Extended The extended CSV file can be used instead of the regular type. It lists transactions (Purchases, Returns, Adjustments, and so on) and all Walley fees, if your agreement deducts fees on settlement. All fees are listed directly under each transaction. #### PDF file Each settlement generates a PDF file that aggregates all transactions and fees (if any), giving you an overview of the transactions for the settlement period. Example of PDF settlement file ### Current settlement integrations Walley partners that offer plug-and-play settlement integrations: - [Automatisera Mera](https://automatiseramera.se/integrations/fortnox) supports Fortnox - [PSP Connect](https://www.n3vis.com/) supports Business Central - [Sharespine](https://www.sharespine.com/sv/anslutna-system/betalvaxlar/walley/?con=pay-walley&masterProducts=ECOMMERCE&masterPrices=ERP&masterStock=ERP&createInvoice=true&oss=false&return=false&private=false) supports Fortnox, Visma eEkonomi, Visma Administration, Visma eAccounting, and Visma.NET --- # Settlement transactions Source: https://dev.walleypay.com/docs/reports/settlements-api/transactions.md Retrieve the transactions included in a settlement. ## Example ```http GET /reports/settlements/{{settlementId}}/transactions?page=1&perPage=1&includeProductCode=false HTTP/1.1 Host: api.uat.walleydev.com // Test environment. Production uses a different hostname. Authorization: Bearer bXlVc2VybmFtZTpmN2E1ODA4MGQzZTk0M2VmNWYyMTZlMDE... ``` ```json { "data": [ { "customerNumber": "", "firstName": "Test", "lastName": "Test", "amount": 1000.0, "purchaseDate": "2022-01-01", "transactionDate": "2020-01-01", "orderNumber": "TEST_230116_011045", "invoiceNumber": "11111111", "type": "Purchase", "totalVatAmountPerRate": [ { "vatRate": 25.0, "amount": 180 }, { "vatRate": 6.0, "amount": 5.66 } ], "currency": "SEK", "settlementDate": null, "payoutReference": null, "actionReference": null, "orderId": "4f35934d-dcf7-4929-b1ec-179155a6db58", "productCode": "DI001" } ], "links": { "self": { "method": "GET", "href": "/settlements?page=1&perPage=1", "query": "page=1&perPage=1" }, "next": { "method": "GET", "href": "/settlements?page=2&perPage=1", "query": "page=2&perPage=1" } }, "metaData": { "totalNumberOfRecords": 100, "numberOfPages": 100, "currentPage": 1, "range": { "from": 1, "to": 1 } } } ``` ## Data Model ### Request #### Request path | Path | Required | Explanation | | ---------------- | -------- | ------------------------------------------------ | | **settlementId** | Yes | The id for the requested settlement transactions | #### Request headers | Header | Required | Explanation | | ----------------- | -------- | -------------------------------------------------------------------------------------------------------- | | **Authorization** | Yes | See [Authentication](/docs/reports/authentication) for how to generate the Bearer token value | | **Accept** | No | The default response format is JSON. To return transactions in CSV format, set the Accept header to `text/csv` | :::note CSV responses use the settlement file format With `Accept: text/csv`, the response follows the same format as the example files on the [Settlements page](/docs/reports/settlements-api/settlements). ::: #### Request querystrings | Parameter | Required | Explanation | | ---------------------- | -------- | ----------------------------------------------------------------------------- | | **page** | No | Page of items that should be returned in request | | **perPage** | No | Number of items to be returned in each request. Largest allowed value is 5000 | | **includeProductCode** | No | Specify whether you want productCode values in the response. Defaults to false | ### Response #### Possible responses | Http status code | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------- | | 200 | Successful request | | 401 | Token missing, expired, or invalid. See [Authentication](/docs/reports/authentication) | | 403 | No permission for this store | | 404 | Transactions not found | | 409 | Request with same idempotency key already in progress | | 422 | Query with incorrect format | #### Response body from 200 OK `response.data` object is an array of the following structure: ```json { "customerNumber": "", "firstName": "Test", "lastName": "Test", "amount": 1000.0, "purchaseDate": "2022-01-01", "transactionDate": "2020-01-01", "invoiceNumber": "11111111", "orderNumber": "TEST_230116_011045", "type": "Purchase", "totalVatAmountPerRate": [ { "vatRate": 25.0, "amount": 180 }, { "vatRate": 6.0, "amount": 5.66 } ], "currency": "SEK", "settlementDate": null, "payoutReference": null, "actionReference": null, "orderId": "4f35934d-dcf7-4929-b1ec-179155a6db58", "productCode": "DI001" } ``` | Property | Explanation | Comment | | ------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------------------- | | **customerNumber** | Custom value that can be provided at purchase | | | **firstName** | The customer's first name for B2C, the company name for B2B | | | **lastName** | The customer's last name for B2C, empty for B2B | | | **amount** | Transaction amount | | | **purchaseDate** | The date when the purchase was captured | | | **transactionDate** | Custom date value provided at purchase | In SOAP OrderDate | | **invoiceNumber** | The purchase invoice number | | | **orderNumber** | Custom value that can be provided at purchase | In checkout reference | | **type** | [Settlement types](/docs/reports/settlements-api/settlement-types) | | | **totalVatAmountPerRate** | The amount of VAT paid for each VAT rate | | | **currency** | The purchase currency | | | **settlementDate** | The date the settlement is created | Only available when extended CSV is configured | | **payoutReference** | The reference used for the bank payout | Only available when extended CSV is configured | | **actionReference** | Custom value that can be provided when purchase is captured or refunded | Only available when extended CSV is configured | | **orderId** | The id of the order associated with the transaction | Available on type `Purchase`, `Return` and `PurchaseAmountAdjustment` | | **productCode** | The product code associated with the transaction | Possibly empty. Included if includeProductCode query param is true | --- # Walley logos Source: https://dev.walleypay.com/docs/wallify.md Here you find the links to our amazing Walley logos. Please display them on your site, i.e on the information page or the web page footer, for marketing materials, and in your checkout together with the payment method or wherever you need to show a logo. ## Walley logo The Walley logo is a minimalistic sign, with a characteristic wing on the W, designed to be easily read, distinct and to be clearly displayed in various applications and contexts. The logo design with the W-wing, reflects our brand personality as a competent and dedicated partner, committed to make our merchants feel that they are part of a winning team. ### Resource location Please link directly to the Walley CDN to ensure the image stays updated. The logo is delivered in SVG format and is fully scalable. | Badge Type | Url | | -------------------- | ----------------------------------------------- | | Standard | https://cdn.walleypay.com/logo/walley-black.svg | | For dark backgrounds | https://cdn.walleypay.com/logo/walley-white.svg | ## Walley logo badge for Walley Checkout For the Walley Checkout badge — with an interactive preview, all locale and variant options, and copy-pasteable HTML — see [Branding resources](/docs/checkout/branding-resources). ## Alternative Walley logos ### Walley Lasku/Tililuotto When you promote the Lasku/Tililuotto payment method in Finland you may use this version of the Walley logo. #### Resource location Please link directly to the CDN to ensure the image stays updated. The logo is delivered in SVG format and is fully scalable. | Badge Type | Url | | -------------------- | ---------------------------------------------------------------- | | Standard | https://cdn.walleypay.com/logo/walley-lasku-tililuotto-black.svg | | For dark backgrounds | https://cdn.walleypay.com/logo/walley-lasku-tililuotto-white.svg | --- # Walley banners Source: https://dev.walleypay.com/docs/wallify/banners.md We are happy to provide you these banners, for use on your website, newsletters, social media or other promotional purpose. The banners come in both static and motional versions, to fit any application. Feel free to use these banners whenever you need to promote Walley as your preferred payment solution! ### Name change banners
| Swedish | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-140x350.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-200x200.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-250x250.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-300x250.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-320x50.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-400x400.png | | https://cdn.walleypay.com/banner/se/walley-banner-1-se-980x120.png | | Norwegian | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-140x350.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-200x200.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-250x250.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-300x250.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-320x50.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-400x400.png | | https://cdn.walleypay.com/banner/no/walley-banner-1-no-980x120.png | | Finnish | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-140x350.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-200x200.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-250x250.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-300x250.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-320x50.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-400x400.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-486x60.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-728x90.png | | https://cdn.walleypay.com/banner/fi/walley-banner-1-fi-980x120.png | ### Generic banners
| Swedish | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-140x350.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-200x200.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-250x250.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-300x250.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-320x50.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-400x400.png | | https://cdn.walleypay.com/banner/se/walley-banner-2-se-980x120.png | | Norwegian | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-140x350.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-200x200.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-250x250.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-300x250.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-320x50.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-400x400.png | | https://cdn.walleypay.com/banner/no/walley-banner-2-no-980x120.png | | Finnish | | ------------------------------------------------------------------ | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-140x350.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-200x200.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-250x250.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-300x250.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-320x50.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-400x400.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-486x60.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-728x90.png | | https://cdn.walleypay.com/banner/fi/walley-banner-2-fi-980x120.png | --- # Walley contact information Source: https://dev.walleypay.com/docs/wallify/contact.md Here are the ways to reach us when you need help
### Customer service B2C - hello@walley.se - hello@walley.no - hello@walley.fi - hello@walley.dk - hello@walleypay.de ### Customer service B2B - b2b@walley.se - b2b@walley.no - b2b@walley.fi ### My Pages - [Walley-App Android](https://play.google.com/store/apps/details?id=com.walleypay.app&hl=en&gl=US) - [Walley-App IOS](https://apps.apple.com/se/app/walley/id1569382782)   - [my.walley.se](https://my.walley.se) - [my.walley.no](https://my.walley.no) - [my.walley.fi](https://my.walley.fi) - [my.walley.dk](https://my.walley.dk) - [my.walleypay.de](https://my.walleypay.de) ### If you need to contact us at Merchant Support - help@walley.se - help@walley.no - help@walley.fi :::info Please note Please don’t send the Merchant Support email address to your customers, they are for your use only 🙂 ::: --- # Walley instore Source: https://dev.walleypay.com/docs/wallify/instore.md For our merchants that have a Walley payment solution in stores, we have preproduced in-store material. The material is intended to be displayed in store for promotion, or to be handed out to inform your customers about the invoice/credit possibilities, credit terms and conditions. The material listed below has a genereic Walley design, with a placeholder for your own company logotype. Please contact Merchant Support if you are interested in in-store material for you shop. Länka till CDN --- # Walley newsletter Source: https://dev.walleypay.com/docs/wallify/newsletter.md To inform your customers about the brand change, feel free to use Walleys pre-made newsletter draft. You may do any changes and adaptations to match your company’s brand and communication.
### Newsletters - [Newsletter Swedish](https://cdn.walleypay.com/template/walley-newsletter-draft-se.docx) - [Newsletter Norwegian](https://cdn.walleypay.com/template/walley-newsletter-draft-no.docx) - [Newsletter Finnish](https://cdn.walleypay.com/template/walley-newsletter-draft-fi.docx) ### Social media videos Explainer videos for social media to inform your customers that Collector’s payment solutions are changing name to Walley. These are free to publish on any platform. Add descriptive caption text of your choice - [Social media video Swedish](https://cdn.walleypay.com/video/CollectorBanks_betallosningar_byter_namn-se.mp4) - [Social media video Norwegian](https://cdn.walleypay.com/video/CollectorBanks_betalingslosninger_skifter_navn-no.mp4) - [Social media video Finnish](https://cdn.walleypay.com/video/CollectorBankin_maksuratkaisujen_uudeksi_nimeksi-fi.mp4) - [Social media video English](https://cdn.walleypay.com/video/CollectorBank_payment_solution_changes_name-en.mp4) --- # Webhooks for authorizations Source: https://dev.walleypay.com/docs/webhooks/authorizations.md These webhooks are related to the authorization flow ## Events ### walley:authorization:created This webhook is triggered whenever an authorization is created using the [authorization endpoint](/docs/checkout/tokenization/authorization). ```json { "Type": "walley:authorization:created", "Timestamp": "2024-01-30T10:02:31.2700113+00:00", "Payload": { "CustomerToken": "0a96881b-295a-4154-a867-865fc912619c", "AuthorizationId": "c31e9218-6a19-4b2f-8992-affc9dca1c41", "Reference": "01478520", "ActionReference": "Action 1234", "CreatedOn": "2024-01-30T10:02:31.2700113+00:00" } } ``` **Do** - Set internal status to `CREATED`. **Do not** - Treat this event as an authorization success or "funds reserved". It only indicates the authorization process has started. ### walley:authorization:authorized This webhook is triggered whenever an authorization is successful, and will be closely followed by a [walley:order:created webhook](/docs/webhooks/orders#walleyordercreated). ```json { "Type": "walley:authorization:authorized", "Timestamp": "2024-01-30T10:02:31.2700113+00:00", "Payload": { "CustomerToken": "0a96881b-295a-4154-a867-865fc912619c", "AuthorizationId": "c31e9218-6a19-4b2f-8992-affc9dca1c41", "Reference": "01478520", "ActionReference": "Action 1234", "CreatedOn": "2024-01-30T10:02:31.2700113+00:00" } } ``` **Do** - Update internal status to `AUTHORIZED`. - Expect and handle the subsequent `walley:order:created` webhook to obtain the `OrderId` required for downstream order operations. **Operational guidance** - Alert if `walley:authorization:authorized` arrives but `walley:order:created` does not arrive within a reasonable time window. ### walley:authorization:retrying This webhook is triggered whenever an authorization was unsuccessful, but there will be additional attempts according to the AttemptSchedule provided when creating the [authorization](/docs/checkout/tokenization/authorization). ```json { "Type": "walley:authorization:retrying", "Timestamp": "2024-01-30T10:02:31.2700113+00:00", "Payload": { "CustomerToken": "0a96881b-295a-4154-a867-865fc912619c", "AuthorizationId": "c31e9218-6a19-4b2f-8992-affc9dca1c41", "Reference": "01478520", "ActionReference": "Action 1234", "CreatedOn": "2024-01-30T10:02:31.2700113+00:00", "CurrentAttempt": 1, "MaxAttempt": 5, "Reason": "SERVICE_UNAVAILABLE" } } ``` **Do** - Update internal status to `RETRYING`. - Consider customer communication for customer-actionable reasons. **Do not** - Immediately create a new authorization on first failure; this webhook indicates Walley is already continuing attempts. ### walley:authorization:failed This webhook is triggered whenever an authorization was unsuccessful, and no further attempt will be performed. Either because this was the last attempt in the AttemptSchedule, or because we deemed the failure unsolvable. ```json { "Type": "walley:authorization:failed", "Timestamp": "2024-01-30T10:02:31.2700113+00:00", "Payload": { "CustomerToken": "0a96881b-295a-4154-a867-865fc912619c", "AuthorizationId": "c31e9218-6a19-4b2f-8992-affc9dca1c41", "Reference": "01478520", "ActionReference": "Action 1234", "CreatedOn": "2024-01-30T10:02:31.2700113+00:00", "CurrentAttempt": 1, "MaxAttempt": 5, "Reason": "PAYMENT_METHOD_EXPIRED" } } ``` **Do** - Update internal status to `FAILED`. - Choose the next business action based on the reason, for example: - Customer action required (request updated payment method or new consent/token) - Token lifecycle issue (stop recurring attempts until a new token exists) - Send a paylink to the customer to use for payment instead. **Do not** - Continue retrying indefinitely on your side; this event indicates Walley will not retry further. --- # Webhooks for customer tokens Source: https://dev.walleypay.com/docs/webhooks/customer-tokens.md These webhooks notify you when a customer token changes status, for example when it becomes active, is canceled or is revoked. ## Events Each event below corresponds to a customer token transitioning into a new status. The event type matches the new status of the token. | Event type | Triggered when | | --------------------------------- | --------------------------------------- | | `walley:customer-token:active` | A customer token becomes active. | | `walley:customer-token:pending` | A customer token is pending activation. | | `walley:customer-token:cancelled` | A customer token is canceled. | | `walley:customer-token:denied` | A customer token is denied. | | `walley:customer-token:revoked` | A customer token is revoked. | | `walley:customer-token:suspended` | A customer token is suspended. | All customer token webhooks share the same payload structure. The `Type` property reflects the new status, and `Payload.PreviousStatus` contains the status the token had before the change. The token status is a computed value derived from whether the token has been canceled, whether it is suspended, and the buyer's approval state. An event is emitted whenever this computed status changes after an update, so the webhook always reflects a genuine transition rather than a repeated notification of the same status. ### walley:customer-token:active This webhook is triggered whenever a customer token becomes active and can be used for [authorizations](/docs/checkout/tokenization/authorization). A token is `Active` when it has not been canceled, is not suspended, and the buyer's approval is either not required or has been approved. A transition into `Active` typically occurs when: - A previously `Suspended` token is re-activated, for example when a payment provider consent (such as Swish) changes back to active after being pending. `Source` is `PaymentProvider`. - A `Pending` token's buyer is approved by Walley's business profile system. `Source` is `WalleyBusiness`. ```json { "Type": "walley:customer-token:active", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Pending", "Source": "WalleyBusiness" } } ``` ### walley:customer-token:pending This webhook is triggered whenever a customer token is awaiting buyer approval from Walley's business profile system. A `Pending` token cannot yet be used for payments. A token becomes `Pending` when it is registered for a buyer whose approval is required, for example a business customer that needs a credit check or approval. The initial registration itself does not emit an event because there is no previous status to transition from, but any later change back to `Pending` does. ```json { "Type": "walley:customer-token:pending", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Active", "Source": "WalleyBusiness" } } ``` ### walley:customer-token:cancelled This webhook is triggered whenever a customer token is permanently canceled and can no longer be used for payments. When a token is canceled it is scheduled for removal after a 90-day retention period. A transition into `Cancelled` occurs when: - A merchant cancels the token via the [cancel endpoint](/docs/checkout/tokenization/cancel-token). `Source` is `Merchant`. - A payment provider signals that the underlying agreement or consent has been deleted, for example when a Swish consent is deleted by the payer or has expired. `Source` is `PaymentProvider`. ```json { "Type": "walley:customer-token:cancelled", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Active", "Source": "Merchant" } } ``` ### walley:customer-token:denied This webhook is triggered whenever the buyer has been denied by Walley's business profile system. A denied token cannot be used, and the token is scheduled for removal after a 90-day retention period. A transition into `Denied` occurs when Walley's business profile system denies the buyer for the buyer and merchant combination; all matching tokens are updated. `Source` is `WalleyBusiness`. ```json { "Type": "walley:customer-token:denied", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Pending", "Source": "WalleyBusiness" } } ``` ### walley:customer-token:revoked This webhook is triggered whenever the buyer's approval has been revoked by Walley's business profile system, for example because the buyer no longer meets ongoing requirements. A revoked token cannot be used, and the token is scheduled for removal after a 90-day retention period. A transition into `Revoked` occurs when Walley's business profile system revokes the buyer for the buyer and merchant combination; all matching tokens are updated. `Source` is `WalleyBusiness`. ```json { "Type": "walley:customer-token:revoked", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Active", "Source": "WalleyBusiness" } } ``` ### walley:customer-token:suspended This webhook is triggered whenever a customer token becomes temporarily unusable because the underlying payment provider agreement is in a transitional state. Unlike the canceled, denied and revoked states, a suspended token has no retention period and remains indefinitely until it is either re-activated or canceled. A transition into `Suspended` occurs when a payment provider consent enters a pending state, for example when a Swish consent is being renewed or the payer needs to re-confirm it. `Source` is `PaymentProvider`. A suspended token can later return to `Active` if the consent becomes active again. ```json { "Type": "walley:customer-token:suspended", "Timestamp": "2026-06-15T05:06:45.0324162+00:00", "Payload": { "CustomerToken": "32c5ee34-3de6-411f-a326-5dd1604654f0", "PreviousStatus": "Active", "Source": "PaymentProvider" } } ``` ## Payload | Property | Type | Description | | ------------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------- | | `Type` | string | The webhook event type. One of the event types listed in the [Events](#events) table. | | `Timestamp` | date | ISO 8601 date-time of when the status change occurred. | | `Payload.CustomerToken` | Guid | The unique identifier of the customer token. See [Getting token details](/docs/checkout/tokenization/token-details). | | `Payload.PreviousStatus` | string | The status the token had before this change. One of `Active`, `Pending`, `Cancelled`, `Denied`, `Revoked` or `Suspended`. | | `Payload.Source` | string | What initiated the status change. See [Source values](#source-values). | ### Source values | Value | Meaning | | ----------------- | ----------------------------------------------------------------------------------------------------------------------- | | `PaymentProvider` | The change was triggered by an external payment provider callback, for example a Swish consent status update. | | `Merchant` | The change was initiated by the merchant, for example cancelling the token via the API. | | `WalleyBusiness` | The change was triggered by Walley's internal business profile system, for example buyer approval, denial or revocation. | --- # Webhooks for orders Source: https://dev.walleypay.com/docs/webhooks/orders.md These webhooks are related to the order creation and order management flows. ## Events ### walley:order:created This webhook is triggered whenever an order is created. This can happen because a customer completed a checkout session, or because an authorization using the tokenized flow was successful, or an AddInvoice was done in the Payment API. ```json { "Type": "walley:order:created", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 30, "Currency": "SEK", "Status": "Authorized", "AuthorizationId": "c31e9218-6a19-4b2f-8992-affc9dca1c41", "CustomerToken": "0a96881b-295a-4154-a867-865fc912619c", "CheckoutId": "c4ebf700-db4a-4194-bae6-4c750f6a6291" } } ``` The `Status` property can have the different states - OnHold - Authorized - Captured - RequiresSigning - RequiresIdentityCheck ### walley:order:authorized This webhook is triggered if an order that was previously `OnHold` is now accepted by Walley. As such, this can only occur for orders created with status `OnHold`. ```json { "Type": "walley:order:authorized", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "Currency": "SEK" } } ``` ### walley:order:rejected This webhook is triggered if an order that was previously `OnHold` is now rejected by Walley. As such, this can only occur on orders created with status `OnHold`. ```json { "Type": "walley:order:rejected", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "Currency": "SEK" } } ``` ### walley:order:reauthorized This webhook is triggered whenever items are changed on an order. This can happen because a call has been made to the reauthorize API, or items have been edited in the Merchant Hub, or a ReplaceInvoice was done in the Payment API. ```json { "Type": "walley:order:reauthorized", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "OriginalAmount": 20, "Currency": "SEK" } } ``` _This only affects the uncaptured amount left on an order._ ### walley:order:extended This webhook is triggered whenever an expired order is authorized again. This can happen because an order is extended in the Merchant Hub. ```json { "Type": "walley:order:extended", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "Currency": "SEK" } } ``` The `Amount` property is equal to the previously expired amount on the order. ### walley:order:captured This webhook is triggered whenever a capture is made on an order. This can happen because a call has been made to the capture API, or a capture is made in the Merchant Hub, or a PartActivateInvoice/ActivateInvoice was done in the Payment API. ```json { "Type": "walley:order:captured", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "CaptureId": "147819779", "Amount": 10, "AmountLeftToCapture": 20, "Currency": "SEK", "CorrelationId": "fcc702a1-f18f-4e24-a54e-7aad1c716494" } } ``` ### walley:order:refunded This webhook is triggered whenever a refund is made on an order. This can happen because a call has been made to the refund API, or a refund is made in the Merchant Hub. ```json { "Type": "walley:order:refunded", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "01478520", "RefundedAmount": 10, "RemainingAmount": 20, "Currency": "SEK", "ActionReference": "MERCHANT_HUB", "CorrelationId": "fcc702a1-f18f-4e24-a54e-7aad1c716494" } } ``` ### walley:order:canceled This webhook is triggered whenever an order is canceled. This can happen because a call has been made to the cancel API, or an order is canceled in the Merchant Hub, or a CancelInvoice was done in the Payment API. ```json { "Type": "walley:order:canceled", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "Currency": "SEK" } } ``` The `Amount` property is equal to the uncaptured amount left on the order when it was canceled. ### walley:order:expired This webhook is triggered when the `expiresAt` date on the order has passed. This only occurs if the order has uncaptured amount left when the `expiresAt` date passed. ```json { "Type": "walley:order:expired", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "MX_220921_111434", "Amount": 10, "Currency": "SEK" } } ``` The `Amount` property is equal to the uncaptured amount left on the order. ### walley:order:service-invoice-paid This webhook is triggered when an order with the payment method service invoice has been fully paid. After this webhook, the order will be settled. ```json { "Type": "walley:order:service-invoice-paid", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "01478520", "Currency": "SEK" } } ``` ### walley:order:advance-invoice-paid This webhook is triggered when an order with the payment method advance invoice has been fully paid. After this webhook, it is possible to capture the order. ```json { "Type": "walley:order:advance-invoice-paid", "Timestamp": "2024-01-30T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "01478520", "Currency": "SEK" } } ``` ### walley:order:sold-debt This webhook is triggered when a service invoice order can be sold to debt collection. ```json { "Type": "walley:order:sold-debt", "Timestamp": "2026-05-12T11:02:42.5997621+01:00", "Payload": { "OrderId": "45e0832b-0b32-43e4-99b2-b10700a58a04", "Reference": "01478520" } } ``` --- # Overview Source: https://dev.walleypay.com/docs/webhooks/overview.md Webhooks let Walley notify your system the moment something happens, instead of you polling for changes. Register an HTTPS endpoint, choose the events you care about, and Walley calls your endpoint when they occur. ## Events Events are grouped into four categories. Each page lists the event types in that category, with payload examples and when they are triggered.

🎫 Customer Tokens

Follow a stored payment token through its lifecycle: active, pending, suspended, cancelled, denied or revoked.

🔐 Authorizations

Track tokenized payment authorizations from created to authorized, and get the reason when an attempt is retried or fails.

📦 Orders

Know when an order is created, authorized, captured, refunded, canceled or expired, no matter which Walley product created it.

💰 Settlements

Get notified the moment a new settlement is ready, so you can fetch the report through the Reports API right away.

## Start here 1. [Receiving webhooks](/docs/webhooks/receiving) covers what your endpoint must support, what the requests look like, how retries work, and how to verify each request with HMAC. 2. [Webhook management in Merchant Hub](/docs/merchanthub/access/webhooks) is where you create your webhooks, choose events and stores, and test the configuration before going live. 3. Pick your events from the categories above and subscribe to them when you create the webhook. --- # Receiving webhooks Source: https://dev.walleypay.com/docs/webhooks/receiving.md Your system receives webhooks on an HTTPS endpoint that you register in Merchant Hub. This page covers what the endpoint must support, what the requests look like, how retries work, and how to verify that a request comes from Walley. ## Expose an HTTPS endpoint To receive webhooks you are required to have an HTTPS endpoint. **Endpoint requirements** - Must accept HTTP POST requests - Must accept a JSON request body - Must support HTTPS with TLS 1.2 or 1.3 **Endpoint recommendations** - Require basic authentication with a username and password - Support HTTP2 - Validate the Walley-Signature header with the HMAC key ## Respond to webhooks When you receive a webhook request you are required to respond with an HTTP status code in the 2xx series. ## Structure The request body is formatted as JSON. `Type` holds the name of the event and `Timestamp` is when the event occurred. `Payload` is different for each event. ```json { "Type": string, "Timestamp": date, "Payload": object } ``` ## Retries Webhooks are delivered at least once, so your endpoint must support being called multiple times with the same event without side effects. We retry delivery with increasing backoff time until we receive an HTTP status code in the 2xx series. The webhook is sent instantly, and if the endpoint does not answer with a 2xx status, a retry will be made after: - 5 seconds - 10 seconds - 3 minutes - 1 hour - 4 hours - 8 hours - 16 hours - 24 hours If the webhook endpoint did not answer with a 2xx status after the last retry (after about 53 hours), we will handle this manually and contact you before retrying again. ## Headers These headers are included in every webhook request: | Key | Description | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | User-Agent | Standard HTTP header. The value will be something like `Walleybot 0.1 (+https://dev.walleypay.com)`. | | Walley-CorrelationId | The id of the request that triggered the webhook request. If you have issues with any request, provide this value in the support ticket. | | Walley-Timestamp | UNIX timestamp when this event occurred. Used for HMAC validation, see [Verifying the request with HMAC](#verifying-the-request-with-hmac). | | Walley-Signature | Computed signature from Walley. Used for HMAC validation, see [Verifying the request with HMAC](#verifying-the-request-with-hmac). | | Walley-Live | `True` or `False`. Used to know if the request to the webhook is made from Walley's production or a test triggered from the Merchant Hub. `True` indicates production data. | ## Verifying the request with HMAC When you set up a webhook, you'll get an HMAC key for it. You can use this key to verify that the requests you receive originate from Walley, using the following method: 1. Retrieve the request header `Walley-Timestamp` 2. Concatenate the version number, the timestamp, and the body of the request to form a basestring. Use a semicolon as the delimiter between the three elements. The version number right now is always `v0`. Example: `v0;{Timestamp};{Body}` 3. Hash the string described above with the HMAC SHA256 implementation of your system's platform, using the HMAC secret for the webhook. 4. Compare the computed signature with the request header `Walley-Signature` ### Examples ```cs static string ComputeHash(string secret, string timestamp, string payload) { byte[] bytes = Encoding.UTF8.GetBytes(secret); HMACSHA256 hmac = new HMACSHA256(bytes); bytes = Encoding.UTF8.GetBytes($"v0;{timestamp};{payload}"); return Convert.ToHexString(hmac.ComputeHash(bytes)).ToLower(); } static bool IsHashValid(string secret, string timestamp, string payload, string verify) { string hash = ComputeHash(secret, timestamp, payload); ReadOnlySpan hashBytes = Convert.FromHexString(hash); ReadOnlySpan verifyBytes = Convert.FromHexString(verify); return CryptographicOperations.FixedTimeEquals(hashBytes, verifyBytes); } ``` ```js const crypto = require('crypto'); const computeHash = (secret, timestamp, payload) => { const hmac = crypto.createHmac('sha256', secret); hmac.write(`v0;${timestamp};${payload}`); hmac.end(); return hmac.read().toString('hex'); }; const isHashValid = (secret, timestamp, payload, verify) => { const computed = Buffer.from(computeHash(secret, timestamp, payload), 'hex'); const received = Buffer.from(verify, 'hex'); return received.length === computed.length && crypto.timingSafeEqual(received, computed); }; ``` ```php function computeHash($secret, $timestamp, $payload) { $hmac = hash_hmac('sha256', "v0;$timestamp;$payload", $secret, true); return bin2hex($hmac); } function isHashValid($secret, $timestamp, $payload, $verify) { $hash = computeHash($secret, $timestamp, $payload); return hash_equals($hash, strtolower($verify)); } ``` --- # Webhooks for settlements Source: https://dev.walleypay.com/docs/webhooks/settlements.md These webhooks are related to settlements. ## Events ### walley:settlement:created This webhook is triggered whenever a new settlement is created. ```json { "Type": "walley:settlement:created", "Timestamp": "2024-01-30T06:00:02.5997621+01:00", "Payload": { "SettlementId": 123456, "SettlementCreatedOn": "2024-01-30T06:00:00+01:00" } } ``` | Property | Type | Description | | ------------------- | ------ | -------------------------------------------------- | | SettlementId | number | The unique identifier of the settlement. | | SettlementCreatedOn | date | The date and time when the settlement was created. |