A dropshipping API for a moulding manufacturer: 80% of partner orders with no manual re-entry
A manufacturer of finishing mouldings wanted partner stores to be able to sell its products without holding their own stock, with orders going straight into the shipping system. We built a dropshipping API on WooCommerce that calculates B2B discounts on its own, checks stock and passes orders to Sellasist accurate to the cent. Two months in, around 80% of all the store’s orders come through the API.
The client makes skirting boards, cornices and wall mouldings in polystyrene, MDF (including fire-resistant and moisture-resistant versions), XPS and stainless steel. It sells through its own WooCommerce store and handles orders, shipping and invoices in Sellasist. Companies that sell finishing materials themselves wanted these mouldings in their range, but without keeping stock and without re-entering every order by hand.

Starting point
Dropshipping looks simple: the partner sells, the manufacturer ships. The devil is in the details, and there were plenty of them here:
- B2B prices are individual. Companies with a Business account have separate discounts for individual product categories and groups. A partner cannot type the price into the order, because then the partner controls the discount, not the manufacturer.
- Some products are sold by the metre. In the store, a moulding’s price is per metre, but the partner receives a piece of a specific length. The price per piece has to follow from the product’s length.
- Orders have to land in Sellasist straight away. That is where the shipping label, invoice and payment terms are created. Anything that reaches Sellasist wrong has to be fixed by hand.
- Partners use different systems. One has an online store, another an ERP. Each names shipping methods differently and retries sending an order differently when something goes wrong with the network.
The goal: the partner connects its system once, and from then on orders flow on their own, with the right price, the right shipping and the right payment terms.
The solution: a dropshipping API inside WooCommerce
Instead of a separate platform, we wrote a plugin for the existing store. That way the catalogue, stock and prices have a single source: the same one the store uses. Each partner gets its own API key, which we store in the database only as a hash, so even a database leak doesn’t reveal the keys.
| Endpoint | What the partner uses it for |
|---|---|
GET /ping | Connection and key test. |
GET /products | Catalogue with prices already after the partner discount, dimensions, weight and images, paginated. |
GET /products/{sku} | A single product by SKU. |
GET /stock | Stock levels only, a lightweight request for frequent syncing. |
POST /orders | Placing an order with the number from the partner’s system. |
GET /orders/{id} | Status, tracking number and tracking link. |
POST /orders/{id}/status | Cancellation or return, as long as the goods haven’t left the warehouse. |
The most important one is POST /orders. Before an order is created, it goes through several gates. See what happens in each scenario:
What happens when a partner sends an order?
Click a scenario to see which steps the order goes through and what the API responds. The steps and responses match how the live system works.
- 1 · PartnerThe partner’s system sends the ordernumber, items, address, shipping
- 2 · KeyAPI key checkhash compared with the database
- 3 · DuplicateHas this number been sent before?lock at database level
- 4 · StockIs there stock for every item?before the order is created
- 5 · PricePrice and discount calculated by the manufacturerthe price in the request is ignored
- 6 · StoreOrder in WooCommercestock reduced automatically
- 7 · SellasistShipping, invoice, payment termswithout manual transcription
// the API response will appear here
Choose a scenario and send the order.

The price is always calculated by the manufacturer
This was the project’s most important rule. In an order, the partner only sends the SKU and quantity. Even if it sends a price, the system ignores it and calculates its own:
- The partner discount is a single percentage for the whole catalogue, set in the admin panel.
- The Business discount applies when the partner’s email matches a Business account in the store. The plugin links these accounts automatically when the partner is saved. The discount is calculated per product: first by the product group (tag), then by category.
- The winner is the higher of the two discounts. For mouldings sold by the metre, the price per metre is multiplied by the length of the piece, exactly as in the store’s cart.
In practice, partners get their discount from the Business account: 356 of 360 API orders received it automatically, with no manual calculation.
Which discount wins?
Choose a product, set the partner discount and switch the Business account on or off. Also try typing “your own” price into the partner field.
Prices and percentages are examples. The mechanics are the same as in the live system: the product group takes priority over the category, the higher discount wins, and the price in the request has no effect on the result.
Four things you won’t find in the documentation
The API itself is half the work. The other half began when real orders started flowing into Sellasist. Each of the problems below only showed up in production, and each would have cost the client’s team daily manual fixes.
1. Where the grosz goes missing
Sellasist reads the unit price from the order and requires unit price times quantity to equal the line value exactly. Standard WooCommerce calculates VAT on the net total of the whole line and only rounds at the end. With larger quantities the two methods drift apart by a few grosz, and then Sellasist splits the line into two. With mouldings this is not an exception: 327 of 393 lines in partner orders have a quantity greater than 1.
The fix: we calculate the gross unit price first, multiply it by the quantity and derive VAT as the difference. We set taxes manually on every line and on shipping, so WooCommerce doesn’t recalculate them its own way afterwards.
Will this line drift apart in Sellasist?
The default values are a real case from production: 22 pieces at PLN 20.77 net, 23% VAT. Change the price and quantity.
Standard WooCommerce calculation
- Line net
- VAT on the total
- Line gross
- Unit price × qty
Our algorithm
- Gross unit price
- Line gross
- VAT as the difference
- Unit price × qty
Accurate to the grosz
2. Courier or parcel locker?
At first, all partner orders had the same shipping method in WooCommerce. Sellasist maps shipping by method ID, so it couldn’t tell a courier from a parcel locker, and orders arrived with a message that no shipping method was mapped. It also turned out that free text in the order is not enough: Sellasist builds its mapping list from the methods registered in the store’s shipping zone.
So we added five real shipping methods (courier, parcel locker, personal pickup, free and catch-all), visible in the store’s API but hidden from customers in the cart. The partner can send the shipping type directly or just its name, and the system works out what it means. The shipping cost comes from the same price list that Sellasist uses. After the rules were set up once in its panel, Sellasist also remapped earlier orders.
What did the partner call the shipping, and what comes out of it?
Type a method name the way a partner store might send it, or click an example. The examples are in Polish, as Polish stores send them.
3. An invoice marked paid before anyone paid
One partner, which places orders straight from its ERP system, reported that its invoices were arriving in Sellasist as paid, even though it has 30 days to pay. The cause was in WooCommerce: setting an order to “processing” automatically sets a paid date. Sellasist saw that date and treated the invoice as paid, skipping the payment terms from the buyer group. The fix is one line that clears the paid date after the status is set. Finding it meant comparing exactly what Sellasist reads from the order.
What does accounting see?
Switch to see the same invoice before and after the fix.
4. The partner’s order number where people look for it
The warehouse and customer service work in Sellasist, not in WooCommerce. The order number from the partner’s system was saved in the order data, but Sellasist didn’t show it. Now it goes in as the first line of the order note (“Partner no.: …”), which Sellasist displays right away. When a partner calls about a parcel, their number is all it takes.
Why it matters
Each of these four problems looked like a detail. Together they would mean that, with around ten orders every working day, someone at the company fixes shipping methods, split lines and invoice statuses instead of selling. An integration is only finished when the data on the other side needs no manual handling.
Documentation for partners and for the team
We prepared two PDF documents for the API. For partners: connection and key, catalogue, placing orders, statuses, error codes, terms of cooperation and a ready-made example in Python. For the client’s team: adding and editing partners, handling orders, discounts, the API log and answers to common questions. The API log records every call, so a “it never arrived on our side” question can be checked in a minute.

