Skip to content
Field NotesFebruary 26, 20266 min read

Why we built Charm

On per-order fees, $199/month VIP-tier paywalls, and the case for every feature in every plan over a 47-tab settings panel.

Why we built Charm

There are roughly forty loyalty apps on the Shopify App Store. Most of them are honest products built by hard-working teams. We did not build Charm because the category was empty.

We built Charm because the category had calcified into two camps, and neither one fit the merchants we wanted to serve.

Where this actually started

A year ago — April 2025 — jmbonline.cz sat us down. We'd worked with them through Appfleece since their early days, watched them grow into one of the stronger Shopify stores in the Czech market, and now they needed loyalty. They'd shopped the App Store carefully, three times. They walked away every time.

The reasons stacked up the same way each time. Pricing didn't fit a European mid-market store: either free with the features they wanted gated behind $199+/month, or cheap with a feature set that stopped short of native customer accounts and checkout extensions. Localization was treated as an afterthought — auto-translated Czech and Slovak strings that read like Google Translate from 2014, no respect for grammatical case in customer emails, no regional polish a Czech customer would consciously notice but would viscerally feel as off. And the feature mix was always 80% there — points without proper tiers, or tiers without referrals, or referrals without a Klaviyo bridge.

We told them we'd think about it. We left the meeting knowing we were going to build it.

We built it for jmbonline first — a fully custom loyalty program running across their Czech and Slovak storefronts (jmbonline.cz and jmbonline.sk) by mid-2025. It was the testbed for everything: what redemption rates actually look like when the program is finally surfaced in the right places, where the localization edge cases hide, which features merchants ask for in week one versus week eight. Then we built similar custom programs for two more Appfleece-client stores through the back half of 2025, learning something different each time.

By January 2026 we'd accumulated enough signal — what worked, what didn't, what every merchant asked for that we hadn't shipped yet — that custom builds didn't make sense anymore. The product had matured past the bespoke phase. In February, in parallel with the productization sprint, we launched the most ambitious build yet for facederma.cz and facederma.sk — already on Shopify Plus through an Appfleece migration the prior year — pairing B2C rewards across both storefronts with a separate B2B perks ladder for their clinical accounts. That build proved the architecture held up at Plus scale and dual-channel, and seeded what eventually shipped as the Concierge tier. May 1st 2026 the product went public on the Shopify App Store as Charm.

The story is in the changelog if you want the longer version.

The two camps

On one side, the incumbents: Smile, LoyaltyLion, Yotpo. Polished, deep, opinionated about retention strategy — and structurally expensive. The first paid tier on each of those starts at $79, $199, $199. By the time a Shopify merchant doing 2,000 orders a month actually has the VIP tiers and checkout features they wanted, they're paying somewhere between $200 and $1,000 per month, often with per-order fees layered on top.

On the other side, the value tier: a long tail of apps competing on price down to $9 a month. The math works because the products are thinner. Fewer surfaces. Iframed widgets instead of native customer-account hubs. Settings panels that look like a 2014 Bootstrap admin theme.

What's missing — what we built Charm for — is the middle. The store doing $50k-$2M a year that wants the surface depth of the incumbents at the cadence of the value tier, in a product that looks like it was designed by someone who cared.

What we decided about pricing

Every feature in every plan. You only pay for your order volume. Free covers the whole product up to 150 orders a month; above that, plans run $19 / $59 / $129 by order band, with a Plus tier for the largest brands. No per-order fees. No commission. No 14% transaction tax disguised as "usage pricing". No cut of your membership revenue.

The decision underneath it: never gate a feature behind a price. The incumbents put VIP tiers behind a $199 plan; we refuse to. A store on the Free plan runs the exact same program — points, tiers, referrals, memberships, POS — as a store paying us $129. The only things a bigger plan buys are order capacity and a higher tier of support.

And the program never halts when you grow. Cross your band and loyalty keeps running — a gentle upgrade nudge, never a cut-off, never a surprise per-order line item. Have a quiet month and you can downgrade in one click. We might layer a Concierge tier on top for multi-store Plus brands that need migration help and SLAs — we already have. But the model stays: pay for size, never for features.

What we decided about surfaces

Charm runs on every native Shopify surface that loyalty programs touch: the storefront widget, customer accounts, checkout extensions, post-purchase, thank-you, order status, product pages. Seven surfaces. Zero iframes. Zero scripts polluting the checkout DOM.

This was the part of the build we cared most about. Every loyalty app you've used that felt slightly broken — the widget that loads after the cart updates, the rewards page that opens in a new tab because the app can't render inside Shopify's customer-account theme — felt that way because it was bolted on. Loyalty deserves to live where the customer already is.

What we decided not to build

We could have built reviews, wishlists, SMS, on-site search, social proof popups. We didn't. There are excellent best-in-class apps for each of those. We integrate with the ones we trust (Judge.me, REVIEWS.io, Okendo, Yotpo Reviews, Stamped, Loox, Fera, Air Reviews, Klaviyo — with Ecomail and Omnisend on the way) and we leave them to do what they do best.

The "all-in-one retention suite" model — Growave is the clearest example — is a business decision dressed as a product decision. It optimizes for the vendor's ARR per account, not for the merchant's stack. We picked the opposite trade.

What we decided about how it looks

The most opinionated decision was visual. Most B2B SaaS marketing sites look like Stripe-derivative grid layouts with rounded squares and a hero illustration that could be on any of fifty apps. Charm looks like it was made by a person who cared about how it felt — Playfair Display for headings, hand-drawn doodle illustrations in the brand palette, restraint where the category has bloat.

This isn't decoration. It's a signal to the merchants we want to attract — the ones who care that their own brand looks considered and would prefer a tool that matches.

What we're committing to

  • The model stays. Every feature in every plan, priced by order band — $0 up to 150 orders, then $19 / $59 / $129 as you grow. We will not introduce per-order fees, and we will not paywall a feature you already rely on.
  • The surface set stays native. No iframes will ever ship in the customer account hub or the checkout extensions.
  • The product stays focused. Loyalty, tiers, referrals, campaigns, memberships. Not reviews, not SMS, not search.
  • The changelog stays public. Every release lands at /changelog. You don't have to log in to find out what changed.

If those four commitments are the kind of thing you want from a loyalty vendor, install Charm on Shopify. If they're not — that's fine too. We're not for everyone, and we'd rather be the right tool for some merchants than a generic option for all of them.


That's the case. The product is at /features. The pricing is at /pricing. The team is at Appfleece.