View Products

To browse the product catalog, click on “Products” in the main menu. The interface will provide you a filterable list of products in a list view and a catalog view:

List View

Catalog View


You can filter by

  • Vendor: The supplier of the product
  • Country: Availability may be different per country
  • Category: Main product category


On the top right can you switch between list and catalog view and define the number of products shown per page.


You will be provided with information about:

  • Name: Product name
  • Category: Main product category
  • Vendor: The supplier of the product
  • Active: Whether a product is active or not. Inactive products will not be shown in the recommendations on your website.


In addition, the different prices are provided for that product. Learn more about the prices in this documentation


View Order Details

To view more details about an order, just click on the order row. The upcoming page will provide the following information:

Order Detail Page


On top you get informed about:

  • Order Id: The unique identifier for every order
  • Created: The day and time the order was created
  • Updated: The day and time the order was updated for the last time
  • Reference: Your order reference number
  • Status: Status of the order

On the main page you get the following information:

Order Items : Overview on the products that were ordered

  • SKU: Which product was ordered
  • Quantity: How many items were ordered
  • Selling Price: Which price was paid by the customer
  • Vendor Order Id: The unique identifier of that order at the vendor
  • Status: Status of the SKU

With a click on the SKU row, you will also get information about the product name and a product picture. Moreover, you can cancel the order or request a return.

Order item states

The sku can have the following states:

  • Created: The order item was placed in our system but not yet approved. Cancellation is possible.
  • Ordered: The order item was purchased at the vendor system. Cancellation is no longer possible.
  • Shipped: The order item was shipped by the vendor. Returns are now possible
  • Delivered: The order item reached the customer. This status is only provided in case the vendor offers tracking.
  • Closed: The final order item state. No more changes to the order and the status are possible.
  • Cancelled: The order item was successfully cancelled.
  • Awaiting_return: The return of the order item is expected.
  • Returned: The order item was returned.
  • Validating: Something extraordinary went wrong with the order, manual checkup and intervention is necessary.


On the right section you get customer information:

  • Contact information
  • Shipping Address

On the page bottom you get information on the order history: A timeline when and why the order status changed

Vendor Concept

As a platform, 35up connects distributors (vendors) to customers on third-party websites (sellers). The vendors provide the supply of cross-selling products that their customers demand.

Once a sellers' customer purchases a product, 35up will receive the order and pass it on to the vendor. The vendor will then drop-ship the products to the end customer.


Order and Payment Flow

We include only large-scale vendors with drop-shipping capabilities on our platform, to ensure a fast and high-quality delivery and product experience for the end customer.

Vendor Integration

There are two ways to get integrated. For large scale operations or those that require real time order placement, 35up build a proprietary vendor service. For all others, we offer dedicated SFTP servers and a csv integration.


Shipment File

To transfer the shipment status back to 35up, a daily shipments.csv needs to be generated and uploaded to the dedicated SFTP server by the vendor. The file name should include a timestamp and be unique.

The file must contain following columns, including header:

  • shipment_id: Id of the shipment to clarify if an shipment included more than one item
  • order_id: 35up order id from the orders.csv
  • item_id: 35up item id from the orders.csv
  • item_sku: Vendor SKU
  • shipped_qty: Quantity shipped of that item
  • shipped_at: Date and time the shipment was made in UNIX timestamp
  • shipping_provider: (optional) Which shipping provider is used
  • shipping_method: (optional) Which shipping method is used
  • tracking_code: (optional) Tracking code of shipment
  • tracking_url (optional) Tracking url of shipment

The csv file should provide one line per item_id and order_id

Example file download

Return File

To transfer the return status back to 35up, a daily returns.csv needs to be generated and uploaded to the dedicated SFTP server by the vendor. The file name should include timestamp and be unique.

The file must contain following columns, including header:

  • order_id: 35up order id from the orders.csv
  • item_id: 35up item id from the orders.csv
  • item_sku: Vendor SKU
  • returned_qty: Quantity shipped of that item
  • received_at: Date and time the return was received in UNIX timestamp
  • status: (optional) Either "vendor_received" to mark that return was received or "confirmed" to mark that return was received and accepted. Default is "confirmed"
  • message (optional) Message with more details on the return

The csv file should provide one line per item_id and order_id

Example file download

Return Flow

As it does for other interfaces, 35up builds a proprietary solution to connect to the vendor’s return services.

To process returns, it is necessary to follow interactions. In case a vendor cannot provide an automated interface, 35up will store respective information in an available space and in a structured way.

Confirm Returns

If a seller requests a return and the customer ships it back to the vendor, the vendor has to mark the item as arrived, and — if it was returned without reason — assess whether the product is damaged in any way. The confirmation can be done either through the 35up admin interface, or the vendor’s interface (if available), based on:

  • 35up order ID
  • Vendor reference ID (if passed on via order interface)

To ease the process, 35up provides the seller a return label barcode with both sets of information.

Create Returns

If the product never reaches the customer, or if the customer sends the item back without notifying 35up or the seller, the vendor has to create a return and assess any potential product damage.

The confirmation can be done either through the 35up admin interface, or the vendor’s interface (if available), based on:

  • 35up order ID
  • Vendor reference ID (if passed on via order interface)

Request Return

Returns can be requested within the order detail view. To request a return, click on the “request return” button. A return request is valid when the order is actually delivered already and no other, competing return was requested before. Once the return request was made, the return details can be viewed within the order detail view.

Request Cancellation

Cancellations can be requested within the order detail view. To request a cancellation, click on the “request cancellation” button. A cancellation request is only valid until the order is getting processed by the vendor.

Product Feed

To include the vendor's products, 35up will provide an SFTP server for the vendor. On this server, the vendor has to upload a product catalog csv file, including all product information availability quantities. The file has to be update regularly, to ensure no out of stock products are listed.

The structure of the csv file is flexible, however, following information need to be provided.

  • Product ID (SKU): A unique identifier of the product
  • Product name 
  • Short description: A one-line description about the product
  • Long description: A multi-line description about the product, with more details
  • Thumbnail image: At least one image that can be used as a thumbnail
  • Recommended seller price: A recommended price for the product
  • Shipping price: Cost to ship the item
  • Return price: Additional costs in case the item is returned (does not include return shipping prices)
  • Purchase price: The price 35up pays the vendor
  • Availability: Is your product currently on stock

To enable 35up to recommend your products to larger enterprises running SAP, in addition, following information should be provided:

  • GTIN/EAN: A global unique identifier of the product
  • Width: Width of the product (with and without packaging)
  • Height: Height of the product (with and without packaging)
  • Length: Length of the product (with and without packaging)
  • Weight: Weight of the product (with and without packaging)
  • Materials: List of materials of the products
  • Color: The main color of the product

Any additional information is welcomed and used internally.


Payment Flow

In the default case, payment collection is the seller’s responsibility. The seller collects the amount from the customer. 35up will invoice the seller, and the vendor will invoice 35up.


Order and payment flow

The exception to the default case happens when the seller only collects the IBAN from the customer and not the amount itself. In this case, the IBAN can be passed to 35up to collect the cross-selling item’s purchase amount.

Plugin Integration

The use of a plugin eases the integration and does not require additional coding. We currently have plugins under development for the following shop systems:

Magento

Shopware Logo
Shopware

Please contact us if you are interested in testing our plugins before release.

Product Feed

To include the vendor's products, 35up will build a proprietary interface to load the vendor’s product feed onto the platform. The product feed can be based on an API, an XML, and EDI, or a CSV/TXT file.

Whatever the format, the feed needs to provide this basic information about each and every product:

  • Product ID (SKU): A unique identifier of the product
  • Product name 
  • Short description: A one-line description about the product
  • Long description: A multi-line description about the product, with more details
  • Thumbnail image: At least one image that can be used as a thumbnail
  • Recommended seller price: A recommended price for the product
  • Shipping price: Cost to ship the item
  • Return price: Additional costs in case the item is returned (does not include return shipping prices)
  • Purchase price: The price 35up pays the vendor
  • Availability: Is your product currently on stock