Results
The first partner tested the API from July and switched to it fully at the end of August. Since then, partner orders have made up most of the store’s sales.
From testing to 80% of sales in two months
Number of partner orders in each month. Hover over a bar to see the gross value.
Data from the store’s database as of 23 October 2026. October covers 23 days.
- 361 orders via the API worth PLN 121,677 gross, 3,682 pieces of goods.
- Around 80% of all store orders in this period came from partners (361 of 453).
- 5,444 API calls in 30 days: 4,033 catalogue requests, 1,176 stock requests and 235 new orders.
- 0 rejected orders and 0 duplicates in the same period. The partner pulls stock levels continuously, so orders are placed for goods that are actually in the warehouse.
- Discounts with no manual calculation: 356 of 360 orders with an automatic Business discount.
- Shipping mapped in Sellasist for all new orders, with no missing-shipping-method message.
Further partners connect on the same terms: they get a key, the documentation and, from day one, the same prices, stock and rules as the first one.
We build similar integrations between online stores and ERP, CRM and shipping systems as part of our ERP/CRM integrationsservice. If you’re wondering what else can be automated in B2B sales, take a look at our articles on automating a B2B sales department i on automation in wholesale.
Frequently asked questions about dropshipping APIs
What is a dropshipping API in WooCommerce?
It is an interface through which partner stores fetch the manufacturer’s catalogue, prices and stock and place orders directly in the manufacturer’s WooCommerce store. The manufacturer ships the goods to the end customer, while the partner keeps no warehouse and does not re-enter orders by hand.
Can a partner set the price in an order sent through the API?
No. In this implementation the partner only sends the SKU and quantity, and the price is always calculated by the manufacturer’s store: with the partner discount or with the Business discount assigned to product categories and groups, whichever is higher.
How do API orders get into Sellasist?
Sellasist fetches them from the WooCommerce store like any other order. To make sure they need no fixes, every order has a registered shipping and payment method, taxes calculated so that unit price times quantity equals the line value, an empty paid date when payment is deferred, and the partner’s order number in the order note.
What happens if a partner sends the same order twice?
No second order is created. The pair “partner and order number” is unique in the database, so a repeat returns the existing order with the “duplicate” flag, even if both requests arrive at the same moment.
Can an ERP system be connected to the API instead of an online store?
Yes. The API accepts plain HTTP requests with a key in the header, so both an online store and an ERP system can use it. One of the partners in this implementation places orders directly from its ERP.
Why did Sellasist split order lines into two?
Sellasist requires the gross unit price multiplied by the quantity to equal the line value exactly. Standard WooCommerce calculates VAT on the line’s net total, so with larger quantities the result was a few grosz off. We calculate the gross unit price first and derive VAT as the difference.
Want partners to order from you without emails and re-typing?
Book a free call. We’ll look at how to connect your store, ERP or shipping system with partners so that prices, stock and invoices match with no manual fixes.
Schedule a callCheck before we talk
Services associated with this deployment. Take a look at the offer, see how we approach similar problems in other customers.
ERP/CRM Integrations
🔗 Page under preparation We are working on the full version Integrations with Comarch, Sente, Salesforce, HubSpot, Pipedrive, and others. Let us know which system you need to integrate.…
View the offer →Automation
🤖 Page under preparation We are working on the full version n8n automations + AI workflows + cross-system integrations. Let me know if you want to automate a specific process.…
View the offer →Websites and online stores
View the offer →Did you like this article?
If after reading this you feel your company also has processes worth rebuilding, book a free call. Together we will check where sales are really leaking and what makes sense to implement first.
Schedule a call