# Profit margin calculator for an online store: markup, VAT and price

Profit margin calculator for an online store in Bulgaria: markup vs margin, price with VAT, courier, COD and card fees and ads per order, with formulas.

Source: https://cloudcart.com/en/blog/pricing-margin-online-store · CloudCart · 2026-11-06

In short: markup is your profit as a share of the product's cost, and margin is the same profit as a share of the selling price without VAT. A product bought for €12 and sold for €36 with VAT has a 150% markup and a 60% margin. After shipping, packaging, the card or cash on delivery fee, returns and €8 of ads, about €4 per order is left.

This guide from CloudCart, the Bulgarian ecommerce platform, is for founders, expats and local businesses selling in or from Bulgaria. The example uses round numbers you replace with your own; courier fees and legal rules come from the official sources linked below, and your accountant confirms how they apply to your company.

## What is the difference between markup and margin?

Markup and margin measure the same profit against a different base. Markup is profit as a percentage of your cost. Gross margin is profit as a percentage of the selling price without VAT. On the same sale, the markup is always the bigger number.

Your cost (cost of goods) is the supplier's price without VAT plus what it takes to get the goods onto your shelf: freight, customs duty on imports, labelling. A product bought for €20 and sold for €30 without VAT earns €10. The markup is 50% (10 ÷ 20) and the margin is 33.3% (10 ÷ 30). "We work on 30%" means a very different price depending on which of the two is meant, so the table converts one into the other.

| Markup | Margin | A €10 cost becomes this price without VAT |

| 25% | 20% | €12.50 |

| 33.3% | 25% | €13.33 |

| 50% | 33.3% | €15.00 |

| 66.7% | 40% | €16.67 |

| 100% | 50% | €20.00 |

| 150% | 60% | €25.00 |

| 200% | 66.7% | €30.00 |

Margin can never reach 100%, while markup can be any number. Profit targets are easier to set as a margin, because it tells you directly how much of every euro the customer pays stays with you before other costs.

## How to calculate markup: the formulas

To calculate markup, divide the profit by the cost and multiply by 100. Every number here is without VAT, because VAT is collected for the state and is not your revenue.

- Markup (%) = (Selling price without VAT − Cost) ÷ Cost × 100

- Margin (%) = (Selling price without VAT − Cost) ÷ Selling price without VAT × 100

- Price from a markup = Cost × (1 + Markup)

- Price from a target margin = Cost ÷ (1 − Margin)

- Margin from markup = Markup ÷ (1 + Markup)

- Markup from margin = Margin ÷ (1 − Margin)

Example with a 30% markup: a €10 cost × 1.30 = €13 without VAT, a 23.1% margin. Example with a 40% target margin: €10 ÷ 0.60 = €16.67 without VAT, a 66.7% markup. Multiplying the cost by 1.40 instead gives €14 and a margin of only 28.6%.

Important: these formulas give the gross margin of the product, before the courier, the payment fee and advertising. Decide the price on the profit per order in the next sections.

## How to calculate a selling price with VAT in Bulgaria