To enable 35up to recommend your products to larger enterprises running SAP, in addition, following information should be provided:

  • GTIN/EAN: A global unique identifier of the product
  • Width: Width of the product (with and without packaging)
  • Height: Height of the product (with and without packaging)
  • Length: Length of the product (with and without packaging)
  • Weight: Weight of the product (with and without packaging)
  • Materials: List of materials of the products
  • Color: The main color of the product

Any additional information is welcomed and used internally.


Pricing concept

For sellers, 35up provides you with 4 relevant prices:

  • Recommended Selling Price: This is the price our platform recommends you to charge from your customers for a certain product. The price is gross, including shipping. However, you can overwrite the recommended price with the selling price, if you want to charge your customers more or less.
  • Selling Price: To overwrite the recommended selling price, you can just set a new selling price. This selling price will be charged from your customers if they buy this product.
  • Purchase Price: This is the price 35up will charge you for selling the product. This is independent of your selling price. 
  • Return Price: In case you are returning a product, you will have to refund your customer and you will get refunded your purchase price paid. However, some vendors request a fixed price to accept a return, the return price

Overwrite Product Price

To change a price of a product, select the product in the product overview and click on the selling price. You can now set a new price and confirm with a click on the check mark.

Order Interface

Because 35up builds a proprietary interface for every vendor, we can work with every format available (API, XML, EDI, csv, txt).

However, the vendor’s order interface has to accept and process the following information, so that orders can be processed:

  • Customer’s first and last name
  • Additional address field
  • Shipping street
  • Shipping zip code
  • Shipping city
  • Shipping state and country
  • Order number
  • Customer's email address
  • SKU of product ordered
  • Quantity of product ordered

Moreover, 35up requires a reference order number and a process to receive order status updates from the vendor.


Order Flow

Every product that is ordered at your shop will pass through your backend, the 35up platform, and ultimately end  up in the vendor's system.

Order Flow

The customer experiences the journey on your website seamlessly. However, he/she will receive two different packages: one from your shop with the base product and one from the vendor with the cross-selling product.

Getting Started (Returns)

The return management does not need a separated integration; it can be fully managed through admin. In the admin area, you can request returns for your customers or confirm incoming returned products.

However, a full integration of the return process is beneficial and can fully automate the process. The integration enables you to:

  • Connect your current return process to 35up
  • Connect automated refund processes to 35up
  • Automatically generate returns for the cross-selling item when the base product is returned
  • Avoid manual input and manual errors

Return Flow

Once the customer requests a return, the request needs to be sent to 35up to create a return label. With this return label, the customer then sends the product directly back to the vendor.



Order and return flow

To refund the customer is in your responsibility. 35up will refund your purchase price.

View Orders

To get an overview of your orders, click on the main menu on “Orders”. The interface will provide you a filterable list of orders:

Order List

You can filter by:

  • Date the order was created: Select the date and time range at "Created" to define the scope of orders you want to get listed
  • Status of the order: Select the fitting value at "Status"
  • Email: Select "Email" as the filtering value next to the magnifier and enter the corresponding mail
  • Reference: Select "Reference" as the filtering value next to the magnifier and enter your internal order number
  • First Name: Select "First Name" as the filtering value next to the magnifier and enter the name to filter for
  • Last Name: Select "Last Name" as the filtering value next to the magnifier and enter the name to filter for
  • Order Id: Select "Order id" as the filtering value next to the magnifier and enter the 35up platform order id

You can combine filters and delete them by clicking on the "x" next to the filter value in the bar

Moreover, you can select the number of orders you want to view per page.


The order list provides your the following information:

  • Order Id: The unique identifier for every order
  • Created: The day and time the order was created
  • Customer: The name of the customer who ordered
  • Reference: Your order reference number
  • Status: Status of the order
  • Total amount: The total amount paid by the customer
Order states

The order can have the following status:

  • Pending: The order was placed in our system but not yet approved
  • Approved: The order was approved by the seller and will be forwarded to the vendor
  • Processing: The order is being processed by the vendor. This status includes the picking of the item. Potential problems of the order in this state are for example "out of stock", "slow picking" or "not yet handed over to the logistics provider"
  • Fulfilled: The order is fulfilled by the vendor. In case the vendor does not provide tracking, this is the last status that is received. Potential problems of the order in this state are "delivery problems", "wrong addresses" or "longer delivery times"
  • Delivered: The order reached the customer. This status is only provided in case the vendor offers tracking.
  • Validating: Something extraordinary went wrong with the order, manual checkup and intervention is necessary.
  • Pending_cancellation: The order was requested to be cancelled. Additional steps to fulfil the cancellation are necessary, e.g., refunding the customer.
  • Cancelled: The order was successfully cancelled.
  • Closed: The final order state. No more changes to the order and the status are possible.

Getting Started (Recommendations)

The basic concept of our API is to keep everything as simple as possible for you and to avoid any unnecessary backend work on your side.

From Developers, For Developers

To achieve this goal, we reduced the required fields in the API recommendation endpoint to a minimum and thereby circumvented the necessity for you to do any backend matching.

Get Your First Recommendation

A product recommendation consists of two parts. First, you inform us which product is in the basket, and then we automatically provide you with a list of products that would be a great fit. This structured list of products includes all relevant information.

To get your first recommendation, please provide us the following information:

  • The product in your basket: Simply send us the name or any other text string — we accept any format
  • A session to identify the request: You can provide us with any session information you have.
  • Your Partner ID, to identify yourself: The recommendations are public and do not require authorization.

The amount of information is very limited — at this point, no personal information about your customer is necessary.

Change the Default

The basic setup of your account is stored and can be changed in the admin interface. However, you always have the ability to edit the basic information connected to your account during a recommendations request, including:

  • Country
  • Language
  • Currency
  • Number of recommendations

If you leave this information blank during your request, we will use the default values stored for your account.

Get More Specific Recommendations

To improve the recommendations, you can voluntarily provide more information such as:

  1. Context-related information
  2. Product-related information
  3. Customer-related information

 

None of this information is required, but if you include it, the customer-related information must be GDPR compliant.

Context-related Information

Context-related information is a fully flexible tool you can use to give us any information about the shopping situation, including (but not limited to):

  • The request’s country of origin
  • Whether it is an ongoing marketing campaign
  • Where the user is coming from‍

 

Product-related Information

The more we know about the product in the basket, the better we can predict which cross-selling item best fits the profile. Therefore, you have the ability to provide us with more information about the product, such as:

  • Product price 
  • Actual value of the product (without discounts or subsidies)
  • Color or design
  • Product category
  • Any other product-related tag

Customer-related Information

In some cases, information about the customer is relevant for the product recommendation and is GDPR compliant. In this case, the following customer information can be provided to make the recommendation fit even better:

  • Age
  • Gender
  • Postal code
  • Country
  • City

  • ...

Order File

To transfer the orders back to the vendor, a daily orders.csv is generated and uploaded to the dedicated SFTP server. The vendor has to download and process the file, and move it to an archives folder. The order file includes the timestamp and is unique.

