Last updated
Commissions and monetizing your platform
Sharetribe provides configurable options for monetizing your platform. You can collect commissions from providers, customers, or both. This article provides you with basic information on the mechanisms supported by Sharetribe for monetizing your platform.
Table of Contents
Introduction
If you have already defined a pricing model for your marketplace, this article will provide you with basic information on the options Sharetribe provides and how to take them into use.
If you need more information on how to decide the pricing, our Marketplace Academy has an article describing different pricing models and the tradeoffs behind different options.
As background, familiarizing yourself with line items and privileged transitions gives you a good understanding of the concepts discussed in this article. In addition, the article that describes payments in Sharetribe provides valuable information about how the payment flow in Sharetribe works.
Configuring commissions happens with the privileged-set-line-items transaction process action. In the template, this is done on the server side because of the privileged nature of this action. If you are developing a client application that is not based on the Sharetribe Web Template, you can apply a similar logic.
Percentage-based commissions
One of the simplest ways to configure commissions is to define a percentage of the listing price as a commission. Commissions can be charged from the provider, the customer, or both.
Information
Example
This example illustrates how to use percentage-based commissions without Console-based hosted configurations.
A marketplace that charges 10 % from the customer and 12 % from the provider would configure the commissions like this:
const PROVIDER_COMMISSION_PERCENTAGE = -12; // Provider commission is negative
const CUSTOMER_COMMISSION_PERCENTAGE = 10; // Customer commission is positive
const order = {
code,
unitPrice,
quantity,
includeFor: ['customer', 'provider'],
};
const providerCommission = {
code: 'line-item/provider-commission',
unitPrice: calculateTotalFromLineItems([order]),
percentage: PROVIDER_COMMISSION_PERCENTAGE,
includeFor: ['provider'],
};
const customerCommission = {
code: 'line-item/customer-commission',
unitPrice: calculateTotalFromLineItems([order]),
percentage: CUSTOMER_COMMISSION_PERCENTAGE,
includeFor: ['customer'],
};
const lineItems = [order, providerCommission, customerCommission];
For a 100 EUR listing, this would result in a 110 EUR payin for the customer and a 88 EUR payout for the provider. The marketplace would receive 22 EUR minus Stripe fees.
Fixed commissions
In addition to percentages, you can define commissions with fixed sums
as the unitPrice
of the line item using quantity
instead of
percentage
.
In the following example, both the provider and customer pay a fixed commission regardless of the listing price or quantity, and Console-based commissions are ignored.
Example
const FIXED_PROVIDER_COMMISSION = -1500; // Provider commission is negative
const FIXED_CUSTOMER_COMMISSION = 1050; // Customer commission is positive
const calculateCommission = (unitPrice, amount) => {
return new Money(amount, unitPrice.currency);
};
const order = {
code,
unitPrice,
quantity,
includeFor: ['customer', 'provider'],
};
const providerCommission = {
code: 'line-item/provider-commission',
unitPrice: calculateCommission(unitPrice, FIXED_PROVIDER_COMMISSION),
quantity: 1,
includeFor: ['provider'],
};
const customerCommission = {
code: 'line-item/customer-commission',
unitPrice: calculateCommission(unitPrice, FIXED_CUSTOMER_COMMISSION),
quantity: 1,
includeFor: ['customer'],
};
const lineItems = [
order,
...extraLineItems,
providerCommission,
customerCommission,
];
For a 100 EUR listing, this would result in a 110.5 EUR payin for the customer and a 85 EUR payout for the provider. The marketplace would receive 25.5 EUR minus Stripe fees.
Dynamically calculated commissions
You can also calculate the commissions with more complex logic. You can
set the result of the calculation as either the unitPrice
or the
percentage
of the line item.
In this example, the customer's commission percentage gets reduced with three percentage points (e.g. from 10 per cent down to 7 per cent) when they buy 5 items or more. The provider's commission is percentage based, but always at least 10 dollars.
Example
// Base provider and customer commissions are fetched from assets
const MINIMUM_PROVIDER_COMMISSION = -1000; // Negative commission in minor units, i.e. in USD cents
const CUSTOMER_COMMISSION_PERCENTAGE_REDUCTION = 3;
const calculateProviderCommission = (order, providerCommission) => {
// Use existing helper functions to calculate totals and percentages
const price = calculateTotalFromLineItems([order]);
const commission = calculateTotalPriceFromPercentage(
price,
providerCommission
);
// Since provider commissions are negative, comparison must be negative as well
if (commission.amount < MINIMUM_PROVIDER_COMMISSION) {
return commission;
}
return new Money(MINIMUM_PROVIDER_COMMISSION, price.currency);
};
const calculateCustomerCommissionPercentage = (
order,
customerCommission
) =>
order.quantity > 4
? customerCommission.percentage -
CUSTOMER_COMMISSION_PERCENTAGE_REDUCTION
: customerCommission.percentage;
const order = {
code,
unitPrice,
quantity,
includeFor: ['customer', 'provider'],
};
// Provider commission reduces the amount of money that is paid out to provider.
// Therefore, the provider commission line-item should have negative effect to the payout total.
const getNegation = percentage => {
return -1 * percentage;
};
// Note: extraLineItems for product selling (aka shipping fee)
// is not included in either customer or provider commission calculation.
// The provider commission is what the provider pays for the transaction, and
// it is the subtracted from the order price to get the provider payout:
// orderPrice - providerCommission = providerPayout
const providerCommissionMaybe = hasCommissionPercentage(
providerCommission
)
? [
{
code: 'line-item/provider-commission',
unitPrice: calculateProviderCommission(
order,
getNegation(providerCommission.percentage)
),
quantity: 1,
includeFor: ['provider'],
},
]
: [];
// The customer commission is what the customer pays for the transaction, and
// it is added on top of the order price to get the customer's payin price:
// orderPrice + customerCommission = customerPayin
const customerCommissionMaybe = hasCommissionPercentage(
customerCommission
)
? [
{
code: 'line-item/customer-commission',
unitPrice: calculateTotalFromLineItems([order]),
percentage: calculateCustomerCommissionPercentage(
order,
customerCommission
),
includeFor: ['customer'],
},
]
: [];
// Let's keep the base price (order) as first line item and provider and customer commissions as last.
// Note: the order matters only if OrderBreakdown component doesn't recognize line-item.
const lineItems = [
order,
...extraLineItems,
...providerCommissionMaybe,
...customerCommissionMaybe,
];
Subscription-based model
The line item commissions are the most straightforward way of monetizing your marketplace and are directly supported by Sharetribe. However, you might want to experiment with other monetization models depending on your business idea. For example, subscriptions might be a good way of monetizing your marketplace. With the Integration API, you can integrate a third-party service such as Chargebee or Stripe billing to process subscription payments from users who want access to your marketplace.