The selling price with VAT is the price without VAT multiplied by 1.20. The standard VAT rate in Bulgaria is 20% under [Art. 66 of the VAT Act (in Bulgarian)](https://lex.bg/laws/ldoc/2135533201), in the version in force since July 1, 2022, and it applies to most goods sold online.

The reverse calculation is where most mistakes happen. The VAT inside a price with VAT is one sixth of it (20 ÷ 120). In €36 the tax is €6 and your revenue is €30. Taking 20% off €36 gives €28.80 and understates your profit by €1.20 on every sale.

Shoppers in Bulgaria see the final price. The [Consumer Protection Act (in Bulgarian)](https://lex.bg/laws/ldoc/2135513678) requires in Art. 47(1)(5) that the total price with all taxes and charges is shown before the order, together with delivery costs where they apply.

In CloudCart, the VAT rule under Settings → Taxes and fees has the option "prices include VAT". With it on, the store shows the price you entered as final and works the tax out backwards; with it off, VAT is added in the cart. If your company is not registered for VAT, your cost is the supplier's price with VAT, because you cannot deduct it. When registration becomes mandatory is in [VAT registration for an online store](https://cloudcart.com/en/blog/vat-registration-online-store).

## Profit per order: the calculator

From a €36 product with VAT and a €12 cost, about €4.09 per order is left when the customer pays by card, you cover shipping and you pay ads for every buyer. That is 13.6% of the price without VAT, against a 60% gross margin.

Replace the numbers in the "Card" and "COD" columns with yours and work each row out with the formula on the right. The example is a VAT-registered seller who covers €4 of shipping without VAT per parcel (your contract rate), spends €8 on ads per order, and pays either the CloudCart Pay card fee at the standard rate from January 1, 2027 (1.29% + €0.05 for a consumer Visa or Mastercard from the EEA) or the cash on delivery (COD) fee of Speedy, a Bulgarian courier.

| Row | Card | COD | How to work it out |

| Price the customer pays | €36.00 | €36.00 | Your price with VAT |

| VAT for the state | −€6.00 | −€6.00 | Price with VAT ÷ 6 |

| Revenue without VAT | €30.00 | €30.00 | Price with VAT ÷ 1.20 |

| Cost of goods | −€12.00 | −€12.00 | Supplier price without VAT |

| Gross profit (60% margin) | €18.00 | €18.00 | Revenue − cost |

| Shipping you cover | −€4.00 | −€4.00 | Contract rate without VAT; €0 if the customer pays it |

| Packaging | −€0.50 | −€0.50 | Box, filler, label |

| Payment fee | −€0.51 | −€0.72 | Card: 1.29% × €36 + €0.05. COD: 2.4% × €36 = €0.86 with VAT, €0.72 without |

| Returns reserve | −€0.90 | −€0.90 | 3% of revenue without VAT (your own return rate) |

| Profit before ads | €12.09 | €11.88 | The most you can pay to win a new order without losing money |

| Ads per order | −€8.00 | −€8.00 | Ad spend ÷ orders from ads |

| Left from the order | €4.09 (13.6%) | €3.88 (12.9%) | Before fixed costs and corporate income tax |

Fixed costs (platform, accountant, salaries) are covered by the sum of all orders. The Baby Pack plan is €14 a month billed annually, excluding VAT ([plan prices](https://cloudcart.com/en/pricing)), which is €0.28 per order at 50 orders a month.

"Profit before ads" sets your ad limit. At €12.09, ads break even at a ROAS (revenue from ads ÷ ad spend) of €36 ÷ €12.09 ≈ 2.98, if the ad platform reports revenue with VAT. A repeat purchase from an email, with no ad cost, keeps the full €12.09, or 40.3%.

### The courier and COD lines in Bulgaria

Speedy's public [price list](https://services.speedy.bg/priceList/?lang=en) (valid on November 6, 2026, with VAT and fuel surcharge) starts at €2.69 for a parcel up to 3 kg between offices or parcel lockers, €2.24 without VAT, and adds €2.59 for delivery to an address. Cash on delivery is 2.4% of the collected amount, at least €0.61 when the money is paid to you by bank transfer. The minimum applies below about €25.40, so on a €20 order COD costs 3% of the price. Econt and other couriers publish their own rates, and a contract usually lowers the parcel price.

- The COD fee is on the whole collected amount. If the customer also pays for shipping, the fee covers product plus shipping.

- Refused parcels cost shipping both ways. Put your own refusal rate into the returns reserve.

- The payout comes later. The courier transfers the cash on its own schedule, so COD orders tie up working capital.

In CloudCart, Econt, Speedy and other couriers that support it report back when a COD parcel is paid, and the order moves to completed on its own (Orders → COD sync, depending on your plan). The full monthly budget is in [what an online store costs in Bulgaria](https://cloudcart.com/en/blog/online-store-cost-bulgaria). When a card is the better choice is in [cash on delivery vs card payments](https://cloudcart.com/en/blog/cash-on-delivery-vs-card-payments).

> CloudCart Pay 0% transaction fee through Dec 31, 2026 In the calculator the card fee is €0.51 per order. With CloudCart Pay through the end of 2026 this row is €0, and the same order leaves €4.60 instead of €4.09 at the same price. How CloudCart Pay works →

## Pricing methods for an online store

The three main pricing methods are cost-based, competitor-based and value-based. Stores combine them: costs set the floor, competitors the ceiling, and value decides where in between the price sits.

| Method | How the price is set | When it works | The risk |

| Cost-plus | Cost plus per-order costs plus a target profit | Always, as the floor | A price above the market if your costs are high |

| Competitor-based | Around the price of the same product in other stores and on price comparison sites | Products many stores sell | A price below your costs if you skip the calculator |

| Value-based | By what the solution is worth to the customer: a rare product, fast delivery, a set | Own brand, handmade or hard-to-compare products | You need photos, descriptions and reviews that justify the price |

| Dynamic | The price moves with demand, stock and competitors | Large catalogs and active competitors | Breaking the price reduction rules without a price history |

## How to set the price: from target profit to the final price

The price that covers every cost and leaves your target profit is: Price without VAT = (Cost + fixed costs per order) ÷ (1 − percentage costs − target profit). Fixed costs are in euros (shipping, packaging, the fixed part of the fee, ads); percentage costs are a share of the price (the card or COD fee, returns).

- Add up the cost. Supplier price without VAT plus freight and customs duty if you import. In the example, €12.

- Add up the fixed costs per order. Shipping €4, packaging €0.50, the €0.05 fixed card fee and €8 of ads: €12.55. With the cost, €24.55.

- Add up the percentage costs against the price without VAT. The 1.29% card fee is charged on the price with VAT, so it is 1.29% × 1.20 = 1.55%; with 3% returns, 4.55%. Speedy's 2.4% COD fee already includes VAT, so it stays 2.4%, or 5.4% with returns.

- Pick a target profit per order, for example 15% of the price without VAT.

- Work out the price. €24.55 ÷ (1 − 0.0455 − 0.15) = €30.52 without VAT, or €36.62 with VAT.

- Round up to a psychological price. €36.90 gives 15.6% on card orders. Rounding down to €35.90 drops below the target.

- Compare with the market. If the same product sells everywhere for €29.90, at these costs it cannot carry paid ads. Sell it to past customers or in a bundle.

| Target profit per order | Price without VAT (card) | Price with VAT (card) | Price with VAT (COD) | Rounded price | Markup needed |

| 10% | €28.73 | €34.48 | €34.75 | €34.90 | 139% |

| 15% | €30.52 | €36.62 | €36.93 | €36.90 / €37.90 | 154% |

| 20% | €32.54 | €39.05 | €39.41 | €39.90 | 171% |

| 25% | €34.85 | €41.82 | €42.24 | €41.90 / €42.90 | 190% |

With paid ads behind every order, a markup below 100% rarely works. The COD column shows why one price for every payment method needs a check: at €36.90 a card order meets the 15% target and a COD order lands at 14.9%. Without ads (orders from email, Google search or regular customers) the same 15% is reached at €24.69 with VAT, which is why repeat buyers and organic traffic let you price below competitors who pay for every buyer.

With more than one supplier, CloudCart keeps purchase prices in the Apps → Suppliers app: you link each product to one or more suppliers with their price and see which is cheapest, so a supplier price rise goes straight into the formula.

> 0% commission 0% of every sale, however much you grow A platform that takes 2% of revenue would add another €0.72 to a €36 order and push the profit in the example below €3.40. On CloudCart you pay a fixed monthly plan and 0% of your sales. How 0% commission works →

## Free shipping: how to build it into the price

Free shipping over a set amount is a cost you carry, so the threshold comes from your margin: Threshold without VAT = (Shipping cost + target profit per order in euros) ÷ average gross margin of the cart.

Example: shipping costs you €4 without VAT, you want at least €10 per order before ads, and the average gross margin is 40%. The threshold is (4 + 10) ÷ 0.40 = €35 without VAT, or €42 with VAT. If most customers choose address delivery over an office or locker, use the higher address rate.

In CloudCart the threshold is a global "Free shipping" discount with the condition "Orders over" in Marketing → Discounts, with no code, and it clears the whole shipping line in the cart. The full math with courier prices is in [the free shipping threshold](https://cloudcart.com/en/blog/free-shipping-threshold-couriers).

## Psychological pricing, bundles and quantity discounts

Psychological prices such as €36.90 instead of €37, or three products at one bundle price, help when they sit on top of a price that already covers your costs, and hurt when they push it below.

- Endings in .90 or .99. Pick one ending for the whole store and round up from the calculated price.

- Bundles. Products bought together (cream and serum, case and screen protector) at slightly below the sum. Shipping and the payment fee are paid once.

- Quantity discounts. "Buy 3, the cheapest is −100%" or −10% on 3 or more products from one brand, set up in the Cart Rules app. The discount types are on the promotions and discounts page.

Check every promotion against the profit per order. A 20% discount cuts revenue without VAT in the example from €30 to €24, and an order from ads turns into a loss.

## Dynamic pricing and competitor prices

Dynamic pricing means changing prices often with demand, stock and competitors. For a small store it works as a rule with a floor: the price moves, never below the minimum worked out from your costs.

- Work out the floor for each product: the price from the formula with a 0% target profit.

- Watch competitors on your best sellers. Pazaruvaj (a Bulgarian price comparison site) and Google Shopping show who sells the same model at what price and with what shipping.

- Change prices in bulk, with a check. In CloudCart, prices for many products change through the Google Sheets app or with one sentence to an AI assistant connected to the store. The CSV import creates new products and does not update prices of existing ones.

- Keep the price history. Every CloudCart product has a Change log : who changed the price, when, and from what to what.

The limit is on announced price reductions. Under [Art. 64-66 of the Consumer Protection Act (in Bulgarian)](https://lex.bg/laws/ldoc/2135513678), in force since May 28, 2022, every price reduction states the prior price: the lowest price you applied on the same website for at least 30 days before it. The reduction lasts between one working day and one month. The rule comes from Article 6a of the EU [Price Indication Directive](https://commission.europa.eu/law/law-topic/consumer-protection-law/unfair-commercial-practices-and-price-indication/price-indication-directive_en), so it also applies when you sell cross-border. A price set automatically from a specific buyer's behaviour must be flagged as personalised ([Your Europe](https://europa.eu/youreurope/citizens/consumers/unfair-treatment/unfair-pricing/index_en.htm), checked on November 6, 2026).

Important: if you raise a price a week before Black Friday and then "reduce" it, the prior price in the announcement is the lower price from before the increase. Check the change log before the campaign.

> A store with an AI assistant New prices for the whole catalog in one sentence A sentence like "raise prices for products from supplier X by 8%, round to .90 and leave the ones on promotion alone" goes to the AI assistant (Claude Code, ChatGPT Codex, Gemini CLI, Cursor), which shows the new prices before writing them to the store. How the AI assistant runs the store →

## Prices in product feeds: Google Shopping, Pazaruvaj, eMAG

A product feed is a file with your products and prices that Google Shopping, Facebook, Pazaruvaj, eMAG (a marketplace in Bulgaria and Romania) and other channels read on a schedule. The feed price has to match the price in the store and in the cart.

In CloudCart, feeds come from the Apps → XML Feed app, with ready formats for Google, Facebook, Pazaruvaj, eMAG, Glami and others. The feed is generated from the catalog, so a price changed once in the admin reaches all [sales channels](https://cloudcart.com/en/sales-channels) at the next automatic update, every few hours, sale prices included. For each feed you choose the products by category, brand, label or stock.

Leave products that earn under €2 per order after ads out of paid feeds, or sell them in a bundle. Change prices in the store only: a hand-edited feed file shows one price in the ad and another in the cart.

## The most common pricing mistakes

- Markup on a price with VAT. Do the math without VAT and add VAT at the end.

- VAT taken as 20% of the final price. The tax is one sixth of the price with VAT.

- Markup mistaken for margin. A 30% markup is a 23% margin.

- One price for every channel and payment method without a check. Orders from ads, from regular customers and by COD each earn a different profit.

- A promotion without a check. A 20% discount on a product earning 15% per order loses money on every order from ads.

> A new store €1/month for the first 3 months Three months at €1 a month on any plan are enough to test your prices and the profit per order with real customers before you pay the full plan price. The offer is for new stores through Dec 31, 2026. Create a store for €1 →

## Frequently asked questions

**How do I calculate markup and margin?**

Markup is (selling price without VAT − cost) ÷ cost × 100; margin is the same profit ÷ the selling price without VAT. Buying for €20 and selling for €30 without VAT is a 50% markup and a 33.3% margin.

**How do I calculate a selling price with VAT in Bulgaria?**

Multiply the price without VAT by 1.20, because the standard rate in Bulgaria is 20%. €30 without VAT is €36 with VAT. To find the VAT inside a price, divide it by 6: in €36 the tax is €6.

**What markup should an online store use?**

Enough to cover shipping, the payment fee, ads and returns and leave your target profit, so it differs for every store. In this example, with €8 of ads per order, a 15% profit needs a markup of about 154%, and much less without ads.

**How much does cash on delivery take from my margin?**

At Speedy's public rate, COD is 2.4% of the collected amount, at least €0.61, VAT included. On a €36 order that is €0.72 without VAT, a little more than a card at the standard CloudCart Pay rate. Add refused COD parcels to your returns reserve.

**Do I have to show the prior price in a price reduction?**

Yes. Under Art. 65 of the Bulgarian Consumer Protection Act, every announced reduction shows the lowest price applied for at least 30 days before it in the same store, and lasts between one working day and one month.

Have a question about prices, discounts or feeds in your store? Write to us at [support@cloudcart.com](https://cloudcart.commailto:support@cloudcart.com).