The file contains following columns, including header:

  • order_id: The 35up internal identifier of the order. This one has to be passed throughout all communication
  • item_id: The 35up internal identifier of the order item. This one has to be passed throughout all communication
  • item_sku: The vendor SKU for the item bought
  • item_qty: The qty of the item bought
  • shipping_first_name: First name of the shipping address of the end customer
  • shipping_last_name: Last name of the shipping address of the end customer
  • shipping_company: (optional) Company name of the shipping address of the end customer
  • shipping_extra: Additional line of the shipping address of the end customer
  • shipping_street_name: (optional - either street name and number or line) Street name of the shipping address of the end customer
  • shipping_street_number: (optional - either street name and number or line) Street number of the shipping address of the end customer
  • shipping_street_line: (optional - either street name and number or line) Street name and number of the shipping address of the end customer
  • shipping_city: City of the shipping address of the end customer
  • shipping_state: (optional) 2 digit (ISO 3166-1 alpha-2) state code of the shipping address of the end customer
  • shipping_country_code: 2 digit (ISO 3166-1 alpha-2) country code of the shipping address of the end customer
  • shipping_postcode: Post code of the shipping address of the end customer

In case a customer orders more than one different item, multiple lines will be generated within the file.

Example file download

Cross-Selling Widget

The recommendations are displayed in the cross-selling widget. Moreover, the widget provides the customer with additional information and allows the customer to add the products to the cart.

The widget is fully configurable and can be adjusted to the look and feel of your website.

Positioning

You can decide where the widget should be displayed (e.g., in the basket, the checkout, a popup, the product-detail page, or on all pages mentioned). The best-fitting location and amount of integrations depend on your user journey.

Basket

The most common location in which to display the cross-selling widget is the basket. The customer has already selected his/her final product and has displayed a willingness to buy, so that is the perfect opportunity to show fitting cross-selling items. Moreover, the basket is a late stage in the journey and shows a high-level of trust in your brand. However, it is still possible to seamlessly add complementary products to the basket without the need to recalculate the final price and taxes.

Overlay to Basket

Another option is to display the widget as a popup between the order detail page and the basket, right after the customer adds the base product. In this case, the customer has already selected his final product and demonstrated a high willingness to buy it. An overlay reminds him about fitting cross-selling items and creates a high awareness of the complementary product. In addition, there is no need to recalculate the final price and taxes.

Product Detail Page

The cross-selling widget can also be displayed to show complementary items on every product-detail page. This display enriches the product-detail pages. To prevent the complementary item(s) from replacing the base product purchases, an "add to cart" click should not lead to a direct load of the basket, but should stay on the product-detail page.


Extended Fields

Rationale

Some of the product data available in the catalog is very rarely used in the context of rendering cross-selling widgets for the final customers containing recommended products. For this reason, the fields included in the response of a GET /v1/recommendations request is kept to a minimum, making the data modeling simpler and improving performance and response time.

However, some clients, mainly when consuming the data from their backends, may have different data needs because of a number of reasons. For this use-case, the access to extended response fields is made available.

What are Extended Fields

The product data included in the response of

GET /products/:sku

that is not present in the default response of

GET /v1/recommendations

are considered extended fields. These fields are usually optional and may or may not exist for a certain product.

Some examples are:

  • taxes
  • gtin.ean
  • gtin.isbn
  • specs.weight
  • specs.width
  • specs.height
  • specs.length
  • delivery.package.weight
  • delivery.package.width
  • delivery.package.height
  • delivery.package.length
  • vendor.address.support.email
How To Use Extended Fields

In order to receive extended fields in the response of GET /v1/recommendations, the additional query parameter extended=... must be passed together with the usual query parameters. The extended parameter should contain desired optional fields to include in the response’s product model. It can be used in two different ways:

  • the field extended=the.field.name can be repeated multiple times, once per additional extended field. For example: GET /v1/recommendations?seller=my-awesome-shop&country=de&lang=de&extended=taxes&extended=gtin.ean
  • the field extended=... also supports a comma-separated list of fields to be included, in which case it can be passed a single time. Example: GET /v1/recommendations?seller=my-awesome-shop&country=de&lang=de&extended=taxes,gtin.ean,delivery.package.weight

In case the extended parameter is passed, the requested additional fields will be included in the response if they are available. Products without the requested fields will still appear in the provided list of recommendations.

Making Extended Fields Required

In case the requested extended fields are always required, the parameter extendedRequired=true may be passed, which will cause any product not containing the requested extended fields to not be included in the final response.

Using this parameter is, however, not recommended. Any non-compliant products are filtered in a final post-processing step, which means that it can greatly reduce the number and quality of the recommendations, potentially leading to a much greater number responses with an empty set of recommendations, even if eligible products are still available in the platform.

Delivery and Returns

To ensure a great customer experience, all vendors must ensure delivery within two to three business days via drop-ship to the end customer.

Our sellers provide our customers a 14-day return-without-a-reason policy. The vendor therefore must accept returns and fully refund the seller. However, they can charge a return fee.


Deactivate products

You can deactivate every product if you don’t want it to appear in the recommendations on your website. To do so, go to the product overview page and deactivate the item.

Cancellation File

To transfer the cancellation status back to 35up, a daily cancellations.csv needs to be generated and uploaded to the dedicated SFTP server by the vendor. The file name should include timestamp and be unique.

The file must contain following columns, including header:

  • order_id: 35up order id from the orders.csv
  • item_id: 35up item id from the orders.csv
  • item_sku: Vendor SKU
  • cancelled_qty: Quantity cancelled of that item
  • message: (optional) a message explaining the reason for the cancellation

The csv file should provide one line per item_id and order_id

Example file download

Bulk Edit Products

To change the same value for more than one product, select the products by clicking on the checkmark field on the left. To select all products of the page, click on the checkmark field in the table header.

A counter on the left top will provide you with the information on how many products you selected. You can then change the price or the activation status. With a click on “Save changes” you will overwrite the current value by your new settings for all selected products.


Basket Data Flow

To allow a seamless customer journey, the cross-selling items must be added to the basket and processed on the backend. The handover of the data from the cross-selling widget to the basket and the backend depends on the type of integration (API/plugin) and the shop systems involved.

The minimum requirements are as follows:

  • SKU 
  • Name 
  • Price 
  • Quantity 

Based on this information, a new total price can be calculated and a new comprehensive basket can be rendered.

API Integration (Webhooks)

Rationale

35up offers the possibility of sending requests to predefined endpoints in reaction to events when they happen in the platform. Using this strategy, the cronjobs and other “pull” strategies — often expensive and inevitably delayed in time — can be replaced by “push” strategies that process the necessary data in near real-time and are much less resource-intensive.

For example, in order to detect order status changes, a traditional “pull” strategy would be implemented by regularly querying the GET /v1/orders/:order-id endpoint every X minutes/hours interval. As the number of orders accumulates, this cronjob could quickly result in hundreds of API calls on every run, potentially running for a long time, many times per day. This puts a lot of strain on both client and server systems, even it is clear that several of the references are not expected to be updated anytime soon, sometimes for a few days.

At the same time, the “pull” strategy is not very reliable, as it will always be delayed in time potentially for as much as the interval chosen to run the cronjob. If it runs once per day, the data update will potentially arrive 24h later. Also, when not implemented very carefully, cronjob batch processing can very easily lead to common errors, specially for long-running ones, such as abruptly terminating the process before the queue can reach the end or race conditions leading to deadlocks and duplicated operations.

Using a “push” strategy, both systems can leverage from a fully event-driven approach and handle the requests as they happen, only when they happen, as soon as they happen. The system requirements in this case are very different from the “pull” strategy, requiring the client (the seller) to keep a service permanently running and accepting requests coming from the server (35up). It also requires that the server can react and send predefined requests when events happen.

All the necessary requirements on 35up side are already fulfilled. Our systems are composed by distributed, event-driven microservices, only requiring the externalization of the important events to the client. On the client side, bringing a service up and running, accepting external connections should be an extremely easy task using virtually any programming language and framework existing in the market. In fact, it is estimated that such effort is nearly the same, if not easier, than composing a reliable set of cronjobs to perform the same operations, while also being substantially cheaper.

Current Availability

The webhook system running on the 35up platform is currently in “Beta” version and not publicly available, but sellers wanting to use it may request to join the beta program.

