Migrating from Okendo Loyalty to Charm: a self-serve walkthrough
Export your Okendo Customer Profiles, run a dry-run preview in Charm, import balances with one click, keep Okendo reviews if you like, and roll back if anything looks off. A practical playbook with zero customer emails fired.
Okendo is a reviews-first suite, and loyalty is one product inside it. If you're moving the loyalty piece to a focused app — usually because you want deeper native customer-account surfaces, or you don't need the whole suite priced as one — Charm has a built-in Okendo migration preset. You upload your Okendo export, preview exactly what will change, and promote it when it looks right. Nothing fires a customer email along the way, and your Okendo reviews can stay exactly where they are.
The short version
- Export Customer Profiles from Okendo (2 min)
- Install Charm → Settings → Data migration → pick the Okendo preset (3 min)
- Upload the export — Charm runs a dry-run and shows you the resulting balances (auto)
- Review the reconciliation, then import (email-silent)
- Flip the storefront surfaces on, send one comms email
- Changed your mind? Revert restores the pre-import state in one click
The full version follows.
Before you start
- Admin access to both apps — to export from Okendo and install Charm.
- The migration tools are on every plan, Free included: the Okendo preset, a dry-run, reconciliation, and revert. Pro and Plus add dedicated migration assistance if you'd rather we drive.
- Your reward structure — point value, VIP tier thresholds, earning rules. Jot it on one sheet so recreating it in Charm is mechanical.
- A decision about reviews. Charm is loyalty and memberships, not reviews — so you can keep Okendo (or any reviews app) running for reviews and just move the loyalty program. Nothing here touches your review data.
Step 1: Export Customer Profiles from Okendo
In Okendo, export your Customer Profiles. This is a per-customer balance snapshot — one row per member with their current points balance, points spent, VIP tier, enrolment date and channel — and it's the file Charm's preset is built around.
One thing worth understanding: Okendo's separate Loyalty Transactions ledger is keyed by an opaque per-customer hash with no email to join back on, so it can't reconstruct balances on its own. Charm derives each member's balance from the Customer Profiles snapshot instead — that's the file that matters. (More on the transactions file below, if you want a browsable history too.)
Step 2: Pick the Okendo preset
Install Charm, then go to Settings → Data migration and choose Okendo from the platform picker. The preset knows the Customer Profiles column shape, so there's no field-mapping step.
While you're in Charm, set the same point value as Okendo and recreate your earning rules. If your Okendo VIP tiers have different names than the ones you'll use in Charm, you'll map them in the next step — a small panel appears once Charm detects tier values in your file, so "Bronze" can route to whatever you've named the equivalent Charm tier. Leave the storefront widget off for now — you'll switch it on at cutover.
Step 3: Upload and read the dry-run
Drop the export in. Charm runs a dry-run automatically — no data is written yet. You get:
- The balance per customer, straight from the snapshot
- Totals to sanity-check against Okendo — points balance, customer count, points spent, and a lifetime-earned figure derived as balance + spent (Okendo doesn't expose a true lifetime total, so this is a sound floor, not an inflated number)
- A flagged list of anything that needs a decision — a row with no email (skipped), a balance that goes negative (Charm clamps it to zero and flags it), or a VIP tier name that doesn't match a Charm tier yet
- A "data as of" timestamp, read from the export's file name — the only honest freshness marker a balance snapshot carries
Two Okendo-specific things the preview surfaces:
- Pending members. Okendo marks members who earned points via an order but never formally joined as "Pending" (versus "Enrolled"). Their balance is a real liability, so Charm imports them too — but respects your join gate: Enrolled members come in joined, Pending members are stamped to Join & Agree before they can spend. The count is shown so there are no surprises.
- Pending points. Points still inside Okendo's maturation window ("Loyalty Points Pending") are carried across as Charm pending points and released a number of days after import that you choose (14 by default). Nobody's maturing points vanish in the move.
Step 4: Import (nothing emails your customers)
When the preview looks right, run the import. The single most important property here: it is email-silent by construction. Migrated balances are written directly to the ledger — they never pass through the points engine, so no "welcome" email, no "you earned points" email, and no Shopify Flow runs fire for the back-filled history. Importing thousands of customers does not blast thousands of inboxes.
Migrated customers are tagged (migratedFrom: okendo) so they're excluded from your member-growth and earning analytics — your post-migration charts reflect real activity, not the import spike. Enrolment date is taken from Okendo's enrolment date per customer, not today, so the cohort history stays honest. Each member's locale comes across too, so their loyalty emails are localized from day one.
Step 5: Cutover
The goal is to swap the customer-facing loyalty experience without anyone seeing two programs at once — while leaving reviews untouched.
- In Charm → Visibility → Storefront widget → on
- In Charm → Visibility → Customer account hub → on
- In your Shopify theme editor → remove the Okendo loyalty app block (leave the reviews blocks in place)
- Turn off (or downgrade) the loyalty product in Okendo — keep the reviews product if you use it
- Send one comms email (template below)
Customer-facing downtime: zero. The widgets swap inside one render cycle, and your product-page reviews never move.
Step 6: Roll back if needed
This is the safety net most migrations don't give you. Charm snapshots every customer's pre-import balance at the moment you import. If something looks wrong, Revert restores those balances, removes the job's ledger rows and any customers the job created, and marks the job reverted. It's an immediate-undo for the import itself — use it within the cutover window before new activity accumulates on top.
The comms email
Keep it short and reassuring.
Subject: Your rewards just got a small upgrade
Hey {first_name},
Quick note: we've moved our rewards program to a new app called Charm. Nothing changes for you — your points balance ({balance}) and tier ({tier_name}) carried over exactly as they were, and any reward codes you had are still valid.
You'll see a new (and frankly nicer) rewards page in your account: [link to your loyalty hub].
If anything looks off, just reply.
— {your name}
Send it once, the morning of cutover.
A couple of Okendo-specific notes
- Want a browsable history too? After the Customer Profiles import, you can optionally upload Okendo's Loyalty Transactions export. Charm imports it as display-only history — it resolves the opaque customer hash via the Shopify order id on "Placed an order" rows, then attaches every other row for that member. These rows never touch balances, tier qualification, or analytics (those come from the snapshot); they just give members and support a readable earn/redeem log. Run it after the profiles import.
- Reviews stay put. Because Charm doesn't do reviews, there's nothing to migrate there — pair Charm with Okendo's reviews product, Judge.me, Loox, or whatever you prefer. The loyalty move doesn't disturb any of it.
Ready? Install Charm, open Settings → Data migration, and pick the Okendo preset. Want a second pair of eyes first? Email team@appfleece.com — we'll look at your Okendo export before you touch anything.
Comparing more broadly? See Charm vs Okendo for a side-by-side.