Skip to content

Your Online Store Can Be Busy and Still Lose Money on Every Order

Orders coming in doesn't mean the store is making money. Shipping priced from a guess, card fees nobody counted, discount codes used twice and changes quoted on the spot all eat the margin quietly. What we found when we checked Velvéa's numbers, and how to check yours.

GrowMint Team · November 5, 2026 · 8 min read

On this page

A store taking orders feels like a store that's working. It might be. But a small online shop can be busy, have happy customers and a checkout that never breaks, and still lose a little on every order, because the costs that matter don't show up in the dashboard. Sales do. The courier invoice, the card fees and the refund arrive separately, often weeks later.

We run the online store for Velvéa, a gift basket shop in Mississauga that opened in September 2026 and took 50 orders in its first month. One of the most useful things we did in that month had nothing to do with design or search. We checked whether the prices on the site actually covered what each order cost. Some didn't.

This post covers the places a small online store usually leaks money, what we found at Velvéa, and how to check your own.

Leak 1: shipping priced from a guess

Almost every new store sets its shipping rates before it has shipped anything. That's unavoidable. The problem is that the guess usually stays, because checkout works fine with a wrong number.

What we found at Velvéa. At launch, tracked shipping to the rest of Ontario was a flat rate we'd estimated. In October we priced it properly. We got courier quotes to 30 towns across the province, from Kingston and Ottawa to Thunder Bay and Kenora, and added the cost of the box and packing materials. The flat rate was below cost for most of Ontario. Velvéa was paying more to ship a basket than it was charging the customer.

What we changed. The rest-of-Ontario rate went up to $28.99 and northern Ontario to $36.99. We also added a lower price for each extra basket in the same order. A second basket going to the same address costs less to send than the first, and charging full shipping twice would have pushed away exactly the buyers worth keeping: the ones ordering more than one.

Nothing about this was visible in testing. The store's checkout did exactly what it was told. It was losing money on every shipped order until somebody compared the fee with the courier's quote.

For your store: take your last 20 shipped orders. For each one, write down what the customer paid for shipping and what the courier charged, plus the box, the filler and the tape. Look at the distant destinations separately, because an average hides them. If you can't easily get these numbers, that's the first thing to fix.

Leak 2: card fees and refunds

Payment processing is a cost per order that owners tend to think of as a cost of doing business rather than a cost of each sale. It's both.

Velvéa takes payments through Stripe. Stripe's published Canadian rate for domestic cards is 2.9% plus 30 cents per successful charge, with a higher rate for international cards. The fee is charged on the full amount, including tax and delivery. As an illustration, a $129.93 order (a $99.99 basket, $14.99 delivery and 13% HST) costs about $4.07 to process.

Two details catch small stores out:

  • Refunds don't return the fee. When you refund an order, the processing fee on the original charge generally isn't returned, and the same is true of most card processors. A refunded order costs you the fee and whatever you'd already spent packing it.
  • Disputes have their own fee. If a buyer disputes a charge with their bank, Stripe charges a separate dispute fee on top of holding the amount. Check the current figure in your own account, because the terms vary by region and change over time.

For your store: build the card fee into your per-order cost, at the full order total. And treat refunds as a cost to reduce, not only a customer service task. For a gift shop, the obvious refund risk is a gift that doesn't arrive in time. That's why, at Velvéa, the same-day cutoff is now checked on the server and each delivery day has a capacity the owner sets. A promise the store can't keep is the most expensive kind of order.

Leak 3: discount codes that do more than you meant

A welcome code is a reasonable way to get a hesitant first-time buyer over the line. The trouble is that most store setups check the code, not the customer.

What we found at Velvéa. The WELCOME10 code was meant for first orders. Nothing stopped a returning customer from using it again on their second, third or fourth order. Once a code like that is shared, it becomes a permanent 10% price cut that nobody decided on.

What we changed. The code is now limited to a customer's first order, and a refunded order still counts as an order, so placing and refunding an order can't reset it.

For your store: list every active discount code and ask three questions. Who is it for? What stops someone else using it? When does it end? Any code without a clear answer to all three is costing you something, even if you can't see how much yet.

Leak 4: changes quoted on the spot