During the testing phase, only a limited number of events are available and there’s no user-friendly interface. In fact, the requests are configured by 35up’s Engineers directly according to the sellers’ specifications and the systems’ current capabilities.

Webhook Endpoint Specs

The webhook endpoints on the sellers side are expected to be running 24h per day, every day continuously since the moment the webhook is configured. The webhook service hosted by the client should follow the requirements below:

  • the webhook application should ideally be hosted under a domain or subdomain fully controlled by the seller. Using IP addresses for webhooks is not recommended and should be avoided, unless the seller is the sole user and permanent owner of a static IP address
  • the webhook must be exposed using HTTPS with a reasonably modern TLS certificate (v1.2 or v1.3). The TLS certificate should be issued by a well established Certificate Authority and have sufficiently long private keys (minimum 2048-bit RSA or 256-bit ECDSA). Also, the use of weak ciphers is expected to be disabled at the clients side. Using a private Certificate Authority and privately issued TLS certificates, although technically possible, require special configuration on the server’s side and should be avoided
  • the webhook endpoints must support either basic, digest and/or token-bearing HTTP authentication
  • HTTP 1.1 POST requests must be supported, containing JSON-encoded payload (Content-Type: application/json)
  • the client should respond with status code 202 Accepted to indicate successful receipt of the message, but any status code in the 2xx family will also be interpreted as success
  • a client response containing 4xx or 5xx status codes will be treated as failures
  • client responses containing 3xx status codes won’t follow redirects, for security reasons, and will count as failures
  • in case the webhook endpoint is unreachable, the requested will be retried for a certain number of times using a back-off algorithm. After the maximum number of retries is reached, all subsequent webhook requests will be paused until the outage is resolved
  • the response to a webhook request may include a short body (using JSON is recommended), which will be recorded on our servers and can be helpful for debugging purposes

An important warning: the events system is designed to follow an “at-least-once, entity-ordered” delivery. In an “at-least-once” approach, the client’s system should be able to tolerate duplicated events. Although rare, duplicated requests about the same event can still happen and, therefor, handling of such events must be done in an idempotent manner. By “entity-ordered” it means that the events about the same base entity id are delivered in chronological order, which does not mean that all events are globally chronological.

The constraints above favor a simpler implementation on both the client and server sides, releasing the need of dealing with multiphase commits, acknowledgment protocols and distributed transactions, as long as all events are effectively delivered at least once and idempotency of the operations is always observed.

Available Events

Events in the 35up platform are named using reverse-domain namespace starting with the io.tfup prefix, followed by the scope/audience “subdomain”, entity (and sub-entities) and event type. New scopes/audiences, entities/sub-entities and event types are expected to be added in the future.

The following events are currently available as triggers for webhook requests containing updates for the different entities used to process a customer order:

  • io.tfup.sellers.Order.Created
  • io.tfup.sellers.Order.StatusChanged
  • io.tfup.sellers.Order.Item.Created
  • io.tfup.sellers.Order.Item.StatusChanged
  • io.tfup.sellers.Order.Shipment.Created
  • io.tfup.sellers.Order.Shipment.StatusChanged
  • io.tfup.sellers.Order.Return.Created
  • io.tfup.sellers.Order.Return.StatusChanged

In addition to the above, the following inventory event may be interesting to react to product availability changes. Exposing the event below is considered experimental. The number of pushed events can be very (we mean VERY) numerous. Because of that, only the SKUs included in seller-specific product selections (such as custom categories) will be included in outgoing webhook requests:

  • io.tfup.inventory.Product.Availability.Changed (experimental, coming soon)
Events Payload

The documentation is under development and will be published soon. The data in the request body is JSON-encoded.

The payload of each webhook request will include at very least the ****id field of the entity in which the event occurred and its current status.

During the beta program, the payload of webhook requests can be tailored to the sellers’ needs using any of the fields available under the entity in which the event occurred. More details about the available field in the upcoming documentation.

An exception to this rule are the inventory-related events, which can currently only contain the product SKU and the affected fields (price or availability).

Some examples:

  • an io.tfup.sellers.Order.Created event can be configured to contain any other fields of the newly created Order entity in the payload of the webhook request, but will minimally contain at least the order id and current status
  • an io.tfup.inventory.Product.Availability.Changed event will contain only the product sku and the updated availability. Currently the payload of a webhook containing this event can’t be augmented using other fields from the product entity and will only be fired for products included in seller-specific product selections, in order to narrow down the amount of events

API Integration (Returns)

Please check the API Reference for all technical details about the API.

To request or patch a return requires authorization and needs to be executed on the backend.

Authorization

35up uses the standard HTTP authorization, based on base64 encoding.


Header: Authorization
Value: basic username:password (base64 encoded)

Most tools and libraries will automatically handle this process.

Request a Return

To place an order, you need to make an authorized POST request to:

https://api.35up.io/v1/returns

All the information needed is part of the request body:

{
 "orderId": "42346434",
 "items": [
   {
     "itemId": "412412",
     "sku": "vendor_id/FEI60XX114014XXAPIP80",
     "quantity": 2
   },
   {
     "itemId": "100397",
     "sku": "vendor_id/FEI60XX114014XXAPIP81",
     "quantity": 1
   }
 ],
}
Return information
  • OrderId: Unique ID of the 35up order that you want to return
  • ItemId: Unique ID of Vendor Order
  • SKU: SKU of product that should be returned
  • Quantity: Quantity of the item that should be returned

Update a Return

To update a return status, you need to make an authorized PATCH request to:

https://api.35up.io/v1/returns/{id}

The ID is the order ID that should be returned.

The request body:

{
 "status": "approved",
}
  • status: The new status you want the return to have.

Return Status
  • Created: Default initial state.
  • Rejected: Processing of the return request is not possible.
  • Awaiting_return: Waiting for the customer to send back the product.
  • Expired: Customer did not ship the items in the allowed timeframe.
  • Customer_shipped: Customer shipped item (only possible if fully integrated in return-tracking process).
  • Seller_received: You received the product because the customer shipped it to you instead of the vendor.
  • Seller_shipped: You shipped the product to the vendor.
  • Vendor_received: The vendor received the product.
  • Voided: Package got lost.
  • Confirmed: The vendor received and checked all items.
  • Not_confirmed: Not all items were received or they were in the wrong condition. Dispute to be opened.
  • Awaiting_refund: Customer awaits refund.
  • Refunded: Customer received refund.
  • Awaiting_dispute: Problem has arisen that needs to be resolved.
  • Cancelled: Return was cancelled.
  • Closed: Final state — cannot be changed.

API Integration (State Machine)

Nomenclature

The following terms are used throughout this document:

  • Seller: an online or offline merchant using the 35up platform API to offer its customers additional products as cross-selling items
  • Vendor: an approved commercial partner by the 35up platform to offer matching products through the standardized API. The current list of vendors include: caseable, SellerX, Hama, smart mobile, Panzerglass, Libri, Neodigital and Clime
  • Order: an order placed by the seller on the behalf of a customer, containing one or more 35up cross-selling items. Each order is given an universally unique alphanumeric id. This is the order entity in 35up’s database, not to be confused with the original order from the seller’s side, created by a customer, which exists only in their databases
  • Order Item: each of the items included in the order entity described above
  • Return: a collection of items meant to be returned to a single vendor
  • Vendor Order: the purchase request sent by 35up to a vendor, in respect to one or more items included in a single order from a seller
  • SKU: anachronism for “stock keeping unit”, used in the context of the API as the unique identifier of a fully qualified product in 35up’s unified catalog of product from all vendors
  • Order Item Id: an unique id assigned by 35up to each Order Item in an Order
  • State/Status: used as synonyms in 35up nomenclature, represent one of the possible conditions that an entity can be at a certain point in time. At the API level, they are designed as a finite (but extendable) set of string labels
Entities using State Machines

