Skip to content

Aug 25, 2026

ImprovementsFixes

Numbers that tell the truth on a freshly migrated store

A store that just moved its program over starts with a hundred thousand imported points and three recorded orders. Analytics used to treat that like a year of trading, and graded it accordingly.

  • Imported balances stay out of the redemption rate. Points that arrived from your previous program were never issued by Charm, so counting them as unredeemed made every fresh migration look like a failure. Each metric now says on its card what it does and doesn't count
  • Codes taken over from your old app no longer inflate reward cost. Discounts that Charm kept alive during a takeover were being priced as if Charm had granted them
  • Too few buyers to grade means no grade. Under ten recorded buyers, the repeat-purchase and retention ratios show a dash instead of "0% repeat, below average", and the benchmark pill and its advisor warning stay quiet. The underlying counts and the honest "3 of 9,536 buyers" subline stay visible — you see the sample, not a verdict off three orders
  • A re-import keeps the original migration date, so the imported-base note doesn't reset every time you top a file up

Point counts group like your currency does. A shop selling in rupees now sees 1,00,000 points, not 100,000 — digit grouping follows the store's currency everywhere points appear: widget, loyalty page, cart, checkout, POS and emails.

Under the hood: an order-points path could look up a shop's currency before the database connection was ready, dropping points on the first order after a cold start. Fixed. And 120 dependency advisories are closed, with React Router and the pub/sub, codegen and lint toolchains moved to current majors.