Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 148 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

CE

Loading...

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Customer Use Cases

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

System Management

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Extensibility and Integrations

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Core Commerce

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Management Dashboard

Loading...

Loading...

Loading...

Loading...

Loading...

Auth Integrations

See how Emporix facilitates integration with other tools and systems with the pre-built functionalities.

You can configure our system to work with various authentication and authorization providers. This is part of the standard system management and tenant configuration process. For details on supported integrations and setup instructions, refer to the System Management – Authentication and Authorization guides.

Customer Communication Integrations

Learn how you can improve the communication with your customers.

Emporix comes with the out-of-the-box service that is responsible for sending automated emails to your customers. The email communication is triggered upon certain events happening in the system, such as for example registering a new customer, submitting an order from the storefront, or many more. The service takes care of keeping the customers in the loop and up-to-date with the operations happening in the system, concerning their accounts, orders, etc.

Apart from the default setup, you can enable your custom emailing service and maintain the automated email templates in your database. Emporix allows you to integrate your custom Mailjet account to take care of customer communication.

For more details, see the Mailjet doc.

For some mailing automation cases, you might consider using the Digital Processes functionality. You can create a workflow process that reacts on some trigger points in the system and takes care of subsequent steps, which can also involve sending information to your customers.

Search

Good search possibility is a key to achieving sales targets.

With Emporix, you get additional ways to enhance search functionality. Check out these resources:

  • Universal Search Connector

  • Search Configuration

  • Indexing Service

Manage Showcase and Sample Data

Use sample data and showcase storefront to test your setup.

The Manage Showcase & Sample Data view of the Emporix Developer Portal is a designed to help you start working with your data and check our Emporix Showcase. The view is available for users with the Admin role.

  • Emporix Showcase - see a sample storefront that is built to showcase how you can set up your own one.

  • How to import sample data - learn about importing sample data to the selected tenant and then see how you can manage it in the Management Dashboard.

Tenant List

View and manage your tenants.

The Tenant List view of the Emporix Developer Portal is the place where you can see all the tenants assigned to your account or you can create a new one.

Creating additional tenants

When you create an account on Emporix and verify your email address, you are asked to set up a tenant — your business subscription to Emporix services. This tenant acts as a production environment that your customers will interact with directly.

You can create more tenants for different purposes, such as a staging environment for testing. This way, you can try out new APIs, get familiar with New features, or verify your assumptions about our system without the risk of breaking the production environment.

Depending on your contract with Emporix, additional tenants may be subject to billing.

  1. Go to the Tenant List view.

  2. Choose Add Tenant.

  3. Provide required details and your preferences and confirm with Create a tenant.

Result: When the tenant is created in the system, you receive an email notification. You can start working with your new tenant.

Customer Social Login

See how social login facilitates accessing your online store.

Social login is a form of single sign-on offered to your customers. Instead of creating a new account specifically to your store, the customers can use their existing social networking service account, such as Facebook, Google, or other, to log in to your online store. Frequently, this is a more convenient option for your customers. Therefore, by facilitating users access, the social login feature enhances the overall user experience.

See how it is used on an example storefront page.

  1. Open the login page on the storefront.

  1. Choose Social login to log in with some other service credentials.

  2. Choose the service to log in with, for example Google. You get redirected to the service to log you in with your existing account.

  1. After authorization, you are logged in to the storefront.

Third Party Add-Ons

Third-party add-ons can boost the effectiveness of building and managing your online store.

Emporix makes it possible to seamlessly integrate your store with external systems, such as Content Management Systems (CMSs) or support platforms. These systems play crucial roles in enhancing your store's functionality. For example, a CMS is software that enables you to create, edit, and publish your store's content. Similarly, a support system allows you to manage customer interactions, resolve issues, and provide assistance efficiently, ensuring a smooth customer experience.

See what you can connect to:

  • Emporix Contentful App - integrate your product data from Emporix to Contentful platform

  • Emporix Builder.io Plugin - create websites using the data from Commerce Engine

  • - integrate product data using Magnolia CMS

  • - integrate with Zendesk to enhance customer support experience

  • - integrate with Storyblok to create content displaying your products and categories

Integrations

See how Emporix facilitates integration with other tools and systems with the pre-built functionalities.

Our system is built with flexibility in mind and offers a wide range of integration options. Whether you're connecting third-party tools, internal platforms, or external services, we provide APIs and event-driven capabilities to make integration smooth and reliable. This documentation covers the available methods and practical examples to help you get started quickly.

Check the following guides:

  • Auth Integrations

  • ERP Integrations

Manage API Keys

API keys enable you to work with Emporix API with different scopes and perspectives.

The Manage API Keys view of the Emporix Developer Portal is the place where you access the API keys connected to your tenants. API keys allow you to access API from either business or a customer's perspectives.

When you create an Emporix tenant, you obtain keys to the following types of :

API type
Description

Commerce Engine

Commerce Engine lives at the heart of your commerce. Get familiar with the Emporix solution.

Emporix Commerce Engine is a cloud-native, API-first platform that provides all the core building blocks of modern digital commerce — from product catalogs and pricing to carts, orders, and promotions. Designed with a composable, MACH-based architecture, it gives enterprises the flexibility to scale, customize, and integrate commerce into any digital ecosystem. Choose it to power complex B2B and advanced B2C scenarios where agility, extensibility, and customer-specific experiences are critical to growth.

My Account

The My Account view of the is the place where you can manage your account information, change password, or set up the MFA.

Personal settings

In Personal settings, you can view and edit your personal information and see the specific roles you are assigned to in the and .

The Custom Roles section is visible if you have specific user groups assigned in the . These can be managed directly in the by CE Administrator users.

Introduction

System management tools in Emporix are designed to help you take full advantage and maximize Emporix capabilities.

The System Management category contains overviews of the Emporix system management functionalities. Each document describes the way that a particular concept is designed in our system.

If you're looking for documentation on how to configure specific system management functionalities for your Emporix tenant, check out our .

Automated Use Cases

Explore the examples of how Emporix CE and OE systems can work together to learn how the functionalities we offer can be used in your company.

As an innovative commerce software, Commerce Engine (CE) can closely integrate with Orchestration Engine (OE), which is responsible for enhancing and improving business processes. We integrate CE and OE to enable a fully automated end-to-end process chain. This step is crucial for increasing efficiency, saving time, and providing seamless, fast, and reliable services to our customers. By eliminating manual processes and ensuring seamless collaboration between CE and OE, we strengthen excellence and innovation in digital commerce.

This documentation is build as a showcase to present business use cases that can be solved with a combination of CE and OE working together and creating one end-to-end process.

See the below business scenario as an example of an end-to-end business process:

Treat these use cases just as examples, the real life scenarios can be different.

Emporix Builder.io Plugin

Builder.io plugin provides external content management functionality.

is a visual and headless CMS platform that allows you to build webpages faster thanks to predefined building elements. You might want to use this solution to create or enhance your online store website or application. To facilitate integration between Emporix Commerce Engine and Builder.io, we have created a plugin that helps you connect your data and build your store even faster. The Builder.io Emporix plugin is made available through .

Within the Builder tool, you can find the plugin on the plugins list:

Purpose

First Registration Coupon

Check out usage of a value stream to automate coupon creation for first time customers.

There are numbers of marketing strategies you might use to gain new customers for your online store. One of them could be a Welcome Campaign that offers a discount coupon for first time users that register at your store. Here, you might use the power of value streams that come with Orchestration Engine. You can create such a scenario with a simple value stream, like the one presented in the example.

Overview video

Extensibility Cases

Take a look at the possibilities that Emporix offers to extend the platform to even better suit your needs.

In an e-commerce environment, data is often sourced from multiple systems. Commerce Engine provides the ability to extend the platform with additional tooling, ensuring seamless integration of data between business applications. Learn how you can extend Commerce Engine to streamline your operations.

Authentication and Authorization

Enable proper authentication and authorization measures to keep the system secure.

At Emporix, we care much about security of our systems to protect your data. One of the security measures that Emporix undertakes is enabling appropriate user authentication and authorization. The tools within Emporix system allow for adequate verification of user identity and access rights.

To learn more about the tools and their configuration, see:

Magnolia Emporix Connector
Zendesk Emporix Connect
Emporix Storyblok Plugin
Customer Communication Integrations
External Products, Pricing and Fees
Enabling Custom Extensions
Auth0
  • Keycloak

  • Identity and Access Management (IAM)
    Emporix Single Sign-On (SSO)
    The Emporix Builder.io plugin provides a standardized and fast integration of data from Commerce Engine. The Builder.io can use data like product and categories when creating data models within Builder.io. Therefore, using the plugin when working on your storefront, you are able to fetch the product data from Commerce Engine and add it to your webpage straightaway.

    Configuration

    If you want to use Builder.io and the Emporix Builder.io plugin to build your webpage, only configuration is required. All the steps how to enable the plugin and start working with it are described in Builder.io documentation. When enabling the plugin, you need to provide:

    • your tenant name

    • your Storefront API ClientID

    Find your Storefront API ClientID within your API Keys.

    To learn about the plugin, see Emporix Builder.io Plugin.

    Builder.io
    Builder.io Integrations
    To start working with
    , make sure to allowlist its IP: 34.128.182.253.
    API Docs
    api.emporix.io

    Used to define your own keys for separate services and with specific scopes.

    To authorize API requests, you need Client ID and Secret of a specific API key depending on the request you want to send. You can easily copy the credentials with the copy icon or view the Secret with the preview icon. Also, it is possible to regenerate the API keys by choosing the renew option.

    Custom API keys

    You can create your custom API keys for various purposes. It is possible to define separate API keys for different services that contain some specific scopes. This way the application stays more secure. The custom API keys are assigned to the specific tenant.

    Creating custom API keys

    1. If you don't have any custom API keys, in the Manage API Keys view choose the Create scopes in the Custom API row. Once you have already defined some API keys and want to define more scopes, expand the Custom API and choose Add custom API.

    2. Enter the name for your custom keys and select the scopes of your interest. You can choose scopes from different services.

    3. Confirm with Generate and the created group appears under Custom API.

    Quick start sample

    For easier start of working with API keys, you get a preview of sample requests. Choose the Get started option next to the selected API key to get a preview of an example request.

    Used to access and manage your tenant's resources. With this key, you have access to all services and scopes within the application.

    Storefront API

    Used to access storefront application to perform basic e-commerce actions like browsing products, viewing prices, or adding products to cart.

    Custom API

    Password

    In the Change password tab, you can change the access password to your account.

    If your account is configured to use a social login or single sign-on to access the applications, you are not able to reset your password on your own, as this is managed by an external provider. To reset the password, change it through the provider directly.

    Multi-factor authentication (MFA)

    In the Manage MFA section of your account settings, you can set up Multi-Factor Authentication (MFA).

    1. Using an Authenticator App (for example Google or Windows ones) on your phone, scan the provided QR code or enter the provided secret key manually.

    1. Enter the verification code and save the configuration. After you choose Save, you are logged out and need to log in to the developer portal again.

    Your MFA setup is complete. You can disable it at any time using the Disable MFA button.

    • All the users can use the MFA, but only Authenticator Apps are supported.

    • When you enable MFA, it works both for the Developer Portal and the Management Dashboard.

  • First Registration Coupon

  • Availability and Warehouse Assignment

  • Quote and Order Entry Automation

  • To explore more possibilities and solutions that Emporix CE and OE can provide, contact our Sales team and request a demo of other use cases.

    For more information about Orchestration Engine, see documentation.

    Process flow

    In this use case, we create a simple value stream that covers the following flow:

    The value stream starts automatically when a first time user registers as a customer on the storefront. The registration event serves as a trigger for OE. OE catches the customer creation event from the storefront and passes the customer's ID to the CE API endpoint responsible for creating coupons. CE creates a coupon and saves it in the database. As a result the discount coupon code is visible in the Management Dashboard, under Customer Management -> Coupons.

    For the first time registration use case, the coupon works only for the customer with the given ID that is read from the previous step. But, the coupon can have different redemption rules, like for example, it can only work for a certain category of products, can be valid only for some period, or work only with some minimum order value, or more depending on your preferences.

    The next step of the value stream takes care of sending an email to the new customer with the created coupon code. OE triggers the mailing service to send out an email with coupon details, encouraging the customer to make a purchase in your store. The customer can use the coupon straightaway at checkout if they fulfill the set coupon rules.

    The value stream as described here can look like this:

    This use case serves only as an example of what you can achieve with CE and OE. The value streams we presented here can be adjusted to your actual needs. For further information, contact our Sales Team.

    Getting Started

    Get to now the concepts on which the Emporix e-commerce system is built.

    Commerce Use Cases

    See example use cases of how Emporix can help you drive your business.

    System Management

    Learn about customizable settings in the Emporix e-commerce system.

    Extensibility and Integrations

    Are you looking for ways to extend the platform and integrate it with other application? You can find details here.

    Core Commerce

    Find out how the Emporix e-commerce system is designed and how you can tailor it to your business needs.

    Management Dashboard

    Get to know the Emporix Management Dashboard - a user interface for managing your system - and learn how to navigate it.

    General Concepts of Emporix

    Get an overview of Emporix's main characteristics and features.

    The Commerce Orchestration Platform enables you to digitalize your sales end-to-end. It embraces Commerce Engine and Orchestration Engine that together can help you revolutionize the ways you sell your goods and operate more efficiently within your company. If you're interested in these products, contact the Sales Team.

    To learn more about Commerce Engine, continue with this documentation, and for more information about Orchestration Engine, see .

    Emporix Commerce Engine is a modern digital commerce platform tailored for B2B businesses and sophisticated B2C, leveraging a composable architecture to enhance flexibility and scalability. Built on MACH principles (Microservices, API-first, Cloud-native, and Headless), it offers a robust infrastructure for various business needs. For B2B commerce, Emporix provides a suite of features tailored to enhance business operations and customer experience. These features include:

    • Customer-Specific Pricing: Manage individual pricing agreements and frame contracts.

    • Bulk Pricing and Discounts: Support volume-based pricing and discount algorithms.

    • Rebate Schemes: Create custom rebate programs.

    • Advanced Quoting and Approval Workflows: Streamline quoting processes and compliance workflows.

    Additional Services:

    • Authorization

    • Artificial Intelligence

    • Configuration

    • Catalog, Product, and Price

    For more details, visit .

    Further, CE is integrated with OE to support a wide range of commerce-driven business processes.

    Multi-tenancy

    Site

    The Emporix Commerce Engine ensures a seamless and integrated digital commerce experience, supporting various front-end interfaces and delivering high performance, scalability, and future-proofing. The headless commerce architecture allows businesses to choose their front-end presentation layers, providing flexibility in how they engage with customers. Additionally, the cloud-native design ensures high availability and dynamic scalability, allowing businesses to focus on innovation and growth without worrying about underlying infrastructure.

    To learn more about sites in the Emporix e-commerce system, check out the .

    Tenants

    Emporix is a multi-tenant SaaS solution. All tenants share the same hardware and software infrastructure. They are virtually separated by tenant IDs and access tokens.

    To learn more about how to create a new tenant, follow the guide.

    API Settings

    Regions

    Emporix is hosted on Google Cloud in Europe, Netherlands - Eemshaven.

    API Base URL

    https://api.emporix.io

    We strongly advise you to use the host and domain names in your applications instead of hardcoding any IP address of the API hosts. IP addresses can change any time without prior notice.

    Authorization

    All requests sent to the Emporix API require authorization with a valid access token. To obtain an access token, you need to know your Emporix API keys. The keys are automatically generated when you create a tenant.

    To learn more about access tokens in Emporix API, check out the .

    JSON

    The majority of the HTTP API endpoints consume and produce standard application/json payloads. To ensure that payloads are encoded correctly, use Content-type: application/json in your HTTP header when sending POST requests. When consuming a JSON response, ignore any unrecognized fields in JSON objects of responses, or deal with them such that it does not cause the client application to crash. The API assumes clients behave properly and considers the addition of new fields to be backward-compatible for existing clients. In addition, client applications should not rely on the presence of undocumented fields. Fields returned by an undocumented endpoint can be renamed or removed at any time without prior notice.

    Identifiers

    Some resources contain a field named id that uniquely identifies a resource. The id value is generated by Emporix when a resource is created. Some resources contain an additional field named code that also uniquely identifies a resource. However, the code field needs to be specified in the request body when creating a resource.

    Update guarantees

    Different kinds of requests in the Emporix API offer one of two update guarantees as described below.

    Strong consistency (read-after-write consistency)

    Whenever a resource is successfully updated or created, it is guaranteed that in a subsequent read (called read-after-write), the returned resource contains all the values from the latest successful update.

    This type of consistency is usually available for all CRUD endpoints that do not require complex background processing. For example an update to the Customer.firstName field will be accessible across the Emporix API immediately.

    Eventual consistency

    Eventual consistency guarantee applies to all APIs that require background processing that is conducted in a non-blocking manner, usually through event-based processing or batching. In this scenario, it is guaranteed that all successful updates are processed and reflected by the system as soon as possible (or according to a particular API's detailed specification). However, a read subsequent to a successful write may result in returning non-updated values. An example of eventual consistency is the Product search API that requires indexing of Product data. As this is a costly operation that leverages an integration, the indexing is run asynchronously and may last longer than a subsequent read to a successful write.

    Customer audit logs

    You can request customer audit logs from Emporix by reaching out to our and sending the email request. The logs are kept for 2 years. You can retrieve information about create, update or delete operations. The records contain information about the tenant, timestamp and the person who performed the actions.

    Free trial

    You can try out the Emporix e-commerce features completely free of charge for 14 days. With our free trial, you get full access to the production-ready e-commerce system, together with our storefront and so you can test all of functionalities before you decide to become our partner.

    What are the differences between a free trial and a paid plan?

    Apart from the free trial being time-limited, there are no differences between free trials and paid plans — both operate in production environments. This approach brings the following benefits:

    • Full experience of the Emporix e-commerce system during the free trial.

    When your free trial ends, the Emporix sales team will contact you to hear about your experience with our products.

    Company Shared Orders and Customer Groups

    Learn how customer groups and shared company orders can facilitate your workflows.

    Use Case

    As a B2B seller, you'd like to set permissions and scopes to your end customers and respond to their specific needs. While the buyer companies have multiple representatives, with frequently different liability levels, it is crucial for them to manage the users and assign relevant permissions to the organization resources in your store. For example, they'd like to keep their purchase orders under control and therefore they'd like to be able to view the orders made not only by themselves but also the other orders that were related to their company (legal entity).

    In this case, customer groups and shared orders features come very useful on the storefront. With the right access, the end customers are able to take care of user management on their own, without the need to contact your support team.

    Customer Groups in the Management Dashboard

    As a B2B seller, you have an option in the Management Dashboard to create and manage B2B customer groups. Customer groups are legal-entity-aware, so the information relevant to the company can be read by the relevant customer group.

    A customer group is automatically created when creating a company in the system. A customer assigned to the legal entity (company) is assigned to the customer group. Also, a new customer that signs up to the storefront, gets assigned to the customer group related to the company they provide during the registration.

    To manage a customer group on behalf of your B2B customer in the Management Dashboard, go to the Customer Management -> Groups. You can create and edit customer groups from there. You can change and add permission scopes or manage group members.

    Adding company related orders visibility

    To allow your customers to view the orders associated with the same organization, assign the read scope for legal entity in relation to the order objects.

    1

    Go to Groups

    In the Management Dashboard, go to the Customer Management -> Groups module.

    2

    The system ensures orders are only shared among users assigned to the same company. When a customer belongs to more than one legal entity, the permissions related to the customer groups are resolved with the refresh token. When a customer switches to another legal entity, the token gets refreshed with the relevant legalEntityId. This way, the right scopes and permissions are received for the customer in relation to each organization. So, for one legal entity the customer can have the access to the company-related orders while for another legal entity not.

    Viewing shared orders on the storefront

    Your B2B customer now has an option to monitor what has already been ordered on behalf of their organization. After logging in, they go to their account details.

    In My Orders, they can view the orders placed by themselves:

    But, if they have been assigned to a group with the read for legal entity scope for orders, they can also view the history of orders placed by other members of their company:

    Viewing the orders related to the company improves the collaboration and transparency for your customers as it allows them to check the order details, return the items, or make the same order if needed.

    Thanks to the scopes and permissions, they can consciously control who gets access to the company's shared information. If they don't have the right scope assigned, they're not able to see the company-related orders:

    To see how B2B customers can manage the users from the same legal entity on their own on the storefront, see the use case.

    Emporix Single Sign-On (SSO)

    Integrate single sign-on mechanism.

    Thanks to the Single sign-on functionality, working with Emporix Commerce Engine is even easier for your employees.

    Purpose

    Single sign-on is an authentication scheme that allows users to log in to different business applications with a single ID without the need to re-enter authentication credentials. Enabling SSO enhances the user experience, bolsters security measures and simplifies identity management within your organization. As the SSO ensures standardized integration for backend logins, the employees can access Emporix Management Dashboard of Commerce Engine with the same login they use for other systems you've integrated with your identity provider. The Emporix SSO functionality has been implemented flexibly for you to integrate with an identity provider of your choice. The identity provider has to be compatible with OpenID Connect (OIDC). For example, you can integrate with Azure AD, Google, Apache Directory Server, or other.

    Features

    Business Aspect
    Description

    Overview

    The following diagram presents the general process:\

    Configuration

    Emporix SSO functionality enables integration of external identity providers (IDP) with the Emporix authentication system. You can choose any identity provider that is compatible with OpenID Connect (OIDC) standard.

    As a customer, you have to configure the IDP system of your choice and provide the required credentials to Emporix so that we can enable SSO for your tenants.

    As the IDP configuration is tool-specific and dependent on your needs, we don't impose any configuration steps. Once you have the application registered in your identity provider, provide the credential details to Emporix. Depending on your IDP, these may be called differently, but should be equivalent to a unique identifier (for example `Application ID`) and secret password (for example `client secret`). These details are essential to enable the SSO functionality on the Emporix side.

    Redirect URI

    In your IDP system, register a redirect URI with a callback function: https://auth.emporix.io/oauth2/v1/authorize/callback. The URL is where the identity platform redirects a user's client and sends security tokens after authentication.

    Login page

    The login page contains the option to log in to Emporix systems using Single sign-on once you enter the configured email address:

    If your email domain is configured to use SSO, once you enter it, the option to Login with SSO appears, and you get redirected to the IDP provider to verify your credentials. Once you are logged in, you don't have to re-enter the password to log in to the Emporix Management Dashboard.

    Only already activated user accounts can use SSO to log in to Emporix tools. The newly created user accounts need to be activated first. A new user receives an invitation email with a link to set a temporary password. When the password is set, the user can log in and link the account with an OIDC account. To link the Emporix account with the external OIDC account, the temporary password is necessary. Temporary password can be only used for linking the account with external providers. The option to log in to the system using temporary password is blocked.

    SSO connection

    After the SSO has been properly configured on IDP and Emporix, the authentication happens in the background. See how it works together on the following diagram:

    Each time an employee logs in to the Developer Portal or Emporix Management Dashboard system, a request is sent to the Emporix user authentication solution with the proper IDP ID. The solution communicates with the Identity Provider system. The IDP returns a token that allows the user to log in to the Emporix Management Dashboard.

    To learn more how you can configure an external identity provider system, see the Azure AD example - .

    Coupons and Redeeming Rewards

    See the example of using coupons end-to-end.

    This is to demonstrate how our Coupon Service and Reward Point Management Service can be used.

    Coupons

    Coupons can be managed within the Management Dashboard, two different types are supported:

    • Percentage

    • Absolute

    To learn about details how to create coupons, see the user guides.

    1. Login as a customer and add products to the cart.

    2. Go to the checkout and add a coupon to the cart.

    1. Choose Apply, the discount is calculated based on the Subtotal without VAT.

    If you delete the coupon, the discount percentage is added again to the cart value. Vat is calculated based on “Subtotal without VAT” - “Discount Amount” = Base value for VAT.

    1. Go through the normal check out and submit the order. The discount is also displayed within the My Orders overview page.

    Reward Points

    Reward points can be exchanged for coupons by customers within the B2B Showcase. To have that functionality available it is necessary to create rewards points first using the endpoint.

    In case a customer already had points, use Adding to add additional points to a customer.

    Points can be exchanged to coupons, which then can be used for future purchases. Redemption options are not limited and can be configured by your employees

    To use it within the B2B Showcase follow the steps:

    1. Login and add a product to the cart.

    2. Go to the checkout and click on Get coupons for points.

    1. The redeem options are displayed which were configured beforehand. Select one redeem coupon and click on Redeem selected.

    Result: The discount should appear in green and the points are counted down.

    1. Proceed with the checkout and submit the order.

    To learn more about API used in this use case see the and for user guides check the and documentation.

    Optimistic Locking

    Ensure smooth simultaneous work for multiple users with optimistic locking mechanism.

    Optimistic locking is a concurrency control mechanism that prevents overriding another user's changes when multiple transactions accessing the same data are happening simultaneously. The main idea behind it is to avoid the use of locks and instead assume that conflicts between operations are rare. With optimistic locking, we can ensure better performance of the Emporix applications. Within Commerce Engine, optimistic locking is based on the metadata.version field. It's supported at the API level, but it also works within Management Dashboard directly.

    All the entities that have metadata.version field defined use the optimistic locking. Entities that don't have such field defined, don't support optimistic locking. You can check if a particular entity has that field defined in our API Documentation. For API calls, ensure to provide the correct metadata.version in PUT operations to turn on the optimistic locking feature. For PATCH operations, providing metadata.version is optional, so if you don't provide the value, optimistic locking is skipped.

    All the metadata fields are set during a document creation in the database, and their values are as follows:

    • version = 1

    • createdAt = Instant.now()

    • modifiedAt = Instant.now()

    Here’s how optimistic locking works:

    1. Version check: Triggered by an API request or an action within Management Dashboard, the optimistic locking mechanism checks if the request includes the metadata.version field.

    2. Transaction processing: The transaction proceeds with the requested changes and updates the data tentatively only in memory, excluding id and metadata fields from the payload.

    3. Document update: The mechanism updates the metadata

    Example

    The Management Dashboard user, Tom, opens the ABC product to edit it. At the same time, another user, Michael, opens the same ABC product for edition. Michael is quicker to complete and save his changes. When Tom wants to save the product after he's done with his changes, he gets an error notification, because in the meantime the document version has changed. Tom needs to reload the product in order to make his updates.

    Emporix Contentful App

    Emporix Contentful App provides external product management functionalities.

    The Emporix Contentful App allows you to visually select your store's products from Emporix and reference them in Contentful entries.

    Prerequisites

    To use the Emporix Contentful App, you need:

    • A Contentful content type. It needs to include at least one field with its type set to either Short text or Short text, list.

    Emporix credentials for integrating with Contentful:

    • Search API Key

    • Index Name

    Installing the Emporix app on Contentful

    1. Log in to .

    2. Navigate to Apps -> Manage apps.

    3. Select the Emporix app and click Authorize access.

    4. Fill out the Emporix app fields with your Algolia credentials. a. Paste your Search API Key in the Search Key field. b. Paste your

    1. Click Install.

    Using the product picker to select products

    1. Navigate to the Content tab.

    2. Select or create a new entry of the content type for which you installed the app.

    3. Find the field and click Select products.

    1. Use the search bar to search for products by name.

    2. Select the products and click Save products.

    1. Selected products should now appear in the content editor.

    To facilitate finding relevant products, the products that have not been published yet are tagged with the [UNPUBLISHED] label. It helps you differentiate whether you select the right items. The information whether a product is published or not comes from the configured search index provider.

    Universal Search Connector

    Universal Search Connector allows you to optimize the system and automate indexing of your products.

    Here you can find an overview of the universal search connector in Emporix, along with its features and benefits.

    Looking for tutorials? Check out the Search Configuration.

    Purpose

    With the Emporix universal search connector, it is possible to gather all events happening in the system and set up automated actions that will ensue in relation to those events. Every time an object is created, updated, or deleted, the events are being indexed and sent to the Webhook Service. The webhook events are further sent out to the Svix application, which in turn updates the search engine database of your choice. The actions, as configured in Svix, can be executed in various third-party applications, as the solution is universal and widely applicable.

    Features

    Feature
    Description

    Overview

    The indexing process consists of the following sequence of events:

    1. When a product-related event takes place, it is processed by CE.

    2. The event is consumed by a messaging system and undergoes indexing.

    3. An indexing message is sent to the Webhook Service.

    The indexing messages are sent in an asynchronous way. The indexing service searches for changes every two minutes to gather all related events and send them in one collective message, for example when you update the price, availability, and delivery methods of a particular product. This may result in a delay in message delivery.

    1. The Webhook Service forwards the message to the Svix Event Gateway.

    2. The Event Gateway passes the event to your pre-configured endpoint for this particular event, and updates the search engine database of your choice.

    For example, if a price is updated in the Emporix environment, an indexed message is sent to the Webhook Service. In Management Dashboard, if you enabled actions for index item updates and/or deletions, the events are passed further to the Svix Event Gateway. If an endpoint for the update/delete actions was configured in Svix, all relevant actions are executed in the third-party search engines that your system is integrated with.

    Availability and Warehouse Assignment

    Check out the Emporix use case of product availability check and warehouse reassignment process.

    To ensure smooth shopping experience for your customers, your online store has to have some backend mechanism to check availability of the products in your storefront site.

    In B2B world, typically customers get assigned to a specific warehouse based on their address. The warehouse is determined when a customer logs in to the online store. Basing on the assigned warehouse, the customer can see the relevant availability of products in the store. Frequently, the availability data comes from external systems such as ERP or OMS. When the customer adds a product to cart, the background process has to retrieve its availability information from an external system and return it to the storefront to allow or disallow the customer complete the checkout.

    In this use case, we demonstrate how you can use CE together with OE to automate the process of assigning a customer to a warehouse and triggering availability check from an external system for a product added to a cart. Additionally, when a product is not available, the automated process notifies a merchant and asks for their approval to transfer the goods delivery to another warehouse where the product is available. The product availability is reflected in the storefront making it possible to complete the checkout. The customer in turn gets a coupon code for free shipping as a form of making up for the delayed delivery. The value stream enhances customer satisfaction and increases retention rate.

    Sounds like a valid use case for your business? Let's take a look at how such a value stream can be configured.

    Process flow

    In this value stream, we cover the following flow:

    We are going to create two value streams that can run separately: one value stream responsible for getting the right warehouse data, and another value stream taking care of checking products availability and taking appropriate actions when products are out of stock.

    Warehouse availability

    When a customer logs in to the online store, the value stream for assigning a corresponding warehouse starts. OE listens to the webhook event when a customer logs in and based on the customer's address information it writes down the warehouse information in the session context.

    This way, the availability of products in the storefront reflects the stock levels in the particular warehouse that the customer got assigned to. The session context holds the information about the warehouse that is later retrieved when a customer adds a product to cart.

    The value stream ends here, but if the customer decides to make some purchases on the storefront, their action triggers another value stream.

    Item added to cart

    1. This value stream starts when a customer adds an item to cart. Orchestration Engine is subscribed to the webhook event of logging in that triggers the workflow.

    2. The product availability is checked against the warehouse stock levels and is updated in the cart.

    • If the product is available, the flow ends. The customer can proceed with the checkout and complete the purchase.

    • If the product is out of stock, we add conditional logic for additional steps.

      • OE sends a form to a merchant with a request for transferring the missing product from another warehouse. The merchant gets a magic link to a form where they can directly act on the request.

      When the merchant approves the change and the goods are transferred, it serves as a trigger to check availability and update it in the customer's cart to notify them that the items are ready to be purchased again.

    Bear in mind this use case serves only as an example of what you can achieve with CE and OE. The value streams we presented here can be adjusted to your actual needs. For further information, contact .

    Unzer

    See example of integrating Unzer.

    Introduction

    The Emporix system allows to integrate with Unzer as the payment provider.

    What we support, is the Pay by Invoice solution as the post-checkout approach. No other Unzer integration is possible at the moment.

    The diagram shows how Unzer sequence looks like when it's integrated with Emporix:

    Gateway configuration

    Prerequisite

    For the Emporix and Unzer configuration, you need to have the private key and the public key from your Unzer account.

    Creating the payment mode

    To create the new payment mode, execute the following request:

    • UNZER_PAYMENT_METHOD_TYPE - PAYLATER_INVOICE is the supported payment method.

    • UNZER_PUBLIC_KEY - The public key from your Unzer account.

    • UNZER_PRIVATE_KEY - The private key from your Unzer account.

    • UNZER_CUSTOMER_TYPE - Either B2B or B2C.

    Storefront implementation

    The integration with Unzer does not require any specific implementation on the storefront side. Emporix implements the server-side-only integration with Unzer, therefore there is no need to generate any token - it's done by the Emporix Payment Gateway service.

    The only thing you need to ensure is that you’re providing the following data during the authorization request:

    • ORDER_ID - Identifier of an order.

    • paymentModeId - Identifier of the payment mode that you got from https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend endpoint.

    To learn more about the Unzer solution, see the documentation.

    Developer Portal

    Developer Portal is a starting place for setting up and configuring your tenant.

    The is designed to help you manage your company account at Emporix.

    Login page

    You can log in to the Developer Portal using one of the following methods:

    • Password-based authentication

    Quote and Order Entry Automation

    See the use case of how the quotes and order process can be automated.

    In this scenario, we'll explore how AI is used by Orchestration Engine and Commerce Engine to automate Order Entry across various sales channels. Handling sales orders by email channels requires manual involvement, which is often very time consuming and inefficient. The integration of CE, OE and AI enhances and improves business processes by minimizing manual work. You can see how Emporix contributes to automating the quote and order entry process.

    The scenario covers a use case when a customer sends an email with a PDF order form. Information about this event works as a trigger for OE to start the process and then for AI to begin a quote preparation that finally leads to completing the order for the customer.

    Process flow

    HTTP Webhook Strategy - HMAC Configuration

    Configure webhooks HMAC to ensure additional authentication layer.

    This article applies to HTTP webhook strategy only.

    With the HTTP webhook strategy active, all the events are sent to the configured destinationURL through HTTP POST requests. These requests can be (optionally) authenticated using HMAC (Hash-based message authentication code). By using HMAC, you can add authentication layer and verify that the incoming data is correct and authentic.

    To enable such an authentication mechanism, provide the secretKey

    ERP Integrations

    See how Emporix facilitates integration with other tools and systems with the pre-built functionalities.

    Integrating two systems can be a complex task, especially when it comes to ensuring consistent data synchronization across platforms. Emporix is designed to simplify this process with its robust and flexible APIs. Its extensible data models, together with mixins possibilities, allow for seamless customization to meet specific business needs. Most importantly, Emporix reduces the challenges of integration by providing an integration-friendly API architecture, streamlining the process and enabling efficient connections between systems.

    To facilitate integration with other systems, Emporix offers the following capabilities:

    Custom ID

    Typically, the integration layer and ERP systems lack visibility into the entity IDs generated by the Commerce Engine during creation. Emporix resolves this issue by enabling the configuration of custom IDs.

    fields:
    • metadata.version increased by 1

    • metadata.modifiedAt set to the current time

  • Database update: The relevant document with matching id and metadata.version is found in the database and updated accordingly. However, if the document cannot be found due to the fact that another operation that has run in the system modified the same data in the meantime, the system throws an exception error, prompting the user to retry the operation.

  • Universal search engine integration solution

    This feature is designed to be universal in order to fit your business' needs. You can use various search engines, such as Algolia, clerk.io, constructor.io, and others.

    Product-related events

    All product-related events, such as price updates, product deletions, and others, trigger the indexing service that sends events to Svix.

    Management Dashboard navigation

    The configuration and management of the indexing feature is handled through the Emporix Management Dashboard.

    Webhooks integration

    Thanks to the integration with the Webhook Service, the product-related events are automatically sent out to other integrated third party applications.

    Event Gateway

    In the Svix application, the event gateway serves as an intermediary between Emporix services and search engines.

    No coding required

    Pure configuration of the identity provider to integrate with the Commerce Engine.

    One login only

    Only one authentication login for all the different internal applications on the merchant side.

    OIDC standard

    Integrating with an identity provider compatible with OpenID Connect ensures secure authentication.

    SSO enforcement

    Possibility to configure additional security measures to allow logging in only for the accounts set up in your IDP through SSO functionality. If you want to enable this option, get in touch with Emporix.

    Quickstart: Register an application with the Microsoft identity platform
    Index Name
    in the
    Index name
    field. c. Paste your
    Application Id
    in the
    Application id
    field. This field is optional. If
    Algolia Application
    is provided by Emporix then this field should be empty. If custom
    Algolia Application
    is used then this field should be provided.
  • Mark checkboxes next to the fields for which you would like to install the Emporix app.

  • Contentful

    Introduction

    Learn about Emporix core commerce features.

    The Core Commerce category contains overviews of the Emporix e-commerce solutions. Each document describes the way that a particular concept is designed in our system and how it can benefit your business.

    If you're looking for documentation on how to configure specific e-commerce functionalities for your Emporix tenant, check out API Docs.

    UNZER_RETURN_URL - The URL to which the customer should be redirected after an external payment.

    Unzer
    curl --location --request POST 'https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "unzer",
        "active": true,
        "provider": "UNZER",
        "configuration": {
            "Unzer/PaymentMethodType": "{UNZER_PAYMENT_METHOD_TYPE}",
            "Unzer/PublicKey": "{UNZER_PUBLIC_KEY}",
            "Unzer/PrivateKey": "{UNZER_PRIVATE_KEY}",
            "Unzer/CustomerType": "{UNZER_CUSTOMER_TYPE}",
            "Unzer/ReturnURL" : "{UNZER_RETURN_URL}"
        }
    }'
    {
      "order":
        {
          "id":"{ORDER_ID}"
        },
      "paymentModeId":"{PAYMENT_MODE_ID}"
    }

    Flexible Invoicing and Payment Options: Provide detailed invoicing and support various payment methods.

  • Customer-Specific Catalogs: Manage tailored catalogs for different customer groups.

  • Users and Permissions
  • Company and Customers

  • Delivery and Shipping

  • Rewards and Promotions

  • Quote Management

  • Checkout

  • Order and Order Fulfillment

  • Utilities

  • Media Management

  • Webhooks

  • Integrations

  • Easy migration from a free trial to a paid plan (your data remains in the system).

    Sites guide
    Creating your first tenant
    Support Team
    B2B Showcase
    data importer
    Getting Started with Emporix API
    Go to edit mode

    Edit the chosen group.

    3

    Assign permissions

    In the Customer Settings section, assign the read permission for orders and save the changes.

    User Management and Approvals

    If the merchant doesn't approve the transfer, the flow ends without any further changes.

    • As the customer is not able to get the selected product immediately, we add a step for automatic coupon creation as a means of making the customer happy again. When the item delivery is delayed because of the necessity to change the warehouse, OE triggers CE to create a coupon code for free delivery and sends it to the customer so that they can use it to complete the transferred product purchase.

    Sales team

    Single sign-on (requires additional configuration of an Identity Provider service, to learn more see Single Sign-On)

  • Social login with the following platforms:

    • Google

    • LinkedIn

    • Microsoft

  • User Interface

    Learn how to navigate through the Developer Portal and what are the available functionalities.

    The top menu is displayed in all the views of the Developer Portal so it is easier to navigate between different functionalities and get access directly to what you need.

    Tenant chooser

    Your Emporix account can be assigned to multiple tenants at the same time. To switch between tenants, expand the dropdown menu on the left side of the Developer Portal. You also have an option to create a tenant from here.

    Dropdown menu

    The top menu gives you access to administer different parts of your account.

    Expand the dropdown menu to see available options and navigate directly to a chosen section from any point in the application:

    • Overview — where you can access all the services available through the Developer Portal.

    • Users — where you can manage your team members and their privileges.

    • API Keys — where you can access your keys, and see some usage examples.

    • My Account — where you can edit your personal settings.

    Direct links

    From the Developer Portal, you can navigate to Emporix documentation portal to see the latest updates and get proper help, or you can jump into Management Dashboard to get backend view on your data. The links to these services are available from all Developer Portal views.

    Overview

    Note that the Developer Portal offers two roles:

    • ADMIN - the user has manage access to all the functionalities of the Developer Portal

    • USER - the user can only manage their own account and change their password, for the Developer Portal functionalities they have view access only, except for the demo data.

    All the functionalities of the Developer Portal are available from the Overview page. It is divided into the following sections:

    • Manage Users - change the users' settings

    • Manage API Keys - view API keys

    • Tenant List - see the tenants assigned to your account or create a new one

    • My Account - edit personal settings or change password

    • Management Dashboard - access Management Dashboard

    • Documentation - read Emporix documentation

    Emporix Developer Portal

    When the customer sends the email with an order request attached as a PDF file, it sets off the whole value stream.

    The trigger is a starting point for the value stream and is configured to listen to the specified event and starts the process execution.

  • When the process starts with the received event, the next step is to check the purchase order identifying the products that were ordered and their quantity, calculating a quote for the order, and matching the customer with the order. This process step consists of smaller subflows that ensure the process is conducted step by step and all the data is parsed together.

    • The step starts with AI retrieving the ordered products and creating data that includes the identifier of the ordered products and the quantity.

    • When the data of the ordered products is gathered, the next part is to create a quote based on the number of the ordered items and their matching price.

    • The last subflow of this process step is to match the customer ID with the placed order.

  • The data from the trigger event and the first process step is combined in a process context which fetches data from all the steps of the value stream until the last step. Using the data that is already included in the process step it's possible to move to the next step and create the actual quote. This step is based on a condition that the customer ID was found and it's possible to generate the quote.

  • When the quote is generated the process checks whether the quote can be automatically approved or whether it needs additional internal approval. In this value stream we use a business rule that says that the quote can be accepted automatically if the threshold is <4000.

    The business rule is created in OE's and works as a condition for the quote auto approval step. If the order value is > 4000, then the quote has to be approved manually.

  • When the quote is auto approved it creates a new event that works as a trigger for the next process steps. The trigger is to send an email to the customer.

    The email contains a link to a quote that can be accepted or rejected by the customer.

    This document can be prepared for the customer using Forms that are integrated within OE.

  • When the quote is sent to the customer, the value stream waits for another event, which is the customer response to the quote. The customer can either accept, or reject the quote. When the customer accepts the offer, and sends their response, it works as a trigger for the last step to complete the order. The customer can accept the quote directly from the link, it doesn't require any additional logging in.

    Having the response from the customer who accepted the quote, the quote status is automatically updated and visible in Management Dashboard as accepted. The order is confirmed and can be completed.

  • in the HTTP configuration.

    HMAC involves cryptographic hash function and a secret cryptographic key. SHA-256 is used as a cryptographic hash function and the provided secretKey acts as a secret cryptographic key.

    The payload sent by Emporix is secured by emporix-event-signature. All the fields and the nested structures are sorted alphabetically. Also, all integer numbers are formatted as integers, not as decimals (for example, the payload contains value 1 instead of 1.0). To compute HMAC in a proper way on the receiver side, the order and format of the numbers has to be the same.

    Authentication process

    The steps to authenticate the message are as follows:

    1. The secretKey is used to produce a key.

    2. The event’s payload is converted to JSON format producing a message.

    3. The SHA-256 hash function is used to produce an HMAC derived from the message and the key.

    4. HMAC is encoded using Base64 scheme.

    5. The encoded HMAC value is attached to the request as the emporix-event-signature header of the HTTP request.

    These steps ensure that the recipient is able to verify if the request is correctly authenticated.

    Example HMAC implementation

    Here is an example JavaScript function which verifies incoming HTTP request on the receiver's side:

    This simple function conveys the following logic:

    1. It converts the request body into JSON. The stringify function from an external library is used to order all the fields and nested objects alphabetically which allows maintaining the correct order.

    2. It generates the key based on the secretKey. The secretKey is password123.

    3. It generates the HMAC using SHA-256 hash function.

    4. It encodes HMAC to Base64 scheme.

    5. It compares the value from the emporix.event-signature header with the generated HMAC.

      • If the values match, it logs HMAC validation passed. With the above configuration, if the secretKey is set to password123 on the source side, the validation passes.

    This example demonstrates how you can implement HMAC in your own setup.

    To learn more about Custom ID, check our documentation.

    Upsert

    UPSERT is a database operation that combines update and insert. It allows a single command to either insert a new record if it doesn’t exist in the database or update an existing record if it does. This is particularly useful in databases where you may want to avoid checking if a record exists before deciding to insert or update it.

    To learn more about Upsert, check our documentation.

    Checkout and Price calculation

    Emporix supports two main pricing scenarios based on business requirements: asynchronous pricing and synchronous pricing, where prices are retrieved directly from the ERP system.

    Asynchronous pricing

    In this scenario, product prices are stored in the product catalog. Prices are replicated asynchronously from the ERP system to the Commerce Engine during master data synchronization. These prices can be tailored for customers using price lists, discounts, and other customizations.

    Synchronous pricing

    In more complex use cases, Emporix external pricing functionality enables the storefront’s backend (BFF) to define custom prices, taxes, and external fees for individual cart items. This allows the BFF to fetch real-time pricing from the ERP system and apply it directly to the Emporix cart. These prices and fees are then utilized during checkout to finalize the order.

    Additionally, Emporix supports adding products to the cart that do not exist in the product catalog. For more information, see the External Products, Pricing and Fees documentation.

    Order simulation

    In scenarios where synchronous pricing is insufficient, such as when delivery options and prices need to be dynamically retrieved from the ERP, the storefront backend can use the cart to gather products and addresses. Final price calculations, however, are managed by the ERP system. In this setup, checkout price calculations are bypassed, and the storefront backend creates the order using the ERP-provided pricing.

    To see an example of the Emporix and ERP system integration, check the SAP Integration documentation.

    Coupon
    Reward Points
    reward points for a customer endpoint
    Coupons
    Reward Points

    Payments

    See how you can utilize different payment solutions.

    Emporix allows for configuration of a variety of payment methods. In the scenarios below, you can see how the configuration works with the example of Emporix demo storefront.

    To learn about the technical implementation of the Emporix payment gateway, see the Payments documentation in the System Management section.

    User scenarios

    Examples of the payment methods seen from the user perspective when creating an order on a storefront.

    Credit Card with Spreedly Express

    When users choose to pay with a credit card, they have to follow the standard payment process and provide their credit card details for payment authorization.

    1. As a checkout step, the user sees a list of available payment methods and selects the Credit card payment option.

    1. The user chooses the Enter Payment Info button and then provided the credit card details.

    1. The user chooses Pay Now and finished the checkout process. The payment amount is authorized automatically and it is captured during the invoice generation.

    Credit Card 3D Secure with Spreedly Express

    Users can choose to pay with a 3D secure credit card. In comparison to the standard credit card, 3D secure adds an additional security layer to the payment process. Users have to provide an authorization token that is generated and sent to them during the payment process.

    1. As a checkout step, the user sees a list of available payment methods and selects the Credit card (3D Secure) payment option.

    2. The user chooses the Enter Payment Info button and then has to provide the credit card details.

    3. The user chooses Pay Now and sees the 3D Secure window.

    1. The user finishes the checkout with the credit card authorization. Spreedly sends a callback to the Emporix payment gateway with a result of the authorization. The payment amount is authorized automatically and it is captured during the invoice generation.

    Spreedly Sprel

    Spreedly Sprel is a solution to use for the off-site payments. It means the payments are done after an order is placed.

    1. As a checkout step, the user sees a list of available payment methods and selects the Sprel payment option.

    1. The user completes the checkout and after the order is completed sees the option to finish the payment.

    1. The user chose the Finish Payment button and completed the payment process. Spreedly sends a callback to the Emporix payment gateway with a result of the authorization. The payment amount is authorized automatically and it is captured during the invoice generation.

    Payment operations

    Details of the payment possibilities, cancellations and returns.

    Payment statuses

    To check a payment status of an order, go to Management Dashboard -> Orders -> Payment Info tab.

    • In the Payment information section, you have information about the payment provider, payment method, transaction ID (an internal Emporix transaction ID), current status, authorized amount, paid amount and the last message.

    • In the Transaction logs section you can see all the payment events. Usually the following events are included there:

      • AUTHORIZATION_START - when an order is created

    All possible statuses:

    • PENDING - an order has been created but payment is not done yet

    • AUTHORIZATION_SUCESS - an authorization flow finished with success

    • AUTHORIZATION_FAILURE - an authorization flow finished with failure

    • CAPTURE_SUCCESS - a capture flow finished with success

    Payment capture

    Capture is a process done during an invoice generation. It's when a payment is completed by settling funds for the transaction.

    1. To generate the invoice, go to Management Dashboard -> Orders.

    2. Select the order and go to the Data tab.

    3. Choose the Send Invoice button.

    Result: The payment capture is done with the invoice generation. After that, the invoice is sent to a customer.

    Payment refund

    The payment refund is possible only when a payment has been invoiced and capture done. The user can get a full or partial refund of the order, but it's not possible to return more than the captured value.

    1. To create the refund, go to Management Dashboard -> Orders.

    2. Select the order for which the payment should be revoked and go to the Payment Info tab.

    3. In the Refund section add a value that should be refunded and confirm it by choosing the Refund button.

    Result: The refund is confirmed and the event is visible in the Transaction logs.

    Payment cancellation

    Payment cancellation can happen for many reasons, for example when a user requests to cancel an order, or an order cannot be completed by a store.

    If for any reason the order is not completed and the payment should be cancelled, the merchant can set the order status to cancelled. The cancellation is then done automatically after the status change.

    1. To set the status as cancelled, go to Management Dashboard -> Orders.

    2. Select the order for which the payment is cancelled and go to the Data tab.

    3. In the Order section choose Cancelled as the extended order status.

    Result: The order payment cancellation is visible in the Payment Info tab. The status is displayed as Cancellation Success.

    Manage Users

    Grant relevant access rights to your team.

    The Manage Users view of the Emporix Developer Portal is designed to help you manage team members who can access your Emporix tenant and also set proper access to the Management Dashboard.

    Note that the Developer Portal offers two roles:

    • ADMIN - the user has manage access to all the functionalities of the Developer Portal

    • USER - the user can only manage their own account and change their password, for the Developer Portal functionalities they have view access only, except for the demo data.

    To find a specific user, search by their name or email address. You can also use the filters options for users of a specific application: Management Dashboard or Developer Portal, or of a specific role they have within the tenant, which means in what capacity they access the Developer Portal.

    To edit user's personal details or access settings, choose the Edit icon next to the chosen user and amend the details accordingly.

    Adding users

    The Developer Portal ADMINS can add new tenant users.

    Adding a single user

    To add a single user:

    1. Choose + Add user.

    2. Provide personal details and email address.

    3. Select a relevant Developer Portal role, and the Management Dashboard role.

    4. Confirm with Save.

    Adding multiple users

    Adding multiple users and specifying their roles is possible by CSV import option.

    To add multiple users:

    1. Choose +CSV Import users.

    2. Download the CSV file with a template for multiple user import. The template includes the name of the user, their email address, and roles within the Developer Portal and Management Dashboard.

    3. Add the users to your CSV file. The pattern is name,surname,email address,tenant role, MD role, for example: john,doe,[email protected],User,CE Manager.

    1. Save the file.

    2. Import the CSV file using the drag-and-drop or by browsing your files.

    After the file is uploaded, you get a notification with confirmation that the users were added to the tenant.

    As a result of user creation, each new user gets an email with activation code to confirm their account details and a welcome email inviting them to join the tenant. When they activate their account, they have to set the password. With the first login to the tenant, they can also opt in for the Emporix newsletter.

    If you have configured SSO for authentication of your users, the newly created users would be able to configure the SSO only after the account activation and setting a temporary password.

    Alert for Unrecognized Browser Logins

    There is a security feature implemented in our system to enhance the protection of your account. Whenever a login attempt is made from an unrecognized browser or device, an alert email is automatically generated and sent to the email address associated with your account.

    This alert email is designed to promptly notify you of any login activities that may be unauthorized or suspicious. If you receive such an alert email and you haven't recently logged in or attempted to access your account from a new browser or device, we strongly advise you to take immediate action to secure your account. This includes changing your password and reviewing your account activity, as well as reporting this fact to your organization.

    Resetting a user's password

    If a user forgets their password, they can use the reset option on the login page. The user gets an email with the recovery code thanks to which they are able to set a new password.

    The ADMIN users in the Developer Portal also have the option to trigger resetting a password for a user in the Developer Portal.

    To reset a user's password:

    1. Select a particular user and use Edit to see their details.

    2. Go to the Change password tab and choose Reset user password.

    The user gets an email with the recovery code and a link to change the password.

    If your account is configured to use a social login or single sign-on to access the Emporix applications, you are not able to reset your password on your own, as this is managed by an external provider. To reset the password, change it through the provider directly.

    Commerce Use Cases

    Get familiar with the Emporix storefront showcase. We've described a few use case examples to demonstrate the possibilities of Emporix system.

    The Emporix use cases documentation is to demonstrate how the Emporix API can be used on a frontend. No middleware was used to build the showcase and every API call is visible from the browser developer network tab.

    You can use Emporix API with any showcase /frontend, we created our own to show the possibilities of Emporix and to present how it works. The showcase we use in our stories is not a final product, it was designed for demo purposes.

    • If you want to learn about our API and get more information about our product possibilities see and our user guides: and .

    • You can also use the to check the solution.

    Below you can see a general explanation how the B2B Showcase is structured and some description about core elements.

    My Account

    When you log in to the showcase as a valid user, you can see the name of your account on the right hand side of the menu. Clicking on the name gives you the option to go to your account settings.

    The account details page includes such information as your personal details, company details, orders, quotes, carts, returns, or discounts.

    • My Orders: All the orders are visible together with their details.

    • My Quotes: All the quotes are visible together with their details. Here, you can decide to approve, decline or request a change for a specific quote.

    • Addresses: It is possible to add, edit or create a new address for the B2B customer.

    • My Returns: All the returns created by a user and their corresponding statuses.

    Navigation menu

    The reference store navigation menu consists of two layers:

    • The top layer has a site, language and currency selector, a customer user login link and a sign-up link. This layer shows a sign up page, which allows you to create a new showcase Customer and Customer ID accessible with the Emporix Management Dashboard.

    • The lower layer has:

      • Catalog link, which dynamically builds a menu out of the category structure in the demo data from the connected tenant

    Catalog

    Product display

    The Product display is split into a facet or filter list on the left hand side, and a grid or list view on the right.

    When you are not logged in the display shows the default catalog price. When you are logged in, it shows your personalized pricing, assuming you have a corresponding Emporix price list defined.

    When you click on an individual product tile in the grid, or row in the list, it opens up the Product Details page for that product.

    Product details page

    The Quantity and Add to Cart buttons work to add the item to the Cart. All the displayed data like product name, product description, images and attributes comes from a demo catalog.

    Contacts

    In case of questions please contact Emporix at or .

    To submit new ideas, visit the .

    User Management and Approvals

    Learn how you can manage users and permissions on the storefront.

    As a B2B customer, with Emporix you can easily manage your company data and your company users' data directly from your storefront.

    Company setup while registering as a customer

    When a new customer registers at your storefront, all the registration data are automatically reflected in your Emporix account. This includes the company data, like address and contact information that your new customer provided during the registration. The most important piece of information is the customer's email address. By default, the customer is created with the admin role and becomes a primary contact for the company, if no other primary contact exists.

    Make sure you add security measures in your implementation for creating new B2B customers on the storefront. For the showcase purposes, the new customer by default gets admin rights which for sure is not the desired behavior on your side.

    Creating users within the storefront

    1. Log in to your storefront account and go to My account -> Manage Users.

    2. To start creating a new user, choose Create new user.

    3. Enter the user data, and choose the role for the user: you can select between Admin, Purchaser and Requester.

    After you create the new user, they receive an email notification to set the account password.

    All of the users' data is reflected and visible in the Emporix account in the backend system.

    B2B sign-up process

    During the sign-up process, when the customer has a defined b2b.companyRegistrationId property, an additional validation takes place. The populated b2b property indicates that the registration process is for the B2B customers. The properties that are required for the B2B customers are:

    • firstName

    • lastName

    • company

    By default, a B2B customer is added to a legal entity matched by the name. If such a legal entity doesn’t exist, the company is created in the system, but only after an address is assigned to the newly created customer.

    When the Admin customer creates a customer, the customer is automatically assigned to the legal entity of the Admin customer. When the customer is created for the B2B flow, then the default employee is informed about that by an email notification. The default employee is defined by the default_employee property.

    Approval requests flow

    Having different user roles within a company helps in keeping the purchasing process in an ordered and transparent way. Anytime an order that is created has to be approved, the approval process starts.

    To be able to set up such a workflow and properly resolve relevant access rights, you need to generate a B2B token that contains the legal entity information. The refreshtoken ensures that the authorization token contains the right legal entity details so that the services retrieve only the relevant information. To learn more about the B2B token, refer to the documentation.

    Requesting an approval

    As a purchaser or material manager, you can create orders within the storefront and then request an approval. To request the approval, a user has to create a standard order first and then go through the standard checkout flow. During the checkout, the user can create an approval request for ordering the items in the cart.

    1. To start the approval process, choose the Request approval option.

    2. Choose the person who should be an approver of the request and add any additional information if necessary. After that, use the Submit button to send the request.

    Result: After sending the approval request an email notification is sent to the approver. You can also see a confirmation message that the approval was requested. In your Saved Carts , you can check the status of your request.

    Approving the request

    As an admin, you have the permission to approve the order requests that are sent by a purchaser or a material manager. When such a request is created, you get an email notification informing you about a pending approval.

    1. To start working on the approval requests, go to the Saved Carts in your storefront account. Here, you can check the requests that are pending processing.

    2. Choose the approval request to view the checkout details for the order.

    3. Review the order, change the shipping information if needed, and decide if you approve or decline the request.

      • If you decide to approve, choose the

    Personalized Commerce - Customer Segments

    See the example of using customer segments to offer personalized experience.

    Offering personalized experiences to your customers can be a game changer for your business. Tailored content and responding to what your customers need is the key to gaining loyalty and trust. Customer Segments is a convenient tool for targeting the right group of people with the relevant products or promotions. Let's see in action how you can use the functionality in your online store.

    Let's assume that for certain customers, for example, of a specific industry, you want to display some dedicated categories and products only. You'd also like to promote some specific products and make a special price offer for these customers. When the customers of that segment log in to your store, they see only the offer that is best suited to their industry needs and fulfill their shopping lists. The customers receive a special discount coupon that they can redeem at checkout. With customer segments you can easily achieve that and respond to any similar scenario.

    Segment creation

    1. First, create a segment. To demonstrate the case, create a segment for the DE site with some categories assigned, and a few additional products that you want to sell to the segment customers. Remember to save your changes at every step of the segment configuration.

    1. Assign the chosen category to the segment:

    And assign a few additional products:

    1. Add a coupon that is valid only for the segment assignments:

    1. Add customers as the segment members:

    Personalized shopping

    Now, the customers who are members of the Golden Card segment get a personalized shopping experience on the DE site.

    To demonstrate the difference, first log in as a customer that is not assigned to any segments. Judy Wilson, from Company XYZ, is not assigned to any segment and she can browse all the products and categories on the storefront:

    Now, check what's available for a customer that belongs to the segment with a dedicated category and products. John Doe, is one of the customers assigned to the Golden Card segment. When Mr Doe logs in to the online store, he can browse only the Golden Card assortment plus the additional products assigned to the segment.

    The dedicated segment products are available under the Assigned Products tab.

    Mr Doe has received an email notification with the special coupons details. He decides to make some purchases and adds chosen items to the cart. He continues to the checkout where he's able to apply the coupon codes that are valid for the segment assignments only. The coupons in this case use the subtotal amounts as tax calculation base.

    As this example demonstrates, the customer gets a personalized shopping experience, which leads to greater customer satisfaction. Customer segments feature facilitates the way how you can increase customer loyalty by tailoring the storefront content to the dedicated customers and responding quickly to the ever-changing market requirements.

    Segmented search offer in the showcase

    To further personalize the shopping experience and ensure that customers can only search relevant products, we have added segments to for our showcase. For example, only search results that match the segment are displayed. This additional enhancement ensures a customized and efficient shopping experience for all customers.

    To learn more about how to configure segments on the storefront, refer to the API guide: . To learn more how to manage segments in the Management Dashboard, refer to the documentation.

    Webhook Event Publishing

    Set up webhook events to ensure smooth interaction between services and systems.

    Here you can find an overview of the Emporix Webhook Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    To move towards an event-driven architecture, we are introducing the Webhook Event Publishing functionality. This feature, implemented through the Emporix API Webhook Service, allows external systems to subscribe to internal events published by the Commerce Engine. Thanks to the Webhook Service, you do not need to call specific API endpoints to look for recent changes in services — you will be automatically notified instead.

    Features

    The Webhook Service introduces the following features:

    Feature
    Description

    Webhooks strategies

    You can apply one of the following strategies to your tenant:

    • Svix-Shared - default strategy allowing you to use the shared Svix subscription offered by Emporix

    • Svix - strategy that allows you to connect your own Svix licence

    • HTTP - strategy that provides possibility to receive events notification as HTTP requests to a declared URL

    Overview

    The Emporix Webhook Event Publishing process consists of the following sequence of events:

    1. When an event that you subscribed to takes place, a message is sent to the Webhook Service.

    2. The Webhook Service forwards the message to the Event Gateway.

    3. The Event Gateway passes the event to your pre-configured endpoint for this particular event.

    For example, if a catalog is created in the Emporix environment, a notification is sent to the Webhook Service. The service passes the message to the Event Gateway. If you configured the Create a new catalog endpoint beforehand, you will receive the notification from the Event Gateway that a new catalog has been created.

    With the Svix-shared strategy, the maximum number of events per tenant is limited to 5000/month. The limit resets on the first day of each month. After you exceed the set limit, the requests do not get sent. For further information about the limits, please contact the Sales department at .

    For more information about webhooks usage, see . For more information on HMAC configuration, see . To see example integration with external application through webhooks, see:

    Keycloak

    See how to integrate with Keycloak.

    Introduction

    Keycloak is an open-source Identity and Access Management (IAM) solution that supports standard protocols like OpenID Connect, OAuth 2.0, and SAML 2.0. Integrating Keycloak with Emporix allows for secure management of user authentication and access across applications. At the same time it reduces development effort and aligns with enterprise compliance needs.

    As a centralized identity provider, Keycloak supports Single Sign-On (SSO), external identity federation and fine-grained access control.

    You can integrate Emporix with Keycloak and ensure clean separation between identity management and business functionality, while at the same time meeting the diverse needs for authentication, federation, and security.

    Integration setup request

    If you have a Keycloak account and want to integrate with Emporix, contact our and provide us with the following data:

    • The domain is the Keycloak domain value, for example, keycloak.eu.yourdomain.com.

    • The token_endpoint is the endpoint that is used for the token call, for Keycloak it’s usually protocol/openid-connect/token.

    • The provider

    See the request example:

    Orders

    See the end-to-end order process.

    Cart

    When a customer is browsing products on your storefront and finds something interesting, they can put it in cart with a standard Add to cart option. When they're done with selecting products, they select the Cart icon to see all the chosen items. It's possible to edit the cart content, add or subtract the product quantities or remove items from the cart before proceeding to checkout.

    Quote Process

    Find out how a quote process looks like from start to end.

    Very often customers want to negotiate the price regarding the products they want to buy. For such a process, it is important that an eCommerce platform supports a more sophisticated process. Requesting a quote is a common use case especially for B2B business model, but within the Emporix platform, the quotes for B2C customers are also supported.

    Below you can see the general, simplified flow:

    Not only the customer is able to request quotes, but also the merchant's employee or a sales manager can generate a quote on behalf of the customer. This is described step by step in the 2nd demo scenario - Employee creates quote on behalf of a customer.

    Roles included:

    • B2B or B2C customer

    SAP Integration

    Learn the possibilities for integration of Emporix with an ERP system, such as SAP, and replicating data properly.

    Emporix is designed to integrate seamlessly with ERP systems. To integrate an ERP system like SAP with Emporix, an integration layer (such as a middleware solution or API management platform) can be utilized to handle data exchange efficiently. This layer can collect and transform data, for example IDocs from SAP, into a suitable format, such as JSON, and make the necessary API calls to Emporix. Options for integration include using an IPaaS platform or an API management layer that supports OData, REST API, or other protocols, enabling flexible and scalable integration tailored to the specific requirements of the ERP and target systems.

    Given SAP’s significant presence in the ERP software space, we highlight a scenario in which asynchronous pricing and order replication occur from the Emporix Commerce Engine to SAP ERP. In this example, we selected SAP BTP Integration Suite (formerly known as SCPI) to streamline the integration process, leveraging Emporix flexible API capabilities.

    Emporix - SAP integration

    Data Localization

    Data localization allows you to reach the international customers.

    Purpose

    The localization concept in the Emporix e-commerce system helps you adapt your business's content to international audiences.

    Localizable data

    Customer Groups

    Group your B2B customers to allow the right access and scope.

    Here you can find an overview of the customer groups feature and its benefits.

    Looking for API reference? Check out the reference.

    Purpose

    B2B scenarios require applying more structure to the management of your end customers. With Customer Groups, you can easily manage your customers to ensure the right level of authorization and access is granted to the customers within a company (legal entity).

    Magnolia Emporix Connector

    Magnolia Emporix Connector provides external CMS functionalities.

    Magnolia CMS is a content management system (CMS) designed to help businesses manage and deliver digital content across multiple channels.

    The Magnolia eCommerce Connector developed by Arvato Systems Switzerland, enables seamless integration of products managed in directly into the Magnolia CMS. The provides several out-of-the-box features, such as apps that allow users to view and manage products, catalogs, and categories from directly within Magnolia. It also includes searchable products and categories, a local cache mechanism and an e-commerce integration registry.

    Each catalog contains a list of products that have been assigned to it.

    Selecting a specific product allows you to view all the relevant details associated with it.

    Brands

    Manage the brands you deal with easily with Brand Service.

    Here you can find an overview of the Emporix Brand Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Labels

    Product labels provide and make the important product information easily noticeable.

    Here you can find an overview of the Emporix Label Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    AI Assistance

    Learn about AI capabilities in Emporix.

    Here you can find an overview of the Emporix AI Assistance, along with its features and benefits.

    • Looking for user guides? Check out the and documentation.

    • Looking for API reference? Check out the documentation.

    
    const functions = require('@google-cloud/functions-framework');
    const crypto = require('crypto');
    const stringify = require('json-stable-stringify');
    
    const secretKey = 'password123';
    
    functions.http('helloHttp', (req, res) => {
    
      const body = stringify(req.body); // 1
      const hmac = crypto.createHmac('sha256', secretKey); // 2
      hmac.update(body); // 3
    
      const computedHmac = hmac.digest('base64'); // 4
    
      if (computedHmac === req.headers['emporix-event-signature']) { // 5
        console.log('HMAC validation passed.'); // 6
      } else {
        console.log("HMAC validation didn't pass."); // 7
      }
    
      res.send(`Hello ${req.query.name || req.body.name || 'World'}!`);
    });
    If the values do not match, it logs HMAC validation didn't pass. With the above configuration, if the secretKey is set to some different value than password123 on the source side, the validation doesn't pass.
    AUTHORIZATION_CALLBACK - when Spreedly notifies Emporix Payment-Gateway service about authorization status)
  • CAPTURE_SUCCESS - when an invoice is generated and capture operation finished with success

  • CAPTURE_FAILURE - a capture flow finished with failure

  • CANCELLATION_SUCCESS - a cancellation flow finished with success

  • CANCELLATION_FAILURE - a cancellation flow finished with failure

  • REFUND_SUCCESS - a refund flow finished with success

  • REFUND_FAILURE - a refund flow finished with failure

  • Note that the alert feature works for email and password logins, while for social logins through external platforms, it has to be configured separately by the provider.

    For further information about the Magnolia Emporix Connector, refer to the Magnolia guide - Emporix Connector.

    connector
  • My Discounts: The redeem options for reward points including the existing points of a customer.

  • Brands link that shows a table of Brands from the demo data using the Brand Service
  • Quick Order link that lets you quickly populate a cart by simply typing in product codes and quantities

  • About Us link which will simply take you to some example content

  • Product Search field powered by the Algolia search engine. If you modify a category or product data in the Emporix Management Dashboard, this triggers a search index update in Algolia.

  • Core Commerce
    Management Dashboard
    Emporix Free Trial
    [email protected]
    [email protected]
    Emporix Support Portal
    Emporix API documentation
    Admin
    : manages users, creates orders, approves orders from other users, who have the purchaser or material manager roles.
  • Purchaser: creates orders within the defined account threshold and can approve orders from material managers

  • Requester: creates order requests for purchaser or admin

  • Choose if the user should be activated or not.

  • Confirm & Pay
    button, this completed the checkout process.
  • If you decide not to approve, choose the Decline Request option. The requester receives information that the request was declined.

  • is the provider that is configured for the IDP, the provider value can be then used in the state parameter, thanks to that it’s possible to have multiple configurations for one tenant, for example,
    keycloak_siteA
    ,
    keycloak_siteB
    .
  • The client_id and client_secret are the credentials provided by the customer, to find the credentials in the Keycloak app go to Clients -> Clients list.

  • The redirect_uri is a value provided by customer that indicates where a user should be redirected after authentication flow. The value points storefront URL, for example, https://storefront.emporix.io/keycloak.

  • The public_key is a value provided by customer as their signing certificate. It has to be stored in one line, however each line of the original certificate value should be separated by \n.

    • Copy the value to the json in the public_key field and surround it with -----BEGIN CERTIFICATE-----\n{TOKEN}\n-----END CERTIFICATE-----

  • Feature

    Description

    Standards-Based Authentication

    Supports OpenID Connect, OAuth 2.0, and SAML 2.0 for secure identity management.

    Single Sign-On (SSO)

    Enables seamless user access across multiple applications, reducing login friction.

    Social & External Federation

    Integrates with social logins and external IdPs like Google, Azure AD or Auth0.

    Customizable Login & UI

    Provides built-in, customizable UI for login, registration, and account self-management.

    Role-Based Access Control (RBAC)

    Fine-grained authorization based on realms, roles, and client-specific configurations.

    Centralized User Management

    Admin console for managing users, groups, roles, permissions, and token policies.

    Emporix Support Team
    Quick order

    If a customer knows exactly what they want to buy, they can use the Quick order option. It allows for simple entering a valid product code and it automatically suggests products. Customers can easily populate the rows and create a new blank row underneath. Additionally, they can also add a list of product codes and quantities via a .csv file (download of sample possible). Finally they can add the list of product codes separated by a comma or a carriage return.

    Once filled, customers place the items in the cart with the Add to Cart option.

    After adding some products to the list and adding them to the cart, the mini-cart opens. In the mini-cart, the customer can see all the added items, it's possible to add or subtract product quantities and delete a line item before proceeding to the next steps.

    Checkout process

    When a customer is ready to proceed with the purchase, the following options are available:

    • Go to checkout - to finish the order by registering or logging in

    • Continue as guest - to process the purchase without the need to register or log in

    • Go to the cart - to check more details of the products and the order before moving to payment

    • Request quote - to send a request for a quote - for more details, see Quote Process

    Go to Checkout

    Choosing this option takes a customer to the login page where they can register or log in to their account using one of the available options.

    The checkout process has the following steps:

    1. Details of the shipping information

    The shipping details are taken from:

    • the customer's address book - the default address is selected

    • the company locations tagged as shipping - if the customer is assigned to the registered company

    The taxes are applied according to the shipping location country.

    1. Payment information

    The billing addresses are taken from:

    • the customer's address book

    • the company locations tagged as billing - if the customer is assigned to the registered company

    You can also add a coupon to get a discount.

    1. Review Order

    This page shows the order review before the final order confirmation. Clicking the Confirm and Pay button creates an order in Emporix Management Dashboard.

    Continue as guest

    The customer has the option to complete the purchase without the need to register or log in. They can choose Continue as guest.

    The checkout has the following steps:

    1. Details of the shipping information

    The customer needs to provide their name, contact information, and shipping address. Also, they need to choose one of the available shipping methods.

    The email address provided in the shipping information cannot be associated with an existing customer account.

    1. Payment information

    The customer chooses the payment method and billing address.

    1. Review Order

    The customer reviews all the provided details and if everything is accurate confirms the order and proceeds to the payment by Confirm and Pay.

    There is a validation mechanism that runs in the background and checks if the provided email address is already associated with an existing customer. If so, it prevents completing a guest checkout with such an email. The customer has an option to either log in or to provide a different email address.

    Successful checkout creates an order in Emporix Management Dashboard.

    In the case when a guest customer later wants to return the purchased item, they need to register with the email address provided at checkout and to create a customer account. After logging in, the customer can view the orders under the order history associated with the email.

    To learn more about API used in this use case see the and for user guides check the Order Fulfillment documentation.

    After the customer submits the order, it is created within the Management Dashboard. The employee can set the status of the order and the storefront is updated accordingly. In a real scenario, the updates are normally integrated from an ERP backend system.

    In the Management Dashboard, for the orders that were created by guest users, the Customer # field is marked as Anonymous. If the guest customer later chooses to create an account, the value of the Customer # is replaced with the real customer ID.

    Merchant employee who needs to accept or decline a quote request

    Demo scenario - a customer (B2B or B2C) requests a quote

    This is a step-by-step description of the quoting process within the Emporix Showcase and what to look for in detail.

    1. Browse for a product by categories or use the search bar to find the product which you want to add to the cart.

    This search uses Algolia as a search engine for displaying the search results. For a newly created tenant it works out of the box.

    1. Choose the product you want to add to the cart and open the product details page.

    1. Change the quantity, for example to 5 and add the product to the cart.

    Result: The following screen is displayed:

    1. Within the cart you can change the quantity and a recalculation of the cart will take place.

    2. To create the quote, choose the Request quote button.

    Result: the quote page appears.

    1. To see the quote overview, choose the Quote overview button. The quote gets the Awaiting status.

    1. Open the Management Dashboard and go to Quotes, the quotes overview page is displayed.

      • The created quote is displayed with the awaiting status.

      • The merchant employee is informed by email that a customer created a quote request. The corresponding sales representative or a customer service employee can then work on the quote request quickly.

    2. Open the quote and check its details, prices and discounts. Go to the Approval tab and choose Approve quote to accept the quote. You can add a comment from a merchant perspective if needed.

    3. Click Update status and then confirm you want to change the quote status.

    Result: The quote request from customer is accepted by the merchant and the quote status changes from Awaiting to Open.

    It is possible to work on quotes in Management Dashboard and to update them anytime needed. For details on how to work with quotes in MD, see Quotes documentation.

    1. In the Emporix showcase, the customer goes to the My Quotes view under My Account. The Quote should have the open status as well.

    After the merchant employee accepts the quote, the customer gets an email with the corresponding PDF. Within the demo the red bubble indicates that a new quote is available for the customer. In this case 2 quotes are new and available.

    1. Customer opens the details of the quote and can decide if they want to accept or decline the quote.

    In case they request a change or decline the quote, they have to select a change or decline reason with an additional text.

    1. In case the customer accepts the quote the status of the quote is updated within the showcase and also within the Management Dashboard.

    • Showcase status - quote detail page:

    To get the storefront status updated you need to refresh the page.

    • Backend status - Management Dashboard:

    Result The accepted quote creates an order within CE and within the quote detail the order link is available.

    Employee creates quote on behalf of a customer

    It is possible for you as an employee to create a quote on behalf of the customer in the Management Dashboard. For example, a customer calls a customer service department and asks for a specific quote. To create the quote on their behalf, you need to be logged in to the Management Dashboard as an employee.

    Then, follow the steps described in the Quotes - Creating a quote guide.

    Result: After you follow the steps and click the create quote button at the end, the quote is created with Open status and the quote notification is sent to the customer by email, including the PDF. The customer can accept or decline the quote as described under Customer requests.

    To learn more about API used in this use case see the and for user guides check the Quotes and the Quote Management documentation.

    The video and the diagram show high level overview of the data replication between Emporix and S/4Hana using SAP Integration Suite.

    This demo is a presentation of one potential approach to integrate with SAP. Alternatively, REST APIs or OData can be utilized for integration purposes.

    Master data replication

    To create an order from Emporix into SAP, the following master data must be replicated to provide the information for the transactional IDoc:

    IDoc
    SAP Name
    Types in Emporix

    MATMAS05

    Material

    Product

    COND_A04

    Condition

    Price, PriceModel, PriceList

    DEBMAS07

    Customer

    Company

    ADRMAS03

    Contact Person

    Here's how the replication process looks like:

    Product replication

    Product replication uses the MATMAS IDoc generated by SAP ERP, which holds essential product details, for example, localized product name, tax type, and product code. Emporix can use the same product code as the ERP, allowing the upsert API to create or update the product as needed, thereby simplifying the integration process.

    Price replication

    Product prices are replicated through the COND_A IDoc, known as conditions in SAP, which contains details such as price validity, minimum quantity, and customer-specific price lists. Prices are assigned to either net or gross price models, depending on the price type, and customer assignments are made at the ship-to level.

    Customer data replication

    Customer data is distributed across multiple IDocs. The diagram below shows SAP/Emporix object relations:

    To accurately reflect this data in the Emporix Commerce Engine, the following entities must be created:

    • Company

      The DEBMAS IDoc contains core company information, including functional assignments such as Sold To, Ship To, Bill To, Payer, and the Contact Person relationship.

      Address details are provided through the ADRMAS IDoc.

    • Location

      Company location details, along with communication information, are derived from data in the DEBMAS and ADRMAS IDocs. Depending on the functional assignments of the addresses, locations are tagged as either shipping or billing.

    • Customer

      The Emporix customer entity is created based on the Contact Person relationship from the ERP system. This relationship includes the customer’s assigned email, phone number, and address details. As illustrated in the diagram, the DEBMAS, ADR2MAS, and ADR3MAS IDocs are required for customer creation within the Emporix Commerce Engine.

    Order replication

    Order replication from Emporix to SAP ERP is achieved through order creation webhooks, which are sent to the SAP BTP Integration Suite. The necessary company details (e.g., sold-to, ship-to) are added to the order using mixins, ensuring they are included in the webhook payload. The SAP BTP Integration Suite then converts the webhook data into a SALESORDER_CREATEFROMDAT202 IDoc, which is sent to the SAP ERP system through the iFlow.

    Resources that can be localized are described in their respective sections.

    Countries

    Countries where your business operates are stored in country configurations.

    For more information on managing country configurations, check out the .

    Currencies

    Currencies accepted by your business are stored in currency configurations. You can specify the default currencies for particular sites as well as the whole tenant.

    For more information on managing currency configurations, check out the .

    You can also define static exchange rates for currencies and calculate product prices based on these rates.

    For more information on currencies and exchange rates, check out the .

    Dates and times

    Dates and times are stored as instantaneous moments in the UTC timezone.

    To localize dates and times for your customers, you need to configure the UTC offset on your storefront.

    Languages

    While the Emporix e-commerce system is designed in English, you can specify languages in which your business communicates with suppliers and customers through language configurations. You can specify the default languages for particular sites as well as the whole tenant.

    For more information on managing language configurations, check out the .

    Measurement units

    The Emporix e-commerce system supports all types of measurement units and measurement systems.

    For more information on measurement units, check out the .

    You can further localize measurement units by translating their names to different languages.

    Names and descriptions

    You can localize information-rich text fields — such as names or descriptions — by translating them into languages of your choice.

    For information on localizing object names and descriptions, check out the Translations section in the .

    Features

    The Emporix customer groups functionality combines a set of features:

    Feature
    Description

    Granular permission control

    As a seller, you can set different access levels within groups, ensuring the right people have the right permissions from their customers.

    Stronger data security

    Restricting access to relevant team members of the end customer minimizes the risk of unauthorized data breaches.

    Improved organizational management

    As a B2B seller, you have a tool to manage the end customers organizations on their behalf, ensuring the structured and controlled access to business-critical information.

    Self-service for end customers

    End customers can independently manage their organization and users without relying on your support teams. Reduced dependency on manual administrative approvals leads to quicker role assignments and modifications within the user management.

    Overview

    Customer groups are automatically created for each legal entity in the system. They are legal entity aware, which means that you can easily administer the company-related permissions. You can manage the customer groups from the Management Dashboard which facilitates assigning the right access to the right group members.

    To learn more how to manage customer groups, see the Customer Groups User Guide.

    Purpose

    With the Emporix API Brand Service, you can define brands for the products that your business offers to make product management easier and to allow your customers to find products quickly.

    Features

    The Brand Service introduces the following features:

    Feature
    Description

    Brand management

    You can manage brands by creating, updating, or deleting brands for your products. By keeping the brand information up to date, you can help your customers find their favorite products easier.

    Media files and additional information

    You can define your brands by providing additional information, such as media files, descriptions, or SEO texts.

    Purpose

    With the Emporix API Label Service, you add proper labels to your products. Labelling provides important information about a product, that helps the customer make an informed decision upon purchase and differentiate a product among others. Labels can serve as marking product ingredients, nutritional value, allergens usage, environmental sustainability, safety instructions, and many more. Adequate labelling can also increase the visibility of your brand and secure customers loyalty.

    Features

    The Label Service introduces the following features:

    Feature
    Description

    Enhance product visibility

    Highlighting key product details directly on your storefront. This includes features such as "organic" or "eco-friendly," which help customers identify important features and make informed purchasing decisions. It also ensures compliance with relevant regulations.

    Customizable Labels for Improved Engagement

    Utilize your own icons and media to create visually impactful labels, such as "Gluten-Free", "A+++ energy class" or "Worldwide Shipping". This enables you to effectively showcase and sell your items by providing the information your customers are specifically looking for.

    Purpose

    Emporix builds loyalty and trust by responding to the current customer and market needs. With our innovative approach, the AI Assistant makes it possible to rapidly address changing e-commerce needs and requirements.

    Using artificial intelligence you can work on your products and enhance their descriptions so that they address audience in a better way and get more focus.

    Business Aspect
    Customer Value

    Higher conversion rates

    Our use of AI service makes it possible to create captivating and compelling product descriptions that pique customers' interest and lead to higher conversion rates.

    Time and resource efficiency

    By using AI service, we can create product descriptions faster without compromising on quality. This allows using time and resources more efficiently.

    Consistency and branding

    We ensure consistent brand communication by perfectly matching the tone and language in the product descriptions to the brand. AI service helps to convey a clear and consistent message across all product lines.

    Diversity of approaches

    AI service allows us to try different approaches to product descriptions. From humorous to informative, from technical to emotional - find the style that suits the products best and hits the target audience.

    Search Engine Optimisation (SEO)

    Our product descriptions are formulated to not only appeal to customers, but are also optimised for search engines. This helps to increase our visibility in search results.

    Customer-focused information

    With the help of AI service, we can provide detailed information about our products. Customers receive clearly understandable details that help them in their purchase decision.

    AI for a Product Description - Management Dashboard
    AI System Preferences

    Events

    All actions that take place in the Emporix API are considered events. For example, creating and updating a catalog in the Emporix API Catalog Service are both considered events.

    Event subscription management

    You can manage notifications for your Emporix tenant by subscribing to and unsubscribing from particular events.

    Event Gateway

    The Event Gateway is a dashboard where you pre-configure endpoints to receive notifications about events you have subscribed to in the Webhook Service. The Event Gateway acts as an intermediary, as it passes notifications from the Webhook Service directly to your tenant.

    Statistics

    You can retrieve statistics for the Shared Account strategy on the number of events successfully sent to the endpoints that you earlier configured in the Event Gateway.

    Strategy configuration

    Possible to configure within the Emporix Management Dashboard if Shared Account, Licensed Account - Svix, or Other - HTTP strategy is used.

    Specific Target URLs

    For the Other - HTTP strategy, it is possible to define different target URLs for different events.

    [email protected]
    Webhooks
    HTTP Webhook Strategy - HMAC Configuration
    HTTP Webhook Strategy - Integration with Azure Service Bus
    HTTP Webhook Strategy - Integration with Amazon Simple Queue Service (SQS)
    Algolia
    Segments

    Returns

    Learn how the returns work in CE.

    In case a customer is not satisfied with the product, they can call the merchant (customer service) and ask for a return of a complete order, partial order or from different orders for different products.

    Scenario - Customer calls Merchant Support to return items

    A customer created several orders with several items. After the delivery the customer calls the merchant customer service to ask for a return of one or more items.

    1. As a customer service employee, log in to the Management Dashboard and open the returns overview page.

    1. To open the edit mode, click the Create return button.

    2. Select the order you want to make a return for:

    a. Existing customers: Select the corresponding customer from the list.

    Only one customer can be selected and for that customer returns can be created.

    After selecting the customer, go to the Orders tab to select the orders which the customer wants to create the return for.

    b. Guest customers: Go to Orders tab to find the relevant order. You can filter the orders by email from the purchase.

    If you don't select any customer in the Customer tab, the Orders tab shows only the orders created by the guest customers.

    1. In the Products tab, all the related products are displayed for these selected orders. The following screen shows the selected orders and the corresponding products.

    All the products that you want to return have to be selected. It is possible to decide if the same reason code & reason details is used for all products. The reason code on header level is mandatory. Reason codes are provided on product level.

    If different reason codes and reason details are necessary, it is possible to maintain a different reason for separate materials.

    1. Select the products which should be returned. With selecting the items the pricing calculation takes place.

    If the ordered quantity is greater than one, only a partial quantity can be returned.

    1. The return total is calculated with the selected products. Within the last step, in the review tab, it is possible to check the whole return.

    Check the return under review and save the return.

    Result: After saving the return it is visible under the Returns overview with status pending.

    By default, the validity of the return is set to 30 days.

    1. It is possible to change the statuses within the details of the return.

    Let's assume everything is booked in the corresponding backend systems (integration work for a project). The status is selected and set to Approved within the Management Dashboard.

    1. Save the return, the status gets updated.

    Scenario - Customer creates a return from the storefront

    Within this scenario, we provide the possibility to enable the self service for your customer. This means your customer is able to create a return from your storefront.

    1. Customer logs in and opens the My Orders overview under My Account.

    In the case when a guest customer wants to return the purchased item, they need to register with the email address provided at checkout and to create a customer account. After logging in, the customer is able to see the orders history associated with the email.

    1. The customer clicks on Return and the order that is to be returned is opened.

    You can only decrease the quantity. A return reason (reason code) is mandatory. The text (reason details) is optional.

    1. The customer clicks the Submit return button, a return is created within the showcase and Management Dashboard.

    • Storefront view:

    In a real scenario, an email notification is sent out to the merchant to notify them regarding the created return.

    • Backend view: Overview page - return is created with status pending

    • Return details:

    1. The employee can decide if the return is rejected, approved or just closed. In this case, the return is approved.

    At the moment no cancellation reason can be maintained by the employee. In a real scenario an email notification is sent out to the customer after the merchant rejects the return.

    1. The status is updated for the customer under My Account → My Returns.

    Return details:

    It is not possible to create a second return for the same order in the showcase.

    To learn more about API used in this use case see the and for user guides check the documentation.

    Identity and Access Management (IAM)

    IAM Service provides out-of-the-box identity and access management.

    Here you can find an overview of the Emporix identity and access management (IAM) concept, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    The IAM feature has been introduced to help you control the user access level in specific services. By defining clear-cut roles and permissions, you can be sure that unauthorized users won't be able to modify or view sensitive data. We have prepared a set of predefined access control templates so that you can get started quickly.

    Features

    The Emporix IAM concept introduces a set of features that make identity and access management easier:

    Feature
    Description

    Overview

    The following diagram presents an example of the information flow in the IAM Service.

    For example, a "Catalog editors" user group may comprise of users granted edit, create, and view permissions within the Catalog resource in the Catalog service.

    Access control templates

    Emporix provides you with several predefined access control templates that you can apply to a group:

    Name
    Service/Resource

    Vendor Management

    Vendor Management Service make it possible to easily manage the suppliers and order splitting.

    Here you can find an overview of the Emporix Vendor Management Service, along with its features and benefits.

    • Looking for APIs documentation? Check out the .

    • To check how the Vendor Management works in Management Dashboard, see the Vendor Management guides.

    Purpose

    The Vendor Management feature in Emporix enables efficient management of the relationships with external suppliers. It offers a structured way to onboard, maintain, and govern vendors while ensuring proper access control and data integrity. Vendors and their employees are granted restricted access, allowing them to interact only with their own products, orders, and data.

    Features

    The Emporix API Vendor Management Service introduces a set of features that make managing your orders and suppliers easier:

    Feature
    Description

    Reward Points Management

    The Reward Points Service automates rewards management that drives customer loyalty and retention.

    Here you can find an overview of the Emporix Reward Points Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    With the Emporix API Reward Points Service, you can ensure customer engagement and satisfaction by giving your customers reward points for every successfully completed order, or regardless of the orders made. In the former case, the reward points are automatically added, which significantly minimizes the effort on the side of your employees. In the latter, your employees can add reward points manually as an additional form of rewarding your customers, for example on their birthday. Points can be exchanged to coupons, which then can be used for future purchases. Redemption options are not limited and can be configured by your employees. By that token, you can adjust the service to your and your customers' needs.

    Features

    Feature
    Description

    Media Management

    Media Service allows you to provide rich content to improve your products visibility.

    Here you can find an overview of the Emporix API Media Management Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    You can upload media files, such as images or video, and/or documents, for example contracts or specification sheets, by using the Emporix Media Management Service. By specifying the access types of the files, you can decide whether they should be accessible to the public on your storefront, or meant for internal purposes only.

    The assets, either linked from an external webpage, or uploaded directly from your internal storage, can serve to better reflect the categories and products your business offers, and to facilitate category and product management within your company.

    Currently, this functionality is fully integrated with the Category and Product Services.

    Features

    Feature
    Description

    Overview

    The following combinations of assets are possible:

    • Public access files linked from an external site

    • Public access files uploaded directly from a local repository

    • Private access files linked from an external site

    • Private access files uploaded directly from a local repository

    Zendesk Emporix Connect

    Integration with Zendesk can enhance your customer support service.

    Zendesk is a customer service and engagement platform designed to help businesses improve their customer support operations. Emporix enhances the support workflow by connecting seamlessly with the platform.

    With Emporix Connect for Zendesk Support, order information is integrated directly into the ticket view, providing support agents with instant access to key details such as ordered products or shipping and billing addresses.

    By eliminating the need to switch between systems, this integration streamlines the process, enabling faster, more accurate responses. The outcome is a more efficient support operation and higher customer satisfaction.

    To start working with Emporix Connect for Support:

    1. Download the application from Zendesk App Marketplace.

    2. Get your Emporix API Credentials. Go to -> . In the API Key section you can check your clientID and Secret values.

    Make sure you're checking your credentials for the right Emporix tenant. The tenant details are visible in the top-left corner. If you want to check the full list of your tenants, you can do so in the section.

    1. Copy your credentials (Client ID, Secret, and tenant) as they are required in the next installation steps.

    2. Install the Emporix Connect for Support and provide the Emporix API keys credentials when requested.

    3. During the installation process you can also set the OrderDisplayLimit. By default, the limit is set to 3.

    For all the information about Zendesk Emporix Connect, refer to the .

    Customer Management

    Customer Management module provides tools to maintain and organize the details of your customers.

    The Customer Management module of the Emporix Management Dashboard is designed to help you manage companies, customers, contacts and discount coupons.

    The Customer Management module is made of three sections:

    • Companies - where you can manage details of the companies assigned to the customers

    • Customers - where you can manage all the customers and contacts' details

    • - where you can manage customer groups and their access permissions

    • - where you can manage customers' groupings together with featured products and categories

    • - where you can manage discounts for the customers

    • Looking for business guides about the features? See and documentation in the Core Commerce section.

    • Looking for the API documentation? See and services documentation.

    Orders

    Orders stand at the core of e-commerce solution.

    Here you can find an overview of the Emporix orders concept, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    The orders functionality at Emporix manages the entire lifecycle of customer orders, ensuring a smooth experience for both customers and businesses. It allows customers to place, manage, and track their purchases effortlessly while enabling businesses to process and fulfill orders in a scalable, automated manner.

    Features

    The Emporix orders functionality combines a set of features:

    Feature
    Description

    Overview

    Orders operations can be handled end-to-end by Emporix or integrated with external systems, providing businesses with multiple approaches to order management.

    The Order Service is built to support both B2B and B2C commerce. Additionally, the service offers dedicated endpoints for different use cases like allowing customers to create and retrieve their own orders, while also enabling employees to handle orders through tenant-managed processes.

    To learn more about the different order management approaches and the service possibilities, see the .

    Mixin Schemas

    Mixins are custom properties that you can define in Emporix to adapt the system to your specific needs.

    Mixin Schemas

    Emporix Commerce Engine provides an extensibility mechanism that allows you to customize the platform adjusting it to the customers needs. The mixin schemas concept allows you to easily extend the data model so that you can boost default objects with customer-specific fields.

    • Looking for code tutorials? Check out .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    To meet customer-specific requirements, it is sometimes necessary to extend the default entities and provide additional information. The mixin schemas feature offers a simple and centralized way of adding customized fields to different objects that provide more industry-specific context. The customized fields are displayed in the Management Dashboard and can be managed from there.

    Overview video

    The diagram shows in a nutshell how creating a schema works:

    Features

    Mixin schemas come with a few features that make the management of customized schemas easier:

    Feature
    Description

    To learn about the service and see how it works, see the following documentation:

    • Management Dashboard User Guide —

    • Developer Guide —

    HTTP Webhook Strategy - Integration with Amazon Simple Queue Service (SQS)

    See the example of integration Amazon Simple Queue Service through webhooks.

    Thanks to HTTP webhook strategy, you can choose the event service that enables communication between Emporix and external systems. This article demonstrates how you can connect Amazon Simple Queue Service to receive events notifications from Emporix. Follow the steps to set up the connection on both sides. Adjust the actual implementation to your needs. Amazon Simple Queue Service (SQS) is a service that allows for sending, storing, and receiving messages between distributed systems. As such, you can choose it as one of the solutions to connect Emporix with some other systems in your company through the webhooks functionality.

    Preparing Amazon infrastructure

    The integration between Emporix and Amazon Simple Queue Service in this example will use Amazon Lambda that is able to receive the HTTP request, validate HMAC signature and then send the request body to the specified queue.

    External Products, Pricing and Fees

    You can connect an external application or system to fetch products, prices, or fees outside Emporix.

    The cart and checkout functionality typically enables customers to purchase items listed in your store's database. During checkout, the system calculates the total price, taking into account the listed prices, shipping costs and any applicable discounts. However, in B2B use cases, you may need to integrate an external system to calculate prices, custom fees or even allow the purchase of products sourced from an external ERP system, bypassing the standard product catalog.

    Emporix recognizes that B2B transactions often demand competitive pricing tailored to various factors, such as product relationships, purchase volume, customer loyalty, and more. It also understands that sometimes you might require to calculate additional fees for shipping, freight and more.

    To address this, Commerce Engine allows seamless integration with external systems that handle product management, price calculations and custom fee management. By leveraging external applications, businesses can ensure accurate and tailored pricing for each customer, streamline pricing and fee processes, and enhance overall operational efficiency. This can be accomplished by leveraging the extensibility features of the Cart Service.

    The extended cart supports the following integration scenarios:

    Auth0

    Authenticate users with Auth0.

    Introduction

    offers a versatile, ready-to-use solution for integrating authentication and authorization services into your applications.

    Auth0 facilitates simplified authentication for users. Instead of having to log in separately to each individual application or platform, users can enter their credentials once and subsequently be authenticated across multiple websites or applications.

    The following diagram shows the authentication and authorization flow:

    Availability, location, and stock levels

    Availability service allows you to manage product availability, location, popularity, and stock levels.

    Here you can find an overview of the Emporix API Availability Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Shared Orders

    Company-shared orders facilitate order management on your B2B customers side.

    Here you can find an overview of the company shared orders concept, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Customer Management

    Customer Management Service brings the tools to administer information about your customers easily.

    Here you can find an overview of the Emporix Customer Management Service, along with its features and benefits.

    • Looking for APIs documentation? Check out the and .

    • To check how the Customer Management and Approval Process can be configured in Management Dashboard, check out the

    Catalogs

    Catalogs serve as a tool to structure your products.

    The catalog concept allows you to create and manage catalogs.

    • Looking for code tutorials? Check out .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Categories

    Categories gather together products of similar properties.

    The category management concept allows you to create and manage categories, subcategories, and category trees.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Customer Segments

    Customer segments allow you to enhance customers experience and target the right group people with the right assortment.

    Learn more about the Customer Segments feature in the Emporix Commerce Engine.

    • Looking for Management Dashboard guides? Check out the .

    • Looking for related API documentation? Check out the

    Returns

    Returns Service simplifies and automates the return process for both registered and guest customers, offering flexible return handling.

    Here you can find an overview of the Emporix Returns Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the

    Introduction

    The Management Dashboard is a powerful application that provides you with backoffice tools to administer all types of settings for your online store. Learn what you achieve with MD.

    The Emporix Management Dashboard is designed to help you manage your store's resources.

    User Interface

    Emporix Management Dashboard allows you to smoothly navigate through the modules and manage your business configuration settings, customers, orders, catalogs, products, pricing, and other.

    {
        "domain" : "",
        "token_endpoint": "",
        "provider": "keycloak",
        "client_id" : "",
        "redirect_uri" : "",
        "client_secret" : "",
        "public_key" : ""
    }
    {
        "domain" : "keycloak.eu.yourdomain.com",
        "token_endpoint": "protocol/openid-connect/token",
        "provider": "keycloak",
        "client_id" : "showcase",
        "redirect_uri" : "https://storefront.emporix.io/keycloak",
        "client_secret" : "8Ku1to4R3mJAJ3tJ3u645EgKt4YfqRoN",
        "public_key" : "-----BEGIN CERTIFICATE-----\nMIICnzCC+F0\n-----END CERTIFICATE-----"
    }
    Emporix Developer Portal
    Manage API Keys
    Tenant List
    Zendesk - Emporix Connect for Support

    Amazon Simple Queue Service (SQS)

    To create SQS, go to the AWS Management Console.

    Follow the steps described in the AWS documentation Creating an Amazon SQS standard queue and sending a message.

    1. Create a queue called webhooks and use the default settings.

    2. Save the URL value of your queue, which you can see in the Details section. This is later required in the Lambda code.

    Secret key

    1. Create a Secret Key that is required in the later steps to set up the connection between Lambda and SQS.

    Follow the steps described in the AWS documentation Where’s My Secret Access Key?

    1. Save the Access Key Id and Secret Key values to provide them later in the Lambda code.

    Amazon Lambda

    1. Create a Lambda function called webhookFun.

    Follow the steps described in the AWS documentation Run a Serverless "Hello, World!" with AWS Lambda.

    The function uses NodeJS 16 and JavaScript.

    1. Modify the function's code to provide necessary details in the placeholders:

    Pay attention to the marked lines:

    i. AWS.config - define relevant values to the following properties: region, accessKeyId and secretAccessKey.

    ii. secretKey constant - provide the secret phrase for HMAC validation. You need to specify the same value in the webhooks HTTP configuration in the later steps. Here, we defined it as password123.

    Find more information on how to configure HMAC validation in HTTP Webhook Strategy - HMAC Configuration.

    iii. when HMAC validation passes, the message body is sent with the request to the queue. Provide the QueueUrl which points to your queue.

    1. Deploy the modified function.

    API Gateway

    To fully prepare Amazon's part, API Gateway is required so that it triggers the Lambda through HTTP requests.

    1. Create an API Gateway of an HTTP API type.

    Follow the steps described in the AWS documentation Create an HTTP API.

    a. In the Integrations section, point to your Lambda.

    b. For the API name, choose webhooks.

    c. In Routes, create a POST route.

    1. Deploy the API Gateway and save the url to your function. It will be needed while defining webhooks HTTP configuration on Emporix side.

    Configuring Emporix webhooks

    Now, prepare Commerce Engine.

    1. Configure webhooks to send the events as HTTP POST requests. Use the following curl and provide relevant information in the placeholders:

    Placeholders to fill in:

    • tenant - name of your production tenant

    • token - your generated Emporix access token with relevant scopes

    • destinationUrl - link to your API Gateway

    1. Subscribe to a chosen event. In this example, we subscribe to the product creation event (remember to replace the values in the placeholders):

    Creating product

    The integration is ready. To see it in action, let's create a product.

    Create a product with the following curl request providing your relevant details in the placeholders:

    After the product is created the event is sent. The webhook service consumes the event and sends it as HTTP request to the specified destinationUrl, which is the API Gateway. Then, the Lambda function receives the request and sends it to Amazon Simple Queue Service (SQS).

    const AWS = require('aws-sdk');
    const crypto = require('crypto');
    
    // i
    AWS.config.update({
      region: 'eu-north-1',
      accessKeyId: 'FILL_IT',
      secretAccessKey: 'FILL_IT',
    });
    
    const sqs = new AWS.SQS();
    
    const secretKey = 'password123'; // ii
    
    exports.handler = async (event, context) => {
    
      console.log(event);
      const body = JSON.stringify(event.body);
      const hmac = crypto.createHmac('sha256', secretKey);
      hmac.update(body);
    
      const computedHmac = hmac.digest('base64');
      
      if (computedHmac !== event.headers['emporix-event-signature']) {
        return {
          statusCode: 401,
          body: JSON.stringify("HMAC validation didn't pass."),
        };
      }
      
      try { // iii
        const messageParams = {
          MessageBody: body,
          QueueUrl: 'queue-url',
        };
    
        await sqs.sendMessage(messageParams).promise();
    
        return {
          statusCode: 200,
          body: JSON.stringify('The message was sent to SQS queue.'),
        };
      } catch (error) {
        console.error('Error:', error);
        return {
          statusCode: 500,
          body: JSON.stringify('An error occured during sending message to SQS queue.'),
        };
      }
    };
    curl -L 'https://api.emporix.io/webhook/{{tenant}}/config' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '{
        "code": "http",
        "active": true,
        "provider": "HTTP",
        "configuration": {
            "secretKey": "password123",
            "destinationUrl": "{{destinationUrl}}"
        }
    }'
    curl -L -X PATCH 'https://api.emporix.io/webhook/{{tenant}}/event-subscriptions' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '[
      {
        "eventType": "product.created",
        "action": "SUBSCRIBE",
        "fieldsToSubscribe": [
          "name"
        ],
        "fieldsToUnsubscribe": [
          "description"
        ]
      }
    ]
     '
    curl -L 'https://api.emporix.io/product/{{tenant}}/products/' \
    -H 'Content-Language: en' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '{
        "name": "Test product for documentation",
        "code": "unique",
        "description": "product description",
        "published": false
    }'

    Localized fields

    When creating or updating a group, permission, or role, you can specify its name and description in multiple languages.

    User types

    For a tenant, there are two types of users available: customers and employees of that tenant.

    Employee groups

    Employee groups aggregate employees of a tenant that share the same access control within a particular service and resource. By assigning an employee to a particular group, you grant them a specific access control level. Access controls are applied to both the Emporix Management Dashboard and the APIs through scopes. To learn more about scopes, check out the Authorization and scopes guide.

    Access controls and access control templates

    Access controls combine both resources and roles. For example, a user with a manager role can view, create, delete, and edit resources within a service. You can use access control templates that contain predefined settings for roles. For more information, check out Access control templates.

    Resources

    Objects within Emporix API services, for example area and time resources in the Delivery Service.

    Roles

    Roles encapsulate predefined permissions that allow users to perform actions on resources within services. For example, a user with a manager role can create, view, edit, and delete resources within a service.

    Permissions

    Permissions define what actions a user with a specific role can perform on resources within services. For example, a service might have permissions to perform the following actions on a resource: view, create, delete, and edit.

    Catalog Manager

    • Catalog

    • Category

    • Product

    • Product template

    • Label

    • Brand

    • Supplier

    • Webhook

    Pricing Manager

    • Price Model

    • Price List

    • Tax

    • Unit

    Order Fulfillment Manager

    • Customer

    • Order

    • SEPA

    • Return

    • Checkout

    • Site

    Reward points validity

    The reward points gathered by your customers are only valid for a specified amount of time. By default, their lifespan is set to three years.

    Reward points management

    Your team can add, delete, update, and retrieve reward points by using an application integrated with the Reward Points Service API.

    Storefront integration

    With this feature, reward points can be exchanged for coupons by customers on your business storefront. Customers can also check the balance of their points, along with a detailed summary of the points added, and a history of redemptions. When redeeming the points, customers can choose from several redemption options configured by your employees.

    Process automation and integration with Order Service

    By default, after a successful order placement, points are automatically added for the customer who placed the order. When a customer redeems points for a coupon, the points are automatically deducted from the customer's total sum of points.

    Coupon generation and integration with Coupon Service

    On your business storefront, customers can exchange certain amounts of reward points for coupons of a specified value, based on the available redemption options.

    Configurable redemption options

    It is possible to create numerous coupon redemption options for your customers, along with specific conditions that have to be met, for example the number of points necessary for the redemption. The available coupons have to be of the absolute or percentage type.

    Money to reward points ratio

    You can set a factor that allows you to calculate the number of reward points assigned to a customer after every successful purchase.

    Automatic / elastic scaling

    The system automatically scales resources to handle peak order volumes without performance issues.

    Order queues and virtual waiting

    Optimized order processing removes delays and virtual waiting times, enhancing user experience.

    Customers orders

    Customers can place orders and view the orders history.

    Order management for employees

    Tenant employees can create, retrieve, delete, and update orders in the Management Dashboard.

    Order history

    Customers and employees can view past orders for reference and tracking.

    Reordering from last order

    Enables customers to reorder previous purchases quickly, improving convenience and efficiency.

    Orders with calculated prices

    Allows customers to place orders with products that have variable pricing (for example weight-based items where the final price is determined later).

    High volumes management

    Designed to handle large-scale order processing without performance troubles.

    Localization

    Provide translations for the custom specific sections, descriptive fields and define if a field itself should be translated into multiple languages.

    API Reference —

    Management Dashboard support for all relevant entities

    Manage the additional fields easily ensuring that the data is consistent.

    Supported entities

    Define and generate data schemas for the following entities: category, company, coupon, customer, customer address, order, price list, product, quote, return, site and custom entity.

    Management Dashboard supported types

    Add fields of the following types: array, boolean, date, date_time, decimal, enum, number, object, text, and time.

    Upload of json files to create schemas

    Define a schema with customized fields by uploading a json file that defines the data model you need. The json file is validated during the upload reducing the errors number.

    Different versions per entity

    Extend a basic schema by individual fields per entity and maintain valid versions of their schemas.

    Unassign mixin schema

    Control which mixin schemas are assigned to the entities to ensure consistency. With unassign feature, the backend users can define which version is the current one for which object.

    Mixin Schema Guide
    Third-party pricing for products existing within CE: Prices are calculated externally by other applications and overwrite those set in Commerce Engine.
  • Third-party pricing for products not defined within CE: Products from an external system, including their pricing, are added to the cart.

  • Products without predefined prices: The cart allows products with no set price to be added making checkout possible, with the final price updated from an external system at the last stage of purchase completion. To cover such a case and proceed with checkout, set temporarily the price value to 0.

  • Third-party sourced fees: The products added to the cart might require additional fees to be calculated, such as for example shipping, freight, packaging, large-size load, or more. Calculate additional fees externally and add them at the customer's cart level.

  • Extended cart flow

    The diagram shows the communication between Emporix and an external system that calculates prices or manages product information. The storefront triggers an additional layer, it can be a backend for frontend (BFF) or an external service outside of the Emporix environment. The price calculation happens at that middleware layer by sending a request to an ERP system. Once the data is ready the BFF layer communicates with the Emporix Cart Service directly.

    Enabling external products, pricing and fees

    Enabling an external service to provide product, pricing and fee information at the cart level requires the following steps:

    1. Get the cart.cart_manage_external_prices scope to handle external system communication.

      a. Go to the Emporix Developer Portal, Manage API Keys section.

      b. In the Custom API, use Add scopes or Add more groups option.

      c. Add a group name of your choice, and under Cart, select the cart.cart_manage_external_prices scope.

      d. Confirm with Generate.

      Now, you can use the generated API keys to allow communication between the Cart Service and an external system for managing pricing.

    Never grant access to these API keys to the end customers as it may lead to security risk of faking your price data.

    1. Turn on the enableExternalPrices setting. You can achieve that in the Management Dashboard or through the :

      • In the Management Dashboard, go to the Settings -> System Preferences. Set the value to true for the Allow fetching external prices setting.

      • In the Configuration Service, add the following configuration:

    2. Use your dedicated Backend-for-Frontend (BFF) layer or an external service responsible for managing pricing, fees and/or products on your side. This layer is to be positioned in between the storefront and the Emporix Cart Service. Ensure that this BFF is properly configured, as the generated API key with the scope for managing external pricing serves as an authorisation token. The token enables direct communication with the Cart Service to update your storefront customers' carts.

    When external pricing is enabled, it is essential to ensure the accuracy of the external prices from your price engine, as CE does not perform price validation in such cases.

    Managing carts with external product, pricing, or fee information

    Once you've enabled the external system in Emporix environment, and configured the external service properly, you're able to use the external service to handle price and fee calculation or product management at a customer's cart level. When a customer creates a cart, you're able to add custom product, pricing and fee data that comes from another service by using the Emporix Cart Service API. Modifying the customer's cart is possible by making a call to the Adding a product to cart endpoint, defining the external sourcing. The request payload has to define the itemType property and set it to EXTERNAL. This ensures the CE cart is able to read data coming from external applications. Include the price details and also tax details relevant for the pricing. See examples of how you can construct such a request.

    External prices

    • Overwriting a product's price from an external source

    Notice that to overwrite a product that is available in CE product catalog, you need to provide the relevant itemYrn property.\

    External products

    • Adding a product from an external source, outside CE catalog, including external price calculation

    • Adding a product without a price

    To achieve completing checkout with products without price defined, define the price to 0.0 value. You can then overwrite the pricing at a later stage, calculating it according to the relevant factors you want to take into account.

    External fees

    • Adding an external fee

    It is possible to combine standard fees with external fees. Depending on your context, you could add a standard fee to one product in a cart and an external fee to another one. However, adding a custom external fee prevails over the standard fee defined for a specific product in the Fee Service.

    The calculated fees are visible in the order summary in the Management Dashboard.

    For more information, see the .

    Features
    Features
    Description

    Universal login

    A customizable login experience that supports various identity providers.

    Social identity providers

    Integration with popular social platforms for authentication, including Google, Facebook, Twitter, Twitch and others.

    Multi-factor authentication (MFA)

    Enhances security by supporting multiple authentication factors, such as SMS, email, or authenticator apps.

    Log streaming

    Provides logs and monitoring capabilities to track authentication and authorization events for auditing and analysis.

    Setting up the Auth0 account

    To set up the account:

    1. Register your account at Auth0.

    2. When your account is created, go to the Getting Started section and choose Create Application.

    1. Provide the application name and select Single Page Web Applications.

    1. Choose Create.

    2. When the application is created, provide the following application details to Emporix: domain, client ID, client secret, certificate and redirect URL.

      • You can find the Domain, Client ID and Client Secret in the Settings tab.

      • For the certificate go to the bottom of the Settings tab where you can find Advanced Settings. Expand the section, go to Certificates and copy the value of the Signing Certificate.

      • Redirect URL is the URL of your storefront where the user is redirected after the Auth0 process.

      When you provide the values, the configuration is now done on the Emporix side. Wait for the confirmation from us that this part is ready.

    3. When the configuration is ready, you need to configure the allowed-origins and callbacks URL. Go to the Settings tab in you Auth0 account and enter the values in the Application URIs section. The values should point to your storefront, for example:

      • Allowed Callback URLs - https://storefront.emporix.io/auth0

      • Allowed Logout URLs - https://storefront.emporix.io

    Storefront implementation

    To set up your storefront:

    1. To redirect the user to Auth0 page, add a login button to the login page:

    • AUTH0_DOMAIN - is the Domain value from the Settings tab in your Auht0 account

    • AUTH0_CLIENT_ID - is the Client ID value from the Settings tab in your Auht0 account

    • REDIRECT_URI - is the value provided in the Application URI in the Settings tab in your Auth0 account, it should point to a place where user is redirected after the authentication flow

    1. When user finishes the auth flow, Auth0 redirects the user to the URL provided in REDIRECT_URI parameter. It adds an additional query parameter called code. Having the code value, you need to invoke Emporix API to exchange the Auth0 code with the Emporix token. Apart from the CODE value, you also need Emporix ${ANONYMOUS_TOKEN}.

    To check how to obtain the anonymous token from Emporix, check the Customer Service (Customer Managed) documentation.

    When you have the two values, invoke the following API:

    Response:

    Store the access_token and saas_token for further communication with Emporix.

    Connecting with social applications

    Auth0 can be connected with many social apps. When the apps are integrated with Auth0, users can then access your storefront with the social application login.

    Twitch is an example of the application that you can integrate with. To configure the setup:

    1. Sign up for a Twitch Developer account.

    2. Set up an application on the Twitch Developer portal. For the detailed instructions, see Twitch's guide on registering an application.

    3. Connect your Twitch application to your Auth0 application. For the detailed instructions, see Auth0's guide on connecting apps to Twitch.

    Result: After the configuration, users can now use the Twitch account as a way of logging in.

    For more information about connections to social apps, see the Auth0 Social Connections documentation.

    Auth0

    Purpose

    The Availability Service helps you manage information about the availability of products sold by your business. To make picking and packing easier, you can also manage physical location of products on particular sites.

    Features

    The Emporix API Availability Service introduces a set of features that make product management easier:

    Feature
    Description

    Availability

    Manage information about availability of products sold by your business.

    Product bundles

    Automatically calculate a product bundle's stock level based on the lowest stock level of the bundled products.

    Location

    Manage the exact location of products inside a warehouse or a store — zones, racks, shelves, and bins.

    Popularity

    Store information about a product's popularity to recommend best-selling products to your customers.

    Stock levels

    Manage stock levels of products at different sites.

    Search functionality

    Quickly retrieve information about location and availability of desired products.

    Purpose

    Frequently in B2B scenarios, companies have a few or multiple customer representatives that make purchases at your online store. Therefore, there is a need for viewing orders made by other customers from the same organization. With the relevant scopes, you can grant access to a certain group of customers so that they can track and manage the shared orders. This feature brings transparency and efficiency to order management on the customers side, improving their workflows.

    Features

    The Emporix orders functionality combines a set of features:

    Feature
    Description

    Company shared orders visibility

    With the right scopes, the end customers can see not only their own orders but also by other customers from the same organization. It improves the expenses transparency and better collaboration for the end users.

    Enhanced security and privacy

    Sensitive order information remains accessible to relevant users/user groups only, reducing data exposure as the visibility of the company related orders is possible only with the relevant scope granted to a customer group.

    Frontend readiness

    Maximize the efficiency of your storefront launch. Take advantage of pre-designed functionality and streamline implementation processes.

    Overview

    To enable the shared orders visibility for a certain group of customers, grant the access by setting the read for legal entity scope for a customer group.

    The diagram visualizes how the orders can be shared among different customers:\

    To learn more about the customer groups and how to manage them, see the Core Commerce guide Customer Groups and the Management Dashboard guide Groups.

    To see the example use case, refer to the Company Related Orders and Customer Groups.

    guides.

    Purpose

    The Emporix API Customer Management Service is designed to make customer management easier for B2B Commerce and improve approval processes for better business coordination.

    The Customer Management Service divides company information into entities that are reusable and manageable. These entities include the companies' subsidiaries, locations, customers, and contacts, as shown in the diagram:

    By using customer management and user groups with specified permissions, it's possible to set up a convenient approval flow within a company.

    Features

    The Emporix API Customer Management Service introduces a set of features that make managing your business customers in your commerce channels easier:

    Feature
    Description

    Automatically-created customer groups

    Offer personalized pricing to your business customers' employees by adding them to automatically created company customer groups.

    Contact assignments

    Allow your employees to assign your business customer employees as contacts representing legal entities they work for. Since contacts may perform different roles within those entities, it is possible to specify the type of contact assignment, for example primary, logistics, or billing.

    Comprehensive data model

    Store detailed data about companies, such as legal information, physical locations, or contacts.

    Customer and contact assignments

    Manage data about customers and contact persons for specific companies.

    Company relationship structures

    Store information about subsidiaries of your business customers.

    Purchasing limits

    Specify the maximum purchase limits at the company level.

    The Customer Management Service is primarily designed to bring information about your business customers close to where it is needed to manage your commerce channels. If your single source of truth about the customers is stored within a third-party-solution it can be integrated into our application.

    Customer Management
    Purpose

    Catalogs allow you to manage categories with products and product-related information efficiently. With this feature, you can group categories into a logical structure with a specified name, description, and other additional properties. Both Catalog and Category Services are compatible with our existing Product Service. Emporix aims to provide a flexible and scalable solution for our customers so that they can manage and sell their products more efficiently.

    Features

    As part of our redesign of how products are stored, categorized, and managed in the Emporix platform, we have introduced a new catalog feature, which acts as a container for categories and products.

    You can have multiple catalogs representing a products range available for different sites so that complex requirements may be modelled in the system.

    The Emporix catalog concept comes with a set of features, described in the table below:

    Feature
    Description

    Localized catalog names and descriptions

    Deliver catalog names and descriptions in languages that your business operates in.

    Synchronized Catalog and Category Services

    Every time you make any changes in the Category Service, they are automatically reflected in the Catalog Service.

    ✅ The Catalog Service automatically checks for any category-deleted events. Every time a root category is deleted, it is automatically removed from all catalogs it belonged to.

    Category assignments

    Assign categories to a catalog.

    Visibility statuses

    Decide which catalogs should appear on the storefront by setting their statuses to visible.

    Time-limited catalogs

    Along with enabling catalog visibility, set the specific timeframe for the catalogs to appear on the storefront.

    ✅ For example, promotional or seasonal catalogs visible on the storefront based on pre-set timeframes.

    Multiple catalogs per tenant

    Create and manage multiple catalogs for different purposes.

    • Supplier and seller catalogs

    • One catalog per product line or division

    • Seasonal catalogs

    Features and benefits for B2B commerce

    The Emporix catalog and category concepts constitute a flexible classification solution that helps B2B companies manage and display their product offerings more efficiently. With our Emporix Commerce Engine, you can be sure that your potential customers find specific products and product information easily. Our brand new Catalog Service allows you to create complex catalog structures with categories that can represent your business offering at a given time.

    Purpose

    Categories are essential to every online business — they organize products and help employees and customers find what they need. Emporix aims to make category management easier by providing you with a customizable classification solution.

    Features

    Our newly improved Category Service provides you with enhanced performance and scalability. Enriched, redesigned features allow you to build efficient classification solutions with guaranteed performance.

    The Emporix category concept comes with a set of features, described in the table below:

    Feature
    Description

    Localized category names and descriptions

    Deliver category names in languages that your business operates in.

    Category customization

    Adjust the category model to suit your business needs with the help of mixins.

    Category trees

    Build category and subcategory structures for better product management.

    Assignments

    Assign products to a category.

    Visibility statuses

    Decide which categories should appear on the storefront by setting them as published.

    Time-limited categories

    Along with using the published status, decide which categories should be visible in a specific timeframe by setting a date range for their validity.

    Features and benefits for B2B commerce

    For a B2B company that offers a wide variety of products, it is essential to provide a robust and flexible classification solution for employees and customers. Thanks to the Emporix Commerce Engine, you can group products into a flexible classification structure using categories that are most suitable for your business offering.

    Our brand new Category Service allows you to freely nest categories and create as many subcategories as you need, along with the attributes assigned to them. Categories can be represented either as a flat list or as a hierarchical category tree to suit the needs of your employees and customers. These views are created and updated automatically.

    To find out more about managing categories, see Categories.

    .

    Purpose

    Successful business strategies should follow the customer-first approach. Taking into account the individual needs of each customer is the key to gaining trust and loyalty. Customer segments are a critical component of any commerce application as it allows businesses to deliver more personalized, efficient, and effective experiences. Tailored marketing campaigns ensure that the right message reaches the right audience. Customer segments also enable more efficient and targeted communication with relevant customers.

    In essence, customer segments transform raw data into strategic insights, driving growth and fostering long-term customer relationships in your commerce application.

    Overview video

    Features

    Feature
    Description

    Content personalization

    Customer segments enable tailored marketing campaigns, ensuring that the right message reaches the right audience. This personalization increases engagement and drives conversions, as customers are more likely to respond to offers that resonate with their preferences and needs.

    Configuration in the Management Dashboard

    The Segments module within the Management Dashboard facilitates creating and managing customer segments to respond to your individual requirements.

    Targeted products

    Choose specific products to connect with a particular segment to be able to promote them within the target group.

    Targeted categories

    Choose specific categories to connect with a particular segment to be able to run relevant campaigns with whole categories of products.

    Members assignment

    Select the customers you'd like to include in each segment so that they serve your business purposes. You are able to target the segments based on the customers purchasing history, geography, or other factors, to create customized campaigns. Segments like frequent purchasers or discount-seekers allow for tailored loyalty programs or exclusive offers.

    Easy activation

    By toggling a segment on and off, you've got full control over the marketing campaigns you're running.

    Overview

    Simplified segments usage:

    Segments
    in the Emporix API Reference.

    Purpose

    With the Emporix API Returns Service, customers may return defective or unwanted products more easily.

    Returns, connected to orders and products on the platform, can be created, updated, or deleted (closed) either by customers themselves through a form on a storefront, or on the Management Dashboard or directly through Emporix API by employees on behalf of a customer. It is also possible to show a list of returns for a particular customer. If integrated with the Emporix API Webhook service, the Return Service events can trigger actions in other systems, such as automated status updates and notifications.

    Features

    Feature
    Description

    Return management

    Thanks to the well-structured return management mechanism with a set of standard fields for each return order, your customers and employees can now return goods more easily. Your customer service team can use the Management Dashboard or another application integrated through the Return Service API to update the return status and other relevant fields.

    Multiple orders and products in a single return request

    We make it easy to return goods from different orders in a single return, while still maintaining the links to the original orders and the products in them.

    List of returns

    Our API makes it easy to publish a filterable list of returns in your storefront application, thus giving your customers an easy way to see their returns and the products in them.

    Webhook integration

    If integrated with webhooks, the Return Service events can trigger actions in other systems (such as sending notifications to customers).

    Support for returns of orders from guest customers

    Even if a customer decides to shop anonymously (without creating an account), it is still possible for them to return the purchased items. The purchase history is associated with an email address provided while submitting an order, therefore there are two options available to make a return for a guest customer: - They can either call your support and the employee is able to find the relevant order and create a return. - They can register with the email address provided at guest checkout and create a return request themselves from the orders history.

    Overview

    The following diagram presents the return process:

    For more information, see also Returns Business Scenario.

    On the left-hand side of the application window, you can find the
    navigation menu
    with modules. Each module is a collapsible menu itself, grouping together specific sections.
  • On the settings bar at the top of the application window, you can find your tenant name and switches that allow you to choose the currency and language that you want to use for your data.

  • The figure that you see in the dashboard presents the revenue and order count for the selected date range. The data is based on the orders placed during the chosen period of time.

  • The possibility to view specific modules and available options that appear in particular views of Emporix Management Dashboard depend on the permissions set for users. If you don't see a specific module, can't see or perform an action described in the documentation, it might mean that you don't have enough permissions. To learn how to manage users and their rights and roles in the application, see Users and Groups.

    Data and interface languages

    There are two language choosers in the settings bar at the top:

    • If you have localized data, you can change the data language to see localized values in that language first. For example, when you switch to French data language and then open a product, you will see that localized fields, such as name or description, show the values in French. But the other content you see in the UI, like modules names, fields names, buttons etc, will not be translated to French.

    • If you want to switch to a different UI language and to have everything translated, change the Interface language under your account icon. Currently, English and German are supported.

    Modules

    The Management Dashboard is divided into the following modules:

    • Customer Management — your place for managing data about the companies, contact persons, customers and coupons.

    • Vendor Management - your place for managing vendors and their access.

    • Quotes — your place for preparing and managing customers' quotes requests.

    • Orders — your place for managing orders.

    • — your place for configuration of catalogs and categories to which your products can be assigned.

    • — your place for product data management, where you can create product templates, labels, manage brands, or gather supplier details.

    • — your place for configuration of the pricing models and price lists.

    • Supplier Management — your place for managing your suppliers' data.

    • — your place for managing store settings, such as delivery options or fees.

    • — your extensions to the product.

    • — your place for managing users, permissions and webhooks.

    Customer

    ADR2MAS03

    Address

    Location

    ADR3MAS03

    Address

    Location

    Transactional IDoc:

    SALESORDER_CREATEFROMDAT202

    Transaction

    Order created Webhook payload

    Centralized vendor data

    All vendor information (legal, contact, and custom attributes) is stored in one secure, unified system.

    Controlled access

    Vendors and their employees can only view and manage their own products and orders ensuring data privacy and integrity. They can manage product media, availability and simple base prices. Additionally, they can publish and unpublish products.

    Flexible vendor management

    Update vendor statuses, maintain profiles, and adapt vendor data as business needs to evolve.

    Order Splitting

    Orders containing products from multiple vendors can be split into suborders by vendor.

    API-Driven Integration

    Integrates with other systems enabling automated workflows and data exchange.

    Secure and compliant

    OAuth2-based access controls and tenant-specific scoping ensure secure and compliant vendor interactions.

    Asset types

    All file types are supported. You can upload media files, such as videos or images, as well as contracts, technical specifications, or any other documents.

    Upload types

    You can upload files directly from local storage, or link to external assets by using a URL. When you link to an asset, it is not downloaded to Emporix storage. Instead, only a reference to the external asset is kept.

    Access and storage types

    Depending on the access type, the assets can have different audiences. If a file's type is specified as "public", then it is stored on a public storage website and is available to access by both customers and employees. If it is a private type of an asset, then it is stored privately and thus only accessible to your tenant's employees through the Media Management Service and the Emporix Management Dashboard.

    Full asset management

    You can create, retrieve, update, and delete assets.

    Integration with Category and Product Services

    The uploaded and/or linked files can be associated with specific products and categories within the Emporix database, or remain unassigned.

    Returns
    Groups
    Segments
    Coupons
    Customer Management
    Coupons

    Creating your first tenant

    Create your first tenant.

    The first step in the e-commerce system is creating a tenant. A tenant represents a business subscription to our services and is required to access the following products:

    The first step in the Emporix e-commerce system is creating a tenant. A tenant represents a business subscription to our services and is required to access the following products:

    • Emporix API — the core of our e-commerce system.

    • Emporix Developer Portal — a platform where you can manage your tenants, team members, and Emporix API access credentials.

    • — a content management system where you can manage your business resources related to product management, marketing, order fulfillment, and more.

    Free trial You can try out the e-commerce features completely free of charge for 14 days. With the free trial, you get full access to the production-ready e-commerce system, so you can test all of its functionalities before you decide to become our partner.

    What are the differences between a free trial and a paid plan?

    Apart from the free trial being time-limited, there are no differences between free trials and paid plans — both operate in production environments. This approach brings the following benefits:

    • Full experience of the e-commerce system during the free trial.

    Setting up a first tenant

    You can create and configure a tenant through the .

    Creating an account

    To set up an Emporix tenant, create an account in the Developer Portal. The following registration methods are available:

    • Password-based authentication

    • Single sign-on (requires additional configuration of an Identity Provider service, to learn more see )

    • Social login with the following platforms:

      • Google

    When creating an account on the Developer Portal, you need to use a business email address. Email addresses registered to public domains are rejected by the registration form.

    Registering an account gives you the ADMIN permissions in the Developer Portal and in the Management Dashboard.

    Once you create an account, you can start creating a tenant straightaway.

    Alert for Unrecognized Browser Logins

    There is a security feature implemented in our system to enhance the protection of your account. Whenever a login attempt is made from an unrecognized browser or device, an alert email is automatically generated and sent to the email address associated with your account.

    This alert email is designed to promptly notify you of any login activities that may be unauthorized or suspicious. If you receive such an alert email and you haven't recently logged in or attempted to access your account from a new browser or device, we strongly advise you to take immediate action to secure your account. This includes changing your password and reviewing your account activity, as well as reporting this fact to your organization.

    Creating a tenant view:

    Choosing a tenant name

    A tenant name is its unique identifier in the Emporix e-commerce system. To call any Emporix API endpoint, you need to pass the tenant name in the form of a path parameter. When coming up with a name for your tenant, your business name is usually a good choice.

    Your tenant name must fulfill the following criteria:

    • It must start with a letter.

    • It must be between 3 and 10 characters long.

    • It can only contain lowercase letters (without diacritics) and numbers.

    Selecting a language

    Specify the language in which your business communicates with suppliers and customers.

    When creating a tenant, you can choose one of the following languages:

    • English

    • German

    Select one of the available languages. Once your tenant is ready, you'd be able to change the selected language or add multiple languages for your tenant by using the Emporix API or Management Dashboard.

    To learn more about language configurations, check out the .

    Selecting a currency

    Your tenant's currency configuration specifies which currencies are accepted by your business.

    When creating a tenant, you can choose one of the following currencies:

    • EUR — Euro

    • GBP — Pound sterling

    • NOK — Norwegian krone

    • USD — United States dollar

    The currency chooser on the lists the currencies most commonly used by our partners and allows you to select a single currency only. However, you can add any currency or set up multiple currencies for your tenant with the help of Emporix API.

    To learn more about currency configurations, check out the .

    Including OE

    If you plan to use the OE for automating workflows and business processes, you can select the Include OE option to get access to the full potential of Commerce Orchestration Platform.

    Subscribing to the newsletter

    Stay up-to-date with the latest news about our products and services.

    Creating a tenant

    Once you fill out the form, choose Create a tenant and wait a couple of minutes for your tenant to finish setup. When your tenant is ready, you are redirected to its dashboard on the Emporix Developer Portal. Check your inbox, as you should receive the confirmation email.

    Out-of-the-box configuration

    Once your tenant is ready, you get immediate access to various resources.

    Emporix API

    The Emporix API is the core of the e-commerce system. With the API, you can easily manage your business resources.

    To prevent unauthorized access to your business sensitive data, your tenant is provided with different API credentials:

    • Emporix API — used to access the API from a business owner's perspective.

    • Storefront API — used to access the API from a customer's perspective. These credentials are used to perform basic actions on a storefront — browse products, view prices, or add products to cart.

    • Custom API - build your custom scopes to access different services and assign permissions to the users

    You can access your tenant's API credentials in the .

    To learn more about our API, check out the .

    Sample data

    To make onboarding easier, some of the resources are automatically configured with sample values.

    If you want to check specific values configured for your tenant, you need to call the API endpoints referenced in the table.

    Resource
    Data available out-of-the-box
    API endpoint

    External applications

    To improve your customers' shopping experience, you can enable an external application for search and indexing. Check out and documentation.

    Indexing of your tenant's data in Algolia is disabled by default. If you want to enable this functionality, reach out the .

    Performance tests

    To ensure good system performance for all our partners, we need to know in advance if you plan to run any load, stress, or other types of performance tests on your tenant. In such cases, contact the .

    HTTP Webhook Strategy - Integration with Azure Service Bus

    See the example integration with Azure Service Bus through webhooks.

    Thanks to HTTP webhook strategy, you can choose the event service that enables communication between Emporix and external systems. This article serves as an example demonstrating how you can connect Azure Service Bus to receive events notifications from Emporix. Follow the steps to set up the connection on both sides. Adjust the actual implementation to your needs. Azure Service Bus is a messaging service that allows for communication between decoupled systems, so it can serve as a solution to connect Emporix with some other systems in your company through the webhooks functionality.

    Preparing Azure infrastructure

    The integration between Emporix and Azure Service Bus in this example will use Azure Function that will act as a consumer of webhook events coming from Emporix. The Azure Function will receive the HTTP request, validate HMAC signature and send the request body to the given queue.

    Azure Service Bus

    To create Azure Service Bus, go to the Azure Portal.

    Follow the steps described in the Microsoft documentation .

    1. Create a Service Bus called webhooking and a queue called webhook.

    2. Save the Connection String that is present in the Shared access policies section.

    Azure function

    1. Create a Function App.

    Follow the steps described in the Microsoft documentation .

    In this example, the function uses NodeJS and JavaScript.

    1. Create the function locally and then deploy it to Azure.

    Follow the steps described in the Microsoft documentation .

    1. Create a new project:

    1. Modify the generated code.

      a. Add a new dependency to package.json:

      b. Execute npm install to apply the change.

      c. Provide the required information in the function's code so that the function sends the requests to Azure Service Bus. Let's take a look and analyze the function’s code:

    \

    Pay attention to the marked lines and provide relevant information:

    i. connectionString constant - replace the value with the connection string to your Azure Service Bus instance. Find it in the Shared access policies section in Azure Portal.

    ii. queueName constant - provide the value of the queue you created. Here, it equals webhook just as the queue we created.

    iii. secretKey constant - provide the secret phrase for HMAC validation. You need to specify the same value in the webhooks HTTP configuration in the later steps. Here, we defined it as password123.

    Find more information on how to configure HMAC validation in .

    iv. when HMAC validation passes, the message body is sent with the request to the queue.

    1. Deploy the function to Azure by calling the command:

    Configuring Emporix webhooks

    Now, prepare Commerce Engine.

    1. Configure webhooks to send the events as HTTP POST requests. Use the following curl and provide relevant information in the placeholders:

    Placeholders to fill in:

    • tenant - name of your production tenant

    • token - your generated Emporix access token with relevant scopes

    • destinationUrl - link to your Azure Function

    1. Subscribe to a chosen event. In this example, we subscribe to product creation event (remember to replace the values in the placeholders):

    Creating product

    The integration is ready. To see it in action, let's create a product.

    Create a product with the following curl request providing your relevant details in the placeholders:

    After the product is created the event is sent. The webhook service consumes the event and sends it as HTTP request to the specified destinationUrl, which is the Azure Function. The Azure Function receives the request and sends it to Azure Service Bus Queue.

    Carts

    Carts are one of the core concepts of online commerce.

    Here you can find an overview of the Emporix carts concept, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    Carts allow your customers to compile a list of items for purchase. The Emporix carts concept aims to simplify cart management by introducing features such as cart merging or automatic deleting of inactive carts.

    Features

    The Emporix carts concept introduces a set of features that make cart management easier:

    Feature
    Description

    Overview

    The following section provides more information on cart management features in the Emporix e-commerce system.

    Cart merging

    Sometimes a customer will browse products and add them to the cart before logging in. In such a case, you can merge their anonymous cart with their customer cart to preserve the shopping flow.

    Once the carts are merged, the anonymous cart's status is set to CLOSED.

    You can use the merging functionality to perform the following actions:

    • Merge an anonymous cart with a customer cart.

    • Merge multiple anonymous carts with a customer cart.

    You cannot use the merging functionality to perform the following actions:

    • Merge a customer cart with an anonymous cart.

    • Merge a customer cart with another customer cart.

    Common conflicts that may occur while merging carts are described in the table below.

    Conflict
    Approach of the merging functionality

    Assisted Buying

    Assist your customers remotely by using the Assisted Buying feature.

    Here you can find an overview of the Emporix Assisted Buying, along with its features and benefits.

    • Looking for Management Dashboard guides? Check out the Sites and Customers guides.

    • Looking for related API documentation? Check out the , , and .

    Purpose

    Assisted Buying is a feature focusing on providing faster and better customer support. Whenever customers have any issues with orders or just ask to act on their behalf, merchant employees can address their requirements in a convenient way.

    Overview video

    Features

    Feature
    Description

    Enabling and using the assisted buying

    To enable the feature, you need to provide a storefront URL for each site where assisted buying should work. This can be done in the Management Dashboard UI, in Site Settings.

    To see the details, check the guide.

    After enabling the feature for a specific site, you can now log in as a customer and perform the requested actions on their behalf.

    The Assisted Buying functionality works only if the logged in user is a member of the support group.

    1. In Management Dashboard, go to Customer Management -> Customers and choose the customer on behalf of whom you want to log in to the storefront.

    2. In the Details view, open the Assisted Buying dropdown list and choose the site.

    When you choose the site that you want to use, it opens a new browser tab with the storefront. You can now do any purchases that were requested by the customer.

    Storefront implementation

    When you log in to the configured storefront site, you're invoking the following request to authenticate as a customer:

    Please note that the employee token is required to complete this request to assure that an authorized person logs in as a customer. The endpoint doesn't work with API key.

    The response includes the following details:

    This information is visible in the URL and attached as query parameters, like in this example:

    Storefront URL configured in Management Dashboard for the site:

    URL of the storefront after you open the site:

    Set the values in your storefront and use them when making the https calls.

    Emporix Storyblok App

    Learn about integration possible with the Emporix Storyblok app.

    Emporix partners with Storyblok which is a headless CMS that combines developer flexibility with an intuitive visual editor, making it easy to create and deliver content across any digital platform. The integration between Emporix and Storyblok is established with the field plugin. This plugin connects to the Emporix Commerce API to retrieve products and categories that are later displayed for the customers.

    The key features are:

    • Product Search – finding products by name

    • Category Filtering – narrowing search results by category

    When adding items to the story through the field plugin, you can browse through products and categories using either a list view or grid:

    If you want to filter the results, you can narrow the search by categories:

    Configuration

    The Storyblok integration setup requires different steps that need to be combined between the customer and Emporix support team.

    Preparation steps

    To start your integration between Storyblok and Emporix, as a customer go through the following steps:

    1

    Add Emporix user to your Storyblok account

    Log in to your Storyblok account and add [email protected] as a user.

    Field plugin configuration

    The Storyblok field plugin requires the following details to connect to the Emporix API:

    • tenant - Your Emporix tenant identifier

    • clientId - Client ID for API authentication

    • clientSecret - Client secret for API authentication

    You can find all the data in your Emporix developer portal in the section.

    When you have the data, these values are configured using Storyblok UI when adding the field plugin in Storyblok:

    1

    Create a new field plugin

    Go to the field plugin design in your Storyblok account.

    2

    Customers

    Manage customers information.

    The customer dashboard enables you to manage your customer information. Within this view, you can easily handle all the contact details and addresses. You can sort and filter the list by customer's ID, first name, last name, company or preferred sites.

    You can also change the default view by using the options available under the orchestration icon.

    With the table orchestration, you can add custom columns to the list view, by adding mixin fields as columns. If you have already defined a mixin schema for the entity, you'd be able to select the defined mixin fields to display them in the main view.

    See example how to do it in the documentation.

    Creating a customer

    1

    Choose to create a customer

    To start creating a customer, go to Customer Management -> Customers and choose Add New Customer.

    2

    Managing customer's details

    The customer Details view allows you to check and manage the customer's information.

    When a customer is assigned as a contact to a company or to a customer group, this assignment is also displayed in the customer view. From there, you can easily navigate to the assigned company or group by clicking its name in the list. The customer view also shows the date and time of the customer’s last successful login to the online store.

    Assisted Buying

    The Assisted Buying button is visible only if there's at least one site with the configured storefront URL and if the logged in user is a member of the support group.

    The Assisted Buying feature can be configured for each customer. The feature allows you to perform actions on behalf of the customer.

    1

    Log in as a customer on a storefront

    In the drop-down menu of the Assisted Buying button, you can find all the customer's sites for which the assisted buying is configured. When you choose the site from the menu, a related storefront URL opens in another tab.

    Groups

    Manage customer groups.

    The Customer Groups feature serves as a B2B user management tool. With customer groups, you define the relevant access permissions for your end customers from the same organization.

    When you create a company in the system, the predefined customer groups are created simultaneously:

    • Admin - has manage rights for users and checkout data, as well as read right for orders data.

    • Contact - is assigned to the company as a contact person.

    • Buyer - can make their purchases up to the account limit defined for the legal entity; purchases above the limit have to be approved by the Admin user.

    • Requester - all their purchases have to be approved - the purchases up to the account limit have to be approved by the Buyer or Admin users; the purchases exceeding the account limit have to be approved by the Admin users.

    You cannot modify the predefined customer groups. Only adding/removing members to the predefined groups is possible. In case you need different permissions, create a new customer group with the relevant settings.

    When you create a new customer in MD or on the storefront, and assign them to the company, the person is automatically assigned to the Contact group.

    The Admin customer group users can manage other users associated with the same organization directly from the storefront, ensuring the right members of their organization have the right permissions.

    Management Dashboard allows you to create and manage customer groups to respond to your and your customers needs more adequately. You can view the groups that are assigned to each company on the company level. Navigate to the Customer Management -> Company, and view the Customer groups tab.

    As customer groups are legal-entity-aware, the information relevant to the company (legal entity) can be read by the customer group.

    Creating a customer group and managing access permissions

    1

    Choose to create group

    In the Management Dashboard, go to the Customer Management -> Groups and choose Create new group.

    2

    Customer assignment rules

    The Emporix platform enforces rules when assigning customers to predefined groups to ensure role assignments remain valid and avoid conflicts. Within a single company, a user can belong to only one predefined group. Validation applies within the scope of a single company (legal entity) only. It does not extend across different companies or any subsidiaries.

    For example:

    • If a customer is already assigned to one predefined group (for example, Emporix Admin Group), then it's not possible to assign that same customer to another predefined group within the same company.

    • If a customer is assigned to an Admin group in one company (for example, Company A), then the same customer may also be assigned to an Admin group in another company (for example, Company B).

    • If a customer is assigned to an Admin group in a parent company (for example, Company A), then that same customer may also be assigned to another role such as Buyer in the parent company’s subsidiary.

    The exception is the Contact group, which can always be assigned.

    Company Contact Propagation

    As a part of the group assignment you can decide how the contact assignments are shared within a company hierarchy. You can choose from the following options:

    • UPWARD: Contacts assigned to a subsidiary are also visible at the parent company level. This is a default setting.

    • DOWNWARD: Contacts assigned to a parent company are also visible in all subsidiaries.

    • DISABLED: Contacts remain only in the company where they were assigned, with no propagation.

    Propagation happens only at the moment of assignment - creating the contact in the selected company also creates corresponding contacts in related companies according to the chosen direction.

    To choose the behaviour, choose the right companyContactPropagation setting in the .

    This setting ensures flexibility in how contacts are managed across parent companies and their subsidiaries.

    To see the example use case of a customer group, see the .

    Measurement Units

    CE provides built-in unit management and conversion mechanism.

    The Unit Handling Service provides built-in unit management and conversion capabilities for the Emporix Commerce Engine. The unit management concept allows you to create and manage measurement units, as well as convert units of the same unit type (such as mass or volume).

    • Looking for object descriptions and code tutorials? Check out the .

    Products

    The Product Service empowers you to efficiently manage rich, customizable product data, such as templates, bundles, variants, and media.

    Here you can find an overview of the Emporix Product Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Tax Classes

    Depending on the countries where your business operates, you need to configure relevant tax classes.

    Here you can find an overview of the Emporix API Tax Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Quotes

    The Quote Service enables you to offer personalized pricing for both B2B and B2C customers through automated quote management.

    Here you can find an overview of the Emporix Quote Management Service, along with its features and benefits.

    • Looking for Management Dashboard documentation? Check out the .

    • Looking for code tutorials? Check out the

    Approvals

    In B2B segment, having an appropriate approval process in place is crucial.

    Here you can find an overview of the Emporix Approval Service, along with its features and benefits. The approval process is relevant only for the B2B customers.

    • Looking for Management Dashboard guides? Check out the and guides.

    • Looking for related API documentation? Check out the

    {
      "key": "enableExternalPrices",
      "value": true,
      "version": 1,
      "secured": false
    }
    {
        "itemYrn": "urn:yaas:saasag:caasproduct:product:mytenant;1600A016BF",
        "itemType": "EXTERNAL",
        "price": {
            "effectiveAmount": 2.0,
            "originalAmount": 2.0,
            "currency": "EUR"
        },
        "tax": {
            "name": "STANDARD",
            "rate": 10,
            "grossValue": 2.0,
            "netValue": 1.82
        },
        "quantity": 1
    }
    {
      "itemType" : "EXTERNAL",
      "product": {
        "id": "myTestId",
        "name": "myExternalProduct",
        "description": "testExternalProduct",
        "sku": "sku",
        "images": [
                    {
                       "id": "imageid",
                       "url": "imageURL"
                    }
        ]
      },
      "price": {
        "effectiveAmount": 2.00,
        "originalAmount": 2.00,
        "currency": "EUR"
      },
      "tax": {
        "name": "STANDARD",
        "rate": 10,
        "grossValue": 2.00,
        "netValue": 1.82
      },
      "quantity": 1
    }
    {
        "itemYrn": "urn:yaas:saasag:caasproduct:product:mytenant;1600A016BF",
        "itemType": "EXTERNAL",
        "price": {
            "effectiveAmount": 0.0,
            "originalAmount": 0.0,
            "currency": "EUR"
        },
        "tax": {
            "name": "STANDARD",
            "rate": 10,
            "grossValue": 0.0,
            "netValue": 0.0
        },
        "quantity": 1
    }
    {
        "itemYrn": "urn:yaas:saasag:caasproduct:product:mytenant;1600A016BF",
        "externalFees": [
            {
                "name": {
                    "en": "Freight Fee"
                },
                "feeType": "ABSOLUTE",
                "feeAbsolute": {
                    "amount": 5.00,
                    "currency": "EUR"
                }
            }
        ]
    }
    
    <button className="w-full h-12 social-login-btn"
        onClick={() => {window.location.href=`${AUTH0_DOMAIN}/authorize?response_type=code&scope=profile email openid offline_access&client_id=${AUTH0_CLIENT_ID}&redirect_uri=${REDIRECT_URI}`}}
    >
      <img src="https://cdn.auth0.com/styleguide/components/1.0.8/media/logos/img/badge.png" width="32"/>
      <span className='social-login-btn-label'>Social Login</span> 
    </button>
    
    curl --location --request POST 'https://api.emporix.io/customer/${TENANT}/socialLogin?code=${CODE}&anonymous_token=${ANONYMOUS_TOKEN}' \
    --header 'Authorization: Bearer ${ANONYMOUS_TOKEN}'
    {
        "social_access_token": "eyJ23GciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiaXNzIjoiaHR0cH23Ly9kZXYtNjRwN2E3M2xjMHhveDVjMi51cy5hdXDoMC5jb20vIn0..AsJCnRiPn3V9GUMh.y8MQhJCZwzOnYla39L3szXOmi8MzCk6RUU_sN_GKxBqQxxtGKfoKarmiWCdZ7WlPddnfeiBcusFl69pN6mChiGv-xSej1xVK-CNrv8Lh7GL-qMgkblWcVyHSfexef8EEDFWse_17D7PkuGH1noLfVnlZsAZ2eIbWZCWL6PnyDmUegB-DEGTYxaRSu6602x8x55kRZCDqVZvg-pivv9lqb-Qrwcpb0YZrnuSKwGr6wGOQowFhJ95VmwOse5tfhoGmswuKVp_672GEMy21KiSDmkvUDItDAawASEFVcr40YQ3kYlxSjBwmQbBL0ZMXf_w4xbfzgdZXabMuItVfoGqL5lAgEq6DLEHlTTazY0GPYRV-sqxced8.buqIsoB5IfkCVik_kJunRQ",
        "social_id_token": "eyJhbGci1iJSUzI1NiIsonZ5cCI6IkpXVCIsImtpZCI6ImY3cFZsUjl0WHBUZC1IS2QtemNnayJ9.eyJnaXZlbl9uYx1lIjoiTHVrYXN6ICIsImZhbWlseV9uYW1lIjoiU3R5cGthIiwibmlja25hbWUiOiJsLnN0eXBrYSIsIm5hbWUiOiJMdWthc3ogU3R5cGthIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0lFYmFBZGFPY19TOUk2V2FPRVZDVF9wSkEzRzNCQ1N1Ylh3OUt3TV9UbT1zOTYtYyIsImxvY2FsZSI6ImVuLUdCIiwidXBkYXRlZF9hdCI6IjIwMjMtMTEtMThUMjA6MDI6NDEuMTc1WiIsImVtYWlsIjoibC5zdHlwa2FAZW1wb3JpeC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6Ly9kZXYtNjRwN2E3M2xjMHhveDVjMi51cy5hdXRoMC5jb20vIiwiYXVkIjoib3diWkhObVdkcG1aOWJPcldIQjVBRndpa083UVByQWciLCJpYXQiOjE3MDAzMzc3NzgsImV4cCI6MTcwMDM3Mzc3OCwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMDQ3NDE0Mjc0MDUwNDQ1NTg2NjIiLCJzaWQiOiJydGlKM003OVpRYks0ajdZQVU0WjdoNVc5TnFMdDFlNSJ9.OsV4_Gcx7o28b65f0ryq1dTd-_BnhfZflVpIK_1Hbto-tO1ggIoDUPW1il0GCQEsINZUovM637zIdoGdO7-hZdFAyXi7YTCkeHFpsjbbRaAA-BMJY9OJuVI1frNJX91d01BJju4uW6zPlEkso9WPYW-zNEn-dDYdw_O3S1K7GV_Rx4Z8XX0tBvNcyNPmeC3cgWc5yzdAPmgBC_hjGqnH84QYCDsvg0djxwd0mFZj4JDVxRzIgvNajt3dI7UksH0EuJtcPDOyZrQ3csxDUAZfvD3SgGxsh6XwDdfX5j7uhhpyzeKT9_FYyFSyl3nyncMxuFfLKT75U3gQUYD3wwSOZg",
        "refresh_token": "1uKxU23p9wY9kIMsc16OMnA1qjjYvqgL",
        "refresh_token_expires_in": "86399",
        "session_idle_time": 120,
        "token_type": "Bearer",
        "access_token": "wmU2vzAR2B8drfBc9HrXobpcc1bF",
        "saas_token": "eyJ0eABaOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI45TEyMDk3NyIsImV4cCI6MTcwMDM1MjE3OCwiaWF0IjoxNzAwMzM3Nzc4LCJqdGkiOiI4ODcyYWQ5OC0yZWNlLTQ1YmItOTcyZS0xZGVkZjAwM2UyZTgifQ.TzzNTfPjaunqWBCkvMpExM8sqcJqooTfxvXoFfYRgbo",
        "expires_in": 14399,
        "scope": "tenant=emporix"
    }
    Catalogs
    Products
    Pricing
    Settings
    Extensions
    Administration
    Use Azure portal to create a Service Bus namespace and a queue
    Create your first function in the Azure portal
    Develop Azure Functions locally using Core Tools
    HTTP Webhook Strategy - HMAC Configuration
    func new --template "Http Trigger" --name MyHttpTrigger2
    "@azure/service-bus": "^7.0.0"
    const { app } = require('@azure/functions');
    const { ServiceBusClient } = require("@azure/service-bus");
    const crypto = require('crypto');
    
    const connectionString = "FILL_IT" // i
    const queueName = "webhook"; // ii
    
    const secretKey = 'password123'; // iii
    
    app.http('MyHttpTrigger2', {
        methods: ['GET', 'POST'],
        authLevel: 'anonymous',
        handler: async (req, context) => {
    
            const serviceBusClient = new ServiceBusClient(connectionString);
            const sender = serviceBusClient.createSender(queueName);
        
            const body = JSON.stringify(req.body);
            context.log(body);
            const hmac = crypto.createHmac('sha256', secretKey);
            hmac.update(body);
        
            const computedHmac = hmac.digest('base64');
        
            
            if (computedHmac !== req.headers['emporix-event-signature']) {
                context.res = {
                    status: 401,
                    body: "HMAC validation didn't pass.",
                };
            }
        
            try {
                const messageBody = req.body;
                const message = {
                    body: messageBody,
                };
        
                await sender.sendMessages(message); // iv
                context.log("Message successfully sent");
                context.res = {
                    status: 200,
                    body: "Message sent to the queue",
                };
            } finally {
                await sender.close();
                await serviceBusClient.close();
            }
        }
    });
    func azure functionapp publish <APP_NAME>
    curl -L 'https://api.emporix.io/webhook/{{tenant}}/config' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '{
        "code": "http",
        "active": true,
        "provider": "HTTP",
        "configuration": {
            "secretKey": "password123",
            "destinationUrl": "{{destinationUrl}}"
        }
    }'
    curl -L -X PATCH 'https://api.emporix.io/webhook/{{tenant}}/event-subscriptions' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '[
      {
        "eventType": "product.created",
        "action": "SUBSCRIBE",
        "fieldsToSubscribe": [
          "name"
        ],
        "fieldsToUnsubscribe": [
          "description"
        ]
      }
    ]
     '
    curl -L 'https://api.emporix.io/product/{{tenant}}/products/' \
    -H 'Content-Language: en' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer {{token}}' \
    -d '{
        "name": "Test product for documentation",
        "code": "unique",
        "description": "product description",
        "published": false
    }'
    Allowed Web Origins - https://storefront.emporix.io/auth0
  • Easy migration from a free trial to a paid plan (your data remains in the system).

  • When your free trial ends, the sales team will contact you to hear about your experience with our products.

    LinkedIn

  • Microsoft

  • Note that the alert feature works for email and password logins, while for social logins through external platforms, it has to be configured separately by the provider.

    Categories

    • ProductRoot — top-level container for all product categories

    • Two sample product categories

    Global (tenant-wide) configurations

    • Country, currency, and language configuration

    • Email settings

    • Measurement units' conversion factors

    • Order statuses

    • Product availability information

    • Product packaging options

    • Product tax classes

    • Storefront URLs

    Measurement units

    Set of most commonly used measurement units.

    Site settings

    Main site with a set of basic settings, such as:

    • Default and supported languages

    • Delivery timeframes

    • Supported countries

    • Payment methods

    • Product packaging options

    • Regular expressions for customers' account information

    • Restrictions on order placements

    • Storefront image sizes

    Emporix Management Dashboard
    Emporix Developer Portal
    Single Sign-On
    API Keys section of the Developer Portal
    Search Configuration
    Indexing Service
    Support Team
    Support Team
    Getting started with Emporix API

    Merge two non-empty carts that use different currencies.

    Anonymous and customer carts

    The Emporix e-commerce system distinguishes two types of carts:

    • Anonymous carts for customers who are browsing the store without logging in.

    • Customer carts for logged-in customers.

    Cart merging

    You can merge a customer's anonymous cart with their customer cart to preserve the shopping flow.

    ℹ️ See: Cart merging.

    Inactivity time

    If a cart is inactive for over 30 consecutive days, it is automatically deleted from the database.

    Statuses

    A cart can either be active (OPEN) or inactive (CLOSED). A cart's status is automatically set to CLOSED in the following cases:

    • The cart belonged to an anonymous customer, and it was merged with a logged-in customer's cart.

    • The cart went through the checkout process.

    ⚠️ You can only perform operations on OPEN carts.

    Both carts contain the same items.

    The quantities of the items are added together.

    The same item is added to both carts, but one is added as an itemYrn and one as a Product object.

    The item is treated as two separate entries. The quantities of the item are not added together.

    The carts use different currencies. Both carts are empty.

    The currency of the customer cart is preserved.

    The anonymous cart includes items that are out of stock.

    The items are preserved.

    ⚠️ If a customer proceeds to checkout, an error message appears, prompting the customer to remove said items from their cart.

    The carts use different custom attributes.

    The custom attributes are consolidated.

    The carts use the same custom attributes, but their values are different.

    The anonymous cart's custom attribute values are preserved.

    To learn how to add a new user, see the Adding new team members Storyblok documentation.
    2

    Contact Emporix about the integration

    Inform the Emporix Support Team that [email protected] has been added as a user to your Storyblok account.

    Once notified, the Emporix team completes the installation steps on their side. After the installation is finished, the Emporix Support Team will notify you about the completion.

    When contacting the Emporix Support Team, also provide the name and region of your Storyblok Space. This is needed for the installation process.

    3

    Remove the Emporix user

    When the previous steps are done, you can remove [email protected] from your Storyblok account. Then, continue with the next steps to configure the field plugin.

    baseUrl - Emporix API base URL, the default is https://api.emporix.io
    Define values in the field configuration

    Enter the tenant, clientID, clientSecret and baseUrl values as Options in the Settings section.

    3

    Add the items

    When the values are defined, use the Add items in the Preview block within the field plugin UI editor and select the products or categories that you want to have displayed. When you select the products for your story, they are later visible in the preview list:

    4

    Save the story

    After you save the story, you can review it and check if everything is displayed correctly.

    Manage API Keys
    Provide customer's details

    Fill in the details related to the new customer, such as: name, contact details, preferred site, or a currency that the customer uses.

    Preferred Currency and Contact Email are mandatory for a customer creation. You can decide to edit other details later. You can also set up a custom customer ID in the Id field. Otherwise, a unique ID is automatically generated when the customer is created.

    3

    Create initial password

    Create an initial password for the customer for the first login. You can define it manually or use autogenerate option.

    4

    Choose Save to create the customer

    Save the details to create a customer in the system. As a result, the ID and the customer number are created, and the creation date is added. You can also see a new section related to marketing details, it includes data about coupons and deliveries.

    5

    Set activation

    Mark if the customer is on hold and if it's an active customer.

    • On hold - place the customer on hold whenever it's needed, for example when you want to perform any checks related to the customer

    • Active - choose if the customer is active or inactive

    The default behavior for customer activation is set in Settings -> System Preferences. The system administrators can set customerOnHoldOnCreation or customerActiveOnCreation accordingly. For more information, see .

    Depending on the activation settings, different actions follow the customer creation operation.

    If you create a customer account with an initial password and active = true and onHold = false settings, after the customer is created in the system, they receive an email with the password.

    If you create a customer account with an initial password and the active = false and onHold = true

    6

    Provide customer's address

    In the Addresses tab, you can provide the details of the customer's addresses with information about contact details and company names related to the customer. You can provide multiple addresses for the same customer and mark which one should be used as default. Similarly to the customer creation, you can also set up a custom address ID in the Id field. Otherwise, a unique ID is automatically generated when the address is added.

    It is possible to create a customer from a company contact. If you want to grant storefront access to an existing company contact person, see .

    7

    Assign a company

    For B2B scenarios, to assign a customer to a company, go to Customer Management -> Companies and select the specific company. Go to the Contacts tab and choose Assign customer option. Choose the customer from the list.

    For more information, see .

    To check how to configure Assisted Buying, go to the Sites guide.

    Displaying mixins in entity list view
    Provide group details

    In the Details tab, provide the basic information about the group, such as its id, name, and description.

    3

    Assign company

    Select the company you are creating the group for.

    4

    Set permissions

    In the Customer Settings section, set the access level to the particular entities. Decide which objects the group could view or manage, and choose Save to create the group in the system.

    5

    Assign group members

    Go to the Members tab to assign customers to the group. Choose Add members and select the relevant people. The group members get access to the specified entities with the specified scopes.

    System Preferences
    Company Related Orders and Customer Groups
    Looking for API reference? Check out the
    in the Emporix API Reference.

    Purpose

    To reduce data redundancy, units are stored independently from the price model. With our unit management solution, it is possible to manage all measurement units through a separate service. The conversion of units is a very intuitive process, where a factor serves as a universal measure of values. The factors are always the same for the values, so their maintenance in the system does not require any additional actions on a daily basis.

    Features

    Unit management comes with a set of features that make managing measurement units easier.

    Feature
    Description

    Customizable unit model

    Create custom measurement units depending on your business needs. Supports metric, imperial, US customary (USC), and custom unit systems.

    Default setup of common units

    Most common measurement units are pre-configured out of the box. See the section for the complete list.

    Localization of unit names

    Unit names can be translated into different languages using language-code maps, enabling you to target global markets. Unit symbols and names are retrieved based on the Accept-Language header.

    Unit conversion

    Convert between units that share the same base unit type using conversion factors. Conversion factors are calculated automatically based on the relationship to the base unit.

    Unit validation

    Validate unit codes before using them in price models or cart items to ensure data consistency and prevent errors.

    Unit search and filtering

    Search for specific units and filter them with additional criteria, supporting sorting and paging for efficient unit management.

    Units need to be convertible by a factor — you can convert units of the same type only. Currently, it is not possible to convert units through shift (for example, Celsius to Fahrenheit).

    Default unit setup

    The Emporix Commerce Engine automatically configures a set of most commonly used measurement units. The units can be organized by type, for example:

    Volume:

    • Centiliter (cl)

    • Cubic centimeter (cm³)

    • Cubic decimeter (dm³)

    • Liter (l)

    • Milliliter (ml)

    • US fluid ounce (us-fl-oz)

    Length:

    • Centimeter (cm)

    • Kilometer (km)

    • Meter (m)

    • Millimeter (mm)

    Quantity:

    • Dozen

    • Piece (pc)

    Mass:

    • Gram (g)

    • Kilogram (kg)

    • Milligram (mg)

    • Tonne (t)

    These default units are immediately available for use in Product Service, Price Service, and Cart Service. You can create additional custom units as needed for your business requirements.

    Features and benefits for B2B commerce

    The Unit Handling Service provides significant benefits for B2B commerce operations:

    Clear unit definitions and standardization

    • Clearly define allowed units and their codes to avoid mistakes or ambiguity across your organization

    • Establish clear-cut rules and definitions of unit types, ensuring consistency in product data, pricing, and orders

    • Reduce errors from unit code mismatches or inconsistent naming conventions

    Automatic unit conversion

    • Convert units automatically when prices or quantities need to be displayed in different units

    • Price matching automatically handles unit conversions when requested units differ from price model units

    • Cart calculations seamlessly convert unit prices to match item requirements

    Flexible product sales

    • Enable flexible product sales by defined units rather than by piece only

    • Support diverse B2B scenarios, such as:

      • 50 meters of steel tubing

      • 250 liters of lubricant

      • 250 grams of fresh-cut cheese

      • Bulk quantities with precise measurement requirements

    Intuitive conversion process

    • Conversion factors serve as universal measures of values, ensuring consistent calculations

    • Factors are always the same for the same unit relationships, requiring minimal maintenance

    • Conversion calculations are performed automatically by the service, reducing manual errors

    Global market support

    • Localized unit names and symbols support multi-language and multi-region operations

    • Display units in the language preferred by your customers

    • Support different measurement systems (metric, imperial, US customary) in a single tenant

    Service integration

    • Centralized unit management ensures consistency across Product Service, Price Service, and Cart Service

    • Changes to units propagate automatically across all services within ~5 minutes

    • Validation prevents invalid unit codes from being used in price models or cart items

    Purpose

    As part of our Catalog solution, Emporix provides you with a scalable product service that allows you to create and manage a vast collection of products along with rich product information and descriptive attributes. We want to ensure that you can offer the products on your website in the most efficient way and that you provide the best customer experience.

    Features

    The Emporix API product service introduces a set of features that make product management easier:

    Feature
    Description

    Bulk product creation

    With Emporix API, it is possible to create multiple products at once.

    Customizable product configuration with product templates

    You can create product templates that contain predefined schemas to specify additional attributes on top of the product features available by default. For more information, see .

    Customizable product ID

    You can add custom ID for each product you create. For details, see documentation.

    Product bundles

    You can decide to sell products together as bundles. For example, a washing machine with washing machine tablets. A product bundle can have its own price, description, and images. For more information, see the section.

    Parent products and product variants

    Products of the same type can be sold in different variants. For example, they can differ in color, size, or fabric. Check out the section.

    Media files

    You can attach media files, such as images, video, and documents, to provide a rich product and catalog experience for your customers.

    Overview

    When you want to create a product, first you need to ensure that the available product attributes will be sufficient to properly represent the product's characteristics. The following sections describe the basic product features and how you can further customize your products in the Emporix e-commerce system.

    Basic product

    Basic product is the most basic product template that contains the following information:

    • Product name

    • Product description

    • URL of the graphical representation of the product, such as an image or a video

    Product templates

    If the above fields are not enough to properly describe a product, you can add your own attributes by creating product templates.

    For example, a template for a T-shirt can contain the following additional parameters:

    • Size

    • Color

    By default, product templates contain the basic product template fields as well.

    For example:

    A basic product that we applied a T-shirt template to contains the following fields:

    • Size

    • Color

    • Name

    • Description

    • Image URL

    • Product ID

    Product ID is automatically generated when a product is created.

    A basic product with a product template applied can itself constitute a product template that can be applied to other products. For example, a T-shirt product can be used as a template for a long-sleeved top and a sweatshirt.

    If you want to create several instances of the same product that differ only in color, size, or any other specifications, you can create product variants.

    Parent products and product variants

    To create a parent product, you need to perform the following steps:

    • Create or update an existing basic product.

    • Apply a template to the product.

    • Mark the product as parent.

    Every parent product can have different variants, which are by default created upon the parent product's creation and/or update. The variants contain the same fields as the parent product, but the contents are different. The parent product's price is automatically inherited, if not specified otherwise. Each of the variants is automatically assigned with a Variant ID.

    It is also possible to create product variants separately by overriding the default variant creation mechanism.

    Product bundles

    Product bundles serve as containers of two or more products that already exist in the system, allowing customers to buy those products together at a more attractive price. These bundles can have special descriptions, prices, and images.

    For example, you can advertise a product bundle that contains a printer, toner, and a ream of paper. The products are sold separately as well, but when bought as a bundle, they are sold at a different price, which is more attractive to the customer.

    Related products

    You can link related products together to make it easier for customers to find them.

    For example, customers want to find consumables and accessories related to the main product:

    • A power charger for a laptop

    • Ink for the chosen printer

    Media files

    With the Emporix Commerce Engine, you can add multiple images, video, and documents to enrich the shopping experience on your website. The documents that you can add may also provide a self-service capability to reduce the cost of sales by allowing your customers to access product manuals, safety data sheets, and PDF brochures at the click of a mouse.

    Purpose

    Based on where your business operates and what types of products you sell, the rates of sales tax may differ. The Emporix Tax Service provides the APIs to help your business cover diverse tax scenarios.

    Tax classes are required to set product prices. In order to define a price for an item, you need to have a tax class configured first. You have to define a tax class for each tax rate and for each country you operate in to determine correct tax calculation according to the given country's regulations. Then, when setting a price for a product, you need to select the correct tax class for a given country and apply the price for a given site. The system calculates the due tax based on the defined tax classes for the countries you sell in.

    For example, on your site you sell books worldwide. In Germany, books are taxable according to REDUCED tax class of 7% tax rate. In Ireland, the biding IE-ZERO tax class for books is with 0% tax rate. So the gross price for a book in each country is calculated according to the chosen tax classes for the product.

    Similarly, tax classes are used in calculating shipping costs or fees, so you need to define a tax class designated to the shipping and other fees your charge, for each country you deliver your goods to. In other words, you need to define the tax classes to properly manage prices, display them on the storefront and to enable proper calculations in the cart and checkout.

    Features

    The Tax Service API introduces a set of features that make tax management easier:

    Feature
    Description

    Automatic calculation of prices

    You can automatically calculate net and gross values for prices. See more in the section.

    Customizable tax configurations

    You can create your own tax configurations and adjust them to your business's needs. See more in the section.

    Overview

    Tax class modeling

    To minimize data redundancy, tax classes are defined in separate, country-specific configurations and then referenced in applicable products.

    You can manage your tax configurations through the or you can also define them directly in the Management Dashboard, in the Settings -> Tax module. Learn more in the Tax documentation.

    You can create as many tax configurations as you need. Each configuration can be described with the following attributes:

    Mandatory
    Optional

    Country code Tax class:

    • Code

    • Rate

    Tax class:

    • Description

    • Name

    • Order on the tax class list

    Based on the defined tax classes, here's the example pricing:

    Product
    Base Price
    Country
    Tax Class
    Final Price

    Book A

    EUR 20.00

    Germany (DE)

    Reduced:

    • Tax Code: REDUCED

    • Tax Rate: 7%

    EUR 21.40

    Book A

    EUR 20.00

    Ireland (IE)

    Zero:

    • Tax Code: IE-ZERO

    • Tax Rate: 0%

    EUR 20.00

    Explanation:

    • Base Price: Price of the product before tax.

    • Tax Class: A category that groups products with similar tax treatments

    • Tax Code: A unique identifier for the tax class in each country.

    • Tax Rate: Percentage of tax applied to the base price.

    • Final Price: Calculated as Base Price + (Base Price × Tax Rate).

    Decide how the product prices are displayed on your storefront. Specify whether all the product prices are shown as gross or net values by updating the given site's includesTax parameter. The true value means that the site displays gross prices, while the false value means the net prices are visible. If the includesTax parameter for a site is not defined, the system defaults to the includesTax value specified at the given price model level. Learn more in the and in the documentation.

    Automated operations

    To facilitate your custom implementations of additional B2B workflows, the Tax Service API supports conversion operations for prices. For that purpose, you can use the Tax calculation endpoint. As an input in the request, you can provide a specific price value, specify the includesTax parameter, and provide a source and target tax class. Based on these, in the response you get the calculations of gross, and net price values, tax value, or a price calculated for another country (using a different tax class). The calculations might be helpful in your custom implementations.

    Note that the Tax Service allows for calculations that are based on specific values you provide. If you want to make calculations based on the Price object, you should use the price matching mechanism of the Price Service.

    Refer to these resources for more information:

    • API guide -

    • Price matching -

    • Cart calculations -

    .
  • Looking for API reference? Check out the in the Emporix API Reference.

  • Purpose

    The Emporix API Quote Service allows you to create quotes for particular item amounts without going directly to checkout. The items grouped together in a quote can be sold at different, more attractive prices, for example when the number of items is substantially big.

    At every step of the process, customer receives notifications about the quote status changes. The notifications, containing a PDF file with the quote's details (if configured), are fully automated, which significantly speeds up the whole operation and enhances customer experience.

    Features

    Feature
    Description

    B2B and B2C business models support

    Quotes can be created by and on behalf of both B2B and B2C customers. Not only companies, but also individual customers can benefit from such an option, which increases conversion potential for you as a merchant.

    Quote request placement

    Quotes can be requested both by customers through your business' storefront, or by your employees on the Management Dashboard, on behalf of a customer.

    Full quote management

    Your customer service team can create, retrieve, update, and delete quote requests both through the Management Dashboard, or by using other applications that work with the Quote Service API. Customers can update the status of a quote they created, or request a change.

    Configurable quote ID

    You can personalize the IDs of quotes within your system.

    Time-limited quote offers

    By default, all quote requests have a lifespan of 30 days. The expiration date can be updated by your employees on the Management Dashboard or directly through our API.

    Quote history

    With our API implemented in your storefront application, you can allow your users to view a full history of previously placed quotes.

    Overview

    The following diagram presents the quote request process:

    Quotes guide
    API.

    Purpose

    An approval process is necessary for the organization to define the correct purchasing flow and budget limits. Depending on the role of the customer who creates an order, some orders are approved automatically, while others require additional confirmation from eligible users.

    The approval flow starts when a customer uses the storefront to add products to the cart. Depending on the customer rights and user group they belong to, they either need or need not an approval for the purchase.

    User groups

    To improve management of the approval process, the following roles are introduced:

    • Customer Administrator - Admin

    • Purchaser of the Customer - Buyer

    • Material Manager - Requester

    Admin

    When the customer is assigned to the Admin group, the checkout triggers in a standard way. There is no additional step to create an order.

    Buyer

    When the customer is assigned to the Buyer group, the approval service checks if the customer has permission to trigger the checkout.

    • If the cart price is within the company limit, the customer can finish the order themselves.

    • If the cart price exceeds the company limit, the customer creates the approval for the customer approver - the approvers list can be fetched from the approval service. When the approval is created, the approver can finish the checkout process and create the order.

    Requester

    The requester is a material manager. When the customer is assigned to the Requester group, the approval service checks if the customer has permission to trigger the checkout. The requester customer cannot trigger the checkout, so the approval needs to be created.

    • If the cart price exceeds the company limit, the customer can only assign a customer approver, who belongs to the Admin group.

    • If the cart price is within the company limit, the customer can only assign a customer approver, who belongs to the Admin or Buyer groups.

    The approvers list can be fetched from the approval service.

    Working with approvals

    When the approval is created in the storefront, the approving customer receives an email with a notification that the approval request was created. If any additional comments were provided by the requester, they are also sent to the approver.

    After a customer creates an approval, the following data is automatically populated:

    • Requester - the value is populated based on a customer token.

    • Approver - firstName and lastName values are populated based on the customer ID.

    • Resource - refers to an order, the value is populated based on cart data.

    • Expiry date - by default the expiry date is set to +10 days from the day when the approval was created.

    • Approval status - the status is set to PENDING by default.

    Within the existing approval, the following scenarios are possible:

    • A requester can update data from the approval: comments, details, delivery windows, statuses. The update is possible only when the approval status is PENDING.

    • A requester can change status to CLOSED.

    • An approver can change status to the APPROVED or DECLINED.

    • After expiry date, the approval status is changed automatically to EXPIRED.

    System Preferences
    Customers

    Approval groups

    Create groups of business customers' employees who can approve purchases made by other buyers in their company. For the approval process you can use the admin, buyer or requester roles. As a customer you can also create new users and assign them with specific roles.

    Approval validity

    Set expiry dates for the approval requests.

    Approval transparency

    Relevant statuses are set automatically and reflect the state of the approval requests.

    Multiple catalogs per site

    Publish a number of catalogs on a site, available at the same time.

    ✅ Product catalog and promotional seasonal catalog.

    Sorting

    Sort and rearrange the categories according to your needs. There is a convenient functionality that allows you to easily move the categories and change the order in which they are displayed.

    Site-awareness

    Customer segments are site-aware, which means that each site can have different segmentation strategies and you can cover different business needs for each one of them.

    Storefront readiness

    The storefront of your online shop can use the segments data so that you can provide a personalized experience to your customers. Segmenting customers helps refine recommendation engines, ensuring that the suggested products or services are relevant. This not only boosts sales but also enhances customer satisfaction and loyalty.

    Dedicated coupons

    Create a coupon that is valid for a specific segment to target your customers better. If a segment specifies products or categories, a coupon is valid only for these items.

    Activation on site level in Management Dashboard

    Easy activation done by adding a relevant storefront URL to site settings.

    Acting on behalf of the customer

    The feature allows an employee to log in as a customer and perform specific actions on a storefront, for example: creating an order, returns or quotes.

    Assisted Buying in Sites

    Saferpay

    See example of integrating Saferpay.

    Introduction

    Saferpay can be used if you want to have a solution that supports the post-checkout payments. It allows the users to pay after they submit the order, within the next 30 minutes.

    It's not possible to use Saferpay for the payments done before the checkout is completed.

    The diagram shows how Saferpay sequence looks like when it's integrated with Emporix:

    Gateway configuration

    1. To create the Spreedly receiver, execute the following request:

    Result:

    Save the token, it's needed for the payment mode configuration. Use this token as the {SPREEDLY_RECEIVER_ID} variable.

    1. Create the new payment mode, execute the following request:

    • SPREEDLY_ENVIRONMENT_KEY - Spreedly environment key that you got from Emporix support team.

    • SPREEDLY_ACCESS_SECRET - Spreedly secret key that you got from Emporix support team.

    • SPREEDLY_RECEIVER_ID - The token from the receiver creation request.

    • SAFERPAY_BASIC_AUTH - The base64 of a user:password of Saferpay JSON API Basic Authentication. You can create new credentials on the Saferpay page.

    Storefront implementation

    Saferpay is available only for the post-checkout approach, after the actual order is done.

    Make sure that you have Spreedly scripts included in your index.html:

    • <script src="https://core.spreedly.com/iframe/express-3.min.js" id="express-script"></script>

    • <link id="spreedly-express-css-file" rel="stylesheet" type="text/css" href="https://core.spreedly.com/stylesheets/express-3.0.0.min.css">

    You can find the examples in the repository.

    1. In the html part, create two buttons needed for the Saferpay:

    • A button that opens Spreedly Express modal:

    • A button that triggers the payment process:

    1. In the same html, add also the JS part:

    Result: With this configuration, the user sees a button to provide their credit card data.

    1. When a user completes the data, Spreedly sends a token via the onPaymentMethod js callback.

    2. Having this token, it's possible to display a button where the user can trigger the payment initialization, where ${initializePayment()} is resolved to /payment-gateway/${getTenant()}/payment/frontend/initialize. As a response you get an object that contains the externalPaymentRedirectURL property.

    3. You have to redirect the user to the URL. The user has to do the 3DS2 flow right on the Saferpay page.

    An example of the redirect page:

    1. When the user is redirected to callback page, you should read query parameters related to the orderId and paymentModeId.

    2. Having the two parameters, you can invoke the authorize method, where ${authorizePayment()} is resolved to /payment-gateway/${getTenant()}/payment/frontend/authorize.

    Result:

    • If the 3DS2 finishes with success, then the authorization response is successful: true.

    • If the 3DS2 doesn't finish with success, the authorization response is successful: false.

    PayPal

    See example of integrating Paypal.

    Introduction

    The integration with PayPal supports both in-checkout and post-checkout payment approaches. To learn about the details, see the PayPal Commerce Platform Gateway Guide documentation.

    In-checkout flow

    Payment done during the checkout requires an https://api.emporix.io/checkout/{TENANT}/checkouts/orders POST request, with the paymentMethods field including the following information:

    • provider - Should always be set to payment-gateway.

    • method - Reflects one of the payment mode codes, depending on the method that you want to choose. You can see the list of available modes after sending the GET request: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend.

    • customAttributes

    With this flow, the payment authorization is done during the checkout process. The response to the checkout request contains the paymentDetails object:

    The externalPaymentRedirectURL field is populated only in case when a redirect is required. The URL is used to navigate the user in order to finish the payment process.

    When the user finishes the whole flow on the PayPal side, the Emporix payment gateway is notified about the result of the operation by a callback. It may take around one minute as this is an asynchronous operation.

    The diagram shows how PayPal sequence looks like when it's integrated with Emporix for the in-checkout flow:

    Post-checkout flow

    The post-checkout approach assumes that a customer does a checkout without pointing to any payment methods. This stage happens after the checkout, when an actual order is already created.

    Payment done after the checkout requires an https://api.emporix.io/checkout/{TENANT}/checkouts/orders POST request, with the paymentMethods field including the following information:

    • provider - Should always be set to payment-gateway.

    • customAttributes - It's a set of attributes specific for the particular payment mode.

      • customer - Identifier of the customer that does the checkout and payment.

    For this flow the payment authorization is NOT done automatically during the checkout process. Therefore, as a response of the checkout request you can receive the following response with missing paymentDetails fields:

    When an order is placed, the storefront should display all the available payment options and allow the user to choose the relevant one, in this case PayPal. Having the payment option chosen and all payment details provided, storefront should invoke the following payment-gateway endpoint: https://api.emporix.io/payment-gateway/{TENANT}/payment/frontend/authorize POST:

    • Order id - A mandatory field, it needs to be an order created by a customer that invokes the authorization endpoint. Otherwise, a validation error is returned.

    • paymentModeId - payment mode identifier - Reflect the payment mode ID that you received from GET: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend.

    • creditCardToken

    Response:

    Pay attention to the paymentDetails.externalPaymentRedirectURL value. To finish the payment, you should redirect the user to the relevant URL, payment flow on the PayPal website.

    When the user finishes the whole flow on the PayPal side, the Emporix payment gateway is notified about the result of the operation by a callback. It may take around one minute as this is an asynchronous operation.

    The diagram shows how PayPal sequence looks like when it's integrated with Emporix for the post-checkout flow:

    Gateway configuration

    1. To start with the gateway configuration, execute the following request:

    • SPREEDLY_TOKEN - Is a result of the base64 of environment_key:access_secret.

    • client_id and secret can be fetched directly from your PayPal account. For more information, see documentation.

    Result:

    Store the token value for the next steps in the configuration. If you lose the token value at any point, use the following request to get it:

    1. To configure the Emporix Payment Gateway service, execute the following request:

    • EMPORIX_AUTH_TOKEN - The standard access token. To check how to get the token see documentation.

    • SPREEDLY_GATEWAY_KEY - Spreedly gateway token that was returned when you configured the payment gateway on the Spreedly side.

    • SPREEDLY_ENVIRONMENT_KEY - Spreedly environment key that you got from the Emporix support team.

    • SPREEDLY_ACCESS_SECRET - Spreedly secret key that you got from the Emporix support team.

    Storefront implementation

    To use Paypal payment, you have to generate a token in Spreedly. You can do this in two ways:

    • Display a button that does the form submission - as described in .

    • Execute the following (an example in react):

    The payment information is stored because it's needed during the checkout call. The payment object during the checkout request should look like:

    Result:

    Sites

    Sites correspond to your online shops or warehouses with location-specific settings, such as currencies, taxes, and delivery options.

    In the Emporix e-commerce system, a site represents a specific shop, warehouse, or another independent facility.

    You can create multiple sites depending on your business needs, such as in the following scenarios:

    • You own stores in multiple locations, where each store handles a different delivery area.

    • You own stores in multiple locations, where taxes vary between each location.

    • You own stores in multiple locations, where delivery options vary between each location.

    You can manage your sites through the Emporix API Site Settings Service.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Properties

    By default, each site is described by the following properties:

    • Currency

    • Default language

    • Home base from which products are shipped

    • Flag indicating whether the site is active

    Custom attributes

    You can use to configure custom site attributes.

    See: .

    Predefined mixins available in the Emporix e-commerce system are described in the table below.

    Mixin name
    Purpose

    Site-specific resources

    Resources are configured either globally or on the site level. The following resources need to indicate a site that they apply to:

    • Carts

    • Delivery-related information:

      • Groups

      • Fees

    Coupons

    Enhance customers loyalty by offering coupons.

    The coupon management functionality allows you to create and manage coupons with discounts.

    • Looking for object descriptions and code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    Purpose

    Emporix offers you the possibility to create coupons every time you want to provide your existing or potential customers with discounts.

    Features

    Our coupon management solution is a customizable model of coupon creation and configuration. The features are described in the table below.

    Feature
    Description

    Features and benefits for B2B commerce

    Coupons for discounts are very attractive to customers who want to save money. By offering discount codes, you can win clients from outside of your usual pool of customers. What's more, your business becomes more popular and is visible online, thus generating more revenue in the long run. With time, you can create a large base of loyal customers thanks to your competitive offering.

    Coupon types

    You can offer discounts both in a form of coupon codes and discounted product prices displayed directly on your business's website.

    Looking for sale price configuration? Check out the .

    With the Emporix API Coupon Service, you can easily create and manage coupons that can later be offered in the form of codes. The following discounts are available:

    • Free shipping.

    • Fixed amount discount on the order total (for example, a $10 discount).

    • Percentage discount on the order total (for example, a 10% discount).

    • Fixed amount/percentage discount for a specific product category. You can decide which product categories are on sale at a given time. Subcategories of products or other categories can be excluded.

    You cannot add category restrictions to the coupons that are applicable to specific customer segments.

    All coupons can be set to work only above a certain minimum order amount. Coupons may be distributed through emails or newsletters in a form of text code that can be applied to a customer's cart at checkout.

    Referral coupons

    The Emporix e-commerce system makes it possible to set up a referral coupon program for your business's customers. Referral coupons provide a fixed discount that can be applied at checkout.

    • Looking for object descriptions and code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    When a customer's referral coupon is redeemed, they receive a referrer coupon as a reward. Referrer coupons provide the same discount as referral coupons.

    The referral coupon functionality covers the following scenario:

    1. Customer A places their first order.

    2. Once the order is paid, a referral code is generated and sent to customer A through e-mail.

    3. Customer A gives their referral code to customer B.

    4. Customer B places their first order and uses customer A's referral code.

    Once referral coupons are configured, the Emporix API Coupon Service periodically checks placed orders and redeemed coupons and performs the following actions:

    • Sends out referral codes to customers who have placed their first orders but haven't received their referral codes yet.

    • Sends out referrer codes to customers whose referral codes have been redeemed.

    The Coupon Service generates referral codes automatically based on your referral coupon settings.

    Pricing (Legacy)

    Create the pricing models in Emporix (legacy).

    As of April 2022, this concept has been marked as legacy.

    To learn about the current pricing concept, check out the .

    In the Emporix e-commerce system, prices apply to products sold on your storefront.

    Tax classes (Legacy)

    Depending on the countries where your business operates, you need to configure relevant tax classes.

    As of April 2022, this concept has been marked as legacy.

    To learn about the current tax classes concept, check out the .

    Companies

    Manage your customers companies details.

    The Companies dashboard allows you to manage information related to your customers' companies. Within this dashboard, you can handle data about the company locations, policies, contacts, or a customer group. You can filter the list by a company name or company type.

    You can also change the default view by using the options available under the orchestration icon.

    With the table orchestration, you can add custom columns to the list view, by adding mixin fields as columns. If you have already defined mixin schema for the entity, you'd be able to select the defined mixin fields to display them in the main view.

    curl --location --request POST 'https://api.emporix.io/customer/{TENANT}/login' \
    --header 'Authorization: Bearer 4eqtOqb8TUhWPz65m3sRa9PY4UWG' \
    --header 'Content-Type: application/json' \
    --data-raw '{
      "email": "",
      "password": ""
    }'
    {
        "accessToken": "wOxp8G6vLiz3S2QYJMzRglFRRprI",
        "saasToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwNjI0ODM3NiIsImV4cCI6MTY5Nzk1NjcyOX0.HYksa0G9LUXEfRx6DvFsugtcuv2FvC7QDbSQ51Aqr50",
        "expiresIn": 2591999,
        "refreshToken": "VmjmyVumjt5AD1WfN7nAp5kmfzcJAcgS",
        "refreshTokenExpiresIn": 86399
    }
    https://storefront.emporix.io?tenant=MyTenant&clientId=StorefrontApiKey
     https://storefront.emporix.io?tenant=MyTenant&clientId=StorefrontApiKey&customerToken=wOxp8G6vLiz3S2QYJMzRglFRRprI&customerTokenExpiresIn=2591999&saasToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwNjI0ODM3NiIsImV4cCI6MTY5Nzk1NjcyOX0.HYksa0G9LUXEfRx6DvFsugtcuv2FvC7QDbSQ51Aqr50
    settings, after the customer is created in the system. After that, the customer receives an email with the initial password and the information that the account is being prepared. The customer can't log in yet until the account status is changed to fully active. Bear in mind that if you allow customer registration through your storefront, you need the storefront to notify the customer that the account is created but not yet fully approved.

    Once you activate the customer's account (by setting active = true and onHold = false), the customer receives another email with information that the account is now active and they are able to log in using the password from the initial email.

    The latter scenario mostly responds to B2B use cases, where customer account preparation requires several steps and workflows before the account activation, for example granting some permissions, assigning to legal entities, groups etc.

    System Preferences
    Converting Contact to Customer
    Companies
  • SAFERPAY_CUSTOMER_ID - The customer ID of your Saferpay account. You can find the information on the Saferpay page.

  • SAFERPAY_TERMINAL_ID - The terminal ID of your Saferpay account.

  • SAFERPAY_TEST_ENV : expected values: true or false. Indicates whether the configuration is related to the test account or not. Based on the flag the following url is used:

    • true - https://test.saferpay.com

    • false - https://saferpay.com

  • SAFERPAY_REDIRECT_URL - The URL to which the user should be redirected after 3DS2 operation. Usually it’s the merchant's storefront. For example Emporix Demo Storefront. The following query params are automatically attached to the redirect URL:

    • orderId

    • transactionId

    • paymentModeId

  • After the operation, Saferpay redirects to the SAFERPAY_REDIRECT_URL configured in payment-mode, with additional query parameters.

  • Emporix B2B Showcase
    curl --location --request POST 'https://core.spreedly.com/v1/receivers.json' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Basic {SPREEDLY_BASIC_AUTH}' \
    --data-raw '{
            "receiver": {
              "receiver_type": "saferpay",
              "hostnames": "https://test.saferpay.com",
              "credentials": [
              ]
            }
          }'
    {
        "receiver": {
            "company_name": "SIX Payment Services",
            "receiver_type": "saferpay",
            "token": "CwFlWAMQaOfUqcsP8Gce2iyzNIU",
            "hostnames": "https://test.saferpay.com,https://www.saferpay.com",
            "sub_merchant_key": null,
            "state": "retained",
            "created_at": "2023-07-16T20:18:48Z",
            "updated_at": "2023-07-16T20:18:48Z",
            "credentials": [
    
            ],
            "ssl_certificate_token": null
        }
    }
    curl --location --request POST 'https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "saferpay",
        "active": true,
        "provider": "SPREEDLY_SAFERPAY",
        "configuration": {
            "Spreedly/EnvironmentKey": "{SPREEDLY_ENV_KEY}",
            "Spreedly/AccessSecret": "{SPREEDLY_ACCESS_SECRET}",
            "Spreedly/ReceiverId" : "{SPREEDLY_RECEIVER_ID}",
            "Saferpay/BasicAuth" : "{SAFERPAY_BASIC_AUTH}",
            "Saferpay/CustomerId" : "{SAFERPAY_CUSTOMER_ID}",
            "Saferpay/TerminalId" : "{SAFERPAY_TERMINAL_ID}",
            "Saferpay/TestEnvironment" : "{SAFERPAY_TEST_ENV}",
            "Saferpay/RedirectUrl" : "{SAFERPAY_REDIRECT_URL}"
        }
    }'
    <button className='large-primary-btn' onClick={openModal}>Enter Payment Info</button>
    <FilledButton
      onClick={executePayment}
      className="mt-4 w-auto bg-yellow text-eerieBlack">
          PAY via Saferpay
    </FilledButton>
    const [spreedlyToken, setSpreedlyToken ] = useState(null)
    
    useEffect(() => {
          window['SpreedlyExpress'].init(paymentMode.environmentKey, {
            "amount": props.grossValue + ' ' + props.currency,
            "company_name": "PowerZone",
            "sidebar_bottom_description": "Total Price",
          }, {
            "customerId": props.customerId
          });
    
          window['SpreedlyExpress'].onPaymentMethod(function(token, paymentMethod) {
            setSpreedlyToken(token)
            window['SpreedlyExpress'].unload()
          });
        }
      }, [])
    
      const openModal = (e) => {
        window['SpreedlyExpress'].openView()
      }
    
      const executePayment = async () => {
        const accessToken = localStorage.getItem(ACCESS_TOKEN)
        const headers = {
          Authorization: `Bearer ${accessToken}`
        }
        const body = {
          order : {
            id : props.orderId
          },
          paymentModeId: paymentMode.id,
          creditCardToken: spreedlyToken
        }
        const res = await api.post(`${initializePayment()}`, body, { headers })
        window.location.replace(res.data.externalPaymentRedirectURL)
      }
    {!authorizationFinished ? 
        (
          <>We're authorizing the request...</>
        ) : 
        (
          <>
            {authorizationSuccess ? (
              <>
                Authorization finished with success <br/>
                <button className="bg-primaryBlue text-[white] px-6 py-0 h-[50px] text-[14px] leading-[14px] md:w-[400px] w-full" 
                  onClick={() => {
                    navigate(`/${tenant}/my-account/my-orders`)
                  }}>
                  CHECK YOUR ORDERS
                </button>
               
               </>
              ) : (<>Authorization failed</>)} 
            </>
        ) 
    } 
    const authorize = async (orderId, paymentModeId) => {
        const accessToken = localStorage.getItem(ACCESS_TOKEN)
        const headers = {
          Authorization: `Bearer ${accessToken}`
        }
        const body = {
          order : {
            id : orderId
          },
          paymentModeId: paymentModeId
        }
        try {
          const res = await api.post(`${authorizePayment()}`, body, { headers })
          setAuthorizationFinished(true)
          setAuthorizationSuccess(res.data.successful)
        } catch(ex) {
          setAuthorizationFinished(true)
          setAuthorizationSuccess(false)
        }
      }
    
      useEffect(() => {
          const orderId = searchParams.get('orderId')
          const paymentModeId = searchParams.get('paymentModeId')
          authorize(orderId, paymentModeId)
      },[])
    - It's a set of attributes specific for the particular payment mode.
    • token - Credit card token for a tokenized approach.

    • modeId - Payment mode identifier, the ID should reflect the payment mode ID that you receive from GET: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend.

    • customer - Identifier of a customer that does the checkout and payment.

    deferred - Should be set to true.

    - The field should contain the token received by the Spreedly library.

    REDIRECT_URL - The URL to your storefront where the user is redirected when the payment is done.

  • SPREEDLY_SIGNATURE_SECRET - Spreedly signature secret that you got from the Emporix support team.

  • PayPal Gateway Credentials
    PayPal Commerce Platform Offsite Payments
    Flag indicating whether the site is your business's default site
  • Flag indicating whether prices assigned to the site are expressed as gross or net values

  • List of countries that the site ships products to

  • List of supported languages

  • Name

  • Unique site code

  • Linkable pages

    Specifies relations between pages on your storefront and in your Content Management System.

    Maps API key

    Specifies your Google Maps API key.

    Merchant address

    Specifies your business's address information.

    Merchant information

    Specifies your business's information such as company address, contact information, or financial information.

    ⚠️ You need to configure your merchant information if you want to enable direct debit payments on your site.

    Order process settings

    Defines settings related to checkouts, orders, payments, and delivery.

    ⚠️ Emporix e-commerce system supports the following payment methods:

    • Cash

    • Credit card

    • Direct debit

    Pickup settings

    Specifies addresses where customers can pick up their orders.

    Product settings

    Specifies custom packaging and cutting options for products.

    ✅ Examples of custom packaging options include paper, vacuum, or loose packaging.

    ✅ Custom cutting options are often used for grocery-related products. Examples of custom preparation options include cutting options such as slices or preparation options such as marinade.

    Template settings

    Defines conditions for templates used by your business.

    Methods

  • Time windows

  • Zones

  • Orders

  • Payment methods

  • Picklists and packlists

  • Pickup points

  • Product-related information:

    • Availabilities

    • Physical locations on sites

    • Promotions

    • Prices

    • Stock levels

    • Tax rates

  • Shipping services

  • Coupon settings

    Defines settings for regular, referral, and reward points coupons.

    Customer settings

    Defines regular expressions which validate the following customer account information:

    • Account password

    • Bank account owner's name

    • BIC

    • Email address

    • Phone number

    Debit settings

    Specifies your business's financial information needed to enable direct debit payments on your storefront.

    ℹ️ See: .

    Delivery process settings

    Defines settings related to delivery, such as expected time for a delivery vehicle to spend at one stop.

    General shop settings

    Specifies business information related to your storefront, such as the business's brand name, logo, or Facebook page.

    Image size

    Defines image resolutions for desktop, tablet, and mobile versions of your storefront.

    Once customer B's order is paid, a referrer code is generated and sent to customer A through e-mail.

    Various coupon types

    • Free shipping.

    • A fixed discount amount applied to a cart total.

    • A percentage discount applied to a cart total.

    • Category coupons applied in a form of fixed amount or percentage discount.

    ℹ️ See: .

    Coupons applicable to product categories in the cart

    You can decide which product categories are on sale at given time. Subcategories of products or other categories can be excluded. The discount code can be applied at checkout in a form of a fixed money amount, or a percentage of the original price.

    Multiple coupons applied to cart

    You can apply several different coupons to a cart. The number of coupons that can be applied all at once can be specified in the global configuration settings through API or in the System Preferences in the Management Dashboard.

    Customizable discount audiences

    You can offer discounts to all customers, logged-in customers only, specific customers by their Ids, or specified customer segments.

    Restrictions

    The minimum order value can be applied to ensure that the discount codes are applicable only above certain sum total. Coupon validity date can also be set in the restrictions section.

    Hypermedia links in coupons

    Links included in the coupons let you inform the customers of the actions they can take with the coupon.

    Price types

    Each product's price information includes two price types. They are described in the table below.

    Price type
    Description

    Presentation price

    Price presented to the customers on the storefront.

    Base price

    Price per base measurement unit (such as a kilogram or liter). It is often used by customers to compare the prices of different products.

    Examples of price setups

    Example of product
    Bananas
    Chocolate spread
    Bottled juice

    Description

    Customers can order bananas by pieces. One banana weighs approximately 180 grams. The final price of the product depends on its actual weight in kilograms.

    Customers can order chocolate spread by packaging. One packaging contains 450 grams of chocolate spread. Base price is calculated per kilogram.

    Customers can order juice by bottles. One bottle contains 500 milliliters of juice. Base price is calculated per liter.

    Original and effective amount

    0.36 EUR

    2.99 EUR

    0.99 EUR

    Measurement unit

    Piece

    Piece

    Sales promotions

    You can put products on sale and specify the date range in which the sale price applies. Discounts can be applied either as a percentage of the original price or as a fixed amount.

    See example of a Price object with the sale price configured
    See example of a Product object with the sale price configured

    Taxes

    When you configure a product, you select its tax class from classes configured for a particular site.

    Product prices are stored as gross values. Their net values are calculated when an invoice is created.

    If you want to display net prices on your storefront, you need to deduct the tax from the gross price according to the following formula:

    Net price = Gross price / (1 + (Tax rate / 100))

    Pricing guide
    Tax configuration

    Tax categories (classes) are defined globally and apply to all sites within a tenant. They are stored under the taxConfiguration key in the .

    JSON example
    {
      "key": "taxConfiguration",
      "value": {
        "taxClassOrder": [
          "FULL",
          "HALF",
          "ZERO"
        ],
        
    

    By default, the following tax categories are configured:

    • 19% (FULL)

    • 7% (HALF)

    • 0% (ZERO)

    Custom tax categories

    You can update the default tax categories' names and values according to your business's needs.

    If you intend to generate invoices through dedicated Emporix API services, you need to keep the original tax naming convention. However, you can still freely change the tax values according to the market in which your business operates.

    Updating the tax configuration does not impact already placed orders or carts with tax values overwritten for individual line items.

    Relations between tax categories and other resources

    Tax categories are closely linked to products and product prices. The influence of tax configurations on these resources is described in their respective sections.

    Products

    Tax categories can be assigned to specific products for the purposes of accounting and invoice creation. There can be only one tax category assigned to a particular product.

    A product's tax category is referenced in the taxClass field inside the productCustomAttributes mixin.

    See an example of a product with the tax category assigned

    To learn more about mixins and mixin schemas, check out the .

    Prices

    Currently, all prices in the Emporix e-commerce system are stored as gross values (regardless of the channel through which they had been configured). Net values are calculated based on products' gross prices and tax rates when you generate an invoice.

    Managing tax categories through Emporix API

    API calls presented in the tutorials require authorization with a and specific scopes. Required scopes are mentioned in each tutorial.

    To learn more about authorization in Emporix API, check out the .

    How to check what tax rates are configured for your tenant

    First, request a with the configuration.configuration_view scope.

    To retrieve your tenant's tax configuration, you need to call the endpoint.

    cURL example
    Response example

    How to change your tenant's tax categories

    First, request a with the configuration.configuration_manage scope.

    To change your tenant's tax configuration, you need to call the endpoint with updated tax categories in the request body.

    cURL example
    Response example

    How to assign a tax category to an existing product

    First, request a with the configuration.configuration_manage scope.

    To assign a tax category to an existing product, you need to call the endpoint with the tax category's name in the request body.

    cURL example
    Response example
    Tax classes guide
    See example how to do it in the Displaying mixins in entity list view documentation.

    Creating a company

    1

    Choose to add new company

    Go to Customer Management -> Companies and choose Add New Company.

    2

    Provide company details

    Add registration country, date, tax, agency and ID.

    Only the Company name is mandatory for a company creation. You can decide to edit other details later. You can also set up a custom company ID in the Id field. Otherwise, a unique ID is automatically generated when the company is created.

    3

    Save your configuration

    Choose Save to create the company. Without saving the general information first, you're not able to move to the next tabs or to add a primary contact. You can add the Primary Contact for the company straight away in the Company details tab, or later in Contacts. If you add it in the Contacts tab, it's also visible in the Company details.

    4

    Add company subsidiaries

    In the Subsidiaries tab you can add related companies with their registration countries and tax registration numbers. To create a subsidiary company, you need to go through the same creation process as for the parent company. You can also set up a custom subsidiary ID in the Id field. Otherwise, a unique ID is automatically generated when the subsidiary is created.

    5

    Add location details

    Use the Location tab to add address details of your company. When choosing a location, you can select if it's a headquarter, an office or a warehouse. You can add multiple locations for one company. As in the previous steps, you can also set up a custom location ID in the Id field. Otherwise, a unique ID is automatically generated when the location is created.

    When creating a location, you can also use tags functionality to indicate if the company address is used for shipping or billing purposes. These tags are later used on the storefront during the checkout process. The locations that are tagged as

    6

    Set up purchasing limits

    In the Policies tab, you can set up purchasing limits for the company. You can define the limit for the account and choose the currency in which the limit is provided. If an order done by a customer on a storefront exceeds the configured limit, an additional approval is required to complete the checkout.

    The approvals are done according to the roles that the users have in the company. To be able to give the approval for an order, the users have to be assigned to the Buyer group (within purchasing limits) or Admin group (exceeding purchasing limits). Using Management Dashboard, you can also create an approval group. If an approval group is created, it overrides the standard user roles settings and only the contact assigned to the approval group can accept approvals.

    7

    Assign company customers

    In the Contacts tab, you can assign customers to the company as contact persons. When adding the customers, you can choose from the list of people that are already defined as customers. For each company, you can also add a new contact that is not a customer. This contact can be anyone from the company.

    When you choose to Assign Customer, you can see which customers are already assigned to the company as contact persons.

    8

    Manage customer groups

    When you create a new company, default customer groups are automatically created and assigned to the company: Contact, Buyer, Requester, and Admin. The company-assigned groups are visible in the Customer Groups tab, and from there you can go directly to the Customer Management -> Groups node to edit the groups, amend the scopes, and add or remove customers to each group.

    Converting a contact to a customer

    During a company creation, you can define a contact person. But it might turn out that a contact person also acts as a customer, therefore would need access to your storefront. Instead of creating a new customer, you can easily convert a contact to a customer in Management Dashboard.

    The conversion option is available only for the contact type. If a contact is of customer type already, the option is not visible.

    1

    Go to contacts management

    In Customer Management -> Companies, select a company and go to the Contacts tab.

    2

    Choose the contact person

    Select the contact person that you want to convert to a customer and choose Edit icon.

    3

    Convert the contact

    Choose Convert contact to customer.

    Results:

    • You are taken to the customer view and all the details from the contact are populated to the new customer. You can edit the details if needed and save the new customer. The contact is visible on the list of customers.

    • This operation triggers automatic creation of a customer's account on the storefront. The customer receives two emails: the first one informs about the account activation; the second one contains a link to reset password. Once the customer resets their password, they are able to log in to the storefront and make a purchase as a logged in user.

    Easily configurable tax information for products using tax classes

    When you configure the correct tax classes in the Emporix API Tax Service, product prices can be retrieved as net or gross, depending on the market the product is sold in.

    Localization of product information

    You can define product names and descriptions in different languages, based on your store's language configuration.

    Product templates
    Creating a new product
    Product bundles
    Parent products and product variants

    Quote changelog

    Selected employees, if granted access, can view the full changelog of a quote in the Management Dashboard application.

    Status change and decline reasons

    Customers, when declining or changing a quote, have to choose a reason from a pre-configured list and provide any additional comments, if needed. Employees can update the list of default reasons for changing the quote status.

    Process automation

    The quote management process requires minimum amount of manual work thanks to the automation mechanisms implemented in the Quote Service: instant email notifications, easy quote-to-order conversion, and possible integration with webhooks.

    Instant notifications

    Any time a new quote is created, updated, or declined, either by a customer or by an employee, a notification email is sent to your customer. The email may contain a PDF generated for the quote (if configured). If a quote is created, updated, or declined by a customer, or when a customer requests changes, employees receive email notifications as well.

    Easy quote-to-order conversion

    Accepted quotes are easily converted to orders, which saves time and manual work.

    Webhook integration

    If integrated with webhooks, the Quote Service events can trigger actions in other systems (such as sending notifications to customers).

    Mixins

    Thanks to the mixins concept, it is possible to customize the Quote Management Service so that it is aligned with your business needs.

    Support for external pricing

    Quotes can be integrated with customer-specific prices from external systems to ensure transparency, strengthen loyalty, and support pricing for products outside of Emporix.

    Default unit setup
    Automated operations
    Tax class modeling

    Mailjet

    Learn how you can connect your Mailjet account with Emporix.

    Mailjet provides email sending services that help you stay connected with your customers. If you already use Mailjet to send company-related emails of any type, you can also use the Mailjet account in the Emporix platform. By default, Emporix provides email service that holds all email templates for communication between your store and your customers. But, it is possible to integrate your custom Mailjet account so that you keep your company theme in the emails related to commerce operations and keep your email templates in one place.

    Enabling custom Mailjet account

    To connect your Mailjet account with Emporix email service, contact the Emporix Support Team and provide the following information:

    • credentials:

      • publickey

      • secretkey

    • sender - optionally, if you'd like to send the emails from a specific email address:

      • emailAddress

      • name

    • template ID numbers - if you want to use your custom email templates, the ID numbers for each language version to be used

    The Support Team enables the Mailjet account on the Emporix side, according to your preferences.

    Languages

    It is possible to create a template for each language version you commonly use in your setup. Provide Emporix with the template IDs for each of them so that we can configure the mailing service accordingly.

    For example:

    Custom email templates

    Using your own Mailjet account allows you to create custom email templates to inform about different actions in the system, apart from the default email templates delivered by Emporix. You can prepare email templates, that are sent out upon different triggers, both internally within your company or externally to your customers. Among other triggers, the emails may concern:

    • new customer in the system

    • order confirmation

    • invoice generation

    • password reset

    You can adjust the templates according to your needs and preferences. However, if you want to include information coming directly from the Emporix system, like order ID, delivery times etc, make sure your templates use the appropriate Emporix variables to display the information properly.

    Common variables

    If you want to include some more information in your templates, that is not listed below, please contact the to help you find the appropriate variables.

    Variable
    Description

    To better understand how to construct the custom email templates, refer to the guide.

    Payment Systems

    Integrate a payment provider system to your e-commerce system.

    Introduction

    The Payment Gateway service is a B2B and B2C functionality that you can use for multiple payment methods configuration. Having the integration with Spreedly, Emporix offers a lot of flexibility and possibilities to use a variety of payment providers. Depending on the needs, payments can be configured as on-site and off-site possibilities with no data kept on the Emporix side.

    Features

    Features
    Benefits

    Prerequisites

    To start with the Payment Gateway solution, you need to have a Spreedly environment. To get the environment, contact the Emporix support team. After the team creates the environment, you should get the following details:

    • Environment key - public value, you can use it on frontend side

    • Access secret - secret value, you should never reveal it and keep it secure

    • Signing secret - secret value, you should never reveal it and keep it secure

    Using Spreedly, it's possible to configure a variety of payment gateways, in this section you can check who to work with sample gateways, inter alia, Spreedly gateway and Paypal Commerce.

    To learn more about gateways supported by Spreedly, see the documentation.

    Payment approaches

    With the payment solution, you can use two different approaches:

    • In-checkout - when the payment is done before an order is placed

    • Post-checkout - when the payment is done after the order is placed

    In-checkout

    Payment done during the checkout requires an https://api.emporix.io/checkout/{TENANT}/checkouts/orders POST request, with the paymentMethod field including the following information:

    • provider - Should always be set to payment-gateway.

    • method - Reflects one of the payment mode codes, depending on the method that you want to choose. You can see the list of available modes after sending the GET request: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend.

    • customAttributes - It's a set of attributes specific for the particular payment mode

    With this flow, the payment authorization is done during the checkout process. The response to the checkout request contains the paymentDetails object:

    The externalPaymentRedirectURL field is populated only in case when a redirect is required. The URL is used to navigate the user in order to finish the payment process.

    The diagram shows how the in-checkout flow looks like when it's integrated with Emporix:

    Post-checkout

    Payment done after the checkout requires an https://api.emporix.io/checkout/{TENANT}/checkouts/orders POST request, with the paymentMethod field including the following information:

    • provider - Should always be set to payment-gateway.

    • customAttributes - It's a set of attributes specific for the particular payment mode:

      • customer - ID of the customer who does the checkout and payment

    For this flow, the payment authorisation is NOT done automatically during the checkout process. Therefore, as a response to the checkout request, you can receive the following response without the paymentDetails information.

    When the order is placed, the storefront should display payment options and allow the users to choose the appropriate one. Having the payment option chosen and all payment details provided, storefront should invoke the https://api.emporix.io/payment-gateway/{TENANT}/payment/frontend/authorize payment-gateway endpoint:

    • Order id - A mandatory field, the ID has to be an order ID created by a customer that invokes the authorization endpoint. Otherwise a validation error is returned.

    • paymentModeId - A payment mode identifier, it should reflect the payment mode ID that you received from GET: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend

    • creditCardToken - A mandatory field when a tokenized payment method is used.

    Response from the endpoint:

    The externalPaymentRedirectURL field is populated only in case when a redirect is required. The URL is used to navigate the user in order to finish the payment process.

    The diagram shows how the post-checkout flow looks like when it's integrated with Emporix:

    Gateways configuration

    Spreedly allows for configuration of multiple payment gateways. For the full list, see the documentation. For examples of configuration possibilities with Emporix, see:

    Storefront implementation

    This is an example of how you can configure your storefront payment support for the Payment Gateway service.

    1. Execute the following request:

    • CUSTOMER_TOKEN - The customer token generated on a storefront.

    Response:

    For the configured payment gateways, you can implement the relevant support for them. For details, see the documentation.

    For examples of configuration possibilities with Emporix, see:

    Site specific payment methods

    You can configure available payment methods separately for every site.

    1. Go to Emporix Management Dashboard -> Settings -> Site Settings.

    2. Invoke two endpoints on your storefront to display the payment methods.

      • Get a list of the payment methods configured for your tenant:

    Response:

    • Get the site settings:

    Response:

    With the two lists, you can configure the payment methods for a given site.

    Enabling Custom Extensions

    You can introduce your custom logic and functionality you need easily with custom extensions.

    You can extend Management Dashboard with your custom extension, which can be embedded directly in Management Dashboard to make it easier for your employees to work with integrated systems. Learn how to prepare your custom extension to make it work smoothly within Emporix platform.

    We recommend using the following:

    • the latest version of , version v20 or higher

    paymentMethods : [
      {
        "provider": "payment-gateway",
        "method": "paypal",
        "customAttributes": {
          "token": "Akon8nPXtz0oahVYEqPsoI7pz4l",
          "modeId": "92d77b2b-9385-43ad-a859-55176fbcbd2f",
          "customer": "61443563"
        }
      }
    ] 
    {
        "orderId": "EON1772",
        "paymentDetails": {
            "externalPaymentHttpMethod": "GET",
            "authorizationToken": "AVTqLLj26KFCVQtfOXrAkymfpR9",
            "externalPaymentRedirectURL": "https://www.paypal.com/checkoutnow?token=2KY55219L2352861G"
        },
        "checkoutId": null
    }
    paymentMethods : [
      {
        "provider": "payment-gateway",
        "customAttributes": {
          "customer": "61443563",
          "deferred": true
        }
      }
    ]
    {
      "orderId":"EON1775",
      "paymentDetails":null,
      "checkoutId":null
    }
    {
      "order": {
          "id":"EON1775"
      },
      "paymentModeId":"ef48f439-1c3c-42ff-807d-ef4cac237745",
      "creditCardToken":"9QpMHzNNZDCHVF47hL9ZDP18RFr"
    }
    {
        "successful": true,
        "paymentTransactionId": "afddff82-de4e-45b8-8de5-3f722b81116b",
        "authorizationToken": "2IKNTd5K2HlYqjmGt8n7JgICWuG",
        "requiresExternalPayment": true,
        "externalPaymentRedirectURL": "https://www.paypal.com/checkoutnow?token=49C50265AF458692S",
        "externalPaymentHttpMethod": "GET"
    }
    curl https://core.spreedly.com/v1/gateways.xml \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}' \
    -H 'Content-Type: application/xml' \
    -d '<gateway>
      <gateway_type>paypal_commerce_platform</gateway_type>
      <login>client id</login>
      <password>secret</password>
    </gateway>'
    <gateway>
        <token>5S0kV27BrZ0Z47TdGK4v1OI7ojB</token>
        ...
    </gateway>  
    curl --location --request GET 'https://core.spreedly.com/v1/gateways.json' \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}'
    curl --location --request POST 'https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "paypal",
        "active": true,
        "provider": "SPREEDLY",
        "configuration": {
            "Spreedly/GatewayToken": "{SPREEDLY_GATEWAY_KEY}",
            "Spreedly/EnvironmentKey": "{SPREEDLY_ENVIRONMENT_KEY}",
            "Spreedly/AccessSecret": "{SPREEDLY_ACCESS_SECRET}",
            "Spreedly/PaymentMethodType": "paypal",
            "Spreedly/RedirectURL": "{REDIRECT_URL}",
            "Spreedly/SignatureSecret": "{SPREEDLY_SIGNATURE_SECRET}"
        }
    }'
    const generateToken = () => {
        var formData = new FormData();
        formData.append("redirect_url", window.location.href)
        formData.append("environment_key", {SPREEDLY_ENVIRONMENT_KEY})
        formData.append("payment_method_type", "paypal")
        
        axios({
          method: "post",
          url: "https://core.spreedly.com/v1/payment_methods.json",
          data: formData,
          headers: { "Content-Type": "multipart/form-data" },
        })
          .then(function (response) {
            storeToken(response)
          })
          .catch(function (response) {
            storeToken(response)
          });
      }
      
      const storeToken = (response) => {
        const url = new URL(response.request.responseURL)
        const token = url.searchParams.get("token")
        window.console.log("TOKEN", token)
        setPayment({
          provider: 'payment-gateway',
          mode: "offsite",
          method: 'paypal',
          displayName: 'Paypal',  
          customAttributes:  {
            token : token,
            modeId : paymentMode.id,
            customer : props.customerId
          }
        })
      }
    {
    ...
    "paymentMethods": [
      {
          "provider": "payment-gateway",
          "method": "paypal",
          "customAttributes": {
              "token": "8Ny2OGn1dwzPBuBdwSej95qAuHN",
              "modeId": "227fed5b-e91a-473e-88ea-3b0e85db8408",
              "customer": "17071158"
          }
      }
    ]
    ...
    }
    {
        "orderId": "EON1011",
        "paymentDetails": {
            "externalPaymentHttpMethod": "GET",
            "authorizationToken": "nzQPTC2skR6Fb3LgOagBmVGCBC",
            "externalPaymentRedirectURL": "https://www.paypal.com/checkoutnow?token=2KY55219L2352861G"
        },
        "checkoutId": null
    }
    {
      "id": "61b9dcb2cfa47f0001e0e75d",
      "productId": "61b9dc9ff5758b79d5815892",
      "siteCode": "main",
      "currency": "EUR",
      "originalAmount": 0.3582,
      "effectiveAmount": 0.2682,
      "measurementUnit": {
        "quantity": "1.0",
        "unitCode": "H87"
      },
      "basePrice": {
        "originalAmount": 1.99,
        "effectiveAmount": 1.49,
        "measurementUnit": {
          "quantity": 1.0,
          "unitCode": "KGM"
        }
      },
      "presentationPrice": {
        "originalAmount": 1.99,
        "effectiveAmount": 1.49,
        "measurementUnit": {
          "quantity": 1.0,
          "unitCode": "KGM"
        }
      },
      "customAttributes": {},
      "salePrice": {
        "discountRate": 25.0,
        "description": "25% off!"
      },
      "metadata": {
        "mixinMetadata": {
          "mixins": {}
        }
      }
    }
    {
      "id": "61b9dc9ff5758b79d5815892",
      "code": "SALEPRICE",
      "name": {
        "localizedMap": {
          "en": "Product on sale"
        },
        "multiLanguage": true
      },
      "description": {
        "localizedMap": {
          "en": "Product created for documentation purposes."
        },
        "multiLanguage": true
      },
      "published": true,
      "mixins": {
        "salePricesData": {
          "salePrices": [
            {
              "enabled": true,
              "salePriceAmount": 1.49,
              "salePriceEnd": "2021-12-31T23:59:00.000+0000",
              "salePriceStart": "2021-12-23T00:00:00.000+0000"
            }
          ]
        },
        "productCustomAttributes": {
          "activeTab": "ProductDescription",
          "categoryPath": {
            "categoryLevel1": "example-category-1",
            "prettyName": "product-on-sale",
            "categoryLevel2": "",
            "categoryLevel3": ""
          },
          "defaultOrderQuantity": 1,
          "inStock": true,
          "maxOrderQuantity": 10,
          "minOrderQuantity": 1,
          "orderUnit": "H87",
          "pricingMeasure": {
            "unitCode": "KGM",
            "value": 1
          },
          "pricingMeasurePrice": 1.99,
          "productState": "prepare",
          "taxClass": "FULL",
          "unitPricingBaseMeasure": {
            "unitCode": "KGM",
            "value": 1
          },
          "unitPricingMeasure": {
            "unitCode": "GRM",
            "value": 180
          },
          "weightDependent": true
        }
      },
      "metadata": {
        "mixinMetadata": {
          "mixins": {
            "salePricesData": "https://res.cloudinary.com/saas-ag/raw/upload/schemata/salePriceData.json",
            "productCustomAttributes": "https://res.cloudinary.com/saas-ag/raw/upload/v1560527845/schemata/CAAS/productCustomAttributesMixIn-v38.json"
          }
        },
        "schema": "https://res.cloudinary.com/saas-ag/raw/upload/v1544786405/schemata/CAAS/product.v2"
      }
    }
    {
        "id": "61b779cff5758b79d5815890",
        "name": "Apple Juice",
        "metadata": {
            "mixins": {
                "productCustomAttributes": "https://res.cloudinary.com/saas-ag/raw/upload/v1560527845/schemata/CAAS/productCustomAttributesMixIn-v38.json"
            }
        },
        "mixins": {
            "productCustomAttributes": {
                "taxClass": "HALF"
            }
        }
    }
    curl --location --request GET 'https://api.emporix.io/configuration/{{tenant}}/configurations/taxConfiguration' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer {{service_access_token}}'
    {
      "key" : "taxConfiguration",
      "secured" : false,
      "value" : {
        "taxClassOrder" : [ "FULL", "HALF", "ZERO" ],
        "taxClasses" : {
          "FULL" : 19,
          "HALF" : 7,
          "ZERO" : 0
        }
      },
      "version" : 2
    }
    
    curl --location --request PUT 'https://api.emporix.io/configuration/{{tenant}}/configurations/taxConfiguration' \
    --header 'Authorization: Bearer {{service_access_token}}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "key": "taxConfiguration",
        "value": {
            "taxClassOrder": [
                "FULL",
                "HALF",
                "ZERO"
            ],
            "taxClasses": {
                "FULL": 20,
                "HALF": 10,
                "ZERO": 0
            }
        }
    }'
    
    {
      "key" : "taxConfiguration",
      "secured" : false,
      "value" : {
        "taxClassOrder" : [ "FULL", "HALF", "ZERO" ],
        "taxClasses" : {
          "FULL" : 20,
          "HALF" : 10,
          "ZERO" : 0
        }
      },
      "version" : 2
    }
    curl --location --request PUT 'https://api.emporix.io/product/{{tenant}}/products/{{productId}}?partial=true' \
    --header 'Authorization: Bearer {{service_access_token}}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "mixins":{
            "productCustomAttributes":{
                "taxClass":"FULL"
            }
        },
        "metadata": {
            "mixins":{
                "productCustomAttributes":"https://res.cloudinary.com/saas-ag/raw/upload/schemata/productCustomAttributesMixIn.v29.json"
            }
        }
    }'
    {
        "code": "OK",
        "status": 200,
        "message": "Operation succeeded"
    }

    Piece

    Base price

    1.99 EUR

    6.64 EUR

    1.98 EUR

    Base price unit

    Kilogram

    Kilogram

    Liter

    Presentation price

    1.99 EUR

    2.99 EUR

    0.99 EUR

    Presentation price unit

    Kilogram

    Piece

    Piece

    shipping confirmation
  • coupons received

  • coupon

    coupon id

    couponIsValidUntil

    end date of coupon validity period

    Customer

    additionalBillingEmail

    email address for billing purposes

    birthday

    customer's birthday

    customerEmail

    customer's email address

    customerGeneralAttributes

    customer-related information

    customerNumber

    customer's id number

    customerToken

    customer token generated at login

    firstName

    customer's first name

    invoiceNotDeliveryAddress

    address for invoicing purposes

    lastDeliveryDate

    date of last delivery to customer

    lastName

    customer's last name

    mobilePhone

    customer's mobile phone number

    tenant

    tenant associated with the customer

    title

    customer's title

    token (activateAccountUrl)

    token used for customer's account activation

    Delivery

    deliveryDate

    date of delivery

    errorMessage

    error notification message content

    orderNumber

    order id

    triggeredAction

    action taken on the delivery failure

    Invoice

    orderNumber

    order id number

    archiveEmail

    email address for invoice archiving

    documentType

    type of document

    linkToInvoice

    invoice link

    Order

    billingAddress

    address associated with billing

    comment

    comment made on order

    computedDeliveryTime

    time of delivery

    customer

    customer associated with the order

    customerGeneralAttributes

    customer's details

    customerName

    name of the customer

    customerTitle

    customer's title

    date

    date of creating the order

    deliveryDate

    date of delivery

    deliveryTimeFrom

    time of delivery range - from

    deliveryTimeFromAmPm

    time of delivery range - from AM/PM

    deliveryTimeTo

    time of delivery range - to

    deliveryTimeToAmPm

    time of delivery - to AM/PM

    discounts

    discounts assigned to the order

    entries

    order entries

    feeTotal

    all fees applied to the order

    firstName

    customer's first name

    lastName

    customer's last name

    linkToInvoice

    link to the invoice

    orderNumber

    order id number

    orderReplaces

    id of replaced order

    packaging

    packaging details

    paymentCosts

    costs associated with payment

    paymentMethod

    payment method chosen for the order

    pickup

    info if pickup was chosen for delivery

    pickupAddress

    address for the order pickup

    shippingAddress

    address for shipping the order

    shippingCosts

    costs associated with shipping goods

    substituteProduct

    product substituted by

    Password Reset

    customer

    customer requesting a password reset

    fullResetLink

    link to reset the password

    Support

    message

    content of a message to support

    subject

    subject of the message to support

    Change Email Request

    customer

    customer's name

    newEmail

    new email address to be updated

    oldEmail

    previous email address used

    Coupon

    customer

    customer's details

    Emporix Support Team
    Mailjet Syntax Reference

    token - Credit card token for a tokenized approach.

  • modeId - Payment mode identifier, the ID should reflect the payment mode ID that you receive from GET: https://api.emporix.io/payment-gateway/{TENANT}/paymentmodes/frontend.

  • customer - Identifier of a customer that does the checkout and payment.

  • browserInfo - It’s required for 3DS2 approach only. For details check Spreedly payment gateway.

  • deferred - should be set to true as it indicates the payment is done after the order is placed

    Configuration of payment strategies

    Simplified integration with payment providers and easy configuration of the solutions using Spreedly as the orchestrator.

    Payment configuration per site

    You can configure the relevant payment method on site level within the Management Dashboard.

    Transaction log

    Have a transparent overview within the Management Dashboard about the transaction history for every order.

    Refund creation

    The merchant customer service can trigger refunds from the Management Dashboard without logging in to several payment provider backoffices.

    Payment cancellation

    Cancel the payment within the Management Dashboard.

    Capture

    Provides the flexibility to adapt the capture trigger based on your business, for example: digital products you might want to capture instantly. In other cases, you might need to reserve an amount and capture the final amount later.

    Spreedly Gateways
    Supported Gateways
    Spreedly Gateway
    Saferpay
    Spreedly Express
    Spreedly Gateway
    Saferpay
    { //...
    
      "languages": {
        "en": 2464336,
        "de": 2472042,
        "fr": 6542186,
        "pt": 9877541,
        "pl": 7412588
      }
    
    //...
    }
    paymentMethods : [
      {
        "provider": "payment-gateway",
        "method": "card",
        "customAttributes": {
          "token": "Akon8nPXtz0oahVYEqPsoI7pz4l",
          "modeId": "92d77b2b-9385-43ad-a859-55176fbcbd2f",
          "customer": "61443563",
          "browserInfo": null
        }
      }
    ]
    {
        "orderId": "EON1772",
        "paymentDetails": {
            "externalPaymentHttpMethod": "GET",
            "authorizationToken": "AVTqLLj26KFCVQtfOXrAkymfpR9",
            "externalPaymentRedirectURL": "https://www.paypal.com/checkoutnow?token=2KY55219L2352861G"
        },
        "checkoutId": null
    }
    paymentMethods : [
      {
        "provider": "payment-gateway",
        "customAttributes": {
          "customer": "61443563",
          "deferred": true
        }
      }
    ]
    {
      "orderId":"EON1775",
      "paymentDetails":null,
      "checkoutId":null
    }
    {
      "order": {
          "id":"EON1775"
      },
      "paymentModeId":"ef48f439-1c3c-42ff-807d-ef4cac237745",
      "creditCardToken":"9QpMHzNNZDCHVF47hL9ZDP18RFr"
    }
    {
        "successful": true,
        "paymentTransactionId": "afddff82-de4e-45b8-8de5-3f722b81116b",
        "authorizationToken": "2IKNTd5K2HlYqjmGt8n7JgICWuG",
        "requiresExternalPayment": true,
        "externalPaymentRedirectURL": "https://www.paypal.com/checkoutnow?token=49C50265AF458692S",
        "externalPaymentHttpMethod": "GET"
    }
    curl --location --request GET 'https://api.emporix.io/payment-gateway/my-tenant/paymentmodes/frontend' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {CUSTOMER_TOKEN}'
    [
        {
            "id": "f44f71a4-b632-4c9e-a9fc-27b97551d1d7",
            "code": "credit_card",
            "integrationType": "TOKENIZED",
            "javascriptUrl": "https://core.spreedly.com/iframe/iframe-v1.min.js",
            "paymentMethodType": "credit_card",
            "environmentKey": "NfNg5nQUbBhunpVotluOxQRzOdN"
        },
        {
            "id": "3005fcfc-8e5e-4253-8309-39e6045970e0",
            "code": "credit_card_3ds",
            "integrationType": "TOKENIZED",
            "javascriptUrl": "https://core.spreedly.com/iframe/iframe-v1.min.js",
            "paymentMethodType": "credit_card",
            "environmentKey": "NfNg5nQUbBhunpVotluOxQRzOdN",
            "scaProviderToken": "a1mCvrg0KDAKtopnvubApHpPRE6"
        },
        {
            "id": "227fed5b-e91a-473e-88ea-3b0e85db8408",
            "code": "sprel",
            "integrationType": "OFFSITE",
            "paymentMethodType": "sprel",
            "environmentKey": "NfNg5nQUbBhunpVotluOxQRzOdN"
        }
    ]
    curl 'https://api.emporix.io/payment-gateway/my-tenant/paymentmodes/frontend' \
      -H 'Accept: application/json, text/plain, */*' \
      -H 'Authorization: Bearer {CUSTOMER_TOKEN}' \
    [ {
    "id" : "92d77b2b-9385-43ad-a859-41176fbcbd2f",
    "code" : "credit_card",
    "integrationType" : "TOKENIZED",
    "javascriptUrl" : "https://core.spreedly.com/iframe/iframe-v1.min.js",
    "paymentMethodType" : "credit_card",
    "environmentKey" : "Rrg7UfAqQefDY1KGvU4b8OKnhz"
    }, {
    "id" : "a8c96773-1cdf-4ea7-b1a2-1453d17f5374",
    "code" : "sprel",
    "integrationType" : "OFFSITE",
    "paymentMethodType" : "sprel",
    "environmentKey" : "Rrg7UfAqQefDY1KGvU4b8OKnhz"
    }, {
    "id" : "9a33c7a5-9535-42af-a936-2fa6ece27579",
    "code" : "cash_on_delivery",
    "integrationType" : "EXTERNAL"
    }, {
    "id" : "46a76ccc-4a20-471e-9219-e92bba8067e9",
    "code" : "invoice",
    "integrationType" : "EXTERNAL"
    }, {
    "id" : "ef48f439-1c3c-42ff-807d-ef4cac237745",
    "code" : "paypal",
    "integrationType" : "OFFSITE",
    "paymentMethodType" : "paypal",
    "environmentKey" : "Rrg7UfAqQefDY1KGvU4b8OKnhz"
    }, {
    "id" : "82d77b2b-9385-43ad-a859-55176fbcbd5f",
    "code" : "credit_card_3ds",
    "integrationType" : "TOKENIZED",
    "javascriptUrl" : "https://core.spreedly.com/iframe/iframe-v1.min.js",
    "paymentMethodType" : "credit_card",
    "environmentKey" : "Rrg7UfAqQefDY1KGvU4b8OKnhz",
    "scaProviderToken" : "EyMV4wnFe7xLASdg1DAVA4w7K0W"
    } 
    ]
    curl 'https://api.emporix.io/site/my-tenant/sites/DE' \
      -H 'Accept: application/json, text/plain, */*' \
      -H 'Accept-Language: de' \
      -H 'Authorization: Bearer {CUSTOMER_TOKEN}' \
    {
    ...
      "code": "DE",
      "payment": [
          {
              "id": "92d77b2b-9385-43ad-a859-55176fbcbd2f",
              "name": "credit_card",
              "serviceType": "SPREEDLY",
              "serviceUrl": "",
              "active": true
          },
          {
              "id": "a8c96773-1cdf-4ea7-b1a2-1453d17f5374",
              "name": "sprel",
              "serviceType": "SPREEDLY",
              "serviceUrl": "",
              "active": true
          },
          {
              "id": "ef48f439-1c3c-42ff-807d-ef4cac237745",
              "name": "paypal",
              "serviceType": "SPREEDLY",
              "serviceUrl": "",
              "active": true
          },
      ],
    ...
    }
    shipping
    are listed as shipping addresses, and locations tagged as
    billing
    are listed as billing addresses. A customer that is assigned to the company is able to select the relevant tagged locations on checkout.

    If registered company locations are not tagged with shipping nor billing, the checkout lists only the addresses from a customer's address book, instead of company locations.

    To check how the Approval process works, go to the Approvals guide.

    Contact is the default customer assignment. Use the Type drop-down menu to choose a different one.

    When assigning customers or adding contact persons, you can set up a custom Assignment ID. Otherwise, a unique ID is automatically generated when the assignment is created.

    The customer assignment to a company is also visible in the Customer details view (Customer Management -> Customers -> edit customer).

    Invoice

    See: .

    "taxClasses"
    :
    {
    "FULL": 19,
    "HALF": 7,
    "ZERO": 0
    }
    }
    }

    Vite frontend build tooling

    • The Synonyms extension we build in this tutorial as an example use case is available for public reuse under MD Extensions. The repository contains also other example extensions. Check it out to get inspired and build your own extension.

    • To learn how to add extensions to Management Dashboard, see the Administration - Extensions guide and to check how they are displayed in Management Dashboard after the installation, see the Management Dashboard - Extensions documentation.

    Custom extension

    Create own extension

    1

    Scaffold the project

    Create an extension using Vite. In your console, run:

    where my-md-ext is the name of the extension.

    2

    Choose framework and variant

    When prompted by Vite, select the framework you want to use (this guide uses React) and the variant (we use TypeScript).

    3

    Install dependencies

    When the project is created, go to the new project directory my-md-ext and run:

    4

    Start the dev server

    After the install completes, run:

    As a successful output, you see the localhost running details:

    To test it, open the URL in a browser to see the vanilla state of Vite and React project:

    Install and initialize md-ext library

    The extension doesn't have any connection to Management Dashboard yet. To prepare the custom extension to be embedded in Management Dashboard, install the md-ext library so that it takes care of the required dependencies for you.

    1

    Install the library

    Stop the server, and in the custom extension directory, run:

    2

    Import the client

    Open the project in your IDE. In App.tsx, add:

    3

    Register the client

    In the same file, add:

    4

    Restart the dev server

    To start the extension, run:

    Add the extension to the Management Dashboard

    You can already add your extension to the Management Dashboard. Follow the steps described in Extensions. As a result, your extension is visible under Extensions module:

    Register context changes callback

    Depending on what you are going to use your extension for, you might need to allow the extension to read the Management Dashboard Context. Thanks to the callback function, the context information is passed to the custom extension each time the extension is launched in the Management Dashboard, and you might process the data further from there.

    1

    Import the callback helper

    In App.tsx, add:

    2

    Register the callback

    Define the callback:

    The following Context information is passed every time a user opens the custom extension in Management Dashboard:

    • accessToken - the token you can use for API communication

    • user - the object containing user information like first and last name, email, and userId

    • tenant - the currently selected tenant

    • currentSite - the currently selected site

    • scopes - all scopes that are valid for the logged in user

    • contentLanguage - the language to display any text in the extension

    • currency - the selected currency

      • id - the currency ID

      • label - the displayed label

    • sites - available sites for the tenant

      • active - information whether the site is active

      • code - the site code

    • windowLocationHref - URL of the extensions

    • configuration - configuration settings

      • currencies - available currencies

      • languages - available languages

    • language - the selected language information

      • id - the language ID

      • label - the language label

    • clients - the selected client information

      • tenant - the selected tenant

      • clientId - the client ID

    Remove state change callback

    You can revert submission to Context updates by unregistering from the callback changes.

    1

    Unregister the callback

    Call unregisterCallback with the callbackId:

    2

    Rebuild the extension

    Add deeplinking

    Implementing deeplinking allows you to direct users to specific pages within the application. With deeplinking, the URL address contains #/, so for example, you can display a specific item directly in the extension by calling it from the URL. Sync the current path with the Management Dashboard path by the adding following code:

    1

    Import helpers

    2

    Synchronize the URL

    Check the App.tsx file after the changes

    Example use case

    Custom extensions can serve different purposes and can organize your work more efficiently in many ways. Let's take a look at the example of a custom extension that serves optimizing the search on your storefront by extending the synonyms library in your search index provider. We've built the Synonyms extension that communicates with an index provider and we've embedded it in the Management Dashboard. The example is based on Algolia, but could be any other provider.

    The Synonyms extension is an example use case of custom extensions. If you want to try it out, as a prerequisite for the extension to work, you need to activate and configure your own index provider. You can achieve that by using the Emporix API. To learn more, see the Indexing Service.

    We've built the Synonyms extension in this example using Vite, just as described in the Custom Extension section above, and have deployed in the Emporix Algolia instance. Then, we've enabled it in the Management Dashboard following instructions in Adding an extension documentation. The extension logic allows you to manage the synonyms of your industry or product-related terms. This way, the search index can be optimized to bring more accurate results for the customers queries on the storefront. Customers tend to use specific wording when they search for a product, and with synonyms in place you can improve the search results. The extension makes it easier for your employees to add, edit or remove synonyms directly from the Emporix UI whenever they see the need for that, without the necessity of switching to Algolia (or another search index provider) configuration UI.

    Node.js
    Coupon types

    Spreedly Gateway

    See example of integrating Spreedly Gateway.

    A single Spreedly gateway provides many methods, like: credit_card, credit_card with 3DSecure, sprel (for offsite payment). Therefore, you can use one Spreedly gateway for all the payment types. To learn about the details, see documentation.

    Gateway configuration

    1. To start with the configuration, make sure you have the Spreedly environment credentials prepared.

    Delivery Cycle Management

    Delivery Cycle Management facilitates shipping your goods to customers.

    Here you can find an overview of the Emporix Delivery Cycle Management, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the following sections in the Emporix API Reference:

    Pricing

    Create the pricing models in Emporix.

    Here you can find an overview of the Emporix API Price Service, along with its features and benefits.

    • Looking for code tutorials? Check out the .

    • Looking for API reference? Check out the in the Emporix API Reference.

    npm create vite@latest my-md-ext
    yarn add md-ext
    import {
      registerCallback,
    } from 'md-ext/lib'
    import {
      unregisterCallback,
    } from 'md-ext/lib'
    unregisterCallback('callbackId')
    yarn build
    import { syncUrl } from 'md-ext/lib'
    import { useEffect, useState } from 'react'
    import { useEffect, useState } from 'react'
    import reactLogo from './assets/react.svg'
    import viteLogo from '/vite.svg'
    import './App.css'
    
    import {registerClient, registerCallback, syncUrl } from 'md-ext/lib'
    
    function App() {
      const [count, setCount] = useState(0)
      registerClient();
    
      registerCallback('callbackId', (ctx) => {
        console.log('context update', ctx)
      })
    
      useEffect(() => {
        syncUrl('/' + location.pathname);
      }, [location]);
      
      return (
        <>
          <div>
            <a href="https://vitejs.dev" target="_blank">
              <img src={viteLogo} className="logo" alt="Vite logo" />
            </a>
            <a href="https://react.dev" target="_blank">
              <img src={reactLogo} className="logo react" alt="React logo" />
            </a>
          </div>
          <h1>Vite + React</h1>
          <div className="card">
            <button onClick={() => setCount((count) => count + 1)}>
              count is {count}
            </button>
            <p>
              Edit <code>src/App.tsx</code> and save to test HMR
            </p>
          </div>
          <p className="read-the-docs">
            Click on the Vite and React logos to learn more
          </p>
        </>
      )
    }
    
    export default App
    Check the App.tsx file after the changes
    default - information if the currency is a default one
  • required - information if the currency is required

  • currency - the default currency used on the site
  • default - information whether the site is a default one

  • defaultLanguage - the default site's language

  • languages - available languages on the site

  • name - the site's name

  • theme - the main theme
    default - information whether the language is a default one
  • required - information whether the language is required

  • To create a gateway on Spreedly side, execute the following request:

    The SPREEDLY_TOKEN is a result of base64 of environment_key:access_secret. Result: after sending the request you should get a response that contains the token value.

    Store the token value for the next steps in the configuration. If you lose the token value at any point, use the following request to get it:

    Credit card configuration

    To configure a new payment mode in the payment gateway service, execute the following request:

    • EMPORIX_AUTH_TOKEN - The standard access token. To check how to get the token see documentation.

    • SPREEDLY_GATEWAY_KEY - Spreedly gateway token that was returned when you configured the payment gateway on the Spreedly side.

    • SPREEDLY_ENVIRONMENT_KEY - Spreedly environment key that you got from Emporix support team.

    • SPREEDLY_ACCESS_SECRET - Spreedly secret key that you got from Emporix support team.

    Credit card configuration with 3DS

    Prerequisite

    To start with the 3DS configuration, you need to create a Merchant Profile and an SCA Provider.

    1. Obtain the Merchant Profile token by executing the following request:

    Response: you should get a json with the merchant_profile.token value. Make sure to save the value as it's needed in the next configuration steps.

    1. Obtain the SCA provider token by executing the following request:

    Response: you should get a json with the sca_provider.token value. Make sure to save the value as it's needed in the next configuration steps.

    Configuration

    To configure a new payment method with the 3DS in the payment gateway service, execute the following request:

    • EMPORIX_AUTH_TOKEN - The standard access token. To check how to get the token see documentation.

    • SPREEDLY_GATEWAY_KEY - Spreedly gateway token that was returned when you configured the payment gateway on the Spreedly side.

    • SPREEDLY_ENVIRONMENT_KEY - Spreedly environment key that you got from Emporix support team.

    • SPREEDLY_ACCESS_SECRET - Spreedly secret key that you got from Emporix support team.

    • SPREEDLY_SIGNATURE_SECRET - Spreedly signature secret that you got from Emporix support team.

    • SPREEDLY_SCA_PROVIDER - The sca_provider.token you got in the previous request.

    • TEST_SCENARIO - This value should be provided only for testing purposes (it shouldn’t be provided for production configuration). Valid options are: authenticated, not_authenticated and challenge. We recommend testing the flow especially with the challenge mode, where an additional offsite step is required when an order is being created.

    To learn more about 3DS2, see the Spreedly 3DS2 Global documentation.

    Spreedly Sprel

    Spreedly Sprel is an off-site payment, which means that the payment is finished outside of your storefront. In this situation, the payment provider needs to know where the end user should be redirected when the payment is done. Therefore, you need to provide a {REDIRECT_URL} value in the configuration, for example: https://storefront.emporix.io/my-tenant/payment-callback.

    To create this payment method, execute the following request:

    • EMPORIX_AUTH_TOKEN - The standard access token. To check how to get the token see documentation.

    • SPREEDLY_GATEWAY_KEY - Spreedly gateway token that was returned when you configured the payment gateway on the Spreedly side.

    • SPREEDLY_ENVIRONMENT_KEY - Spreedly environment key that you got from Emporix support team.

    • SPREEDLY_ACCESS_SECRET - Spreedly secret key that you got from Emporix support team.

    • SPREEDLY_SIGNATURE_SECRET - Spreedly signature secret that you got from Emporix support team.

    • REDIRECT_URL - The URL of your storefront, where the user should be redirected after the payment is completed.

    Storefront implementation

    This is an example of how you can configure your storefront payment support for the Payment Gateway service.

    Credit cards

    1. Add a button that opens Spreedly Express modal.

    There's a 'onClick' handler configure, the handler should open the Spreedly modal:

    1. Configure an init function, it should be invoked when a page/component is rendered.

    1. Configure Spreedly listener.

    1. Adjust the checkout request, by adding the following payment information to the payload:

    • The provider should always be payment-gateway if you’re using payment-gateway service.

    • The token is the token returned by Spreedly express.

    • The modeId is the payment-mode identifier - the id returned by Payment Gateway service.

    • The customer is the customer identifier.

    Response:

    The thing that may be needed for you is paymentDetails section. In case of on-site payment no further action is required.

    Credit cards with 3DS

    1. Adjust Spreedly listener.

    1. Adjust the checkout request by adding the following payment information to the payload:

    • The provider should always be payment-gateway if you’re using payment-gateway service.

    • The token is the token returned by Spreedly express.

    • The modeId is the payment-mode identifier - the id returned by .

    • The customer is the customer identifier.

    • The browserInfo is the one that was generated in the onPaymentmethod listener.

    1. When the checkout is done and the order is completed, it should be checked if the 3DS challenge is needed. You can check that by adding the html code and JS part.

    Html code:

    JS part:

    If a challenge is needed, then an appropriate modal is displayed. Emporix system is notified about the result of the operation by an appropriate callback that is sent directly to the payment-gateway service by Spreedly.

    Spreedly Sprel

    To use Spreedly Sprel as the off-site payment solution, you have to generate a token in Spreedly. You can do this in two ways:

    • Display a button that does the form submission - as described in PayPal Commerce Platform Offsite Payments.

    • Execute the following (an example in react):

    All the payment information is stored, because we need this value during the checkout call. The payment object during the checkout request should look like:

    Response:

    Pay attention to the paymentDetails.externalPaymentRedirectURL value. To finish the payment, you should redirect the user to the URL. Emporix payment gateway is notified about the result of the payment process by Spreedly callback functionality.

    Spreedly Gateway
  • To check how the Delivery Cycle Management can be configured in Management Dashboard, check out the Delivery Times and Shipping Methods.

  • Purpose

    To facilitate the delivery process and support diverse customer scenarios, Emporix provides you with multiple delivery and shipping configuration options, such as customizable delivery areas, zones, delivery windows, and shipping methods.

    Features

    Feature
    Description

    Delivery times

    Create multiple delivery times using the bulk create feature.

    Delivery dates

    Customize the delivery dates for the orders in a number of ways:

    • Single or multiple weekdays

    • Single or multiple calendar days

    • Date periods

    Non-delivery dates

    Set the dates when the orders cannot be delivered, similarly to the delivery dates, the non delivery dates can be:

    • Single or multiple weekdays

    • Single or multiple calendar days

    • Date periods

    Multiple delivery slots

    You can set up many delivery slots for the same day, for the same or different zones and shipping methods.

    Shipping zones

    Shipping zones are countries and postal codes for areas that your business delivers products to.

    Shipping methods

    You can set shipping methods in relation with zones and delivery times. For each of the methods, you can define the following settings:

    • Shipping cost

    • Tax class

    • Minimum order value

    • Shipping groups

    Delivery times

    Well-functioning delivery and shipping features are the core elements of any e-commerce business. The following sections provide more information on this functionality in Emporix - for example customization of delivery settings and a description of what you can achieve with those features.

    Delivery dates calculation

    By default, the end customer can set a delivery date for 90 days ahead. When the payment method is specified as credit card, the date is set to 7 days.

    Delivery and non-delivery days

    You can customize the delivery and non-delivery days and periods of time in many different options:

    • Weekdays

    • Calendar days

    • Customized periods

    For every delivery configuration you can set up multiple slots for every day.

    Delivery windows

    Using delivery windows you can specify the following:

    • Delivery window for a single day, for example: 06/06/2023

    • Non-delivery window for a single day

    • Delivery window for a defined period of time, for example: 06/06/2023-10/07/2023

    • Non-delivery window for a defined period of time

    • Delivery window for a weekday, for example: Monday

    • Non-delivery window for a weekday

    You can set up different combinations for the delivery windows, but it's not possible to create opposite rules for the same delivery time.

    Examples of acceptable combinations:

    One period of time
    with another period of time

    Delivery on a single date: 22/12/2023

    and non-delivery on a different single date: 23/12/2023.

    Delivery period: 25-26/12/2023

    and a different non-delivery period: 27-28/12/2023.

    Delivery on a single date: 22/12/2023

    which overrides a non-delivery period: 21-28/12/2023.

    Non-delivery on a single date: 22/12/2023

    which overrides a delivery period: 21-28/12/2023.

    Delivery on a weekday on every Monday

    and non-delivery on Sunday.

    Delivery on a weekday on every Monday with two delivery windows for different time slots: 08:00 - 10:00 and 13:00 - 15:00

    and a delivery on a specific date for Mondays, with for example one delivery window from 08:00 - 15:00, which overrides the general cut-off time configuration for Mondays.

    Examples of non-acceptable combinations:

    One period of time
    with another period of time

    Delivery on a single date: 22/12/2023

    and non-delivery on the same single date: 22/12/2023.

    Delivery period: 25-26/12/2023

    and non-delivery period: 25-26/12/2023.

    Delivery period: 22-26/12/2023

    and non-delivery period which partially overlaps another period: 25-29/12/2023.

    Delivery on a weekday on Monday

    and non-delivery on Monday.

    Cut-off days

    You can use the cut-off day functionality to specify by what day the customers have to check out to receive their order in the defined delivery time. There are two possibilities to set up the cut-off day:

    • General cut-off day: Sets the cut-off day for all the slots available for the delivery time. The general cut-off day can be set up to 6 days before the delivery of the order, you can select from a range between -1 and - 6 days. If you choose -6, it means you have 6 days to prepare the order and to deliver it to the customer.

    • Specific cut-off day: Sets the cut-off day for single delivery slots. This option is only active for Weekday deliveries, not for single dates or periods. The specific cut-off day can be set up to 6 days before the configured weekday delivery, you can select from a range between -1 and - 6 days. If you choose -3, it means you have 3 days to prepare the order and to deliver it to the customer. Both weekdays and weekends are counted.

    The default value for the cut-off days is 0, which means the cut-off day is not set. If one of the cut-off day options is selected, the other one is hidden.

    Examples of the cut-off days configurations:

    Delivery day
    General cut-off day
    Specific slot cut-off day

    Delivery on a weekday: Wednesday

    For example: -2, which means the cut-off day is Monday. It can be any single day up to 10 days before the delivery day.

    Not available

    Delivery on a weekday: Wednesday

    Not set.

    Can be set for every slot separately

    Delivery day: 22/12/2023

    For example: -1, which means the cut-off day is 21/12/2023.

    Not available

    Delivery period: 22-26/12/2023

    For example: -5, which means the cut-off day is 17/12/2023 for 22/12/2023 delivery, 18/12/2023 for 23/12/2023, 19/12/2023 for 24/12/2023 delivery and further.

    Cut-off time

    Cut-off time is the exact hour of the cut-off day that ends the order placement period, for the specific delivery window. The cut-off time is always specified in the UTC time zone.

    Examples of usage

    Defined delivery time with the cut-off set to 9:00 AM:

    User's action
    Result

    A user creates an order at 8:55AM (UTC).

    The delivery window contains the order for the current day.

    A user creates an order at 9:05AM (UTC).

    The delivery window does not contain the order for the current day, but only for the next day.

    A user creates an order from CET zone (UTC+1) at 9:55AM (CET).

    The delivery window contains the order for the current day, because in the UTC zone there is still 8:55AM.

    Product lead times

    Product lead time defines how much time your supplier needs to prepare a product for delivery. In the Emporix e-commerce system, lead times are specified for individual products and are expressed in hours.

    When calculating the delivery date at checkout, the lead times and non-delivery days of products in the cart affect the next possible delivery date.

    Preorders

    You can allow customers to order goods in advance by setting appropriate lead times for products. The set value is then calculated into the next possible delivery date at checkout.

    Maximum number of deliveries per day

    You can specify how many deliveries your business can complete in a day per slot. If the number of orders per slot reaches the set capacity, the delivery slot automatically closes. In case all the slots' capacities are reached, the delivery date is closed. Whenever a customer cancels an order or chooses a different delivery date, the originally chosen delivery slot becomes available again.

    Shipping Services guide
    Purpose

    The Emporix API Price Service aims to simplify price management by introducing customizable price models and automated price operations.

    Features

    The Emporix API Price Service introduces a set of features that make product pricing easier:

    Feature
    Description

    Automatic calculation of prices

    You can automatically calculate net and gross values for prices.

    ℹ️ See: .

    Customizable price models

    You can define multiple price models and adjust them to your business's pricing strategies. We have included three common examples — basic, tiered, and volume pricing.

    ℹ️ See: .

    Price matching

    You can retrieve the lowest prices for desired products based on specified criteria.

    ℹ️ See: .

    Features and benefits for B2B commerce

    The Emporix API Price Service comes with a set of features that specifically address the needs of B2B commerce. These features support complex pricing scenarios that are typically found in a B2B context:

    Feature
    Benefits

    Multi-currency support

    Businesses that sell globally can take advantage of our multi-currency implementation by configuring multiple currencies that their customers can choose from. To make it easier to manage a global business, you can create multiple sites and define a different default currency for each of them or support multiple currencies on a single site.

    Net pricing mode

    In B2B commerce, businesses often use net pricing. With that in mind, we added a site setting that you can use to define the default pricing mode — net or gross — for particular sites.

    Tiered and volume pricing

    Our customizable pricing model supports pricing strategies common in B2B commerce, such as tiered and volume pricing. You can experiment with these pricing strategies to find the most profitable way to sell your products.

    See: .

    Price personalization

    You can set up prices that are exclusive to specific customers to improve your business's relationship with them. We have also introduced a functionality that helps you determine the best prices for specific customers based on a number of inputs.

    Currently, the price personalization functionality is limited to specific customers.

    Price lists

    Price lists can be used to offer personalized pricing to customers that match specific criteria, or to offer contract-specific pricing. You can configure predefined sets of prices and products for specific regions, countries, and customer groups. The Emporix price lists implementation is well-suited for international businesses as each price list can be expressed in a different currency.

    See: .

    |

    The Emporix API Price Service has been designed to support the potentially high number of prices a B2B commerce company may require without impacting the system performance.

    Overview

    In the Emporix e-commerce system, prices are not defined within products, but as separate entities that reference them.

    Each price can be described with the following attributes:

    Mandatory

    Optional

    Amount

    Customers

    Country

    Date-time range

    Sale discount

    Product

    Sites

    You can manage prices through the Emporix API Price Service.

    Looking for API reference? Check out the in the Emporix API Reference.

    Price models

    Based on a number of factors — such as a diverse customer base or a variety of offered products — your business may incorporate multiple pricing models. To support such cases, we have introduced customizable price models with which you can define price structures.

    You can create as many price models as you need. Each model can be described with the following attributes:

    Mandatory
    Optional

    Measurement unit

    Description

    Name

    Price type — net or gross

    Pricing strategy

    Pricing tiers

    Measurement unit

    Each price model can specify one of three pricing strategies:

    • Basic pricing, where the price per unit is constant, regardless of the ordered quantity.

    • Volume pricing, where the price per unit depends on the ordered quantity.

    • Tiered pricing, where the price per unit depends on the tiers that the ordered quantity falls into.

    Take a look at a comparison of pricing strategies:

    Tier
    Basic pricing
    Volume pricing
    Tiered pricing

    1-10 units

    $1.50

    $1.50

    $1.50

    11-20 units

    $1.50

    $1.25

    $1.25

    21+ units

    $1.50

    $1

    Currently, our price models support basic, volume and tiered pricing.

    Price lists

    You can create multiple sets of prices for the same products. If all criteria specified for a price list are met, prices from that list take precedence over catalog prices originally defined for products.

    Each price list needs to indicate a site that it's applicable to. Additionally, you can narrow down the list's validity with the following factors:

    • Customer groups

    • Countries

    • Date range

    • Regions

    Prices in lists can also be expressed in a different currency than originally defined for products.

    Automated operations

    To help automate price management, we have introduced the following functionalities:

    • Price matching, which you can use to retrieve the lowest prices for desired products.

    Currently, the price matching functionality is limited to finding the lowest defined price.

    • Tax calculation, which you can use to calculate:

      • Net prices to gross prices.

      • Gross prices to net prices.

      • Gross prices in one country to gross prices in another country.

    For more information on the tax calculation functionality, check out the Tax classes guide.

    Additionally, you can specify whether prices assigned to a particular site should be — by default — presented as gross or net values.

    For more information on sites and how to configure them, check out the Sites guide and the in the Emporix API.

    Related resources

    Currencies

    Your business may accept more than one currency. To make it easier to manage multiple currencies, we have introduced the Emporix API Currency Service.

    Looking for API reference? Check out the in the Emporix API Reference.

    To minimize data redundancy, each currency needs to be defined in a separate configuration and then referenced in applicable prices.

    Currently, the exchange rates are defined statically and are not influenced by actual currency exchange rates. If you want the statically defined exchange rates to reflect the actual rates more closely, you will need to manually update these on a regular basis.

    See: in the Emporix API Reference.

    import { useState } from 'react'
    import reactLogo from './assets/react.svg'
    import viteLogo from '/vite.svg'
    import './App.css'
    import {registerClient} from 'md-ext/lib'
    
    function App() {
      const [count, setCount] = useState(0)
      registerClient();
    
      return (
        <>
          <div>
            <a href="https://vitejs.dev" target="_blank">
              <img src={viteLogo} className="logo" alt="Vite logo" />
            </a>
            <a href="https://react.dev" target="_blank">
              <img src={reactLogo} className="logo react" alt="React logo" />
            </a>
          </div>
          <h1>Vite + React</h1>
          <div className="card">
            <button onClick={() => setCount((count) => count + 1)}>
              count is {count}
            </button>
            <p>
              Edit <code>src/App.tsx</code> and save to test HMR
            </p>
          </div>
          <p className="read-the-docs">
            Click on the Vite and React logos to learn more
          </p>
        </>
      )
    }
    
    export default App
    yarn install
    yarn dev
    import {registerClient} from 'md-ext/lib'
    registerClient();
    yarn dev
    registerCallback('callbackId', (ctx) => {
      console.log('context update', ctx)
    })
    
    useEffect(() => {
        syncUrl('/' + location.pathname);
      }, [location]);
    curl --location --request GET 'https://core.spreedly.com/v1/gateways.json' \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}'
    curl --location --request POST 'https://core.spreedly.com/v1/gateways.xml' \
    --header 'Content-Type: application/xml' \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}' \
    --data-raw '<gateway>
        <gateway_type>test</gateway_type>
    </gateway>'
    
    <gateway>
        <token>5S0kV27BrZ0Z48TdGK7v10Y7ojB</token>
        ...
    </gateway>
    curl --location --request POST 'https://api.emporix.io/payment-gateway/my-tenant/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "credit_card",
        "active": true,
        "provider": "SPREEDLY",
        "configuration": {
            "Spreedly/GatewayToken": "{SPREEDLY_GATEWAY_TOKEN}",
            "Spreedly/EnvironmentKey": "{SPREEDLY_ENVIRONMENT_KEY}",
            "Spreedly/AccessSecret": "{SPREEDLY_ACCESS_SECRET}",
            "Spreedly/PaymentMethodType": "credit_card"
        }
    }'
    curl --location --request POST 'https://core.spreedly.com/v1/merchant_profiles.json' \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
            "merchant_profile": {
              "description": "Spreedly",
              "visa": {
                "acquirer_merchant_id": "spreedlys_mid",
                "merchant_name": "Spreedly",
                "country_code": "276",
                "mcc": "5978"
              },
              "mastercard": {
                "acquirer_merchant_id": "spreedlys_mid",
                "merchant_name": "Spreedly",
                "country_code": "276",
                "mcc": "5978"
              }
            }
          }'
    curl --location --request POST 'https://core.spreedly.com/v1/sca/providers.json' \
    --header 'Authorization: Basic {SPREEDLY_TOKEN}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
            "sca_provider": {
              "merchant_profile_key": "{MERCHANT_PROFILE_TOKEN}",
              "type": "test",
              "sandbox": true,
              "mastercard": {
                  "acquirer_bin": "4444444444",
                  "merchant_url": "https://spreedly.com",
                  "merchant_password": "optional"
              },
              "visa": {
                  "acquirer_bin": "4444444444",
                  "merchant_url": "https://spreedly.com",
                  "merchant_password": "optional",
                  "merchant_brand_id": "optional"
              }
            }
          }'
    curl --location --request POST 'https://api.emporix.io/payment-gateway/my-tenant/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "credit_card_3ds",
        "active": true,
        "provider": "SPREEDLY",
        "configuration": {
            "Spreedly/GatewayToken": "{SPREEDLY_GATEWAY_TOKEN}",
            "Spreedly/EnvironmentKey": "{SPREEDLY_ENVIRONMENT_KEY}",
            "Spreedly/AccessSecret": "{SPREEDLY_ACCESS_SECRET}",    
            "Spreedly/SignatureSecret": "{SPREEDLY_SIGNATURE_SECRET}",
            "Spreedly/PaymentMethodType": "credit_card",
            "Spreedly/SCAProviderToken": "{SPREEDLY_SCA_PROVIDER}",
            "Spreedly/TestScenario" : "{TEST_SCENARIO}"
        }
    }'
    curl --location --request POST 'https://api.emporix.io/payment-gateway/my-tenant/paymentmodes/config' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer {EMPORIX_AUTH_TOKEN}' \
    --data-raw '{
        "code": "sprel",
        "active": true,
        "provider": "SPREEDLY",
        "configuration": {
            "Spreedly/GatewayToken": "{SPREEDLY_GATEWAY_TOKEN}",
            "Spreedly/EnvironmentKey": "{SPREEDLY_ENVIRONMENT_KEY}",
            "Spreedly/AccessSecret": "{SPREEDLY_ACCESS_SECRET}",    
            "Spreedly/SignatureSecret": "{SPREEDLY_SIGNATURE_SECRET}",
            "Spreedly/PaymentMethodType": "sprel",
            "Spreedly/RedirectURL": "{REDIRECT_URL}"
        }
    }'
    <button className='large-primary-btn' onClick={openModal}>Enter Payment Info</button>
      const openModal = (event) => {
        window['SpreedlyExpress'].openView()
      }
          window['SpreedlyExpress'].init(paymentMode.environmentKey, {
            "amount": cart.subtotalAggregate.grossValue + ' ' + cart.subtotalAggregate.currency,
            "company_name": "PowerZone",
            "sidebar_bottom_description": "Total Price",
          }, {
            "customerId": cart.customerId
          });
          window['SpreedlyExpress'].onPaymentMethod(function(token, paymentMethod) {
            // store token, because it should be send in the checkout request
            window['SpreedlyExpress'].unload()
          });
    {
    ...
    "paymentMethods" : [
          {
              "provider": "payment-gateway",
              "customAttributes": {
                  "token": "HXCA1VgWm2EYDdhZ8gFgUxUhwlI",
                  "modeId": "f44f71a4-b632-4c9e-a9fc-27b97551d1d7",
                  "customer": "17071158"
             }
          }
    ]
    ...
    }
    {
        "orderId": "EON1005",
        "paymentDetails": {
            "externalPaymentHttpMethod": null,
            "authorizationToken": "aPF9mGbmqApxWmCBeMHduxccL9G",
            "externalPaymentRedirectURL": null
        },
        "checkoutId": null
    }
    window['SpreedlyExpress'].onPaymentMethod(function(token, paymentMethod) {
            let browserInfo = window['Spreedly'].ThreeDS.serialize('4')
            // store the browserInfo, because it should be send in the checkout 
            // store token, because it should be send in the checkout request
            window['SpreedlyExpress'].unload()
          });
    {
    ...
    [
        {
            "provider": "payment-gateway",
            "method" : "credit_card",
            "customAttributes": {
                "token": "YqLX1WVg7lUpTaJWFOVkL6XxNJq",
                "modeId": "3005fcfc-8e5e-4253-8309-39e6045970e0",
                "customer": "17071158",
                "browserInfo": "eyJ3aWR0aCI6Mzg0MCwiaGVpZ2h0IjoyMTYwLCJkZXB0aCI6MjQsInRpbWV6b25lIjotMTIwLCJ1c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2IiwiamF2YSI6ZmFsc2UsImxhbmd1YWdlIjoiZW4tR0IiLCJicm93c2VyX3NpemUiOiI0IiwiYWNjZXB0X2hlYWRlciI6InRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sIn0="
            }
        }
    ]
    ...
    }
    <div id="device-fingerprint" className="hidden"></div>
            <div id="challenge-modal" className="hidden fitToModal">
              <div id="challenge" className=''></div>
            </div>
    const [challenge, setChallenge] = useState(true)
    
      useEffect(() => {
       if(payment?.paymentMode?.scaProviderToken) {
        var lifecycle = new window['Spreedly'].ThreeDS.Lifecycle({
          environmentKey: {SPREEDLY_ENVIRONMENT_KEY},
          hiddenIframeLocation: 'device-fingerprint', 
          challengeIframeLocation: 'challenge', 
          transactionToken: {AUTHORIZATION_TOKEN},
          challengeIframeClasses: '3dsModal'
        })
        var on3DSstatusUpdatesFn = function(threeDsStatusEvent) {
          if (threeDsStatusEvent.action === 'succeeded') {
            setChallenge(false)
          } else if (threeDsStatusEvent.action === 'error') {
            // present an error to the user to retry
          } else if (threeDsStatusEvent.action === 'finalization-timeout') {
            // present an error to the user to retry
          } else if (threeDsStatusEvent.action === 'challenge') {
            setChallenge(true)
            document.getElementById('challenge-modal').classList.remove('hidden');
          }
        }
        window['Spreedly'].on('3ds:status', on3DSstatusUpdatesFn)
        lifecycle.start()    
       } else {
        setChallenge(false)
       }
      }, [])
    const generateToken = () => {
        var formData = new FormData();
        formData.append("redirect_url", window.location.href)
        formData.append("environment_key", {SPREEDLY_ENVIRONMENT_KEY})
        formData.append("payment_method_type", "sprel")
        
        axios({
          method: "post",
          url: "https://core.spreedly.com/v1/payment_methods.json",
          data: formData,
          headers: { "Content-Type": "multipart/form-data" },
        })
          .then(function (response) {
            storeToken(response)
          })
          .catch(function (response) {
            storeToken(response)
          });
      }
      
      const storeToken = (response) => {
        const url = new URL(response.request.responseURL)
        const token = url.searchParams.get("token")
        setPayment({
          provider: 'payment-gateway',
          mode: "offsite",
          method: 'sprel',
          customAttributes:  {
            token : token,
            modeId : paymentMode.id,
            customer : cart.customerId
          }
        })
      }
    {
    ...
    "paymentMethods": [
        {
            "provider": "payment-gateway",
            "mode": "offsite",
            "method": "sprel",
            "customAttributes": {
                "token": "8Ny2OGn1dwzPBuBdwSej95qAuHN",
                "modeId": "227fed5b-e91a-473e-88ea-3b0e85db8408",
                "customer": "17071158"
            }
        }
    ]
    ...
    }
    {
        "orderId": "EON1011",
        "paymentDetails": {
            "externalPaymentHttpMethod": "GET",
            "authorizationToken": "nzQPTC2skR6Fb3LgOagBmVGCBC",
            "externalPaymentRedirectURL": "https://core.spreedly.com/sprel/5S0kV27BrZ0Z47TdGK4v1OI7ojB/checkout/nzQPTC2skR6Fb3LgOagBmVGCBC"
        },
        "checkoutId": null
    }

    Shipping groups

    You can assign customers to groups and define different shipping costs for these groups, for example B2B customers, or companies/customers that order regularly.

    Shipping fees

    Depending on the shipping costs specified for shipping zones and methods, shipping fees are added to the order value.

    Cut-off days

    • General cut-off day: refers to the specific day and time (cut-off time) by which an order must be placed to be processed and shipped on the specific delivery day.

    • Specific cut-off day: refers to the specific slot within the delivery window and time (cut-off time) by which an order must be placed to be processed and shipped on the specific delivery day.

    Cut-off time

    Define the cut-off time after which it won't be possible to create orders for a specified delivery time.

    Capacity

    Define how many orders can be created for the delivery time.

    Delivery on a single date: 31/12/2023 (Sunday)

    and non-delivery on a weekday on Sunday - all Sundays are non-delivery days, excluding 31/12/2023, which is a delivery date.

    Delivery period: 30-31/12/2023 (Saturday-Sunday)

    and a non-delivery weekday Sunday - all Sundays are non-delivery days, excluding 31/12/2023, which is a delivery date.

    Not available

    $1

    Total for 25 units

    25 x $1.50 = $37.50

    25 x $1 = $25

    (10 x $1.50) + (10 x $1.25) + (5 x $1) = $32.50

    Automated operations
    Price models
    Automated operations
    Price models
    price matching
    Price lists
    Currency
    Price model

    Indexing Service

    Configure search indexer to bring great searching experience on your storefront.

    The Indexing Service is designed to help you configure the search index in your Emporix instance.

    The Indexing Service is responsible for including all your resources, such as products, or categories, in the search index and make them searchable on your storefront. You have to enable your own indexing service on Emporix by providing your credentials for the index provider into CE platform. Currently, the supported index provider is Algolia. For more information how you can configure search, see Search Configuration.

    The Indexing Service gives you the possibility to provide your own API keys to the indexing provider, separately for each tenant. This approach gives you more flexibility in configuration.

    There are two groups of endpoints in the Indexing Service:

    • Secured endpoints - that require a security scope and serve managing configuration.

      Example response:

    • Public endpoints - that do not require any security scopes and they can be used directly on a storefront. The public endpoints do not return a writeKey, but a searchKey only.

    Even though the public endpoints do not require any scopes, an authorization token is required to complete the request.

    Reindexing data

    Be aware that changing configuration for indexing provider isn't enough to apply your changes in the index. Usually, the indexing process of your data is triggered by changes done on your products, or dependant entities, such as category, price, media etc. There is a scheduler job that discovers the delta changes on the resource data and starts reindexing of the updated instances, so that they are searchable on the storefront. Applying the changes done to the search index configuration require updating all existing product data. To avoid updating all the data, there is a reindexing mechanism available. So, if you change the index configuration, remember to reindex all your product data by using the reindex endpoint.

    Indexing strategies

    As Emporix is a multi-site solution, data on each site may differ, such as availability or price. Therefore, site-aware data must be included in the index. The Indexing Service provides two index strategies:

    • MERGE: the default strategy. The strategy creates just a single index that contains information from all the sites. The site-aware information is stored in sitePrices and siteAvailabilities properties. These properties are maps where a key corresponds to a site code and a value corresponds to the price or availability object respectively. This approach is more performant as you have only one index.

    See an example index with MERGE strategy
    • SPLIT: an alternative strategy. The strategy creates as many indices as the number of sites declared in the system. The index item does not contain sitePrices and siteAvailabilities fields. All the site-aware fields are available on the root level. This approach may be more flexible as a particular index contains only information related to one site. But, the fields that are not site-aware, like description, name etc are duplicated across all the indices. The number of indices is significantly higher.

    See an example index with SPLIT strategy

    Changing index strategy

    Changing the index strategy can be done in the following ways:

    • System Preferences of the Emporix Management Dashboard: see the .

    • API request to the Configuration Service

      (If there is an already existing configuration for your tenant, send PUT request to update configuration. If there is no configuration yet, first send the POST request to create one. If there is no configuration, the MERGE strategy is used by default.)

    Please remain patient as propagating changes to the index strategy may take up to 1 hour, so you might not be able to see the changes instantly.

    Example request with MERGE strategy
    Example request with SPLIT strategy
    • Looking for API tutorials? Check out .

    • Looking for API reference? Check out the in the Emporix API Reference.

    {
      "active": true,
      "searchKey": "84dc4886f81f805c42bdd89d64de751a",
      "applicationId": "8AP2HABA2I",
      "indexName": "exampleTenant",
      "provider": "ALGOLIA",
      "writeKey": "51ebe89215dddcf85e5dacd5643d17e7"
    } 
    System Preferences

    Search Configuration

    Learn the possibilities for configuring search in Emporix.

    You can integrate the Emporix Commerce Engine with any index providers by leveraging the webhook events concept. Emporix CE recognizes all changes around a product item like the product itself, its price, category or availability related to the product. If any of the connected entities is modified, our platform prepares an index-item object which contains all the necessary data.

    See the event schema for an updated index item - IndexItemUpdated.
    "id": "String",
    "code" : "String",
    "siteCode" : "String",
    "name" : "Map<String,String>", // Localized map
    "description" : "Map<String, String>", // Localized map
    "categoryAssignments" : [
      {
    
    
    See an example of the index-item object and what is emitted every time a product is created or updated.
    See the event schema for a deleted index item - IndexItemDeleted.
    See an example message that is sent when a product is deleted.

    Enabling webhook service

    1. Log in to the Management Dashboard and go to Administration -> Webhooks.

    2. Choose the webhooks strategy that best suits your needs.

    For more information on webhooks strategies and configuration, see .

    1. Extend the Index item webhook details and enable the Index item updated and the Index item deleted events.

    1. Depending on the chosen webhook strategy, there are different ways to configure the endpoints for receiving notifications about events happening in the system. Configure your strategy to be able to process the events.

    See example webhook configuration

    For Svix-shared strategy, you can use Open Svix Dashboard option to configure the relevant endpoints.

    1. Go to Endpoints and choose the Add Endpoint button to start the endpoint configuration.

    For testing purposes, you can use Svix Play configuration, it automatically creates a sandbox destination.

    Search provider configuration

    Commerce Engine allows you to configure your own search functionality. You can choose any provider that suits your needs. For demonstration purposes of how you can configure search through the webhooks functionality, we present examples of configuring Algolia and BatteryIncluded. These are the search engines that can be configured to work with Emporix CE and Svix.

    To learn more about Algolia, see . To learn more about BatteryIncluded, see .

    Prerequisites

    Before you start configuring a search engine in Emporix, ensure the following:

    • Enable the Index item updated and Index item deleted events are enabled in Management Dashboard, see .

    • Activate Algolia or BatteryIncluded account.

    Initial steps

    1. Log in to the Management Dashboard and go to Administration -> Webhooks.

    2. Go to Svix by choosing the Open Svix Dashboard button.

    3. To start the endpoint configuration, go to Endpoints.

    4. Follow the steps for one of the providers: Algolia or BatteryIncluded.

    Algolia Configuration

    Creating and updating products

    1. In Endpoints, choose Add Endpoint and fill in the fields with the following values:

    • Endpoint URL - https://{ALGOLIA_APPLICATION_ID}.algolia.net/1/indexes - provide your Algolia application ID

    • Description - Algolia Create/Update

    • Message filtering - select only the index-item.updated event

    1. Choose Create and check if your configuration was properly saved.

    2. Go to the Advanced tab, provide the required custom headers and enable the transformation feature:

      • Key: X-Algolia-API-Key Value: YOUR_ALGOLIA_ADMIN_API_KEY

    Find the right values for your keys in your application settings (API Keys) in your Algolia account.

    1. In the Transformations section, set the transformation feature to enabled.

    1. In Edit transformation, start working on the Algolia mapping.

    Since there are differences between the default mapping in Svix and Algolia requirements, we need to adjust the mapping to make it work properly.

    The default mapping available in Svix is as follows:

    According to Algolia API Reference, the request that should be sent is as follows:

    To learn more about Algolia API, see .

    In the Edit transformation section, change the code to create the right mapping: a. Change the http method:

    b. Modify the target URL:

    c. Optional: Modify the message body. For example, you can add additional field like image based on media field:

    1. Choose Run test for the index-item.updated payload. As a result, you can see your transformed output.

    2. If the output is correct, save your changes.

    To test the configuration, create a product in Management Dashboard and after a few minutes check if it appears in your index in the Algolia account. With this configuration, every time when a product is created or updated, the appropriate event is propagated to Svix, transformed and sent to Algolia.

    Deleting products

    1. In Endpoints, choose the Add Endpoint. Fill in the fields with the following values:

    • Endpoint URL - https://{ALGOLIA_APPLICATION_ID}.algolia.net/1/indexes - provide your Algolia application ID

    • Description - Algolia Delete

    • Message filtering - select only the index-item.deleted event

    1. Choose Create and check if your configuration was properly saved.

    2. Go to the Advanced tab, provide the required custom headers and enable the transformation feature:

      • Key: X-Algolia-API-Key Value: YOUR_ALGOLIA_ADMIN_API_KEY

    Find the right values for your keys in your application settings (API Keys) in your Algolia account.

    1. In the Transformations section, set the transformation feature to enabled.

    According to Algolia API Reference, the request that should be sent is as follows:

    To learn more about Algolia API, see .

    In the Edit transformation section, change the code to create the right mapping: a. Change the http method:

    b. Change the target URL:

    c. If the output is correct, save your changes.

    To test the configuration, delete a product in Management Dashboard and after a few minutes check if it was deleted in your index in the Algolia account. With this configuration, every time when a product gets deleted, the appropriate event is propagated to Svix, transformed and then sent to Algolia.

    BatteryIncluded Configuration

    Creating and updating products

    1. In Endpoints, choose Add Endpoint. Fill in the fields with the following values:

    • Endpoint URL - https://api.batteryincluded.io/api/v1/collections/{BATTERY_INCLUDED_TENANT}/documents/import

    • Description - BatteryIncluded Create/Update

    • Message filtering - select only the index-item.updated event

    Replace the {BATTERY_INCLUDED_TENANT} with the value from the URL address in the BatteryIncluded Portal. For example, if the URL looks like this https://portal.batteryincluded.io/#/discover/customer.emporix, the {BATTERY_INCLUDED_TENANT} value is customer.emporix.

    1. Choose Create and check if your configuration was properly saved.

    2. Go to the Advanced tab, provide the required custom headers:

      • Key: X-BI-API-KEY Value: Your private integration key

    Find the right values for your keys in your connection settings in your BatteryIncluded account.

    To test the configuration, create a product in Management Dashboard and after a few minutes check if it appears in your index in the BatteryIncluded account. With this configuration, every time when a product is created or updated, the appropriate event is propagated to Svix, transformed and then sent to BatteryIncluded.

    Deleting products

    1. In Endpoints, choose Add Endpoint. Fill in the fields with the following values:

    • Endpoint URL - https://api.batteryincluded.io/api/v1/collections/{BATTERY_INCLUDED_TENANT}/documents/delete

    • Description - BatteryIncluded Delete

    • Message filtering - select only the index-item.deleted event

    Replace the {BATTERY_INCLUDED_TENANT} with the value from the URL address in the BatteryIncluded Portal. For example, if the URL looks like this https://portal.batteryincluded.io/#/discover/customer.emporix, the {BATTERY_INCLUDED_TENANT} value is customer.emporix.

    1. Choose Create and check if your configuration was properly saved.

    2. Go to the Advanced tab, provide the required custom headers and enable the transformation feature:

      • Key: X-BI-API-KEY Value: Your private integration key

    1. If the output is correct, save your changes.

    To test the configuration, delete a product in Management Dashboard and after a few minutes check if it was deleted in your index in the BatteryIncluded account. With this configuration, every time when a product is deleted, the appropriate event is propagated to Svix, transformed and then sent to BatteryIncluded.

    Example response:
    
    ```
    {
      "active": true,
      "searchKey": "84dc4886f81f805c42bdd89d64de751a",
      "applicationId": "8AP2HABA2I",
      "indexName": "exampleTenant",
      "provider": "ALGOLIA"  
    }   
    ```
    {
    "name": [
      "Banana"
    ],
    "localizedName": {
      "en": "Banana"
    },
    "categories": [
      "Food"
    ],
    "popularity": 0,
    "prices": [
      {
        "id": "659bd4e09862ec2ec136a61b",
        "itemId": {
          "itemType": "PRODUCT",
          "id": "659bd4bfb9ce7a0b975c33eb",
          "name": {
            "en": "Banana"
          }
        },
        "currency": "EUR",
        "originalAmount": 1.99,
        "effectiveAmount": 1.99,
        "location": {
          "countryCode": "DE"
        },
        "priceModelId": "63402c86af907617bb4e1234",
        "priceModel": {
          "id": "63402c86af907617bb4e1234",
          "name": {
            "en": "Default price model"
          },
          "description": {
            "en": "Default price model"
          },
          "includesTax": false,
          "measurementUnit": {
            "quantity": 1,
            "unitCode": "pc"
          },
          "tierDefinition": {
            "tierType": "BASIC",
            "tiers": [
              {
                "minQuantity": {
                  "quantity": 0,
                  "unitCode": "pc"
                },
                "id": "63402c86af907617bb4e9826"
              }
            ]
          }
        },
        "restrictions": {
          "validity": null,
          "siteCodes": [
            "main"
          ]
        },
        "tierValues": [
          {
            "id": "63402c86af907617bb4e9826",
            "priceValue": 1.99
          }
        ],
        "siteCode": "main"
      }
    ],
    "description": [
      "Banana"
    ],
    "localizedDescription": {
      "en": "Banana"
    },
    "image": "http://res.cloudinary.com/saas-ag/image/upload/v1704711465/lspaymentstage/media/659bd5286bec48360e3b3a83.jpg",
    "code": "Banana",
    "categoriesMissing": false,
    "available": false,
    "distributionChannel": [
      "ASSORTMENT"
    ],
    "sitePrices": {
      "DE": [
        {
          "id": "659bd4f29862ec2ec136a61c",
          "itemId": {
            "itemType": "PRODUCT",
            "id": "659bd4bfb9ce7a0b975c33eb",
            "name": {
              "en": "Banana"
            }
          },
          "currency": "EUR",
          "originalAmount": 2.49,
          "effectiveAmount": 2.49,
          "location": {
            "countryCode": "DE"
          },
          "priceModelId": "63402c86af907617bb4e1234",
          "priceModel": {
            "id": "63402c86af907617bb4e1234",
            "name": {
              "en": "Default price model"
            },
            "description": {
              "en": "Default price model"
            },
            "includesTax": false,
            "measurementUnit": {
              "quantity": 1,
              "unitCode": "pc"
            },
            "tierDefinition": {
              "tierType": "BASIC",
              "tiers": [
                {
                  "minQuantity": {
                    "quantity": 0,
                    "unitCode": "pc"
                  },
                  "id": "63402c86af907617bb4e9826"
                }
              ]
            }
          },
          "restrictions": {
            "validity": null,
            "siteCodes": [
              "DE",
              "FR"
            ]
          },
          "tierValues": [
            {
              "id": "63402c86af907617bb4e9826",
              "priceValue": 2.49
            }
          ],
          "siteCode": "DE"
        }
      ],
      "main": [
        {
          "id": "659bd4e09862ec2ec136a61b",
          "itemId": {
            "itemType": "PRODUCT",
            "id": "659bd4bfb9ce7a0b975c33eb",
            "name": {
              "en": "Banana"
            }
          },
          "currency": "EUR",
          "originalAmount": 1.99,
          "effectiveAmount": 1.99,
          "location": {
            "countryCode": "DE"
          },
          "priceModelId": "63402c86af907617bb4e1234",
          "priceModel": {
            "id": "63402c86af907617bb4e1234",
            "name": {
              "en": "Default price model"
            },
            "description": {
              "en": "Default price model"
            },
            "includesTax": false,
            "measurementUnit": {
              "quantity": 1,
              "unitCode": "pc"
            },
            "tierDefinition": {
              "tierType": "BASIC",
              "tiers": [
                {
                  "minQuantity": {
                    "quantity": 0,
                    "unitCode": "pc"
                  },
                  "id": "63402c86af907617bb4e9826"
                }
              ]
            }
          },
          "restrictions": {
            "validity": null,
            "siteCodes": [
              "main"
            ]
          },
          "tierValues": [
            {
              "id": "63402c86af907617bb4e9826",
              "priceValue": 1.99
            }
          ],
          "siteCode": "main"
        }
      ],
      "FR": [
        {
          "id": "659bd4f29862ec2ec136a61c",
          "itemId": {
            "itemType": "PRODUCT",
            "id": "659bd4bfb9ce7a0b975c33eb",
            "name": {
              "en": "Banana"
            }
          },
          "currency": "EUR",
          "originalAmount": 2.49,
          "effectiveAmount": 2.49,
          "location": {
            "countryCode": "DE"
          },
          "priceModelId": "63402c86af907617bb4e1234",
          "priceModel": {
            "id": "63402c86af907617bb4e1234",
            "name": {
              "en": "Default price model"
            },
            "description": {
              "en": "Default price model"
            },
            "includesTax": false,
            "measurementUnit": {
              "quantity": 1,
              "unitCode": "pc"
            },
            "tierDefinition": {
              "tierType": "BASIC",
              "tiers": [
                {
                  "minQuantity": {
                    "quantity": 0,
                    "unitCode": "pc"
                  },
                  "id": "63402c86af907617bb4e9826"
                }
              ]
            }
          },
          "restrictions": {
            "validity": null,
            "siteCodes": [
              "DE",
              "FR"
            ]
          },
          "tierValues": [
            {
              "id": "63402c86af907617bb4e9826",
              "priceValue": 2.49
            }
          ],
          "siteCode": "FR"
        }
      ]
    },
    "siteAvailabilities": {
      "DE": {
        "id": "DE:659bd4bfb9ce7a0b975c33eb",
        "stockLevel": 700,
        "productId": "659bd4bfb9ce7a0b975c33eb",
        "site": "DE",
        "available": false,
        "popularity": 0,
        "distributionChannel": "ASSORTMENT"
      },
      "main": {
        "id": "main:659bd4bfb9ce7a0b975c33eb",
        "stockLevel": 999,
        "productId": "659bd4bfb9ce7a0b975c33eb",
        "site": "main",
        "available": false,
        "popularity": 0,
        "distributionChannel": "ASSORTMENT"
      },
      "FR": {
        "id": "FR:659bd4bfb9ce7a0b975c33eb",
        "stockLevel": 50,
        "productId": "659bd4bfb9ce7a0b975c33eb",
        "site": "FR",
        "available": false,
        "popularity": 0,
        "distributionChannel": "ASSORTMENT"
      }
    },
    "category_assignments": [
      {
        "id": "2918ddc4-0c1c-4977-bb91-a4c366c535a6",
        "name": "Food",
        "localizedName": {
          "en": "Food"
        },
        "code": "food",
        "localizedSlug": {
          "en": "food"
        },
        "parent": null
      }
    ],
    "category_levels": {
      "level0": [
        "Food"
      ]
    },
    "_tags": [
      "product",
      "published"
    ],
    "category_ids": [
      "2918ddc4-0c1c-4977-bb91-a4c366c535a6"
    ],
    "objectID": "urn:yaas:saasag:caasproduct:product:lspaymentstage;659bd4bfb9ce7a0b975c33eb"
    }
      {
      "name": [
        "Banana"
      ],
      "localizedName": {
        "en": "Banana"
      },
      "categories": [
        "Food"
      ],
      "popularity": 0,
      "prices": [
        {
          "id": "659bd4e09862ec2ec136a61b",
          "itemId": {
            "itemType": "PRODUCT",
            "id": "659bd4bfb9ce7a0b975c33eb",
            "name": {
              "en": "Banana"
            }
          },
          "currency": "EUR",
          "originalAmount": 1.99,
          "effectiveAmount": 1.99,
          "location": {
            "countryCode": "DE"
          },
          "priceModelId": "63402c86af907617bb4e1234",
          "priceModel": {
            "id": "63402c86af907617bb4e1234",
            "name": {
              "en": "Default price model"
            },
            "description": {
              "en": "Default price model"
            },
            "includesTax": false,
            "measurementUnit": {
              "quantity": 1,
              "unitCode": "pc"
            },
            "tierDefinition": {
              "tierType": "BASIC",
              "tiers": [
                {
                  "minQuantity": {
                    "quantity": 0,
                    "unitCode": "pc"
                  },
                  "id": "63402c86af907617bb4e9826"
                }
              ]
            }
          },
          "restrictions": {
            "validity": null,
            "siteCodes": [
              "main"
            ]
          },
          "tierValues": [
            {
              "id": "63402c86af907617bb4e9826",
              "priceValue": 1.99
            }
          ],
          "siteCode": "main"
        }
      ],
      "description": [
        "Banana "
      ],
      "localizedDescription": {
        "en": "Banana "
      },
      "image": "http://res.cloudinary.com/saas-ag/image/upload/v1704711465/lspaymentstage/media/659bd5286bec48360e3b3a83",
      "code": "Banana",
      "categoriesMissing": false,
      "available": false,
      "distributionChannel": [
        "ASSORTMENT"
      ],
      "category_assignments": [
        {
          "id": "2918ddc4-0c1c-4977-bb91-a4c366c535a6",
          "name": "Food",
          "localizedName": {
            "en": "Food"
          },
          "code": "food",
          "localizedSlug": {
            "en": "food"
          },
          "parent": null
        }
      ],
      "category_levels": {
        "level0": [
          "Food"
        ]
      },
      "_tags": [
        "product",
        "published"
      ],
      "category_ids": [
        "2918ddc4-0c1c-4977-bb91-a4c366c535a6"
      ],
      "objectID": "urn:yaas:saasag:caasproduct:product:TENANT;659bd4bfb9ce7a0b975c33eb"
      }
      
    
    curl --location --request PUT 'https://api.emporix.io/configuration/{TENANT}/configurations/indexing_siteAwareFieldsStrategy' \
    --header 'authorization: Bearer {TOKEN}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "key": "indexing_siteAwareFieldsStrategy",
        "value": {
            "strategy": "MERGE"
        }
    }'
    
    
    curl --location --request PUT 'https://api.emporix.io/configuration/{TENANT}/configurations/indexing_siteAwareFieldsStrategy' \
    --header 'authorization: Bearer {TOKEN}' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "key": "indexing_siteAwareFieldsStrategy",
        "value": {
            "strategy": "SPLIT"
        }
    }'
    

    In the Message Filtering section, choose the index-item events:

    • index-item.deleted

    • index-item.updated

    1. Save your endpoint configuration by choosing the Create button.

    You can test the configuration by going back to the Emporix Management Dashboard and adding a new product. After a few minutes, you should see the updated delivery statistics in Svix.

    Key: X-Algolia-Application-Id Value: YOUR_ALGOLIA_APPLICATION_ID

    Key: X-Algolia-Application-Id Value: YOUR_ALGOLIA_APPLICATION_ID

    In the Transformations section, set the transformation feature to enabled.
  • In the Edit transformation section, change the code to create the right mapping. Modify the HTTP method:

  • "id" : "String",
    "code" : "String",
    "name" : "String",
    "localizedName" : "Map<String,String>", // Localized map
    "localizedSlug" : "Map<String,String>", // Localized map
    "parent" : "Object"
    }
    ],
    "tags" : String[], // Array of strings
    "popularity" : "Integer",
    "prices" : [
    {
    "id" : "String",
    "itemId" : {
    "id" : "String",
    "itemType" : "String" // PRODUCT
    },
    "currency" : "String",
    "originalAmount" : "Number",
    "effectiveAmount" : "Number",
    "location" : {
    "countryCode" : "String"
    },
    "salePrice" : {
    "discountAmount" : "Double",
    "discountRate" : "Double",
    "description" : "String"
    },
    "priceModelId" : "String",
    "priceModel" : {
    "id" : "String",
    "name" : "Map<String,String>", // Localized map
    "description" : "Map<String,String>", // Localized map
    "includesTax" : "Boolean",
    "measurementUnit" : {
    "quantity" : "Double",
    "unitCode" : "String"
    },
    "tierDefinition" : {
    "tierType" : "String",
    "tiers" : [
    {
    "id" : "String",
    "minQuantity" : {
    "quantity" : "Double",
    "unitCode" : "String"
    }
    }
    ]
    }
    },
    "restrictions" : {
    "validity" : {
    "from" : "String",
    "to" : "String"
    },
    "siteCodes" : "String[]" // Array of strings
    },
    "tierValues" : [
    {
    "id" : "String",
    "priceValue" : "Double"
    }
    ],
    "mixins" : "Map<String,Object>",
    "siteCode" : "String"
    }
    ],
    "medias" : [
    {
    "url" : "String",
    "position" : "Integer",
    "contentType" : "String",
    "customAttributes" : Map<String, Object>
    }
    ],
    "availability" : {
    "id" : "String",
    "stockLevel" : "Double",
    "productId" : "String",
    "site" : "String",
    "available" : "Boolean",
    "popularity" : "Integer",
    "distributionChannel" : "String"
    },
    "mixins" : "Map<String,Object>",
    "published" : "Boolean",
    "available" : "Boolean"
    Webhooks
    algolia.com
    batteryincluded.ai
    Enabling webhook service
    Algolia API Reference
    Algolia API Reference
    {
      "availability": {
        "available": false,
        "distributionChannel": "ASSORTMENT",
        "id": "main:643dacfad50d664c58694c2d",
        "popularity": -2147483648,
        "productId": "643dacfad50d664c58694c2d",
        "site": "main",
        "stockLevel": 2313
      },
      "available": false,
      "categoryAssignments": [
        {
          "id": "79eccb8b-b163-4cb9-9528-ed9468b9f740",
          "localizedName": {
            "en": "c1"
          },
          "name": "c1"
        }
      ],
      "code": "Oranges",
      "id": "643dacfad50d664c58694c2d",
      "medias": [
        {
          "contentType": "image/jpeg",
          "customAttributes": {
            "height": 800,
            "name": "oranges.jpeg",
            "sizeKB": 156.7138671875,
            "width": 1200
          },
          "mainImage": false,
          "url": "http://res.cloudinary.com/saas-ag/image/upload/v1681763617/lsindexdbstage/media/643dad208fc03d22f4e857e6"
        }
      ],
      "popularity": -2147483648,
      "prices": [
        {
          "currency": "EUR",
          "effectiveAmount": 1.55,
          "id": "643dad10c0dc2925289a6206",
          "itemId": {
            "id": "643dacfad50d664c58694c2d",
            "itemType": "PRODUCT",
            "name": {
              "en": "Oranges"
            }
          },
          "location": {
            "countryCode": "DE"
          },
          "originalAmount": 1.55,
          "priceModel": {
            "description": {
              "en": "Default price model"
            },
            "id": "63402c86af907617bb4e1234",
            "includesTax": false,
            "measurementUnit": {
              "quantity": 1,
              "unitCode": "pc"
            },
            "name": {
              "en": "Default price model"
            },
            "tierDefinition": {
              "tierType": "BASIC",
              "tiers": [
                {
                  "id": "63402c86af907617bb4e9826",
                  "minQuantity": {
                    "quantity": 0,
                    "unitCode": "pc"
                  }
                }
              ]
            }
          },
          "priceModelId": "63402c86af907617bb4e1234",
          "restrictions": {
            "siteCodes": [
              "main"
            ]
          },
          "siteCode": "main",
          "tierValues": [
            {
              "id": "63402c86af907617bb4e9826",
              "priceValue": 1.55
            }
          ]
        }
      ],
      "published": true,
      "siteCode": "main",
      "tags": [
        "product",
        "published"
      ]
    }
    
    
    "id": "String",
    "siteCode" : "String"
    
    {
      "id": "643dab38a9e0f24d6bda45ee",
      "siteCode": "main"
    }
    
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
      // modify the webhook object...
      
      // and return it
      return webhook
    }
    curl "https://${APPLICATION_ID}.algolia.net/1/indexes/contacts/myID" \
         -X PUT \
         -H "X-Algolia-API-Key: ${API_KEY}" \
         -H "X-Algolia-Application-Id: ${APPLICATION_ID}" \
         -d '{
                "name": "Betty Jane Mccamey",
                "company": "Vita Foods Inc.",
                "email": "[email protected]"
             }'
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
    
      webhook.method = "PUT";
      return webhook
    }
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
    
      var indexName = "emporix_" + webhook.payload.siteCode;
      webhook.url = webhook.url + "/" + indexName + "/" + webhook.payload.id;
      webhook.method = "PUT";
      return webhook
    }
    
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
    
      if(webhook.payload.medias && webhook.payload.medias.length > 0) {
        webhook.payload.image = webhook.payload.medias[0].url;
      }
    
      var indexName = "emporix_" + webhook.payload.siteCode;
      webhook.url = webhook.url + "/" + indexName + "/" + webhook.payload.id;
      webhook.method = "PUT";
      return webhook
    }
    curl -X DELETE \
         -H "X-Algolia-API-Key: ${API_KEY}" \
         -H "X-Algolia-Application-Id: ${APPLICATION_ID}" \
        "https://${APPLICATION_ID}.algolia.net/1/indexes/contacts/myID"
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
    
      webhook.method = "DELETE";
      return webhook
    }
    /**
     * @param webhook the webhook object
     * @param webhook.method destination method. Allowed values: "POST", "PUT"
     * @param webhook.url current destination address
     * @param.webhook.eventType current webhook Event Type
     * @param webhook.payload JSON payload
     * @param.webhook.cancel whether to cancel dispatch of the given webhook
     */
    function handler(webhook) {
    
      var indexName = "emporix_" + webhook.payload.siteCode;
      webhook.url = webhook.url + "/" + indexName + "/" + webhook.payload.id;
      webhook.method = "DELETE";
      return webhook
    }
      /**
    * @param webhook the webhook object
    * @param webhook.method destination method. Allowed values: "POST", "PUT"
    * @param webhook.url current destination address
    * @param.webhook.eventType current webhook Event Type
    * @param webhook.payload JSON payload
    * @param.webhook.cancel whether to cancel dispatch of the given webhook
    */
    function handler(webhook) {
      // modify the webhook object...
    
      // convert data
      const playload = [webhook.payload.id]
    
      webhook.method = "DELETE";
      webhook.payload = playload
    
      return webhook
    }
    What is OE?
    Rulestore
    OE documentation
    Authorization and scopes guide
    Rewards and Promotions Services
    API Standard Practices
    API Standard Practices
    Webhook Service guide
    Webhook Service
    B2B Token
    Customer Segment Service Tutorials
    Customer Service API
    Brand Service guide
    Brand Service
    Label Service Tutorial
    Label Service
    AI Service
    Order Service
    Quote Service
    Country Service guide
    Currency Service guide
    Pricing guide
    Language Configuration guide
    Measurement units guide
    Standard practices guide
    Identity and access management (IAM) Service guide
    IAM Service
    Vendor Service
    Reward Points Service guide
    Reward Points Service
    Media Management Service guide
    Media Management Service
    Returns Service
    Company and Customers
    Coupons
    Order Service
    Order Service
    Order Service Tutorials
    Availability Service guide
    Availability Service
    Order Service
    Order Service
    Customer Management
    Approval Service
    Catalog Service guide
    Catalog Service
    Category Service guide
    Category Service
    Customer Segment Service
    Returns Service guide
    Returns Service
    Schema Service
    Schema Service
    Schema Service Tutorial
    Schema Service
    Configuration Service
    Cart Service Tutorial
    Cart Service guide
    Cart Service
    Site Settings Service
    Customer Service
    Orders Service
    Returns Service
    Product Service guide
    Product Service
    Unit Handling Service guide
    Unit Handling Service
    Quote Service Tutorials
    Quote Service
    Approval Service
    Tax Service guide
    Tax Service
    Emporix Tax Service
    Site Settings API
    Price Service API
    Tax Service API Tutorial
    Price Service Tutorial
    Cart Service Tutorial
    OAuth Service
    Coupon Service guide
    Coupon Service
    Price Service guide
    Referral Coupon Management in Coupon Service
    Referral Coupon Management in Coupon Service
    Language Configuration guide
    Currency guide
    Retrieving a list of categories
    Retrieving configurations
    Finding units by filters with sorting and paging
    Retrieving a site
    Emporix API Configuration Service
    Standard practices in Emporix API
    service access token
    Authorization and scopes guide
    service access token
    Retrieving a configuration
    service access token
    Updating a configuration
    service access token
    Updating a product's details
    Site Settings Service guide
    Site Settings Service Service
    mixins
    How to add custom attributes to a site
    How to set up direct debit payments
    How to enable payment methods
    OAuth Service
    OAuth Service
    OAuth Service
    Payment Gateway service
    Delivery Service
    Shipping Service
    Price Service guide
    Price Service
    Price Service
    Site Settings Service
    Currency Service
    Currency exchange
    Indexing Service Tutorial
    Indexing Service