A WooCommerce multi vendor marketplace setup looks simple on the plugin directory page: install Dokan or WCFM, switch on vendor registration, and sellers start listing products the same afternoon. In practice the plugin is about a third of the work. The rest is commission rules, payout compliance, per-vendor shipping and tax, vendor onboarding, dispute handling, and the server load of a store that now has hundreds of sellers each running their own dashboard queries against the same database.
This guide is for the business owner or CTO who is choosing between Dokan, WCFM Marketplace and a custom build, and who wants to know what breaks before committing budget. It is the same evaluation we run at the start of every WooCommerce multi vendor marketplace setup engagement, so you can use it to make the decision yourself or to check the plan someone else has handed you.
what a marketplace actually adds to WooCommerce
Single-vendor WooCommerce has one seller, one set of shipping zones, one tax configuration and one payout destination: your bank account. A marketplace changes every one of those assumptions, and each plugin handles the change slightly differently.
- Vendors are users. Dokan adds a
sellerrole and stores shop settings in user meta (dokan_profile_settings). WCFM addswcfm_vendor. Products keep their normalpost_author, which is how both plugins know who owns what. - Orders get split. When a customer buys from three vendors in one cart, the plugin creates a parent order plus one sub-order per vendor. Dokan writes to
wp_dokan_ordersand flags the parent withhas_sub_ordermeta; WCFM writes towp_wcfm_marketplace_orders. Reporting, refunds and email notifications all have to understand that split. - Money is tracked per vendor. Commission is calculated per line item or per order and written to tables such as
wp_dokan_vendor_balanceandwp_dokan_withdraw. This is the ledger your accountant will eventually ask about. - Shipping and tax become per-vendor problems. Vendor A ships from Dhaka, vendor B from Leeds. WooCommerce shipping zones were never designed for that, so the plugins layer their own shipping tables on top and hook
woocommerce_cart_shipping_packagesto split the cart into one package per vendor.
If you are on WooCommerce 8 or later with High-Performance Order Storage enabled, check that the marketplace plugin version you install is HPOS compatible. Dokan and WCFM both declare compatibility now, but many of their add-ons and third party extensions still read wp_postmeta directly and will silently miss orders stored in wp_wc_orders.
Dokan vs WCFM vs custom build: the honest comparison
We have shipped marketplaces on all three routes. The short version: Dokan is the safest default, WCFM gives you more front-end control per dollar, and a custom build only makes sense when the business model does not fit either.
| Factor | Dokan (Lite + Pro) | WCFM Marketplace | Custom build |
|---|---|---|---|
| Vendor dashboard | Front-end, clean, opinionated | Front-end, highly configurable, heavier | Whatever you design |
| Commission models | Flat, percentage, combined; per vendor, category or product (Pro) | Same, plus per-vendor-group rules | Anything, including tiered or negotiated rates |
| Split payouts | Stripe Connect, PayPal Marketplace, manual (Pro modules) | Stripe Split Pay, PayPal (paid add-on) | Stripe Connect direct |
| Ongoing maintenance | Active vendor, frequent releases | Slower release cadence in recent years | You own it, including every WooCommerce update |
| Typical budget for a launch-ready store | Lowest | Low to mid | Highest, often 3 to 5 times a plugin build |
The deciding question is usually the payout model. If vendors must be paid automatically at the moment of sale, with the platform never holding funds, you need Stripe Connect or PayPal Commerce Platform, and that narrows the field to Dokan Pro, WCFM with the Stripe add-on, or custom code. If a weekly manual payout from the admin is acceptable, Dokan Lite gets you surprisingly far.
WooCommerce multi vendor marketplace setup, step by step
1. prepare the store before installing anything
Marketplace plugins inherit whatever state your store is in. Fix the foundation first: PHP 8.2 or newer, WooCommerce and WordPress current, a persistent object cache (Redis), and a clean database. A few WP-CLI commands cover the audit:
wp core version && wp plugin list --update=available
wp wc tool run regenerate_product_lookup_tables --user=admin
wp option get woocommerce_custom_orders_table_enabled
wp db query "SELECT COUNT(*) FROM wp_postmeta" --skip-column-names
wp redis status
If wp_postmeta is already in the tens of millions of rows, deal with that now. Our nine-step database cleanup is the process we run before any marketplace work, because vendor dashboards multiply the number of meta queries per page.
2. install and configure the core plugin
wp plugin install dokan-lite --activate
wp option update dokan_general '{"admin_access":"on","vendor_store_header_template":"default"}' --format=json
wp user create vendor_demo [email protected] --role=seller --user_pass="$(openssl rand -base64 18)"
Then walk the setup wizard, but do not trust its defaults for two settings. Set new vendor accounts to require admin approval before selling, and turn off automatic product publishing until you have a moderation process. Every marketplace we have taken over that skipped this step ended up with spam products indexed by Google within a month.
3. commission logic
Decide the commission structure in writing before configuring it, because changing it after vendors have sales creates accounting disputes. Common patterns are a flat percentage (10 to 20 percent is typical for physical goods), a percentage plus a fixed fee per order to cover payment processing, and category-based rates. Dokan Pro supports all three in the admin. If you need something the UI cannot express, such as a lower rate once a vendor passes a sales threshold, hook vendor creation and adjust the per-vendor rate programmatically:
add_action( 'dokan_new_seller_created', function ( $vendor_id, $data ) {
// Start every vendor on the standard rate; a scheduled job reviews volume monthly.
update_user_meta( $vendor_id, 'dokan_admin_percentage', 15 );
update_user_meta( $vendor_id, 'dokan_admin_percentage_type', 'percentage' );
update_user_meta( $vendor_id, 'dokan_enable_selling', 'no' ); // require approval
}, 10, 2 );
add_filter( 'dokan_can_add_product', function ( $can_add ) {
$vendor = dokan()->vendor->get( get_current_user_id() );
return $vendor->is_enabled() ? $can_add : false;
} );
4. payouts
Stripe Connect with Express accounts is the model that works in the most countries. The vendor completes Stripe’s hosted onboarding (identity, bank account, tax details), Stripe takes responsibility for KYC, and each sale creates a charge on your platform account with a transfer to the vendor’s connected account. Dokan Pro’s Stripe Connect module and WCFM’s Stripe Split Pay both do this. What they do not tell you is that your platform must be approved by Stripe for Connect in your country, and that approval can take days. Apply for it in week one, not the week before launch.
Check the vendor’s connected account status before you let them list products. The plugins store the account id in user meta (dokan_connected_vendor_id for Dokan), so a nightly check against the Stripe API for charges_enabled and payouts_enabled is a small script that prevents a large support headache.
5. shipping and tax
Per-vendor shipping is where most WooCommerce multi vendor marketplace setup projects run over budget. Both plugins let vendors define their own zones and rates, but the customer then sees one shipping line per vendor at checkout, which is unfamiliar and hurts conversion. Two approaches work: a platform-wide flat rate with the vendor absorbing the difference, or real-time carrier rates per package through the plugin’s shipping modules. Tax is simpler if every vendor is in one country; cross-border tax needs a service like TaxJar or Avalara and a clear answer on who is the merchant of record. Get that answer from an accountant, not from a plugin.
the custom build route: when it is actually right
A custom marketplace on top of WooCommerce makes sense in three cases: the commission or payout logic is genuinely unusual (escrow, milestones, negotiated rates per contract), the vendor experience is the product and must be designed from scratch, or you are running a service marketplace where “products” are bookings or quotes rather than stock. In each case the plugins fight you at every step and the cost of working around them exceeds the cost of building.
The core of a custom build is smaller than people expect: a vendor role, a _swd_vendor_id product meta, a hook on order creation that splits line items into vendor sub-orders, and a Stripe Connect integration. The order split looks like this:
add_action( 'woocommerce_checkout_order_processed', function ( $order_id ) {
$order = wc_get_order( $order_id );
$items_by_vendor = [];
foreach ( $order->get_items() as $item ) {
$vendor_id = (int) get_post_meta( $item->get_product_id(), '_swd_vendor_id', true );
$items_by_vendor[ $vendor_id ][] = $item;
}
if ( count( $items_by_vendor ) < 2 ) {
return; // single vendor, no split needed
}
foreach ( $items_by_vendor as $vendor_id => $items ) {
$sub = wc_create_order( [ 'parent' => $order_id, 'customer_id' => $order->get_customer_id() ] );
foreach ( $items as $item ) {
$sub->add_product( $item->get_product(), $item->get_quantity() );
}
$sub->update_meta_data( '_swd_vendor_id', $vendor_id );
$sub->calculate_totals();
$sub->save();
}
$order->update_meta_data( '_swd_has_sub_orders', 'yes' );
$order->save();
}, 20 );
What is not small is everything around that core: vendor dashboards, order status sync between parent and sub-orders, refund handling across a split, withdrawal requests, vendor reviews and reporting. Budget for those or the custom build will feel unfinished for a year.
performance: the part nobody budgets for
A marketplace with 300 vendors is not a store with 300 more products; it is 300 people logging in daily and hitting order lists, product lists and earnings reports that all run uncached queries. Three things keep it fast:
- Redis object cache, so that repeated
get_user_metaandget_post_metacalls inside vendor dashboards hit memory rather than MySQL. - HPOS enabled, so order queries go to indexed columns in
wp_wc_ordersinstead of joins acrosswp_postmeta. - Checkout kept lean. Per-vendor shipping calculation happens on every
update_order_reviewAJAX call. If that takes more than a second, customers leave. We wrote up the full diagnosis process in how to fix a slow WooCommerce checkout, and marketplaces are the most common case where it is needed.
Host accordingly. A marketplace that expects real traffic belongs on a server with dedicated PHP workers and a separate database, which for most of our clients means EC2 or Lightsail on AWS rather than shared managed hosting. Our AWS migration service exists partly because of marketplace projects that outgrew their original host in the first quarter.
onboarding, compliance and the ledger
The technical launch is usually not the hard launch. Vendors need a clear agreement covering commission, payout schedule, refund responsibility and what happens when a customer disputes a charge. Stripe pulls disputed funds from the platform account, not from the vendor, so your withdrawal rules need a holding period (7 to 14 days is typical) before earnings become withdrawable. Dokan’s withdraw threshold and WCFM’s withdrawal settings both support this; a custom build needs it designed in from the start.
Keep a ledger you can export. The wp_dokan_vendor_balance table records every debit and credit per vendor, which is enough for most accountants if you also export the parent orders. Schedule the export with Action Scheduler (as_schedule_recurring_action) rather than plain WP-Cron, so it runs even on a quiet night. If your CRM or accounting system needs order data too, the queue-based pattern from our CRM integration guide applies to marketplace orders unchanged, with the sub-order id as the record key.
when to do this yourself vs hire someone
Do it yourself if you are launching with under 20 vendors in one country, one currency and a manual payout schedule, and you have someone in-house comfortable with WooCommerce settings and basic PHP. Dokan Lite plus a good theme covers that, and you will learn the plugin’s edges cheaply.
Hire someone when any of the following is true: automated split payouts through Stripe Connect, cross-border vendors, a commission model with more than one rule, an existing store with real order history that must survive the migration, or an expected launch above a few hundred vendors. Each of those is the point where a wrong configuration decision costs more to reverse than a fixed-price build would have cost up front. Whoever you hire, ask for the plan in writing with the payout model, hosting spec and post-launch maintenance arrangement stated before work begins.
next step
If you want a straight answer on which route fits your marketplace, send us the vendor count, the countries involved, your payout expectations and a link to the current store. We reply within 24 hours with a recommendation, a fixed scope and a fixed price for the WooCommerce multi vendor marketplace setup, and you talk directly with the engineers who will build it. Get in touch here, or read the service page first if you want the detail of how a build runs with us.