Small stores like saying yes. A customer wants the product with one thing swapped, or one thing added, and the owner agrees in an Instagram message at the same price. Do that a few times and the store is selling its most labour-heavy orders at its standard margin.

What Velvéa does. It built a custom basket request form, and every product page has a box to ask about changing that basket. The changes are deliberately quoted by hand, not priced by the form. Swapping one item can push a basket's cost well past what its price was set to cover, and a person reading the request catches that. A form wouldn't. Those requests brought in five custom orders in the form's first three weeks, each priced for what it actually was.

The same thinking kept a bigger feature switched off. Velvéa's original plan included a build-your-own-basket tool. It's still off, because a tool that lets customers combine items at prices nobody has checked is a margin problem waiting to happen. It goes live when every item in it has real stock, real photos and a real price behind it.

Leak 5: substitutions without a policy

Any store that packs to order will sometimes run out of something. Without a written policy, the choices are all bad: hold the order and risk the date, cancel and refund, or swap in something and hope the buyer doesn't mind. Each of those can end in a refund, and as above, refunds aren't free.

What Velvéa does. The terms say, before the customer pays and again in the confirmation email, that any substitute will be of equal or greater value and will keep the basket's look and theme. The buyer has agreed to it before the problem happens, so a substitution is part of the order rather than a complaint.

Leak 6: features launched before they're ready

This one is less obvious because it looks like growth. Gift cards, a product builder, shipping to new provinces: each makes the store look bigger. Each also creates a new way for an order to go wrong, and a half-working feature usually costs more in refunds and support than it brings in.

Velvéa has several things built and switched off, each waiting on a specific condition:

FeatureWaiting for
Gift cardsBuying and redeeming both working end to end
Build-your-own basketReal stock, photos and prices behind every item
Shipping outside OntarioWording, policies and rates for each province confirmed
Google Merchant Center listingsEnough order history to back up the product and shipping claims

The last one connects to search. Google's merchant listing guidance asks for accurate shipping and return details. If those rates turn out to be wrong, the store is advertising a loss to more people.

Work out what one order really costs

You don't need accounting software to find these leaks. Take one typical order and write down everything it cost:

CostWhere to find it
The product itselfYour supplier invoices
PackagingBoxes, filler, tissue, cards, tape
Shipping or local deliveryThe courier invoice, or fuel and time for your own run
Card processingYour payment provider's fee on the full total
Discount appliedThe code used, if any
Refunds and redeliveriesYour share of these across all orders

If what's left after all of that is small, raising prices by a few dollars usually does more than another month of ads. More orders at a loss only make the loss bigger.


If you run an online store and want a second pair of eyes on where it's losing money, see our e-commerce development service, read about Velvéa's first month, or book a call.

Frequently asked

How do I know if my online store is losing money on shipping?

Compare what customers paid for shipping on recent orders with what the courier actually charged, plus the box and packing materials. Do it by destination, not on average. When we checked Velvéa's flat Ontario rate against real quotes to 30 towns, it turned out to be below cost for most of the province, so the rate was raised and a lower price was set for extra baskets in the same order.

What does Stripe charge a Canadian online store?

Stripe's published rate for domestic cards in Canada is 2.9% plus 30 cents per successful charge, with a higher rate for international cards and a separate fee for disputes. Check the current rates on Stripe's Canadian pricing page, because they change. The fee on the original charge is generally not returned when you refund an order, so a refunded sale still costs you money.

Should a small online store offer free shipping?

Only if the price of the product, or a minimum order, covers the real cost of shipping it. Free shipping isn't free to the store. Work out the shipping cost per order by destination first, then decide whether to build it into the price, set a threshold, or charge for it openly.

How do I stop a first-order discount code being reused?

Tie it to the customer as well as the code. Check at checkout that the customer has no earlier orders, by account and by email, and count refunded and cancelled orders as orders. Velvéa's welcome code was meant for first orders but nothing stopped a returning customer from using it again until we added that check.

Sources

  1. Stripe pricing (Canada), Stripe
  2. Stripe Services Agreement, Canada, Stripe
  3. Merchant listing structured data: shipping and return policy, Google Search Central
  4. Velvéa gift baskets and hampers, Velvéa

Want this done properly on your site?