35up uses the concept of finite state machines (FSM) to control the state transition flow of several parts of the system. In particular, the following entities are currently using a FSM:

  • Order
  • Order Item
  • Return

In addition to the above, the following entities are planned to use a FSM in the near future:

  • Ticket (customer service)
  • Dispute (customer service)
  • Payment
  • Shipment

All state labels are written in English language, lowercase and using underscores (snake_case).

Conceptual connection between State Machines

Internally, the 35up platform is designed following a distributed and event-driven architecture adhering to the established good practices in the industry.

When it comes to the state machines in the system, it means that they are independently guided, reacting and sending events that may be coming from other state machines or other sources, internally or externally initiated. With this practice, the size of each state machine is kept to a minimum and only the domain-specific knowledge is needed for each moving part.

An important side-effect of this design is that entity states and state transitions have clearer roles:

  • an entity state usually tells what the system expects/accepts as next interactions and is often used as the subject for condition checking
  • a state transition, besides moving an entity to another state, may trigger additional logic and events, causing automatic side-effects in other parts of the system, including new state machine transitions
Implementation Advise

Clients implementing a connection to 35up are advised to apply the same principles and design their systems in order to:

  • use the entity states to check for conditions when interacting with other modules in their systems
  • react to transitions (by detecting a state value change or by listening to an event) in a programmatic manner to propagate changes and trigger the necessary business logic automation

Also, keep in mind that despite being Finite State Machines, they are constantly evolving according to the business requirements. The addition of new state labels, although not frequent, is definitely possible. When designing data models to interact with API responses, the clients are advised to be careful if using strict Enum types mirroring the current labels. This data type is well known to break in case unknown values are received.

State Machine Description
Orders

Currently supported states are the following:

  • pending: the order is created, but should not be processed yet
  • approved: the order is ready to be processed
  • processing: the order was picked up by the system and fulfillment actions already started
  • fulfilled: all order items were already shipped by the vendors
  • delivered: all order items were delivered to the final customer
  • validating: conditions being checked or manual intervention required
  • pending_cancellation: a cancellation was requested and some actions are still pending, such as returning an item back to the vendor, payment reimbursement, customer service complaint, etc
  • cancelled: the order was successfully cancelled
  • closed: the order is completed and the all the return/cancellation windows are closed

When creating a new order using POST /v1/orders or updating it through a PATCH /v1/orders/:order-id request, the following states are available for the seller:

  • pending (default initial state on POST requests, can be omitted)
  • approved (available as initial state on POST and also for PATCH requests)
  • cancelled (available for PATCH requests)

The following transitions are currently possible by the sellers action by sending a PATCH /v1/orders/:order-id request with {"status": "target_status"} payload:

  • pending -> approved: triggered by the seller in case an order was placed in pending state to mark it as ready to proceed. Usually this transition is used when certain conditions need to be checked by the seller on their side after the order is initially created. Important: if an order is placed in pending state it won’t be processed until it is moved to approved. Some examples are:
  • the original order uses an asynchronous payment method, for example “bank transfer”. The order can be created at 35up in pending state together with the original order to “lock” the prices. After the bank transfer is received, the order is then patched to approved and 35up will proceed with the fulfillment
  • the original order requires checking the customer’s credit score, such as selling a new mobile/data plan to which a new smartphone is attached. In case the contract is not approved, the cross-selling accessory would make no sense. An order in pending state prevents all fulfillment actions on 35up side’s until the seller is assures all the conditions are met
  • pending, approved -> cancelled: triggered by the seller, in case the preconditions weren’t met on their side. Cancelling a pending or approved order has no condition checks and can be done at any time without costs
  • processing, fulfilled, delivered -> cancelled: when an order was already picked up for processing, one or more fulfillment actions may already be performed by 35up and/or their partners. In such cases, different conditions have to be checked, depending on the actual state of each item included in the order. Because of that, a PATCH to cancelled will usually leave the order in pending_cancellation state, until all the conditions are checked

All the other transitions are triggered by 35up or its commercial partners in reaction to fulfillment actions and unconditional cancellations.

Order Items

The following states are currently defined for the order items:

  • created: order item data was received and created in DB
  • ordering: fulfillment has started with the order item information being transmitted to the vendor, but no confirmation was received yet
  • ordered: order item information was successfully received by the vendor
  • shipped: order item shipment information was received from the vendor
  • delivered: order item was delivered to the final customer
  • awaiting_return: a return was requested for this order item and is currently being being processed (check the respective return entity for details)
  • returned: the return of the order item was successfully completed
  • cancelled: the order item was successfully cancelled
  • validating: conditions being checked or manual intervention required
  • closed: the processing of the order item is completed and the its return/cancellation window is closed

When a new order is created using POST /v1/orders, all the required order items are automatically created in created state.

After initial creation, the following states can be used by the seller in PATCH /v1/orders/:order-id/items/:item-id requests:

  • cancelled

The following transitions are currently possible by the sellers action on PATCH /v1/orders/:order-id request with {"status": "target_status"} payload:

  • created -> cancelled: used by the seller for unconditional cancellation before any fulfillment action takes place, free of charge

The state awaiting_return can also be achieved from ordered, shipped and delivered states by the seller action indirectly, creating a new return entity including the desired order item. Please check the return entity below.

All the other transitions are triggered by 35up or its commercial partners in reaction to fulfillment actions and unconditional cancellations.

Returns

A return entity currently supports the following states:

  • created: a new return request was received by the system (usually created by the seller)
  • rejected: processing of the return request was not possible (e.g. return window already closed)
  • awaiting_return: the seller already transmitted the necessary information to the customer, who should next give the items to the post office
  • expired: exceeded the maximum allowed amount of time, while awaiting the customer to ship the items
  • customer_shipped: confirmation was received, that the customer shipped the items
  • seller_received: abnormal initial state for a return, in case the customer sends the items directly to the seller. The seller should use this state to create a new return and forward the received items to the vendor
  • seller_shipped: the seller has shipped the package containing the items received directly from the customer to the vendor, in the case of an abnormal return described above
  • voided: the package was shipped, but never received at the vendor after the expected amount of time
  • vendor_received: the vendor received the package with returned items, but still has to check the contents. Also used by the vendor as initial return state, in case they receive the returned items directly from the customer
  • confirmed: the vendor confirmed that the items were received in the expected state and accepted the return
  • not_confirmed: the vendor reported problems with the received package contents and did not accept the return. A customer service dispute will be started to clarify
  • awaiting_refund: after the return is confirmed or a dispute in resolved in favor of the customer, an external action should be taken to revert the payment in total or partially to the customer. Usually, a seller action is expected at this point. This state is also automatically applied when the maximum amount of time is exceeded by the vendor to confirm the return after vendor_received state
  • refunded: the payment was successfully reverted in favor of the customer
  • awaiting_dispute: there are issues in the return process that require human intervention and checking different conditions to either confirm or cancel the return process
  • cancelled: the return was cancelled reverting the state of the items
  • validating: conditions being checked or manual intervention required
  • closed: the return was completed and no further actions are required

The usual return process, with the states described above, starts with the customer making contact with the seller, who requests a new return to 35up. The seller then transmits the shipment information to the customer, who ships the items directly to the vendor. After checking the items, the vendor confirms the return and the seller give the respective refund to the customer.

However, sometimes abnormal return flows also happen. Specially, there are cases where the customer sends the items directly to the seller or to the vendor without formally starting the return process at the 35up platform. In such cases, it is up to the seller or the vendor to create the return in a more advanced state:

  • In case the items are directly received by the seller:
  • the return should be created using seller_received state
  • patch the status to seller_shipped when the package is given to the post office
  • the return follows the normal flow from this point onward
  • In case the items are directly received by the vendor:
  • the return will be created in vendor_received state
  • the return follows the normal flow from this point onward

