Download OpenAPI specification:Download
Paywerk is offering cross-border and domestic Buy Now Pay Later and Pay Now payments. Payments are based on debit or credit card. Any EU e-shop can offer BNPL payments to any EU shopper but also for domestic shoppers. Shoppers can pay later in 30 days or split the payment in 3. Purchase full amount will be paid to merchant after order fulfilment. Overview of the transactions can be found in our merchant portal.
No splitting to merchant payment. Merchant doesn’t have to wait for customer to pay. Paywerk’s approval rate is high - we have partnership with several banks on every market. Many shoppers with different characteristics will get financing immediately. The whole process will take about 7 seconds.
Shopper’s check-out experience is very similar to card payment experience. No complicated forms to fill or account needed with Paywerk. Shopper fills one data field (usually personal code or birth date, depending on market) and gets approval in few seconds.
More information about our solutions can be found on our website paywerk.co.
Shopper country | Pay now | Invoice | Slice |
---|---|---|---|
Poland | ✓ | ✓ (30 days) | ✓ (3 parts) |
Other EEA countries | ✓ | - | - |
Paywerk adds new supported countries every year. We allow merchant to add new countries with just few clicks. Unless agreed otherwise in merchant agreement, all new countries will by available to merchants by default.
Merchant country | Shopper country | |
---|---|---|
Poland | ✓ | ✓ |
Other EEA countries | - | ✓ (Pay Now only) |
Right now we support purchases only in the merchant country's currency. Also, the shopper country's currency has to match merchant's currency.
For example, an Estonian shopper can buy from German merchant since the currency is the same (EUR), but an Estonian shopper yet can't buy from Polish merchant.
We are working to add multi-currency acccounts in the near future.
Country | Supported currencies |
---|---|
Poland | PLN |
Other EEA countries | EUR, PLN |
You can check the current and historical service status on our status page at status.paywerk.co.
API key is the single secret for communication between your server and Paywerk. There is no limit for the number of API keys. Since each merchant can have multiple companies (legal entities) and multiple shops, please bare in mind that each API corresponds to the combination of one company and one shop. That also means that a single purchase can be related only to one company and one shop since it has to use one API key.
You can generate API keys in Merchant Portal:
Step 1. Find API keys menu. Open menu API keys and click Add API key button.
Step 2. Define scope of API key. Add a user-friendly and memorable name for the API key, especially if you plan to use multiple API keys. Choose the company and shop to which the API key corresponds.
Step 3. Find you API key and store it securely. API key is created! Now all you have to do is store it in a secure place. Your API key can perform any activity that is available in Paywerk's Merchant API, therefore it's sensitive information. Please note that API key is shown only once and cannot be retrieved after the modal is closed.
Step 4. Insert API key to your shop. If you use a plugin, refer to the plugin's section of this documentation. In any other case, store the API key in your shop's configuration, secret manager of other place where the shop can retrieve it for making queries.
In any request you send towards Paywerk, you need to pass the Authorization
header. The only exception is the Health Check API request which does not require authentication.
Authorization: Bearer YOUR_API_KEY_HERE
Paywerk offers integration with certain e-commerce platforms.
Currently we support with dedicated plugins the following platforms: WooCommerce, Prestashop and Magento.
Platform | Latest version | Latest version release date | Supported platform versions | Minimum PHP version | Download |
---|---|---|---|---|---|
Wordpress (wooCommerce) | 1.1.10 | Oct 20, 2023 | >= 5.6.1 | >= 7.0 | Download latest |
Prestashop | 1.1.0 | Mar 3, 2023 | >= 1.7.0 | >= 7.0 | Download latest |
Magento | 1.0.1 | Oct 28, 2022 | >= 2.2.11 | >= 7.1.0 | Download latest |
The best way to get Paywerk plugin for WooCommerce is to add it via Wordpress plugin directory. That way you'll be able to get plugin updates automatically or with a single click.
Step 1. Go to Wordpress's Plugins menu. Click Add New.
Step 2. Enter keyword "Paywerk" and search for the plugin. When finding Paywerk Payments plugin, click Install. Alternatively you can also download the plugin and upload it from the same screen.
Step 3. Start plugin activation. Click Activate.
Step 4. Continue setup. Click Settings link on Paywerk Payments plugin.
Step 5. Continue setup. You'll be directed to WooCommerce's payments section where you have to choose Settings on Paywerk Payments payment method.
Step 5. Configure Paywerk plugin. Here you have the following configuration options:
Main configuration:
Shopping cart total amount based visibility:
Statuses configuration - choose statuses relevant to your shop's processes:
Title of checkout panel:
Promotions - show a promotional widget on product pages that advertises free pay later options for shoppers:
Note that promotions will be displayed only for products which are in certain price range. Currently it's limited to:
Step 7. Activate payment method. You're ready to go! Just switch the payment method slider on.
Currently you can add Paywerk Payments module to Prestashop only manually.
Step 1. Go to Prestashop's Modules menu. Click Upload a module button.
Step 2. Upload Paywerk Payments module. Select from your computer the file paywerkpayments.zip
you downloaded from button above, and upload it to your module manager.
Step 3. Module installed. Click Configure.
Step 4. Configure Paywerk module. Here you have the following configuration options:
Main configuration:
Shopping cart total amount based visibility:
Statuses configuration - choose statuses relevant to your shop's processes:
Title of checkout panel:
Promotions - show a promotional widget on product pages (near Add to cart button) that advertises free pay later options for shoppers:
NB! If you want to enable Promotions widget, you have to plant it into a position. Check Step 6 for instructions.
Note that promotions will be displayed only for products which are in certain price range. Currently it's limited to:
Step 5. Assign Paywerk Payments payment method to Payment preferences/restrictions.
Go to Payment, choose Preferences. You'll see difference blocks of options for currency restrictions, group restrictions, country restrictions, carrier restrictions. Make sure Paywerk Payments option is checked for all relevant options.
Step 6. Optional: Enable Promotions widget.
Go to Design, choose Positions. Click on button Transplant a module.
In the form that opens, fill it in as follows:
Paywerk Payments
either by scrolling or typing in Paywerk.displayProductAdditionalInfo (Product page additional info)
Then click Save. You should now see the widget place in single product page.
Step 1. Order request. On checkout page where payment options are shown, start by sending the order request POST /orders
. The body of the request contains communication language, shopper's name and contact details, purchase amount and currency, and 3 URLs (success, failure, callback). The more data you provide by the shopper, the less the shopper has to fill in afterwards, and the higher the probability of successful payment (in case of Pay Later payment options).
You'll receive back a unique paywerkId
which you should store and use in any subsequent queries related to the purchase.
In case there are any changes in any of the initially provided fields (e.g. cart contents or amount changes, shopper data changes), you have to make the same request again. If you make a new request and send the same order reference (field reference
) as before, the paywerkId
will usually be the same in case (nevertheless, always check and use the latest). In case the order reference is changed, paywerkId
will also change. You would receive error 409 in case the shopper has already continued with the payment but for some reason comes back and starts again. In this case you should update the reference since it has to be unique.
Step 2. Display offer. On checkout page where payment options are shown, include a HTML tag in the place you'd like to show Paywerk payment options:
<paywerk-products paywerkId="{paywerkId}"/>
{paywerkId}
refers to the identifier you received in the response in Step 1.
Additionally, you have to include a JavaScript from Paywerk (refer to URL: https://merchant.sandbox.paywerk.co/ui/shop.js
for Sandbox and https://merchant.paywerk.co/ui/shop.js
for Production) in order to display the contents inside <paywerk-products />
:
Sandbox:
<script type="module" async>
import 'https://merchant.sandbox.paywerk.co/ui/shop.js'
// any additional logic here
</script>
Production:
<script type="module" async>
import 'https://merchant.paywerk.co/ui/shop.js'
// any additional logic here
</script>
If possible, include the JavaScript directly from Paywerk's URL, so that all updates are automatically accomodated on your web site.
Step 3. Send shopper to the payment flow. Here you have two options:
It's important that the shopper has selected a payment method inside Paywerk's environment.
In order to listen to the changes in the Paywerk payment options selector, you may use the following combination of HTML and JavaScript, and allow to continue only then paywerkUrl
has been provided:
Sandbox:
<input type="hidden" name="paywerkUrl">
<script type="module" async>
import 'https://merchant.sandbox.paywerk.co/ui/shop.js'
document.querySelector('paywerk-products').addEventListener('product-selected', function (e) {
e.preventDefault()
document.querySelector('[name=paywerkUrl]').value = e.detail.productUrl
})
</script>
Production:
<input type="hidden" name="paywerkUrl">
<script type="module" async>
import 'https://merchant.paywerk.co/ui/shop.js'
document.querySelector('paywerk-products').addEventListener('product-selected', function (e) {
e.preventDefault()
document.querySelector('[name=paywerkUrl]').value = e.detail.productUrl
})
</script>
Note that the additional JavaScript part should be included only when paywerkId
is provided.
Step 4. Wait for change in order status. It is recommended to combine multiple options whereas options A and B are both mandatory to implement:
Note that options A and B are run by Paywerk in parallel but callbacks are impacted by overall load on servers - sometimes redirect can happen before callback and sometimes, vice versa. The best approach is to allow both redirect and callback to do the same thing, but the one arriving after first one may be ignored.
Order can have 3 statuses:
PENDING
- initial status, no changes yetCONFIRMED
- payment succeeded; you may now confirm the orderFAILED
- payment failed, either because of negative risk decision, failure in registries or other reasons; you should offer alternative payment methods to the shopper so that he or she can finalise the orderCallbacks arrive to callbackUrl
provided in the order request using HTTP POST method with the following body:
{
"paywerkId": "{paywerkId}",
"orderReference": "Merchant-Order-Reference-12345"
}
Paywerk has its own retry mechanism for failed callbacks. We may try a certain amount of times to send the update before stating it a failed effort. Since callbacks sometimes can fail, we insist on allowing option A and optionally using option C from step 4 as a fallback solution for knowing the latest status of the payment.
Step 5. Process the order. Based on status change received in step 4, you can either mark the order completed or, in case of failed payment, offer other payment options. The order status you should use in your own e-commerce platform depends on your own workflows. You can treat CONFIRMED
status as payment done, and whatever steps may follow that (like order confirmation) is up to you.
Step 6. Fulfil the order. Depending on whether the order was paid via Pay Now or Pay Later payment option, you may need to mark the order items as fulfilled.
Step 7. Receive funds. Depending on parameters agreed in your contract, there can be one or two Payout Delay parameters agreed with you: one for Pay Now and one for Pay Later payment methods.
See more in Fulfilment and Settlements sections.
Fulfilment can be done in various ways:
POST /orders/{paywerkId}/fulfil
. You may use this API endpoint also to fulfil all order items by sending fulfilment information about all order items in a single query.POST /orders/{paywerkId}fulfil-all
.See also Settlements section.
There can be various reasons for refunds, such as customer returns the goods, goods were not available afterall, customer compliants etc.
Paywerk allows refunds to be performed only directly by merchants. In case the shopper turns to Paywerk in any such questions, we direct the customer to the merchant. Merchant can initiate refunds in the following ways:
POST /orders/{paywerkId}/refund
. You may use this API endpoint also to refund all order items by sending refund information about all order items in a single query.POST /orders/{paywerkId}/refund-all
.Refunds are deducted from the order amounts you would receive the following settlement. See more in Settlements section.
Funds are sent as SEPA or local transactions in batches depending on your contract on a daily or weekly basis, or on certain weekdays. You'll receive not more than one settlement payment from us per day per merchant company. Please note that all Paywerk fees are deducted from the order amounts when payouts are made.
There may be also a situation where due to having more refunds and new orders on a specific day, you may need to send us funds instead of us sending you. In those cases you'll receive an automated e-mail instructing where to make the payment and in which amount.
You can get a better understanding of the transactions in Merchant Portal under Transactions menu. You can also see any relevant transactions per order when you go to Orders menu and find a specific order.
In checkout, in order to display the detailed payment option, you need to send us an order request. As a response you will receive a Paywerk ID which allowes to display inline content.
lang required | string Language code according to ISO 639-1 standard (2 lowercase letters). Allowed values: |
firstName | string First/given name(s) of the shopper. |
lastName | string Family/last name(s) of the shopper. |
string E-mail address of the shopper. Has to be in a valid | |
phone | string Phone number of the shopper formatted in the International E.164 standard, starting with plus (+) symbol. In case multiple phone numbers are known, prefer the main mobile number. |
birthDate | string <date> If known by merchant, send birth date of the shopper. The date must be in ISO 8601 format: |
required | object (Address) Shopper's billing address is mandatory for Pay Later products, billing address country is mandatory for Pay Now. Please note that the payment process depends on billing address country. Adding delivery address (when applicable) may improve the acceptance rate of the payment method. |
object (Address) Shopper's billing address is mandatory for Pay Later products, billing address country is mandatory for Pay Now. Please note that the payment process depends on billing address country. Adding delivery address (when applicable) may improve the acceptance rate of the payment method. | |
amount required | number Total purchase amount that needs to be paid by the shopper, including but not limited to any taxes, fees, delivery costs, discounts, coupons used, etc. May include up to 2 decimal places (decimal separator |
currency required | string Currency of the purchase in ISO 4217 format (3 uppercase letters). Allowed values: |
successUrl required | string <url> URL where to redirect the shopper after successful payment process. |
failedUrl required | string <url> URL where to redirect the shopper after unsuccessful payment process. |
callbackUrl | string <url> URL where to send server-to-server callback requests about status changes. |
reference required | string Unique order number on merchant side. When sending updates of the same shopping cart or shopper info, you can use same |
Array of objects (OrderRequestItem) Shopping cart rows, i.e., items in the shopping cart. In case sending the full information on shopping cart rows is not possible or difficult, you may sum up all items as one item row. To provide the best shopper experience, we highly recommend providing full list of items in the cart. When no order items are sent, Paywerk adds a summarising item covering full amount of the order, on its own. Important: The sum of amounts of all items must match the order | |
displayedProductTypes | Array of arrays Items Enum: "PAY_NOW_CARD" "INVOICE" "SLICE" If set, displays only selected Paywerk product types (Pay Now, Invoice, Slice). If not set, does not limit product types displayed as payment methods. |
object (ShopMetadata) Merchant integration information, e.g., plugin/extension name and version. May help with locating errors and bugs on merchant side. | |
object (ShopperHistory) Optionally send some generalised order history information of that shopper in your shop, so that we can provide a better quality decision. You need to make sure that you have shopper's consent for that. In case you decide to send such data, |
{- "lang": "en",
- "firstName": "Jane",
- "lastName": "Doe",
- "email": "jane.doe@domain.com",
- "phone": "+491711234567",
- "birthDate": "1990-01-01",
- "billingAddress": {
- "countryCode": "DE",
- "postalCode": "80331",
- "region": "Bavaria",
- "city": "München",
- "street": "Marienplatz 8",
- "apartment": "12"
}, - "deliveryAddress": {
- "countryCode": "DE",
- "postalCode": "80331",
- "region": "Bavaria",
- "city": "München",
- "street": "Marienplatz 8",
- "apartment": "12"
}, - "amount": 1238.16,
- "currency": "EUR",
- "reference": "W-1234567",
- "items": [
- {
- "name": "Electric bicycle X-4000",
- "sku": "493579_red",
- "unitPrice": 1238.99,
- "quantity": 1,
- "type": "PHYSICAL",
- "category": "Electric bicycles"
}
], - "displayedProductTypes": [
- "PAY_NOW_CARD",
- "INVOICE",
- "SLICE"
], - "metadata": {
- "shopPlatform": "WooCommerce",
- "platformVersion": "6.0.1",
- "pluginVersion": "1.0.1"
}, - "history": {
- "numOrders": 12,
- "registeredAt": "2019-08-24T14:15:22Z",
- "totalAmount": [
- {
- "amount": 0,
- "currency": "string"
}
]
}
}
{- "paywerkId": "a635b4b2-3aef-475e-814b-b0f18b874728",
- "isComplete": true
}
In case you would like to show shoppers promotion of Pay Later payment methods, use this endpoint to get the payment schedule and then display it accordingly. E.g. Pay 33.34 EUR today, 33.33 EUR on XX.XX.XXXX, 33.33 EUR on XX.XX.XXXX. No extra fees or interest.
productType required | string Enum: "INVOICE" "SLICE" "PAY_NOW_CARD" Product type for which the payment schedule is queried. In case multiple products of the same type are available for the merchant, this endpoint uses the standard default product for that country. |
amount required | number Total product or purchase amount that needs to be paid by the shopper, including but not limited to any taxes, fees, delivery costs, discounts, coupons used, etc. May include up to 2 decimal places (decimal separator |
shopperCountryCode | string Country code in ISO 3166-1 alpha-2 format (2 uppercase letters). Use shopper billing country here. If set, takes the default standard product for that country. If not set, the country is set to merchant country. |
fulfilmentDate | string <date> If set, the payment schedule starts from this date. Set it as the earliest date the order would be fulfilled. If not set, the payment schedule starts from today. Value may be between today and 30 days from today. The date must be in ISO 8601 format: |
{- "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
- "productType": "INVOICE",
- "schedule": [
- {
- "seqNumber": 0,
- "date": "2019-08-24",
- "amount": 0,
- "currency": {
- "currencyCode": "string",
- "defaultFractionDigits": 0,
- "numericCode": 0,
- "displayName": "string",
- "symbol": "string",
- "numericCodeAsString": "string"
}
}
]
}
In case you would like to show shoppers promotion of Pay Later payment methods, use this endpoint to get the payment schedule and then display it accordingly. E.g. Pay 33.34 EUR today, 33.33 EUR on XX.XX.XXXX, 33.33 EUR on XX.XX.XXXX. No extra fees or interest.
productId required | string <uuid> Product ID for which the payment schedule is queried (ask ID from Paywerk). |
amount required | number Total product or purchase amount that needs to be paid by the shopper, including but not limited to any taxes, fees, delivery costs, discounts, coupons used, etc. May include up to 2 decimal places (decimal separator |
shopperCountryCode | string Country code in ISO 3166-1 alpha-2 format (2 uppercase letters). Use shopper billing country here. If set, takes the default standard product for that country. If not set, the country is set to merchant country. |
fulfilmentDate | string <date> If set, the payment schedule starts from this date. Set it as the earliest date the order would be fulfilled. If not set, the payment schedule starts from today. Value may be between today and 30 days from today. The date must be in ISO 8601 format: |
{- "productId": "dcd53ddb-8104-4e48-8cc0-5df1088c6113",
- "productType": "INVOICE",
- "schedule": [
- {
- "seqNumber": 0,
- "date": "2019-08-24",
- "amount": 0,
- "currency": {
- "currencyCode": "string",
- "defaultFractionDigits": 0,
- "numericCode": 0,
- "displayName": "string",
- "symbol": "string",
- "numericCodeAsString": "string"
}
}
]
}
paywerkId required | string <uuid> |
{- "paywerkId": "a635b4b2-3aef-475e-814b-b0f18b874728",
- "status": "PENDING",
- "createdAt": "2019-08-24T14:15:22Z",
- "initialAmount": 0,
- "amount": 0,
- "currency": "string",
- "reference": "string",
- "items": [
- {
- "name": "string",
- "sku": "string",
- "unitPrice": 0,
- "initialQuantity": 0,
- "quantity": 0,
- "fulfilledQuantity": 0,
- "returnedQuantity": 0,
- "cancelledQuantity": 0,
- "type": "PHYSICAL",
- "category": "string"
}
], - "shopper": {
- "firstName": "string",
- "lastName": "string",
- "email": "string",
- "language": "string"
}, - "billingAddress": {
- "countryCode": "DE",
- "postalCode": "80331",
- "region": "Bavaria",
- "city": "München",
- "street": "Marienplatz 8",
- "apartment": "12"
}, - "deliveryAddress": {
- "countryCode": "DE",
- "postalCode": "80331",
- "region": "Bavaria",
- "city": "München",
- "street": "Marienplatz 8",
- "apartment": "12"
}
}
paywerkId required | string <uuid> |
Parameter sku identifies order item to be refunded.
Parameter quantity specifies number of refunded items. It's allowed to refund single item partially (for example quantity can be 0.5). Optional value. Omitted value means 'refund all'
Parameter refundType can be CANCEL, RETURN or AUTO.
sku required | string |
refundType required | string Enum: "RETURN" "CANCEL" "AUTO" |
quantity | number |
[- {
- "sku": "string",
- "refundType": "RETURN",
- "quantity": 0
}
]
paywerkId required | string <uuid> |
Parameter sku identifies order item to be fulfilled.
Parameter quantity specifies number of items to be fulfilledrefunded items.
sku required | string |
quantity | number |
[- {
- "sku": "string",
- "quantity": 0
}
]
Promote Pay Later right on your product page with the promotion widget. You can show customers that they can slice payments with Paywerk, increasing your website’s conversion rate.
The promotion block includes a link to an explanation about Paywerk’s payment method, so that they can learn how to use it. To add the promotion widget to your website, make sure you have the latest plugin from Paywerk, and review its settings according to the instructions above.
Promotions are currently available on WooCommerce and PrestaShop. To get the widgets, follow the instructions below.
Use our pre-made promotional banners on your website to encourage customers to use Paywerk’s flexible payments.