--- title: "Partner platform requirements" description: "Onboard sub-merchants and add online stores so that they can process ecommerce transactions." url: "https://docs.adyen.com/classic-platforms/platforms-for-partners" source_url: "https://docs.adyen.com/classic-platforms/platforms-for-partners.md" canonical: "https://docs.adyen.com/classic-platforms/platforms-for-partners" last_modified: "2023-02-20T16:48:00+01:00" language: "en" --- # Partner platform requirements Onboard sub-merchants and add online stores so that they can process ecommerce transactions. [View source](/classic-platforms/platforms-for-partners.md) The content on this page only applies when you have a partner arrangement for Adyen for Platforms. For information about platform integrations built after August 1, 2022, refer to our [new integration guide](/adyen-for-platforms-model) instead. On your partner platform, you cannot process payments on behalf of your sub-merchants. Instead, Adyen establishes a direct relationship between each sub-merchant and the card schemes. For us to be able to establish that relationship, and for your sub-merchants to be able to process ecommerce transactions, we need you to: * Collect additional PCI DSS compliance documentation in the form of the [Self-Assessment Questionnaire](https://www.pcisecuritystandards.org/documents/PCI-DSS-v3_2_1-SAQ-A.pdf) (SAQ A). * Create online stores for each sub-merchant to establish a direct connection between them and the schemes. Sub-merchants that process point-of-sale (POS) transactions also need stores to be created for them. However, they do not have to complete the SAQ A. The connection between the card networks and each store is established through the POS terminals, as are the PCI DSS requirements. See [Point of sale for platforms](/classic-platforms/platforms-for-pos) for more information. This is an overview of the steps to take: 1. [Create an account holder](/#create-account-holder-platform) for your sub-merchant. 2. [Onboard account holders and collect the SAQ A information](#onboard-partner-platform). 3. [Add a store](#add-store) for the account holder. 4. [Add allowed origins](#add-allowed-origins) for sub-merchants that use their own domains. 5. [Route payments](#route-payments) to the account holder's store. ## Requirements Before you start with your integration, you must: * Be familiar with the features of [Adyen for Platforms](/platforms), such as the [account structure](/classic-platforms/account-structure), the [onboarding and verification process](/classic-platforms/onboard-users), and notifications. The only differences for partner platforms are: * While onboarding, you have to gather the additional PCI compliance data in the form of the SAQ A. * You have to create an online store for each account holder on the platform. * Contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) and provide the following required information. * Countries * Currencies * Merchant category codes (MCCs) * Payment methods You can specify different currencies, MCCs, and payment methods for each country/region. We use this information to enable you to create stores based on the type of payments that must be processed in the store. ## Step 1: Create an account holder Create an account holder for your sub-merchant. For details, see [account holders and accounts](/classic-platforms/account-holders-and-accounts). You need to create the account holder before you can proceed to onboard your sub-merchants. Apart from the [minimum information](/classic-platforms/account-holders-and-accounts?tab=minimum-info-business_2#minimum-required-information) needed to create an account holder, also collect the following details from your sub-merchant. You will need these details later when you create a store. * Website address for the [webAddress](https://docs.adyen.com/api-explorer/Account/latest/post/createAccountHolder#request-accountHolderDetails-storeDetails-webAddress) field. * Telephone number (including country code) for the [fullPhoneNumber](https://docs.adyen.com/api-explorer/Account/latest/post/createAccountHolder#request-accountHolderDetails-storeDetails-fullPhoneNumber) field. ## Step 2: Onboard account holders and collect SAQ A details The onboarding process is the same as onboarding regular sub-merchants, with the added requirement to send them the SAQ A. Make sure that each sub-merchant has completed the SAQ A and has passed the KYC verification process before you add a store. ### Collect SAQ A details using the Hosted Onboarding Page If you use our [Hosted Onboarding Page](/classic-platforms/onboard-users/hosted-onboarding-page) (HOP), the SAQ A will automatically appear for the sub-merchant as part of the onboarding flow. ### Collect SAQ A details using your own onboarding flow If you have built your [own onboarding implementation](/classic-platforms/onboard-users/custom-onboarding), you have to include an additional call in your onboarding flow. 1. Make a POST request to the [/getPciQuestionnaireUrl](https://docs.adyen.com/api-explorer/Hop/latest/post/getPciQuestionnaireUrl) endpoint, specifying: * `accountHolderCode`: The unique reference to the account holder. * `returnUrl`: The URL to your partner platform website. **Get a PCI questionnaire link** ```bash curl https://cal-test.adyen.com/cal/services/Hop/v6/getPciQuestionnaireUrl \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "accountHolderCode": "YOUR_UNIQUE_ACCOUNT_HOLDER_CODE", "returnUrl": "URL_TO_YOUR_PLATFORM_PORTAL" }' ``` The response contains: * `redirectURL`: The page to where you redirect your account holder. This URL must be used within 15 seconds and can only be used once. * `pspReference`: The reference to this session. We recommend that you store this for troubleshooting purposes. **Response** ```json { "invalidFields": [], "pspReference": "8315748692943050", "resultCode": "Success", "redirectUrl": "https://hop-test.adyen.com/hop/pci/?token=" } ``` 2. Redirect the account holder to the redirect URL within 15 seconds after you received the response. When they are successfully redirected to the questionnaire, the session starts. The session is valid for 30 minutes. The account holder receives an HTTP 401 status code if: * The redirection did not occur within 15 seconds. * The account holder refreshes or reloads the browser after the session has started. To restart the session, make another POST request to [/getPciQuestionnaireUrl](https://docs.adyen.com/api-explorer/Hop/latest/post/getPciQuestionnaireUrl). 3. Make sure that you have [configured webhooks](/classic-platforms/configure-notifications) so you can get the [verification statuses](/classic-platforms/verification-process/check-verification-results#verification-statuses) in the **ACCOUNT\_HOLDER\_VERIFICATION** notification. **Example notification** ```json { "eventDate": "2020-11-05T14:48:10+01:00", "eventType": "ACCOUNT_HOLDER_VERIFICATION", "executingUserKey": "Account Holder Update", "live": false, "pspReference": "8515659450108980", "content": { "accountHolderCode": "YOUR_UNIQUE_ACCOUNT_HOLDER_CODE", "kycCheckStatusData": { "type": "PCI_VERIFICATION", "status": "PASSED" } } } ``` When you have verified that the account holder provided the SAQ A successfully and that the KYC verification is complete, you can continue with the next steps. ## Step 3: Create a store for the account holder An account holder is successfully onboarded on your platform when they have passed the KYC checks and completed the SAQ A. Now, you need to provide us with the details of their store. Make sure our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) has enabled creating stores. If you haven't requested this yet, refer to the [requirements](#requirements). Once our Support Team has enabled creating stores, you can start adding stores for your account holders. 1. Make sure that you have [configured webhooks](/classic-platforms/configure-notifications) so that you are able to receive notifications. Create a [notification configuration](/classic-platforms/configure-notifications#create-a-notification-configuration) with an `eventConfigs` array with: * `eventType`: **ACCOUNT\_HOLDER\_STORE\_STATUS\_CHANGE** * `includeMode`: **INCLUDE** 2. To provide the store details, include a `storeDetails` array when you update an existing account holder. Make a POST request to [/updateAccountHolder](https://docs.adyen.com/api-explorer/#/Account/updateAccountHolder). In the request body, include an [accountHolderDetails.storeDetails](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails) array, specifying: * [address](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-address): The address of the store. * [fullPhoneNumber](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-fullPhoneNumber): The phone number of the store. * [merchantAccount](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-merchantAccount): The merchant account used for accepting payments. * [merchantCategoryCode](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-merchantCategoryCode): The merchant category code (MCC) that classifies the business of the account holder. * [storeName](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-storeName): The name of the account holder's store. This will be included in the shopper statement. * [storeReference](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-storeReference): Your unique reference for the account holder's store. * [webAddress](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-webAddress): The URL of the account holder's online store. * [shopperInteraction](https://docs.adyen.com/api-explorer/Account/latest/post/updateAccountHolder#request-accountHolderDetails-storeDetails-shopperInteraction): The sales channel. In this case, use **Ecommerce**. The next example shows an [/updateAccountHolder](https://docs.adyen.com/api-explorer/#/Account/updateAccountHolder) request to add a store to an account holder. **Add store** ```bash curl https://cal-test.adyen.com/cal/services/Account/v6/updateAccountHolder \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "accountHolderCode": "YOUR_UNIQUE_ACCOUNT_HOLDER_CODE", "accountHolderDetails": { "storeDetails" : [ { "address" : { "city": "Store City", "country": "US", "houseNumberOrName": "1", "postalCode": "123", "stateOrProvince": "CA", "street": "Store Street" }, "fullPhoneNumber": "+31201234567", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "merchantCategoryCode": "7999", "storeName": "Store Name", "storeReference": "YOUR_SUBMERCHANT_STORE_ID", "webAddress": "URL_TO_SUBMERCHANT_WEBSITE", "shopperInteraction": "Ecommerce" } ] } }' ``` The response contains various account holder details, including the `storeDetails` showing that the status of the store is **Pending**. **Response** ```json { "invalidFields": [], ... "accountHolderDetails":{ ... "storeDetails" : [ { "address" : { "city": "Store City", "country": "US", "houseNumberOrName": "1", "postalCode": "123", "stateOrProvince": "CA", "street": "Store Street" }, "fullPhoneNumber": "+31201234567", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "merchantCategoryCode": "7999", "status": "Pending", "store": "UNIQUE_SUBMERCHANT_STORE_ID", "storeName": "Store Name", "storeReference": "YOUR_SUBMERCHANT_STORE_ID", "webAddress": "URL_TO_SUBMERCHANT_WEBSITE", "shopperInteraction": "Ecommerce" } ], ... }, ... } ``` 3. Before processing any payments, wait until you receive an [ACCOUNT\_HOLDER\_STORE\_STATUS\_CHANGE](https://docs.adyen.com/api-explorer/Notification/latest/post/ACCOUNT_HOLDER_STORE_STATUS_CHANGE) notification showing that the new status of the store is **Active**. **Notification** ```json { "eventType":"ACCOUNT_HOLDER_STORE_STATUS_CHANGE", "eventDate":"2018-04-23T13:13:44+02:00", "executingUserKey":"ws", "live":true, "pspReference":"1313642467023511", "content":{ "accountHolderCode":"YOUR_UNIQUE_ACCOUNT_HOLDER_CODE", "store": "UNIQUE_SUBMERCHANT_STORE_ID", "storeReference":"YOUR_SUBMERCHANT_STORE_ID", "newStatus":"Active", "oldStatus":"Pending", "reason":"YOUR_REASON" } } ``` ## Step 4: Add sub-merchant domains to allowed origin If any of your sub-merchants take payments from their own domains, you need to [add their domains to your allowed origins](/development-resources/client-side-authentication#manage-allowed-origins). ## Step 5: Route a payment to a store Each sub-merchant has their own unique connection to the card networks. This connection is represented by their store. When processing payments, you have to direct them to the appropriate store. To route a payment to a store, include the `store` field in your [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request. You can get the value for this field from the response you received when you [added the store](#add-store), or from the [ACCOUNT\_HOLDER\_STORE\_STATUS\_CHANGE](https://docs.adyen.com/api-explorer/Notification/latest/post/ACCOUNT_HOLDER_STORE_STATUS_CHANGE) notification webhook. When processing payments through a store, you can [create a split configuration](/classic-platforms/split-configuration-for-stores) to automatically split payments or you can provide [split instructions](/classic-platforms/processing-payments#processing-split-payments) in every API request. You can split payments across multiple account holders, but you can only process a payment through a single store. The following example shows how to provide split instructions in the API, routing them over a single store. **Process a payment** ```bash # Set your X-API-KEY with the API key from the Customer Area. curl https://checkout-test.adyen.com/v68/payments \ -H 'x-api-key: ADYEN_API_KEY' \ -H 'content-type: application/json' \ -d '{ "amount": { "currency": "USD", "value": 5000 }, "store": "UNIQUE_SUBMERCHANT_STORE_ID", "reference": "YOUR_ORDER_NUMBER", "paymentMethod": { "type": "scheme", "encryptedCardNumber": "test_4111111111111111", "encryptedExpiryMonth": "test_03", "encryptedExpiryYear": "test_2030", "encryptedSecurityCode": "test_737", "holderName": "John Smith" }, "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "splits":[ { "amount":{ "value":4000 }, "type":"MarketPlace", "account":"8815628270908491", "reference":"YOUR_REFERENCE_TO_SPLIT_#1" }, { "amount":{ "value":500 }, "type":"MarketPlace", "account":"181472818", "reference":"YOUR_REFERENCE_TO_SPLIT_#2" }, { "amount":{ "value":500 }, "type":"Commission", "reference":"YOUR_REFERENCE_TO_SPLIT_#3" } ] }' ``` ## See also * [Adyen for Platforms](/platforms) * [Account holders and accounts](/classic-platforms/account-holders-and-accounts) * [Onboard and verify users](/classic-platforms/onboard-users) * [Adyen for Platforms Account API](https://docs.adyen.com/api-explorer/#/Account/latest/overview)