A new return can be created by the seller’s action using POST /v1/returns endpoint containing one or more items of the same vendor for a given order. In case items from multiple vendors need to be return, several return entities should be created for the same order.

When creating a return, the following states can be used by the seller as initial states:

  • created (default): when the items are physically with the customer and should be shipped to the vendor
  • awaiting_return: the information allowing the customer to ship the package was already provided and the seller is now awaiting for the customer action (for example, a shipping label was already generated and sent to the customer)
  • customer_shipped: the return can be created directly in this state in case the seller already knows that the package was shipped by the customer (for example, using an already existing integration with a reverse logistic provider)
  • seller_received: when the items were received at the seller’s warehouse directly from the customer and should still be shipped to the vendor
  • seller_shipped: when the items were received at the seller’s warehouse directly from the customer and were already shipped to the vendor

The return status can be updated using PATCH /v1/returns/:return-id with a {"status": "target_state"} payload. The following states are available to the seller in such request:

  • customer_shipped, seller_received and seller_shipped as described above
  • refunded: to confirm that a refund was already issue in favor of the customer, after the return is confirmed
  • cancelled: in case the return is not needed or applicable anymore and should be stopped

Given the states above, the following transitions are allowed by the state machine and can be triggered by seller’s actions:

  • created -> awaiting_return: used when return information is given to the customer
  • created -> customer_shipped: used when the customer is able to create the shipment by themselves going directly to the post office
  • created -> cancelled: when the return intention was manifested, but later retracted for any reason
  • awaiting_return -> customer_shipped: when the seller received the information that the customer correctly delivered the package to the post office
  • seller_received -> seller_shipped: used when the seller ship the items to the vendor, after receiving them directly from the customer
  • seller_received -> cancelled: used to cancel the return request after receiving the items directly from the customer, without sending them to the vendor (e.g. decided to discard the products). Notice that in such case the order will still be considered as fulfilled and will be billed as usual
  • awaiting_refund -> refunded: used to confirm that the payment reversal in favor to the customer was correctly done

All the other transitions are triggered by 35up or its commercial partners in reaction to fulfillment actions and unconditional cancellations.

Mixed or Conflicting States

Some entities have natural child entities, notably the Orders and Returns are connected to one or more Order Items. As such, there may be a mix of different states between order items belonging to the same order or return.

When this happens, the system will advance the state of the parent entity to the most advanced non-conflicting global state that is common to all items in the group and correctly represents the global state of the parent entity.

For example, consider an order containing two order items (item_0 and item_1) of two different vendors (vendor_x and vendor_y, respectively):

  • when item_0 is picked up for fulfillment by vendor_x, the order will advance to processing state, because the processing of the order has globally started and the order can’t be unconditionally cancelled anymore. Technically, processing is a state that tells that a sequence of actions has started, therefor requires a single order item transition to be successfully triggered and it is non-conflicting with approved state
  • when item_1 is also collected for ordering by vendor_y, the order will stay in processing
  • when the first item is shipped by one of the vendors, the order will stay in processing state, this is because the order can’t be considered globally fulfilled yet. The most advanced non-conflicting state at this point is processing. Technically, fulfilled is a state that tells that a sequence of actions was completed and therefor requires all sub-entities to reach a minimum status in their state machines (in this case, shipped). The state fulfilled conflicts with earlier states in the order FSM (preventing the transition), but is non-conflicting with more advanced states in the order FSM
  • when the second item is also shipped by the other vendor, the order will globally move to fulfilled state (as now all the items are at least in shipped state)
  • if the first item would have been moved to delivered state before the second item could move to shipped, the order would have stayed in processing state, because there would not have happened any global conditions to move the order to a more advanced state. When the second item would move to shipped, the order would have advanced to fulfilled, even if the first item was already delivered, given that fulfilled would now be the most advanced non-conflicting global state for the order

API Integration (Widget)

The most flexible way to get and show the recommendations is to use our API (see our Reference for all technical details).

You will receive your recommendations with a simple GET request:


https://api.35up.io/v1/recommendations

The response is a structured JSON, which provides all the information needed to show the recommended cross-selling products.

JSON Response

A comprehensive JSON response for one product is below. However, if more than one product is recommended, the "recommendations" array will provide the additional products in the following structure.


{
 "recommendations": [
   {
     "vendor": {
       "legalName": "caseable GmbH",
       "name": "caseable",
       "logo": {
         "square": "https://media.caseable-stage.de/ logo/squared.png",
         "landscape": "https://media.caseable-stage.de/ logo/horizontal.png"
       },
       "id": "caseable"
     },
     "sku": "caseable/ PF165XXC01737XXAPIP65",
     "price": {
       "value": 19.9,
       "formatted": "$ 19.90",
       "currency": "USD"
     },
     "name": "Apple iPhone 11 Pro Max Eco Friendly Phone Case, \ "Eco-Design\" by caseable Designs",
     "images": {
       "thumbnail": "https://caseable.com/ media/catalog/product/ thumbnail/ apple-iphone-11-pro-max- eco-friendly-phone-case/ caseable-designs/ eco-design.jpg"
     },
     "descriptions": {
       "short": "Design protection for your device",
       "long": "This accessory from caseable not only looks great, but also protects your device all around. caseable produces environmentally on order and is known for its great artist designs."
     },
     "delivery": {
       "timeMin": 5,
       "timeMax": 8
     },
     "actions": {}
   }
 ]
}

The JSON response always provides the following information, which can be used to display the products.

Vendor Information

The vendor object provides the following information for every vendor:

  • LegalName: The legal name of the entity, as displayed on invoices
  • Name: The name the customer sees
  • Logo: A URL to a logo image file in squared and landscape - This image can be used if you want to show the vendor’s logo to the customer.
  • ID: the internal vendor ID on our platform

Product Information

The SKU string shows the unique identifier of a product on our platform.

The price object provides following information:

  • Value: Numeric value of the price, for calculations
  • Formatted: The numeric value in the correct format to display to the customer
  • Currency: The three-letter ISO code for the price currency

The name string shows the full name of the product.

Images provides a number of product image URLs with the required "thumbnail."

The descriptions object provides:

  • Short: A one-line description of the cross-selling product, to introduce it without going into much detail
  • Long: A longer description of the product, to create a detailed overlay in the widget

The delivery object provides two data points on the delivery time:

  • TimeMin: The minimum delivery time in days
  • TimeMax: The maximum delivery time in days

Actions

Actions are optional actionable URLs that trigger operations on the platform. They are deactivated in the default configuration.


API Integration (Recommendations)

The most flexible way to get the recommendations is to use our API (see our Reference for all technical details).

You will receive your recommendations with a simple GET request:

https://api.35up.io/v1/recommendations

The API does not require any authentication for the recommendations request.

Simple Recommendations Request

The most simple recommendations request only requires three additional URL-encoded parameters:

  • BaseProduct.title: Product that is in the basket - Simply send us the name or any other text string, — we accept any format.
  • Session: A session to identify the request - You can provide us any session information you have.
  • Partner: Your partner ID, to identify yourself.

In this example, we use the product "Apple iPhone 12 Pro - Pacific blue" ( URL-encoded - Apple%20iPhone %2012%20Pro%20-%20Pacific%20blue) with the session "test" and the partner ID "35up-test."

https://api.35up.io/v1/recommendations? partner=35up-test& session=test& baseProduct.title=
Apple%20iPhone% 2012%20Pro%20-%20 Pacific%20blue

No additional parameters are necessary to make your first successful API request.

Adjust Default Values

Every request uses the partner ID to load default settings for:

  • Country: Any two-digit ISO code to define the country will work.
  • Language: Any two-digit ISO code will work to define the language. Currently, our API speaks English, German, and French.
  • Limit: The number of recommendations you want to have.

These values can be adjusted in the admin area. To edit these default values during the request, additional parameters are needed. In this case, we want to take our first example, but change the values to Germany, German, and Euros, with a maximum number of 10 products:

https://api.35up.io/v1/recommendations? partner=35up-test&session=test &baseProduct.title=
Apple%20iPhone%2012 %20Pro%20-%20Pacific%20 blue&limit=10 &lang=de&country=de

The currency Euro is connected to the country Germany, so in this case no additional parameter is needed.

Provide Additional Product Information

The more information you provide about the product in the basket, the better the recommendation. To provide additional information, you can add any baseProduct* value, such as:

  • Price: Product price
  • Value: Actual value of the product (without discounts or subsidies)
  • Color: Color or design
  • Category: Product category
  • Tag: Any other product-related tag
https://api.35up.io/v1/recommendations? partner=35up-test &session=test&baseProduct.title=
Apple%20iPhone%2012%20 Pro%20-%20Pacific%20blue &limit=10&lang=de&country=de &
price=44.99 &value=999.99&color=blue &category=smartphone &tag=expensive

These additional parameters are not required, but they can provide helpful additional information.

Provide Additional Customer Information

If information about the customer could influence the recommendation, you can submit these values as well. However, you have to take care that all information provided is GDPR compliant. These values can be added as customer.*

Following is an example for an 80-year-old person from Boston:

  • Age: 80
  • City: Boston
https://api.35up.io/v1/recommendations? partner=35up-test &session=test& baseProduct.title=
Apple%20iPhone%2012%20 Pro%20-%20Pacific%20blue& limit=10&lang=de&country=de
&price=44.99&value=999.99 &color=blue& category=smartphone& tag=expensive
&customer. age=80&customer.city=Boston

These additional parameters are not required, but they can provide helpful additional information.

API Integration (Place & Update Order)

Please check the API Reference for all technical details about the API.

Order placements and updates require authorization and need to be executed on the backend.

Authorization

35up uses the standard HTTP authorization, based on base64 encoding.

Header: Authorization
Value: basic username:password (base64 encoded)

Most tools and libraries will automatically handle this process.

Place an Order

To place an order, you need to make a POST request authorized to:

https://api.35up.io/v1/orders

All the information needed is part of the request body:

{
 "session": "123abc",
 "reference": "Order74927943",
 "customer": {
   "firstName": "Jeffrey",
   "lastName": "Bazos",
   "email": "jeffrey@nile.com",
   "phone": "001384859590"
 },
 "shippingAddress": {
   "firstName": "Jeffrey",
   "lastName": "Bazos",
   "email": "jeffrey@nile.com",
   "phone": "001384859590",
   "company": "Nile",
   "street": "Monopoly Street",
   "streetNumber": "66",
   "extra": "Top Floor",
   "city": "Seattle",
   "postcode": "98121",
   "state": "WA",
   "country": "US"
 },
 "items": [
   {
     "sku": "caseable/ HC12PXX127030XXAPIP2P",
     "qty": 2,
     "config": {
       "size": "45",
       "color": "black"
     }
   }
 ]
}
Reference information
  • Session: A session to identify the request - You can provide us any session information that you have. Please use the same session identifier you already used for the get /recommendations request.
  • Reference: This is an optional but highly recommended reference value, so you can easily identify the base product’s complementary order. Best practice here is to use your order number from the base product order.

Customer Information
  • FirstName: Your customer’s first name
  • LastName: Your customer’s last name
  • Email: Your customer’s email address
  • Phone: Your customer’s phone number (optional)

Shipping Address

The shipping address is crucial. Please make sure you always provide the correct information to avoid unhappy customers and additional costs.

  • Firstname, lastname, email, phone: These values are optional if they are the same as the information provided under "customer."
  • Company: Optional, if the order should be shipped to a company.
  • Street: Street name to which the order should be shipped.
  • StreetNumber: Street number to which the order should be shipped.
  • Extra: Additional address line, if needed.
  • City: City to which the order should be shipped.
  • Postcode: The city's postcode.
  • State: The state to which the order should be shipped in the US and Canada. Please use two-digit ISO code (ISO 3166-1 alpha-2).
  • Country: Country to which the order should be shipped. Please use two-digit ISO code (ISO 3166-1 alpha-2).

Product Items

The item’s array provides the information about which product should be ordered in what quantity:

  • SKU: Unique product identifier, provided by the product’s endpoint or the recommendation endpoint
  • QTY: Quantity of the product to be ordered
  • Config: The config object is optional and sends additional attributes about the product to 35up.

Response

If the order was successfully placed, you will receive a response with the status code 201.


{
 "id": "42CA346434",
 "status": "approved",
 "updatedAt": "1603375967",
 "createdAt": "1603375967"
}

This response contains valuable information:

  • ID: Unique ID of your 35up order. Best practice is to keep this order ID in your database.
  • Status: Status of the order.
  • UpdatedAt: Timestamp of when the order was updated for the last time.
  • CreatedAt: Timestamp of when the order was created for the last time.

Status

An order can have one of the following statuses:

  • Pending: The default state of a created order; awaits status update to proceed.
  • Approved: Order has been approved and will be processed.
  • Processing: Order is processing on the vendor side.
  • Fulfilled: Vendor shipped the order.
  • Delivered: Order arrived to the customer. Status either triggered by tracking or time.
  • Pending_cancellation: A cancellation was requested.
  • Cancelled: A cancellation was performed.
  • Closed: Final state; the order is closed. Status either triggered by time or cancellations.

Update an Order

To update an order status, you need to make an authorized PATCH request to:

The ID is the order ID received as a response to the POST order request.

https://api.35up.io/v1/orders/{id}

The request body:

{
 "status": "approved",
 "message": "order successfully paid by the customer"
}
  • Status: The new status you want the order to have. The following statuses are possible: pending, approved, cancelled.
  • Message: Optional additional information that the system will store and display.

The response will have the same structure as the POST order request response.

Time Delay of an Order

If there is to be a delay between placing an order and dispatching it, this can be solved as follows:

  • The order is created via POST order in the status "pending".
  • Only when the order is to be dispatched is the order set to the status "approved" via a PATCH order.

This can be useful if, for example, credit scoring is to be carried out first for the main order.

Admin Overview

For every non-technical user, the Admin Area is the main place to get information and change settings. You can reach the Admin Area by clicking on the “Sign In” button on the top menu of 35up.com 

The Admin Area is separated into 3 parts. On the left side you can see the main menu, leading to separate pages or sub-menus. On the right top side you can manage your session information and the middle segment provides you with the main information.

Dashboard Overview


API Integration (List Orders)

Please check the API Reference for all technical details about the API.

The listing of orders requires authorization and needs to be executed on the backend.

Authorization

35up uses the standard HTTP authorization, based on base64 encoding.

Header: Authorization
Value: basic username:password (base64 encoded)

Most tools and libraries will automatically handle this process.

Get a List of Orders

To get a list of all orders, you need to make an authorized GET request  to:

https://api.35up.io/v1/orders

The response provides you with a list of orders:

{
 "orders": [
   {
     "id": "42CA346434",
     "status": "approved",
     "updatedAt": "1603375967",
     "createdAt": "1603375967"
   }
 ]
}

 

  • ID: Unique ID of your 35up order. Best practice is to keep this order ID in your database
  • Status: Status of the order.
  • UpdatedAt: Timestamp of when the order was updated for the last time.
  • CreatedAt: Timestamp of when the order was created for the last time.

Status

An order can have one of the following statuses:

  • Pending: The default state of a created order; awaits status update to proceed.
  • Approved: Order has been approved and will be processed.
  • Processing: Order is processing on the vendor side.
  • Fulfilled: Vendor shipped the order.
  • Delivered: Order arrived to the customer. Status either triggered by tracking or time.
  • Pending_cancellation: A cancellation was requested.
  • Cancelled: A cancellation was performed.
  • Closed: Final state; the order is closed. Status either triggered by time or cancellations.

Get detailed order information.

Based on the ID from the Get Orders request, you can get detailed information about a single order with a GET orders/ID request:

https://api.35up.io/v1/orders/{id}

The response body includes all necessary information:

{
 "id": "42CA346434",
 "status": "approved",
 "partner": {
   "id": "yourshop"
 },
 "customer": {
   "firstName": "Jeffrey",
   "lastName": "Bazos",
   "email": "jeffrey@nile.com",
   "phone": "001384859590"
 },
 "shippingAddress": {
   "firstName": "Jeffrey",
   "lastName": "Bazos",
   "email": "jeffrey@nile.com",
   "phone": "001384859590",
   "company": "Nile",
   "street": "Monopoly Street",
   "streetNumber": "66",
   "extra": "Top Floor",
   "city": "Seattle",
   "postcode": "98121",
   "state": "WA",
   "country": "US"
 },
 "items": [
   {
     "id": "5f91935facffbdf7b8c6b347",
     "sku": "caseable/HC12PXX127030XXAPIP2P",
     "qty": 2,
     "status": "approved",
     "updatedAt": "1603375967",
     "createdAt": "1603375967"
   }
 ],
 "updatedAt": "1603375967",
 "createdAt": "1603375967"
}
General Information
  • ID: Unique id of your 35up order. Best practice is to keep this order ID in your database.
  • Status: Status of the order.
  • UpdatedAt: Timestamp of when the order was updated for the last time.
  • CreatedAt: Timestamp of when the order was created for the last time.
  • Partner: Your own shop identifier.
Customer information
  • FirstName: Your customer’s first name
  • LastName: Your customer’s last name
  • Email: Your customer’s email address
  • Phone: Your customer’s phone number (optional)

Shipping Address

The shipping address is crucial. Please make sure you always provide the correct information to avoid unhappy customers and additional costs.

  • Firstname, lastname, email, phone: These values are optional if they are the same as the information provided under "customer."
  • Company: Optional, if the order should be shipped to a company.
  • Street: Street name to which the order should be shipped
  • StreetNumber: Street number to which the order should be shipped
  • Extra: Additional address line, if needed
  • City: City to which the order should be shipped
  • Postcode: The city's postcode
  • State: State to which the order should be shipped in the US and Canada. Please use the two-digit ISO code (ISO 3166-1 alpha-2).
  • Country: Country to which the order should be shipped.  Please use the two-digit ISO code (ISO 3166-1 alpha-2).

Product Items

The items array provides information about which product should be ordered in what quantity:

  • ID: The order’s unique vendor ID
  • SKU: Unique product identifier
  • QTY: Quantity of the product to be ordered
  • Status: Status of the order for that specific item
  • UpdatedAt: Timestamp of when the order was updated for that specific item for the last time
  • CreatedAt: Timestamp of when the order was created for that specific item for the last time

API Integration (Payment)

Please check the API Reference for all technical details about the API.

The request to post payment information requires authorization and needs to be executed on the backend.

Authorization

35up uses the standard HTTP authorization, based on base64 encoding.

Header: Authorization
Value: basic username:password (base64 encoded)

Most tools and libraries will automatically handle this process

Provide Payment Information (SEPA)

To place the SEPA payment information of an order, you need to make an authorized POST request to:

https://api.35up.io/v1/payments/sepa-direct-debit

All the information needed is part of the request body.

{
 "orderId": "42CA346434",
 "value": 99.9,
 "currency": "EUR",
 "params": {
   "iban": "DE1012341234123412",
   "fullName": "John Doe",
   "bic": "DRESDEFF160"
 }
}
Order information
  • OrderId: Unique ID of your 35up order to which the payment information belongs
  • Value: The total purchase amount, including taxes
  • Currency: The currency code; three-character ISO 4217
Payment Parameters

  • IBAN: Verified IBAN of the account from which to collect the money
  • FullName: Full name of the account from which to collect the money
  • BIC: BIC of the account from which to collect the money

API Integration (Basket)

Please check the API Reference for all technical details about the API.

The API was designed to make the integration for developers as easy as possible. However, the handover of the product data from 35up to your backend requires additional coding on your side when you use the API. The additional 35up product, from this point on, needs to be present in your database.

Best Practices

To achieve the handover using the standard processes that most shop systems use seems to be the easiest, cleanest approach. Of course, the exact execution depends on your system and your system conditions. Here, we identify three best practices:

Configurable Products

Many modern shop systems provide the ability to add "configurable" products into the basket. These products do not have to preexist in your product database — they can be created "on the fly." This mechanism is perfect for adding 35up cross-selling to the basket and handing over the data to your backend. In this case, you simply create a new configurable product every time a customer adds a 35up product to the basket and enrich the necessary information based on the product data provided.

This approach ensures the sole use of standard processes and is not likely to require additional changes on the backend.

Dummy Products

Another approach to hand over the product data from the front end to the backend is the use of dummy products. If your shop system does not allow for configurable products, dummy products are very often the next best choice. In this case, you create one "35up dummy" product in your product database. Every time a 35up product is added to the basket, you add this dummy product and overwrite the price and name with the values from the product info.

Order Attributes

If neither the configurable nor the dummy product approach works for your system, you could add the additional cross-selling items as attributes or comments to an order. In this case, make sure that the information is stored in a structured, repeatable way and that you can use the values to calculate the final price.

Get Product Info

To support your effort in handing over the product data, we created an additional API endpoint: "GET products."

https://api.35up.io/v1/products/{sku}

This endpoint provides you with all product information based on the SKU. With this endpoint, you only have to hand over the SKU and the quantity, and you can reach all other information on demand later.


{
 "recommendations": [
   {
     "vendor": {
       "legalName": "caseable GmbH",
       "name": "caseable",
       "logo": {
         "square": "https://media.caseable-stage.de/ logo/squared.png",
         "landscape": "https://media.caseable-stage.de/ logo/horizontal.png"
       },
       "id": "caseable"
     },
     "sku": "caseable/ PF165XXC01737XXAPIP65",
     "price": {
       "value": 19.9,
       "formatted": "$ 19.90",
       "currency": "USD"
     },
     "name": "Apple iPhone 11 Pro Max Eco Friendly Phone Case, \ "Eco-Design\" by caseable Designs",
     "images": {
       "thumbnail": "https://caseable.com/ media/catalog/product/ thumbnail/ apple-iphone-11-pro-max- eco-friendly-phone-case/ caseable-designs/ eco-design.jpg"
     },
     "descriptions": {
       "short": "Design protection for your device",
       "long": "This accessory from caseable not only looks great, but also protects your device all around. caseable produces environmentally on order and is known for its great artist designs."
     },
     "delivery": {
       "timeMin": 5,
       "timeMax": 8
     },
     "actions": {}
   }
 ]
}

The JSON response always provides the following information, which can be used to store the product with all its details in your product database:.

Vendor Information

For every vendor, the vendor object provides:

  • LegalName: The legal name of the entity, as displayed on invoices
  • Name: The name that the customer sees
  • Logo: A URL to a logo image file in squared (portrait) and landscape mode - This image can be used if you want to show the vendor’s logo to the customer.
  • ID: The internal vendor ID on our platform

Product Information

The SKU string shows the unique identifier of a product on our platform.

The price object provides following information:

  • Value: Numeric value of the price, for calculations
  • Formatted: The numeric value in the correct format to display to the customer
  • Currency: The three-letter ISO code for the price currency

The name string shows the full name of the product.

Images provides a number of product image URLs, with the required "thumbnail."

The descriptions object provides:

  • Short: A one-line description of the cross-selling product, to introduce it without going into much detail
  • Long: A longer description of the product, to create a detailed overlay in the widget

The delivery object provides two data points on the delivery time:

  • TimeMin: The minimum delivery time in days
  • TimeMax: The maximum delivery time in days