# Charm documentation URL: https://docs.charmloyalty.com import { CardGrid, LinkCard } from '@astrojs/starlight/components'; Charm is a Shopify-native loyalty and membership platform: points & rewards, VIP tiers, referrals, paid memberships, store-credit cashback, and POS — every feature on every plan. This site documents how Charm works and how to set it up — from your first earning rule to storefront surfaces, integrations, and migrating from another loyalty app. Start here Install & connect — add Charm to a store and grant scopes. Your first program — earning rules, rewards, and turning the widget on. Points & rewards — the points ledger, reward types, and how every program builds on it. Popular guides The quickest answers to the questions we hear most — each program (Points, VIP tiers, Referrals, Memberships, Campaigns) has its own section in the sidebar. Going further Charm is built on Shopify's own primitives — nothing is iframed, and nothing is injected into checkout. Storefront surfaces — the widget, product-page, customer-account, checkout, and POS surfaces. Theme app blocks — add the widget and product blocks in the theme editor. Shopify Flow — automate loyalty with Charm's Flow actions and triggers. Klaviyo — two-way sync of loyalty events and profile properties. Ecomail — sync loyalty state and referral data onto Ecomail contacts and trigger automations from loyalty events. Migration — moving from another loyalty app? See the importer under Settings → Data migration and the FAQ. Need help? Email hello@appfleece.com. Privacy and terms live on the company site. --- # Analytics URL: https://docs.charmloyalty.com/analytics/overview Charm → Analytics answers one question: is the loyalty program paying for itself? Every figure comes from your own store data — no estimates, no benchmarks pretending to be your numbers. Choosing a period A period selector sits at the top of the page: Today, Yesterday, Last 7 / 30 / 90 days, This month, Last month, All time, or a custom range. Turn on Compare to previous period and each headline metric gains an up/down figure against the equivalent window before it. Anything that says lifetime ignores the selected period on purpose — retention and breakage only mean something across a member's whole history. The tabs Overview The headline set: program revenue, reward cost, return on investment, active members, points issued vs redeemed, and outstanding liability. Read it as a single sentence — this much revenue came from members, these rewards cost that, here's the ratio. Growth & ROI Program revenue — revenue from orders placed by loyalty members in the period. Reward cost — the value of rewards members redeemed in the period. Return on investment — loyalty revenue ÷ reward cost. Higher is better; the chart plots the two series together so you can see them diverge. Outstanding liability — what you would owe if every unspent point were redeemed at once. It is a ceiling, not a forecast. VIP perk savings and cashback issued break out what tiers and cashback specifically cost you. Points & rewards Points earned, points redeemed, and the number of redemptions, plus two ratios worth watching: Redemption rate — points redeemed ÷ points earned. Very low means points aren't reaching a reward customers want; very high means your rewards may be too cheap. Breakage rate — the share of issued points that expired before anyone redeemed them, lifetime. Lower is better. Top earning sources shows where points come from (orders, signup, referrals, birthdays, reviews, claimed rules, manual adjustments, newsletter and SMS signups, Shopify Flow, order edits), and Top rewards redeemed shows which rewards members actually pick. Customers Retention, measured across all members rather than the selected period: Repeat-purchase rate — members with 2+ orders ÷ members with at least one. One-time buyers — bought exactly once. This is the audience a win-back campaign exists for. Average orders per buyer and at-risk members (bought before, since gone quiet). Member impact — the share of all your store's orders that came from members, plus member average order value against the store's. Member growth charts new enrollments over time. Redeemers vs non-redeemers Buyers who redeemed a reward in the last 12 months, set against buyers who haven't: Customers, Annual spend, Frequency, and Avg. order value, each carrying a lift badge against the non-redeemer column. The card leads with whichever gap is strongest — "Customers who redeem spend 3.2× as much as those who don't" — and says nothing at all when the lift is under 1.1× or one of the two groups is empty, so a thin month never produces a headline the data can't carry. Reach for this one when redemption starts looking expensive. Rewards cost real money; this card is the other half of that sentence. VIP & memberships Per-tier member counts, annual spend, and purchase frequency, each compared against your base tier, so you can see whether a tier actually changes behavior or just hands out perks. Alongside it, paid membership figures: active, in grace, and expired members, membership revenue, monthly recurring revenue, new members this month, memberships expiring within 30 days, renewal rate, and 30-day churn. Spend and frequency here cover the trailing 12 months. Referrals Total referrals, how many converted to a first order, the conversion rate, and your share rate — the portion of members who have referred at least one friend. A healthy program usually needs the share rate to move before conversion does. If you migrated from another loyalty app A store that has just imported its program starts with a large balance of points nobody earned in Charm and only a handful of orders Charm has actually recorded. Analytics knows the difference and says so rather than grading you on it: Imported balances are excluded from the redemption rate, because Charm never issued those points. They are counted in outstanding liability, since you genuinely owe them. Reward codes taken over from your previous app don't count toward reward cost — Charm kept them alive, it didn't grant them. See reward codes from your previous app. Retention isn't graded on too small a sample. With fewer than ten recorded buyers, the repeat-purchase and average-orders ratios show a dash instead of a score, and no benchmark or Advisor warning is raised. The counts stay visible, along with an honest "3 of 9,536 buyers" line, so you can see the sample rather than a verdict drawn from it. Re-importing keeps the original migration date, so topping up a file doesn't restart the imported-base notice. These notes clear themselves as real activity accumulates. Nothing is hidden permanently — the numbers simply wait until they mean something. The Advisor At the top of Analytics, the Advisor reads your program the way a consultant would and writes a short list: What's working, and To improve. Tips are specific to your data — a redemption rate that has stalled, a tier nobody reaches, an earning rule that pays nothing. Dismiss any tip you have decided against, and it stays gone. Tips you fix disappear on their own and are marked as resolved. Exporting Export CSV downloads the current view with the period you have selected, for your own spreadsheets or reporting. To pull the underlying customer and points records instead, see Export your Charm data. Related Check your plan, order cap, and overage status Export your Charm data Migrate from another loyalty platform Concept: Campaigns Concept: Paid memberships --- # Use Charm from Claude and ChatGPT (MCP) URL: https://docs.charmloyalty.com/api/mcp Charm ships an MCP (Model Context Protocol) server on top of the public API, so AI assistants like Claude and ChatGPT can read and act on your loyalty program — "how many points does jane@example.com have?", "give her 500 bonus points", "list rewards redeemed this week" — using the same guarded endpoints as the REST API. Connect an assistant Endpoint: (Streamable HTTP) Auth: a Charm API key from Settings → API in the Charm admin — either sent directly as a header, or handed over once through the OAuth consent page, depending on the client. Browser assistants (claude.ai, ChatGPT): add the endpoint URL as a custom connector — nothing else. The assistant discovers Charm's OAuth flow on its own and opens a consent page where you paste your API key once; the connector then runs on short-lived tokens derived from that key. Connected assistants are listed under Settings → API → Connected assistants, where one click disconnects them. Header-capable clients (Claude Code, IDEs, custom MCP clients): send the key yourself: How it behaves Tools mirror the API. Every public API endpoint is exposed as an MCP tool, generated from the same registry — path, query, and body parameters flatten into one tool argument object, so the tools can never drift from the API. Your key's scopes are the assistant's capabilities. A read-only key exposes only read tools; granting a write scope adds the matching mutation tools. Revoking the key cuts the assistant off entirely. Same guards as HTTP. Every tool call passes the same scope checks, rate limits, and idempotency handling as a direct API request. Mutations accept an optional argument; without one, each call is treated as a fresh "do this now" instruction. Related API overview — endpoints, scopes, keys, and rate limits Set up Shopify Flow triggers and actions --- # Charm API URL: https://docs.charmloyalty.com/api/overview The Charm API is a shop-scoped REST API for server-to-server integrations. It reads and writes the same points ledger the app itself uses, so anything you do through the API shows up in the customer's history, in analytics, and in the storefront widget exactly as if it had happened inside Charm. The machine-readable spec is served unauthenticated at [](https://charm.appfleece.app/api/v1/openapi.json) (OpenAPI 3.1) — point your client generator or API tooling at it. The API is available on every plan. Access is switched on per store — message us in the in-app support chat (Settings → API has a button) and we'll enable it for you. The ask-first step exists so we know who is integrating and can help from day one, not to upsell. What stores build with it In-store purchases earn points. Your loyalty program shouldn't stop at the webshop door. A small bridge from your POS or cash register awards points per receipt ( with the receipt number as ), so omnichannel customers see one balance everywhere. Loyalty context in your helpdesk. Show balance, tier and recent history next to every ticket, and let support grant goodwill points right from the helpdesk after a rough experience ( with a reason the customer sees). Reward actions that happen outside Shopify. Reviews on an external platform, wholesale-portal orders, event attendance, a packaging-return program — anything your systems can observe can earn points. Mirror balances into your CRM or data warehouse. Nightly reads of customers and transactions feed segmentation, BI dashboards and accrual reporting without touching the app. One-off imports and corrections. Migrating from a legacy program or fixing a batch of balances beats clicking through the admin one customer at a time. Authentication Create API keys in Settings → API in the Charm admin. Each key has: a label, so you know which integration it belongs to a set of scopes (below) — grant only what the integration needs; the read-only preset is pre-selected a token starting with , shown exactly once at creation (and once more if you rotate it). Charm stores only a hash — a lost token means rotating or minting a new key. Lost the token, or want to swap it out on a schedule? Rotate a key from its detail view (the edit icon next to any key in Settings → API): it mints a fresh token under the same name and scopes and revokes the old one in the same action. Rotation requires the access grant, like creating a key — it mints a credential either way. Revoking a key never requires the grant: taking access away is never gated. A revoked key can be permanently deleted once it's revoked — deletion is a second, explicit step, never a shortcut around revocation. Send the token as a bearer token on every request: The shop is always resolved from the key itself — there is no parameter, and one supplied in a request is ignored. Keys are server-side credentials: never ship one in a browser, mobile app or theme (there is no CORS support on purpose). The Pause API switch in Settings → API stops all API traffic for the shop immediately without revoking any keys. Scopes | Scope | Grants | |---|---| | | Shop profile, currency, points name, plan | | | Customer list and detail — balance, tier, referral code, email | | | Exclude / re-enroll customers, set or clear a tier override | | | A customer's points transaction history | | | Earn, deduct and adjust points | | | Redemption rules and reward catalog | | | Redeem rewards and reverse redemptions — mints real discount codes / store credit | | | Program performance summary — members, points, attributed revenue, trends | | | Register, list and delete webhook endpoints | There is no wildcard scope, and every scope automatically includes its sibling — a key that can change what it cannot see would help nobody. deserves respect: combined with it can manufacture discounts, which is why both carry the tightest limits below. Endpoints | Method | Path | Scope | |---|---|---| | GET | | | | GET | | | | GET | | | | GET | | | | GET | | | | GET | | | | GET | | | | POST | | | | POST | | | | POST | | | | POST | | | | POST | | | | POST | | | | DELETE | | | | POST | | | | POST | | | | GET | | | | GET | | | | POST | | | | DELETE | | | accepts a Shopify customer GID () or the bare numeric id (). Email is a query filter on the collection endpoint, never a path segment. Program configuration is read-only in v1 — rules, tiers and referral settings are managed in the Charm admin. Prefer being told over asking? Webhooks push , , and friends to your server as they happen, HMAC-signed and retried. A ready-made Bruno collection with one request per operation lives in the app repository under . Idempotency Every and requires an idempotency key (any unique string, e.g. a UUID) — normally the header, or the query parameter for no-code clients that cannot vary a header per run (a Gorgias action button, say). The query parameter wins when both are present, so a stale fixed header left behind in a no-code tool's configuration cannot override it. A client whose configuration is fixed — a helpdesk action button, say — can send the literal instead of a key and have one derived from the request itself. An identical repeat within 60 seconds is then refused with , naming how long ago it ran, rather than silently replaying the first result; anything that differs is a new operation immediately, and a derived key can never collide with another caller's. Retrying with the same key replays the original response — marked with — instead of running the operation again, so a crashed integration can retry blindly without awarding points twice or minting two discount codes. Keys are remembered for 24 hours; reusing one with a different request returns . Points earning is additionally idempotent at the ledger level: (required on earn) is unique per customer, so the same event can never award twice even across different idempotency keys. Rate limits Limits protect your own store first — every Shopify API call the Charm API makes competes with order processing and points awarding for the same per-store budget. | Class | Limit | |---|---| | Reads | 10 req/s, 600/min per key | | Writes (points, customer state) | 5 req/s per key, 300/min per shop | | Shopify-touching writes (redemptions, tier overrides) | 20/min per shop, plus a daily cap: 1 000 by default, 5 000 on Unlimited | | Points volume | a daily budget that scales with your shop's normal issuance | Every response carries , and for the tightest applicable bucket; a includes . Shopify-touching writes are also shed pre-emptively with a when your store's Shopify API budget is running low — back off and retry after the indicated delay. Need a higher cap for a migration or a Plus store? Contact support — limits are adjustable per shop without a deploy. Errors Errors use one envelope, and every response carries an header (also echoed in the body) — include it when contacting support: | Code | Status | Meaning | |---|---|---| | | 401 | No bearer token presented | | | 401 | Token unknown or revoked | | | 403 | Key lacks the required scope | | | 403 | API access is not enabled for this store yet — ask us in the support chat | | | 403 | The merchant paused API access | | | 404 | Unknown path or resource | | | 409 | Same key, different request body | | | 422 | Malformed input | | | 422 | Balance cannot cover the operation | | | 429 | A limit above was hit — honor | | | 500 | Unexpected failure on our side | | | 503 | Shopify is throttled or unreachable — retry later | Pagination List endpoints return . Pass the cursor back as to fetch the next page; a cursor means the end. defaults to 50 (max 250). There is no total count — pages are stable under concurrent writes, counts would not be. History attribution Writes show up in the customer's points history. A you supply is shown to the shopper verbatim; without one, a localized default ("Awarded via API") is used in the shopper's language. Every API transaction also records which key made it, so support can always answer "who changed this balance". --- # Webhooks URL: https://docs.charmloyalty.com/api/webhooks Charm can push loyalty events to your server the moment they happen, so an ERP, CDP or a no-code tool like Make or Zapier reacts in seconds instead of polling on a schedule. Topics | Topic | Fires when | |---|---| | | A customer earns points (orders, rules, API awards) | | | A balance is corrected or deducted — is signed, negative for deductions | | | Points are spent on a reward | | | A customer reaches a new VIP tier | | | A customer gets close to the next tier | | | Store credit lands on a customer's account | | | A referred friend's qualifying order completes | Subscribe Webhooks are managed over the API with a key that carries the scope: The response includes the endpoint's signing exactly once — store it; it is never shown again (lose it and you delete + recreate the endpoint, which costs nothing). lists your endpoints with delivery health, stops deliveries. A store can hold up to 10 endpoints, and the URL must be public https. What a delivery looks like is the numeric Shopify customer id — the same value the customer endpoints accept. Verify the signature is the base64 HMAC-SHA256 of the raw request body, keyed with the endpoint's secret. Verify before trusting anything: Compute it over the raw bytes — re-serializing the parsed JSON will produce a different string and a false mismatch. Delivery semantics Acknowledge fast. Respond with any within 5 seconds. Do the real work after responding if it might take longer. At-least-once. A delivery that isn't acknowledged is retried with backoff (1 min → 24 h, 7 attempts over ~33 hours), then dropped. Duplicates are possible — dedupe on the event , which stays the same across every retry. Redirects are not followed. Register the final URL. Failing endpoints switch off. After 25 consecutive failed attempts the endpoint is disabled ( shows ); delete and recreate it once your receiver is healthy. Related API overview — keys, scopes, rate limits, idempotency MCP for AI assistants — the same events, asked about in natural language --- # Clone a campaign to reuse for another occasion URL: https://docs.charmloyalty.com/campaigns/clone-a-campaign Reuse a campaign that worked — clone it to copy its multiplier, scope, audience, and email setup, then just update the name and dates. Steps 1. Go to Charm → Campaigns. 2. On the campaign's row, open More actions and choose Clone (or tick rows and use the Clone bulk action). 3. The clone opens as a Draft — update its name and Starts at / Ends at dates, then Save and Schedule. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Preview a campaign email with a test send --- # Limit a campaign to specific products or collections URL: https://docs.charmloyalty.com/campaigns/limit-to-products Apply a campaign's bonus multiplier to only part of your catalog — for example, double points on a single collection while everything else earns the normal rate. Steps 1. Go to Charm → Campaigns and open the campaign you want to scope. 2. In Product scope, set Apply to which products? to Only selected products / collections (or All except selected products / collections to invert it), then use Pick products and Pick collections, or enter comma-separated Product tags. 3. Click Save to apply the change. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Target a campaign to a VIP tier or customer tags --- # Choose how a campaign multiplier stacks with VIP multipliers URL: https://docs.charmloyalty.com/campaigns/multiplier-stacking Decide what a VIP member earns during a campaign — for example, whether a Gold member's 1.5x tier bonus combines with a 2x campaign or whether one wins outright. Steps 1. Go to Charm → Campaigns and open the campaign you want to adjust. 2. In Basics, set Stacking with VIP tiers to Compound (multiply), Use highest, or Replace tier multiplier. 3. Click Save to apply the change. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Target a campaign to a VIP tier or customer tags --- # Campaigns & Reward Spotlight URL: https://docs.charmloyalty.com/campaigns/overview Campaigns layer a time-boxed event on top of your everyday program — a long weekend of double points, a Black Friday reward sale, a members-only week. A campaign carries its own schedule, audience, storefront banner, and emails, then ends cleanly without touching your base rules. Two campaign types Earning boost — multiplies the points earned during the window (e.g. 2× points). You choose: which activities are boosted (order placed, reviews, etc.), the audience (everyone, a VIP tier, or a customer tag), an optional product scope and stacking behavior, optional caps on orders or bonus points. Reward Spotlight — the redemption side of a campaign. During the window it can: put existing rewards on sale at a lower points cost, and unlock exclusive rewards that are otherwise hidden, so a reward can be offered only during the event. The reward engine enforces sale prices and exclusivity at redemption time across online, hub, and POS — a single choke point, so nothing leaks before or after the window. Scheduling & banners Start and end times are interpreted in your store's time zone. Each campaign shows a storefront banner on the widget and account hub with a live countdown. Banner title and subtitle are editable per language, with localized system defaults. Emails Campaigns can announce themselves over email: Earning campaigns support teaser, launch, and last-chance blasts. Reward Spotlight campaigns send a launch announcement listing the spotlighted rewards. Email copy is managed in the shared email system, localized per recipient — what you preview is what sends. Plan ahead & measure The occasion planner surfaces upcoming moments (Valentine's, Mother's Day, Black Friday/Cyber Monday, and more, country-aware) and creates a pre-filled campaign in a click. Analytics report each campaign's orders, bonus points, attributed revenue, and spotlight redemptions — with lift versus the prior equivalent window. Related how-tos Run a 2x points campaign for a fixed weekend Limit a campaign to specific products or collections Target a campaign to a VIP tier or customer tags Choose how a campaign multiplier stacks with VIP multipliers Create a reward spotlight (limited-time reward unlock or sale) Clone a campaign to reuse for another occasion Preview a campaign email with a test send Use Klaviyo flows instead of Charm emails --- # Create a reward spotlight (limited-time reward unlock or sale) URL: https://docs.charmloyalty.com/campaigns/reward-spotlight Run a campaign that temporarily discounts a reward's points cost or surfaces a normally-hidden reward — perfect for limited-time exclusives. Steps 1. Go to Charm → Campaigns, click New campaign, and pick a Reward spotlight template. 2. In Spotlight rewards, use Rewards on sale to lower the Sale cost on rewards customers can already redeem, and Exclusive unlocks to surface a disabled reward only while the campaign runs. 3. Set your dates in Basics, Save, then Schedule or Activate now. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Preview a campaign email with a test send --- # Run a 2x points campaign for a fixed weekend URL: https://docs.charmloyalty.com/campaigns/run-a-points-multiplier Drive a sales spike by doubling the points customers earn for a limited window — for example, a 2x campaign that runs Friday to Sunday. Steps 1. Go to Charm → Campaigns, click New campaign, and pick a template (or Start blank). 2. In Basics, enter a Campaign name, set the Multiplier to , and choose Starts at / Ends at dates with their Start time / End time to cover your weekend. 3. Save, then Schedule (to start automatically at the start time) or Activate now. Related Concept: Campaigns Target a campaign to a VIP tier or customer tags Choose how a campaign multiplier stacks with VIP multipliers --- # Target a campaign to a VIP tier or customer tags URL: https://docs.charmloyalty.com/campaigns/target-an-audience Run a campaign for a chosen audience only — for example, a double-points weekend reserved for your top VIP tier or a set of tagged customers. Steps 1. Go to Charm → Campaigns and open the campaign you want to target. 2. In Audience, set Who is eligible? to Specific tiers (then check tiers under Pick tiers) or Customer tags (then enter Customer tags as a comma-separated list). 3. Click Save to apply the change. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Limit a campaign to specific products or collections --- # Preview a campaign email with a test send URL: https://docs.charmloyalty.com/campaigns/test-campaign-email Check exactly how a campaign email looks before it reaches customers by sending a test copy to yourself. Steps 1. Go to Charm → Campaigns and open the campaign. 2. In the right sidebar, expand Send a test email and set Which email to a phase — Teaser, Launch, or Last chance. 3. Enter one address and click Send test. Related Concept: Campaigns Run a 2x points campaign for a fixed weekend Clone a campaign to reuse for another occasion --- # Audit loyalty activity in the Activity Log URL: https://docs.charmloyalty.com/data/activity-log Review every points and store-credit event across your whole store in one feed, newest first — and export it for reconciliation or accounting. Steps 1. Go to Activity. 2. Filter with Activity type (earn, redeem, credit, adjust, expire), From date / To date, and Search by customer or description. 3. Click Export CSV to download the rows matching your current filters. Related Concept: Points & rewards Export your Charm data Launch (or pause) your loyalty program --- # Change the Charm admin interface language URL: https://docs.charmloyalty.com/data/change-admin-language Switch the language of the Charm admin so you and your team work in the language you prefer. Steps 1. Go to Settings → App language. 2. In App language, choose any of Charm's 32 languages — or Automatic (from Shopify) to follow your Shopify admin. 3. Refresh the page for the change to take effect, as the banner prompts. Related Supported languages Concept: Points & rewards Check your plan, order cap, and overage status Export your Charm data --- # Copy settings between your stores URL: https://docs.charmloyalty.com/data/copy-settings-between-stores If you run the same brand on several stores, copy your Charm configuration from one to the other instead of rebuilding it — points program, tiers, branding, text, emails, and referrals, each opt-in. Steps 1. On the source store, go to Settings → Data migration → Copy between your stores and click Generate code. Copy the one-time code (format ) — it expires after 15 minutes, and nothing changes on this store. 2. On the destination store, open the same section, paste the code into Transfer code, and click Preview. 3. Review Choose what to import — each section shows what it contains (for example "Points program — 6 earning rules, 4 rewards"). Untick anything you want to keep as-is on this store. 4. Click Import selected. 5. If the success banner says some settings need a quick re-pick, open those settings and re-select the products, discounts, or images they point to — references to the other store's resources can't carry over. Undo Before the import, Charm snapshots the destination store's previous settings. A banner on the page offers Undo import for 30 days — it reverts only the sections you imported and leaves everything else untouched. Related Migrate from another loyalty platform Import point balances Revert an import --- # Export your Charm data URL: https://docs.charmloyalty.com/data/export-data Download a CSV of your loyalty data anytime — to back it up, analyze it, or audit activity outside Charm. Steps 1. Go to Settings → Data migration → Export your data. 2. Pick a data type — Customer balances, Active rewards, Referrals, or Memberships — and click Download CSV on that tile. 3. For very large stores, use Email me the export instead: choose a Data type, enter an email under Send link to, and Charm emails a download link. Related Concept: Eligibility, expiry & anti-fraud Audit loyalty activity in the Activity Log Import existing customer point balances --- # Look up a customer and read their loyalty profile URL: https://docs.charmloyalty.com/data/find-a-customer Everything Charm knows about one member sits on their loyalty profile: balance, tier, how they earned it, which rewards they hold, which emails they got. Customers is where you find them — usually because a support ticket just landed. Find the customer 1. Go to Customers. 2. Type into Search customers — a name, an email address, or a Shopify customer ID. Names are matched through Shopify, so "novakova" finds her even though Charm stores the loyalty record against an ID. 3. Narrow the list further if you need to: - Segment — All customers, ⭐ Champions, ⚠️ At-risk, or 🚩 Watch-list. - Tier, Status (Active, Excluded, Migrated), and Min / Max balance. 4. Sort by Balance, Earned or Redeemed by clicking the column header, and click a row to open the profile. What the profile shows Customer info carries the numbers you'd otherwise go digging in Shopify for: | Field | Where it comes from | |---|---| | Orders (all time) and Total spend (all time) | Shopify's own lifetime totals for the customer, including orders placed before your loyalty program existed | | Average order value | The two above, divided | | Program orders | Only the orders Charm has tracked since the program started | | Member since | When they joined the program | Because the all-time figures are Shopify's lifetime aggregates rather than a sum of the orders Charm can see, a customer who has shopped with you for five years reads as a five-year customer — not as someone who arrived when you installed Charm. Below that: the Current Tier with the option to Change tier (a manual override), the points history table (date, type, description, points, running balance — including the note behind every manual adjustment), Active reward codes with their status and expiry, Emails sent to this customer, and the Referral program panel with their referral link and code. Loyalty risk signals appears only for a customer who has tripped the watch-list — points redeemed against orders that were later refunded, refunds that wiped out net spend, a repeated redeem-then-refund pattern. Charm shows the evidence and leaves the decision to you. Act on the profile Adjust points — add or remove points with a note; the note shows up in the history and in the Activity log. Redeem reward — redeem on the customer's behalf, for a phone or counter request. Change tier — a manual VIP override when the earned tier isn't the right answer. Edit birthday or Set name day — for the birthday and name day bonuses. Exclude customer — stop them earning and redeeming, with a reason recorded. Re-enable any time from the same place. Transfer balance — move everything to another profile when Shopify can't merge the two. See merge duplicate customers. Related Merge duplicate customers and transfer a balance Audit loyalty activity in the Activity Log Export your Charm data Concept: Eligibility, expiry & anti-fraud --- # Import existing customer point balances URL: https://docs.charmloyalty.com/data/import-point-balances Bring your customers' existing point balances over when you move to Charm, so nobody loses what they earned on your old platform. Use this template flow when you're building your own file — moving from Rivo, Ellity, Okendo, or LoyaltyLion? The automatic platform migration skips the spreadsheet work entirely. Steps 1. Go to Settings → Data migration and click Import from a CSV template. 2. Under Import opening balances, click Download CSV (or Copy for Sheets) and fill in one row per customer. Only (or ) and are required — the other columns enrich the record: , , , , , , , , and . 3. Set How to handle balances — Replace customer balance with imported balance, Add imported balance to current balance, or Skip customers already in Charm — then click Choose CSV, select your file ( or both work), and click Import customer balances. The result appears under Recent imports with imported, skipped, and failed row counts. This template import runs immediately, so keep the page open until it finishes. Moving a very large list, or migrating a whole store off another platform? Use the platform migration flow instead — it processes big files in the background — or let Charm's team do it for you (free). Related Concept: Eligibility, expiry & anti-fraud Migrate from Rivo, LoyaltyLion or another loyalty platform Revert an incorrect import --- # Launch (or pause) your loyalty program URL: https://docs.charmloyalty.com/data/launch-or-pause-program Turn your program on to start rewarding customers, or pause it temporarily without deleting any balances or configuration. Steps 1. Go to Program. 2. Check the Setup summary card — a count of the core building blocks (earning rules, a reward, app embed) you need before launch. 3. In the Program status card, turn on Enable loyalty program and click Launch program (or Save). To pause later, switch the toggle off — the status flips to Paused and customers stop being rewarded. Running referrals or memberships without points The points program is one switch among several: you can run referrals or paid memberships with points switched off entirely. When you do, Charm stops talking about points on the storefront: The floating widget drops the balance header, the bonus-campaign banner, and the numeric badge on the launcher; the launcher falls back to your program name. The referral, discount-code, and membership rows stay. Earning rules and rewards are withheld from every surface, including already-installed theme blocks, so a staged program can't leak before launch. VIP tiers hide on the landing page and in the Loyalty Hub, along with the tiers FAQ — tiers run on points. Points history stays visible to customers who actually have rows in it, so a shop that ran points and later switched them off never makes past balances unreadable. While the program is off, the theme editor still previews your staged configuration, so you can place and style every block before launch — see theme app blocks. Related Concept: Points & rewards Audit loyalty activity in the Activity Log Check your plan, order cap, and overage status --- # Merge duplicate customers and transfer a balance URL: https://docs.charmloyalty.com/data/merge-customers When the same person ends up with two customer accounts, their points end up split across both. Merging the accounts in Shopify brings their loyalty data together too; when Shopify refuses to merge, you can move the balance across by hand. Merge in Shopify and let Charm follow 1. In the Shopify admin, open Customers, select the two duplicate profiles and merge them the usual way, choosing which profile to keep. 2. That's it. Charm picks the merge up automatically and moves the deleted profile's points, points history, issued rewards, tier progress and referral record onto the profile you kept. A merge that fails in Shopify changes nothing in Charm, and a repeated notification can never add the same balance twice. Transfer a balance by hand Shopify won't merge a customer who holds store credit or an active subscription. For those, move the balance across in Charm instead. 1. Go to Customers and open the profile you want to empty. 2. Click Transfer balance. 3. In Target customer, type the email address or customer ID of the profile that should receive everything. 4. Choose Points handling: - Add balances together — the default; the target ends up with both balances. - Keep target's points only — use when the two balances are the same points counted twice. 5. Click Preview to see exactly what moves, then Transfer. The source profile is excluded from the program afterwards, so nobody earns on it by accident. What moves Everything Charm keys to the customer follows the merge: | Moves to the kept profile | Stays where it is | |---|---| | Points balance, lifetime points and tier points in the period | Shopify's own store credit account — Shopify decides what happens to it during a merge | | Points history, including the note behind every manual adjustment | Orders — Shopify merges those itself | | Issued rewards and unused reward codes | | | Reward codes taken over from a previous loyalty app | | | Store credit ledger entries Charm recorded | | | Loyalty email history | | | VIP tier, tier progress and lifetime spend | | | Referral record, referral code and both sides of any referral | | The kept profile's tier is re-evaluated straight after the merge, so a customer whose combined points clear the next threshold moves up right away. Related Look up a customer and read their loyalty profile Import point balances from a file Revert an import Activity log --- # Migrate from Smile, Rivo, Loloyal, LoyaltyLion or another loyalty platform URL: https://docs.charmloyalty.com/data/migrate-from-another-platform Move your whole program over by uploading your old loyalty app's export — Charm detects the format, maps the columns, and imports your customers' point balances with no spreadsheet editing. Smile.io, Rivo, Yotpo, Ellity, Okendo, Loloyal, and LoyaltyLion exports are recognized automatically; both and files work. Steps 1. Go to Settings → Data migration → Migrate from another platform. 2. Under Which app are you moving from?, select your platform (Smile.io, Rivo, Yotpo, Ellity, Okendo, Loloyal, or LoyaltyLion), then click Choose CSV and pick your unmodified export file. 3. Review the Import preview — customers, opening points, and any rows needing attention. Under Map your VIP tiers, match your old tier names to Charm tiers, then click Confirm and import. The preview adapts to what's in your file: unmatched customers get a Create Shopify accounts checkbox, points still maturing in your old app get a Release imported pending points after (days) field, and customers who never formally enrolled in the old program (Okendo "Pending", LoyaltyLion members with no enrolment date) are routed through Charm's join step when program opt-in is on. Large files run in the background — a Large file — the import will run in the background banner appears, and you can leave the page. The Recent imports table tracks each job's status (Queued, Running, then Completed) with imported, skipped, and failed row counts; click View errors on a job that finished with problems to see the rows that failed. If something lands wrong, revert the import. Balances and tiers aren't the only thing worth bringing over: discount codes your customers earned in the old app but never redeemed are still active in Shopify. Take over those reward codes from the same page — Charm scans them in your store, no export needed. Related Concept: Eligibility, expiry & anti-fraud Take over reward codes from your previous loyalty app Import existing customer point balances Revert an incorrect import --- # Check your plan, order cap, and overage status URL: https://docs.charmloyalty.com/data/plan-and-billing Check which plan you're on, how many loyalty orders you've used this period, and whether you've gone over your monthly cap. Steps 1. Go to Plan (the Billing & Plan page). 2. Read the Orders this month usage bar — orders used against your cap (e.g. ) for the current billing period, turning amber and then red as you approach and pass the limit. 3. If you're over the cap, an enforcement banner appears at the top; click Upgrade (or pick a plan card) to move to a higher tier. Related Concept: Points & rewards Launch (or pause) your loyalty program Audit loyalty activity in the Activity Log --- # Revert an incorrect import URL: https://docs.charmloyalty.com/data/revert-an-import Undo a migration that went in wrong — from a snapshot it takes before writing, Charm restores balances to how they were before the import and removes any customers it created, so you can fix your file and re-import cleanly. Steps 1. Go to Settings → Data migration → Recent imports. 2. Find the import job and click Revert on its row. If the job finished Completed with errors, click View errors first to see which rows failed. 3. Confirm in the Revert this import? dialog by clicking Revert import. Related Concept: Eligibility, expiry & anti-fraud Migrate from Rivo or another loyalty platform Import existing customer point balances --- # Take over reward codes from your previous loyalty app URL: https://docs.charmloyalty.com/data/reward-codes-from-previous-app Discount codes your customers earned in a previous loyalty app but never redeemed still live in Shopify — and they stay redeemable at checkout even after that app is gone. Charm finds them right in your store (no export file needed) and lets you decide what happens to them. Steps 1. Go to Settings → Data migration and find the Reward codes from your previous app card. 2. If the old app issued codes with a shared start, enter it in Code prefix (e.g. ); leave it empty to scan all unused single-use codes. Click Scan discount codes — the scan skips codes minted by Charm, already-used codes, and multi-code merchant promotions. 3. Review the Scan results: how many unused codes were found, how many are Linked to a customer, the fixed-amount value total, and the split between fixed-amount, percentage, and free-shipping codes. 4. Under What should happen to them?, pick a policy and click Apply to found codes: - Convert to points — each fixed-amount code is deactivated and its customer gets points of matching value instead, using the Conversion rate you set (Charm suggests one from your own reward pricing). Percentage and free-shipping codes are left untouched. - Keep and show in Charm — codes stay valid and each customer sees theirs in the loyalty program among their rewards; once redeemed, it's marked as used automatically. - Let them run out — codes stay valid at checkout but aren't shown anywhere in Charm. - Deactivate without compensation — every found code is deactivated with nothing in return, including codes with no customer link. Batches run in the background and usually finish within a minute; the card shows the last run's done, skipped, and failed counts. Codes handled by an earlier run are tracked (the Handled previously badge) and never processed twice. If a run lands wrong, click Undo last run. If the old app deleted the codes you kept Uninstalling your previous loyalty app can delete or deactivate the discount codes in Shopify — including the ones you chose to keep. Customers usually find out at checkout. Click Verify & restore codes on the same card. Charm reviews every kept code against Shopify, recreates the ones that were deleted and reactivates the ones that were switched off, exactly as they were issued. Codes a customer already used are never brought back to life. The summary afterwards reads like , so you can see what the old app took with it. Running the check again is harmless — codes that are already fine are left alone. Related Migrate from Rivo, LoyaltyLion or another loyalty platform Import existing customer point balances Revert an incorrect import --- # Switch between formal and casual wording URL: https://docs.charmloyalty.com/data/set-tone-of-voice Many languages address people differently depending on how formal you want to sound — Czech vykání / tykání, German Sie / du, French vous / tu, Spanish usted / tú. Charm's Tone of voice setting lets you pick one register, and it applies to all of your default customer-facing copy at once — consistently across every language your store uses. Steps 1. Go to Settings. 2. Find Tone of voice. 3. Choose Formal or Casual. The options show what that means in your store's own languages — a Czech + English store reads *Formal (vykání, formal) / Casual (tykání, casual)*. 4. Save. Your choice reflows the default copy across every customer surface — the storefront widget, Loyalty Hub, landing page, auto-generated FAQ, and customer emails — in every language that has the distinction. Leave the setting untouched and each language stays on its own natural default (formal for German and Czech, informal for Spanish and Italian, and so on). A different tone for one language Brands don't always speak the same way in every market — you might be casual in Czech but keep German customers on Sie. If your store publishes more than one language with the distinction, an Edit button appears next to the switch: 1. Click Edit next to the Tone of voice select. 2. Each published language shows its current register, pre-filled from the brand-wide setting — with its own real options (Formal (Sie) / *Casual (du) on the German row, Formal / Casual* on the English one). 3. Flip any language to the other side and press Done. 4. Save. Languages you changed become exceptions: the main switch shows **with exceptions**, and the text under it lists which languages speak formally and which casually. Flipping a language back to the brand's side removes the exception; Reset to default clears them all at once. What it looks like, language by language The same piece of copy, shown formal and casual: | Language | Formal | Casual | |---|---|---| | Czech | Vaše odměny | Tvoje odměny | | Slovak | Vaše odmeny | Tvoje odmeny | | German | Ihre Prämien | Deine Prämien | | French | Vos récompenses | Tes récompenses | | Spanish | Sus recompensas | Tus recompensas | | Italian | I Suoi premi | I tuoi premi | | Portuguese | As suas recompensas | As tuas recompensas | | Portuguese (Brazil) | …conforme gasta conosco | …conforme você gasta com a gente | | Dutch | Uw beloningen | Jouw beloningen | | Polish | Państwa nagrody | Twoje nagrody | | Romanian | Vedeți recompensele dumneavoastră | Vezi recompensele tale | | Croatian | Pogledajte svoje nagrade | Pogledaj svoje nagrade | | Slovenian | Oglejte si svoje nagrade | Oglej si svoje nagrade | | Bulgarian | Вижте вашите награди | Виж наградите си | | Ukrainian | Переглянути ваші нагороди | Переглянути твої нагороди | | Greek | Δείτε τις ανταμοιβές σας | Δες τις ανταμοιβές σου | | Hungarian | Az Ön szintje | A szinted | | Lithuanian | Jūsų statusas | Tavo statusas | | Latvian | Jūsu statuss | Tavs statuss | | Turkish | Ödüllerinizi görüntüleyin | Ödüllerini görüntüle | | Chinese (Simplified) | 查看您的奖励 | 查看你的奖励 | | English | You will be enrolled immediately. | You're in right away. | Two languages work a little differently: English has no formal/informal you, so the switch changes word choice and tone instead — receive / select rather than get / pick, and fuller phrasing without contractions. Brazilian Portuguese uses você either way, so only the warmth shifts (for example com a gente instead of conosco). Languages the switch leaves alone Some languages have no everyday formal/informal split, so they keep their natural wording no matter which option you pick: Swedish, Danish, Norwegian, Finnish, Estonian, Japanese, and Korean. Three more ship in a single, carefully chosen register instead of two: Chinese (Traditional), Vietnamese (the friendly, neutral bạn used by Vietnamese retail), and Thai (the standard polite คุณ register Thai software uses). Their wording stays the same whichever option you pick. Good to know Related Change the Charm admin interface language Edit an email template's subject and content Concept: Storefront surfaces --- # Supported languages URL: https://docs.charmloyalty.com/data/supported-languages Charm ships fully translated in 35 languages: Customer surfaces — the widget, loyalty hub, landing page, cart, checkout, POS, and lifecycle emails follow each shopper's language from their Shopify Markets locale, per recipient. All 35 languages are covered. Merchant admin — the whole Charm admin is available in 32 of them; pick yours under Settings → App language. Hindi, Indonesian, and Malay cover the customer side today, with the admin to follow. You never have to write a translation — but every customer-facing string is editable per language under Visibility → Customer copy if you want to phrase it your way. The languages Bulgarian Български Chinese (Simplified) 简体中文 Chinese (Traditional) 繁體中文 Croatian Hrvatski Czech Čeština Danish Dansk Dutch Nederlands English English Estonian Eesti Finnish Suomi French Français German Deutsch Greek Ελληνικά Hindi * हिन्दी Hungarian Magyar Indonesian * Bahasa Indonesia Italian Italiano Japanese 日本語 Korean 한국어 Latvian Latviešu Lithuanian Lietuvių Malay * Bahasa Melayu Norwegian Norsk Polish Polski Portuguese Português Portuguese (Brazil) Português (Brasil) Romanian Română Slovak Slovenčina Slovenian Slovenščina Spanish Español Swedish Svenska Thai ไทย Turkish Türkçe Ukrainian Українська Vietnamese Tiếng Việt \* Customer surfaces only for now — the merchant admin in these languages is on the way. Good to know Formal vs. informal address — languages that grammatically distinguish the two (German Sie/du, French vous/tu, Czech vykání/tykání, and others) have a tone-of-voice switch. Languages without that distinction read naturally either way. Thai dates stay on your calendar. Thai's default locale renders years in the Buddhist Era (2570 instead of 2027). Charm deliberately keeps dates Gregorian so they always match the rest of your Shopify admin and your order data. Your own text stays yours. Points names, tier names, and any copy you override are shown exactly as you wrote them — Charm never machine-translates merchant-entered text. Related Change the Charm admin interface language Set the tone of voice Rename points --- # Exclude B2B / wholesale customers from earning URL: https://docs.charmloyalty.com/eligibility/exclude-b2b-customers Stop company and wholesale buyers from accruing loyalty points while keeping your retail (B2C) customers earning as normal. Steps 1. Go to Settings → Eligibility → B2B and B2C customers. 2. In Who can earn rewards, choose B2C customers only (or B2B customers only for the reverse). 3. Click Save to apply the change. Related Concept: Eligibility, expiry & anti-fraud Exclude specific customers by tag Stop points on membership purchases --- # Exclude specific customers by tag URL: https://docs.charmloyalty.com/eligibility/exclude-customers-by-tag Block individual customers — staff, blocked accounts, or a specific segment — from earning and redeeming loyalty rewards using their Shopify tags. This is the tag-based side of Eligibility; for company buyers, exclude B2B customers instead. Steps 1. Go to Settings → Eligibility → Excluded customers. 2. In Customer tags, type Shopify tags separated by commas (for example ), then Add tag. 3. Click Save to apply the change. Related Concept: Eligibility, expiry & anti-fraud Exclude B2B / wholesale customers from earning Exclude products from earning points --- # Stop gift cards and discounted items earning points URL: https://docs.charmloyalty.com/eligibility/exclude-gift-cards-and-discounted-items Two categories of sale that most merchants would rather not pay points on, each a single switch — no product list to maintain as your catalogue changes. Gift cards 1. Go to Settings → Eligibility → Excluded products. 2. Turn on Don't award points for gift cards. 3. Click Save. Buying a gift card moves money into store credit; it isn't a sale. With this on, the gift card purchase earns nothing, and the order the card later pays for earns points on its own — so the same money doesn't earn twice. Discounted items 1. In the same section, turn on Don't award points for discounted items. 2. Click Save. Any item sold below its compare-at price stops earning, and the rest of the order earns normally. Because Charm reads the compare-at price at the moment of the order, a sale you run next month is covered without touching this setting again. Related Concept: Eligibility, expiry & anti-fraud Exclude products and collections from earning points Exclude subscription orders from rewards Store credit expiry --- # Stop points earning on membership purchases URL: https://docs.charmloyalty.com/eligibility/exclude-membership-purchases Make sure customers don't earn points when they buy or renew a membership — a membership fee is a pass, not a regular product. This is one of several eligibility controls over what counts toward earning. Steps 1. Go to Settings → Eligibility → Excluded order types. 2. Turn on Exclude membership purchases. 3. Click Save to apply the change. Related Concept: Memberships Exclude subscription orders from rewards Exclude products from earning points --- # Ignore orders by tag URL: https://docs.charmloyalty.com/eligibility/exclude-orders-by-tag Orders carrying any of the listed Shopify order tags are ignored by the loyalty program: they trigger no earning rules and award no points. Typical uses: staff or test orders, imported orders, and wholesale flows. Steps 1. Go to Settings → Eligibility → Ignored orders. 2. Type one or more order tags (for example , , ) and add them. 3. Click Save. Notes Tags are matched case-insensitively against the order's Shopify tags. The check runs when the order is processed — before any payment or fulfillment gates — so an ignored order never sits in a "waiting for payment" state either. To exclude specific customers rather than orders, use customer tags; to keep specific products from earning, use product exclusions. --- # Exclude products and collections from earning points URL: https://docs.charmloyalty.com/eligibility/exclude-products Keep specific products — samples, low-margin items, a whole sale collection — from contributing to the points a customer earns, while the rest of the order still earns normally. This is the product side of Eligibility; to exclude people instead, exclude customers by tag. Steps 1. Go to Settings → Eligibility → Excluded products. 2. Choose how to exclude: - Pick products — select individual products or variants. - Pick collections — select whole collections. Anything that lands in the collection later stops earning automatically, and starts again when it leaves; handy for a sale or clearance collection you keep rotating. - Product tags — type tags, then Add tag. 3. Click Save to apply the change. Related Concept: Eligibility, expiry & anti-fraud Stop gift cards and discounted items earning points Stop points earning on membership purchases Exclude specific customers by tag --- # Exclude subscription orders from rewards URL: https://docs.charmloyalty.com/eligibility/exclude-subscription-orders Subscriptions are two separate decisions in Charm: whether a customer's redeemed reward codes may be applied to a subscription order, and whether an automatic renewal earns points. They live in different places because they're different sides of the program. Keep reward codes off subscription orders 1. Go to Settings → Reward discount codes. 2. Turn on Limit reward codes to one-time purchases. 3. Click Save. Newly issued reward codes can then only be applied to one-time purchases. Codes already in customers' hands keep working exactly as they were issued, so turning this on never breaks a reward someone is holding. Stop renewals from earning points 1. Go to Settings → Eligibility → Excluded order types. 2. Turn on Don't award points for subscription renewals. 3. Click Save. Automatic renewal orders then earn nothing, while the first order the customer places at checkout still earns normally — you reward the decision to subscribe rather than the recurring charge. Related Concept: Eligibility, expiry & anti-fraud Control when an order earns points Stop points earning on membership purchases Reward subscription milestones Subscription apps --- # Eligibility, expiry & anti-fraud URL: https://docs.charmloyalty.com/eligibility/overview Order eligibility Not every order should earn. Charm's eligibility settings control which orders award points: Minimum order value Excluded discount codes or heavily-discounted orders Excluded products / variants — including membership fee products, which are excluded automatically (see Memberships) Order status / source conditions (e.g. exclude draft or POS where desired) Eligibility is normalized into a single settings object, so every earn path — order earning, refunds, on-page estimate, checkout preview, and POS — honors the same rules with no per-surface logic. Points expiry Points expire by one of: Inactivity (default — 12 months since last activity) Absolute date Per-rule lifetime Expiry applies retroactively to existing balances, so tightening the policy doesn't require rebuilding the program. A points-expiry warning email can fire a configurable number of days before expiry. Anti-fraud Cooldowns prevent double-dipping on review rewards (one per order), referral rewards (one per friend), and sign-up bonuses. Per-customer caps bound monthly redemptions and referral conversions. Manual review holds high-value or above-threshold events for approval before the reward fires. Refunds & cancellations When an order is refunded or cancelled, Charm automatically reverses the points it awarded for that order, keeping balances honest. Related how-tos Exclude B2B / wholesale customers from earning Exclude specific customers by tag Set up points expiration Import existing customer point balances Migrate from Rivo or another loyalty platform Exclude products from earning points Stop points earning on membership purchases Exclude subscription orders from rewards Revert an incorrect import --- # Require customers to join before redeeming URL: https://docs.charmloyalty.com/eligibility/require-program-opt-in Make customers explicitly join your program — and optionally accept your terms — before they can redeem, so enrolment is intentional and consent is recorded. Steps 1. Go to Settings → Points program → Join gate. 2. Turn on Require customers to join before redeeming. 3. (Optional) Turn on Offer an email opt-in checkbox at join to write marketing consent to the Shopify customer profile. 4. Set Terms link to Shopify policy pages (automatic) — Charm auto-detects your published Terms and Privacy pages — or Custom page to pick a specific page. 5. Click Save. Once enabled, new customers see a Join & Agree step in the Loyalty Hub and floating widget, and a locked state at checkout. Points from qualifying orders keep accruing safely and show as waiting, then become spendable the moment the customer joins. The welcome bonus is held until they join. Existing customers are treated as already joined, and admin- or POS-issued points bypass the gate. Related Concept: Eligibility, expiry & anti-fraud Give members exclusive access to content --- # Change the loyalty email sender name and logo URL: https://docs.charmloyalty.com/emails/change-sender-name-and-logo Sender settings control how every loyalty email looks in the inbox — the "from" name customers see and the logo or text in the header — and apply across all your points, rewards and tier emails at once. Steps 1. Go to Emails → Sender settings, then expand Sender, email & brand colors. 2. Set Sender name — the "from" name shown in the inbox. 3. Switch Email header from Text to Logo (logo image on the colored header band) or Banner (a full-width image that replaces the band entirely). 4. Click Choose file to pick the image from your store's Shopify Files — search by name, page through the library, or drag-and-drop a new upload straight into the picker. 5. For a banner, set Max. height (default 150 px) — the image fills the full width and crops to exactly this height. A wide image around 1200 × 300 px works best. 6. Click Save to apply the change. Related Concept: Points & rewards Edit an email template's subject and content Turn off an individual email type --- # Check a customer's email history URL: https://docs.charmloyalty.com/emails/customer-email-history See exactly which loyalty emails a customer received — and whether they landed — right on the customer's detail page, so you can tell an email problem from an eligibility one without leaving Charm. Steps 1. Go to Customers and open the customer you want to check. 2. Scroll to the Emails card. It lists loyalty emails sent to this customer in the last 90 days, newest first, with the email's subject, its type, and a Status badge. 3. Read the Status column to see how each send did: Sent, Delivered, Opened, or Bounced. If a customer's address hard-bounced or drew a spam complaint, Charm stops emailing it and shows an Emails to this customer are paused banner at the top of the card, explaining when and why sending stopped. Once you've confirmed the address is good again, click Resume emails in that banner to start sending to them. Related Turn off an individual email type Use Klaviyo flows instead of Charm emails Common questions --- # Edit an email template's subject and content URL: https://docs.charmloyalty.com/emails/edit-an-email-template Each points, rewards and tier email has its own editable subject line, heading, body, and button text — so you can match your brand's voice without touching the shared sender settings. Steps 1. Go to Emails, find the email under the Loyalty program group (e.g. Points Earned), and click Edit. 2. In Content, set the Subject line, then edit Heading, Body text, and Button text. 3. Click Save to apply the change. Related Concept: Points & rewards Change the sender name and logo Turn off an individual email type --- # Turn off an individual email type URL: https://docs.charmloyalty.com/emails/turn-off-an-email Switch off any single loyalty email — handy when a feature doesn't apply, like the points-expiry warning if you never expire points. Steps 1. Go to Emails, find the email under the Loyalty program group (e.g. Points Expiry Warning). 2. Toggle its switch off — the change saves automatically. 3. The Template status badge changes to Paused and Charm stops sending that email. Related Concept: Eligibility, expiry & anti-fraud Edit an email template's subject and content Use Klaviyo flows instead of Charm emails --- # Use Klaviyo flows instead of Charm emails URL: https://docs.charmloyalty.com/emails/use-klaviyo-flows If you'd rather build loyalty emails in Klaviyo, Charm can sync points, rewards and tier events to Klaviyo and stop sending its own emails so customers don't get duplicates. Steps 1. Go to Emails, then find the Email marketing card in Integrations. It covers every platform Charm syncs to — Klaviyo, Omnisend, Ecomail, and Mailchimp — and shows a Connected badge once any of them is on. 2. Click through to Settings → Integrations → Marketing and SMS apps → Klaviyo (connect Klaviyo first if needed). Per-platform detail — delivery mode, account, connection warnings — lives on that page. 3. Click Pause Charm delivery and use Klaviyo flows and confirm. 4. Build your flows in Klaviyo from the synced metrics. To switch back, return here and click Resume Charm emails. Build the flows before the first real event You don't have to wait for a real customer to trigger an event before a metric appears in Klaviyo. On the same page, open Sample event and click Send all sample events — Charm pushes one sample of every deliverable type at once, so the whole metric catalogue shows up in Klaviyo ready to pick from the flow builder. Pick a Sample event language first if you want to preview a template in a specific locale, or use Send sample event with a single Sample event type when you only need to re-check one flow. The panel appears as soon as Klaviyo is connected. Turning Charm's emails off entirely Switching the master email toggle off doesn't stop the event sync. With any of Klaviyo, Omnisend, Mailchimp or Ecomail connected and event sync on, loyalty events keep flowing to your marketing platform while Charm sends nothing itself — the right setup when your marketing platform owns all customer email. The per-type toggles still gate each event: turn off an individual email type and that type sends no email and emits no event, which makes it your switch for what your marketing platform hears about at all. Related Concept: Points & rewards Turn off an individual email type Edit an email template's subject and content Customer email history --- # Common questions URL: https://docs.charmloyalty.com/faq/common-questions Does Charm work on every Shopify plan? Yes — including Plus. POS loyalty needs Shopify POS; storefront blocks need the Online Store. The customer-account hub renders in Shopify's native customer accounts. How is Charm billed? Through Shopify's App Billing API, in USD. Every plan includes every loyalty feature; plans differ only by monthly order band and support level. There are no per-order fees, no transaction fees, and no platform cut on membership revenue. Do membership purchases earn points? No. Membership fee products are auto-excluded from point earning across every surface, so a plan can't earn redeemable points against its own multiplier. See Memberships. My storefront widget shows a spinner forever. Re-add the widget in the theme editor (Online Store → Themes → Customize → App embeds → Charm loyalty widget) and confirm the surface shows as Active on the Visibility page. If it still doesn't load, email hello@appfleece.com with your store URL — it's usually a one-minute fix on our side. Can I migrate from another loyalty app? Yes. There's a built-in importer under Settings → Data migration with a Rivo preset, a dry-run preview, and one-click revert; CSV import covers other platforms. Imports are email-silent (no welcome blast). How do I automate loyalty from my own workflows? Use the Shopify Flow actions (award/deduct points, award store credit) and triggers (points earned/redeemed, store credit issued, VIP tier achieved) — they plug into any Flow workflow with no code. Where are the privacy policy and DPA? Privacy and terms live on the company site: appfleece.com/privacy and appfleece.com/terms. A DPA is available on request. What does each storefront block status mean? On Visibility, the Block detection panel badges each surface (Widget, Loyalty Hub, Checkout, Points earned, and more). Active means real customer traffic has passed through the block, Detected means Charm sees the block placed but no traffic yet, and Inactive means it still needs setup. A freshly placed checkout or thank-you block can stay Inactive until the next order. See Check whether a storefront block is live. How do campaign multipliers stack with VIP tier multipliers? You choose per campaign. Compound (multiply) multiplies them together — a 1.5x tier and a 2x campaign give 3x. Use highest applies whichever is larger (2x). Replace tier multiplier ignores the tier and uses only the campaign (2x). The field previews the effective multiplier as you pick. See Choose how a campaign multiplier stacks with VIP multipliers. Why didn't a customer earn points for their order? Work down the eligibility checklist: the program must be Active (not paused), the order must reach your configured payment status, and the order must pass eligibility. Common blockers are an excluded customer or audience (see Exclude B2B / wholesale customers from earning and Exclude specific customers by tag), excluded products, a minimum-order-value rule, or a heavily-discounted order. See Eligibility, expiry & anti-fraud. When exactly do points get awarded — checkout, payment, or fulfillment? By the order's payment status, not at checkout or fulfillment. By default points fire when the order is Paid, and you can change the trigger to Authorized, Partially paid, or Pending. Points are issued the first time the order reaches the status you pick (or anything stronger). See Control when an order earns points. Do refunded or cancelled orders reverse earned points? Yes. When an order is refunded or cancelled, Charm automatically reverses the points it awarded for that order, keeping balances honest. The reversal is recorded as a ledger entry, so it's fully auditable in the customer's history. See Eligibility, expiry & anti-fraud. Can I run Charm in multiple languages? Yes. Storefront copy — the points name, emails, and account pages — is localized per recipient, and you can set a per-language points name. The admin interface language is separate: change it under Settings → App language (see Change the Charm admin interface language). What's the difference between VIP tiers and paid memberships? A VIP tier is a cohort a customer earns by their behavior (points, spend, orders, referrals, or a tag). A paid membership is a VIP plan a customer buys as a Shopify product. Both use the same perk vocabulary and resolve through the same checkout discount Function, so a customer who is both a member and a tier member gets both, compounded. See Points & rewards and Memberships. Can I send loyalty emails through Klaviyo instead of Charm? Yes. Charm can sync loyalty events to Klaviyo and pause its own delivery so customers don't get duplicates. Connect Klaviyo, then pause Charm delivery and build your flows in Klaviyo. Make sure your flows are live before pausing, or members stop getting loyalty emails entirely. See Use Klaviyo flows instead of Charm emails. Will importing balances or migrating trigger a welcome email blast? No. Imports and migrations are email-silent — bringing in opening balances does not send a welcome or points email to anyone. Each imported row is recorded as a migration adjustment in the customer's timeline. See Import existing customer point balances. Is the Bonus Campaigns feature available on my store, and how do I get access? Bonus Campaigns is rolled out gradually. If it's enabled for your store, you'll see your campaign list under Campaigns. If not, Campaigns shows a Bonus campaigns — Coming soon screen with a Notify me when available button that adds your store to the waitlist; we email you once it's ready to enable. To request earlier access, email hello@appfleece.com with your store URL. --- # Fix: plan, order-cap, and overage questions URL: https://docs.charmloyalty.com/faq/fix-billing-plan-limits You're seeing an order-cap usage warning or enforcement banner and want to know what it means and what to do. Likely causes Loyalty orders this billing period are approaching or over your plan's monthly cap. You've passed the cap and are in the grace period of warning banners. You need a higher order band than your current plan allows. How to fix 1. From your Shopify admin, open Charm and go to Plan (the Billing & Plan page). 2. Read the Orders this month usage bar — it shows orders used against your cap for the current period and turns amber, then red, as you approach and pass the limit. 3. If you're over, click Upgrade (or pick a plan card) to move to a higher tier with more orders per month. Every plan includes every loyalty feature — plans differ only by monthly order band and support level. Going over the cap doesn't immediately stop your program: Charm keeps rewarding customers through a grace period of warning banners before any write-lock kicks in, so balances and earning stay intact while you decide. See Check your plan, order cap, and overage status. Still stuck? Email hello@appfleece.com with your store URL. --- # Fix: checkout or thank-you block not showing URL: https://docs.charmloyalty.com/faq/fix-checkout-block-not-showing The earn-and-redeem block at checkout, or the points-earned block on the thank-you / order-status page, isn't showing. Likely causes The block wasn't added in Shopify's checkout editor, or it was added on only one of the two post-purchase pages. In-checkout step placement (before payment) is being attempted on a non-Plus store. The block shows Inactive in Block detection because no order has gone through since you placed it. How to fix 1. From your Shopify admin, open Charm and go to Visibility → Checkout editor, then click Set up (or Customize) on the relevant card and use Open editor to launch Shopify's checkout editor. 2. Add the blocks where they belong: Redeem points and Points to earn near the order summary, and the Points earned block once on the thank-you page and once on the order status page. Click Save. 3. Place a test order, then return to Visibility → Block detection — each card flips to Active after real traffic passes through it. On non-Plus stores, in-checkout step placement is gated; use the thank-you and order-status blocks instead. See Enable earn & redeem at checkout and Show points earned on the thank-you page. Still stuck? Email hello@appfleece.com with your store URL. --- # Fix: customer didn't earn or got the wrong points URL: https://docs.charmloyalty.com/faq/fix-customer-didnt-earn A customer placed an order but earned no points, or earned a different amount than expected. Likely causes The program is paused, so no new earning happens. The order hasn't reached the payment status that triggers earning (default Paid). The customer or their order is excluded by an eligibility rule (B2B, customer tag, minimum order value, or a heavily-discounted order). Some line items are excluded products, so they didn't count toward the earning amount. A campaign multiplier or VIP tier multiplier changed the total — or the order was refunded, reversing the points. How to fix 1. From your Shopify admin, open Charm and go to Program and confirm Program status is Active. 2. Check Settings → Points Program → Order rules to see which payment status triggers earning, and confirm the order has reached it. 3. Review Settings → Eligibility for customer and product exclusions, and open the customer's loyalty profile to check their points history for a reversal or a campaign/tier multiplier applied to the order. See Control when an order earns points, Exclude products from earning points, and Eligibility, expiry & anti-fraud. Still stuck? Email hello@appfleece.com with the order number and customer email. --- # Fix: storefront widget not appearing URL: https://docs.charmloyalty.com/faq/fix-widget-not-appearing The floating loyalty widget shows a spinner that never resolves, or doesn't appear on the storefront at all. Likely causes The Charm app embed is toggled off in the theme editor. The embed was added to an unpublished theme, so it's not live on the storefront. The block shows Inactive in Block detection because no real traffic has hit it yet. A theme or browser cache is serving an old version of the page. How to fix 1. From your Shopify admin, open Charm and go to Visibility → Floating widget, then open the Widget card. 2. Click Customize to launch the theme editor with the Charm app embed selected, toggle the embed on, and click Save. Confirm you're editing your published theme. 3. Back in Charm, go to Visibility and check the Block detection panel. Detected means the embed is placed; it flips to Active once a customer loads it. Reload the storefront in a private window to clear cache. See Add the floating loyalty widget to your storefront and Check whether a storefront block is live. Still stuck? Email hello@appfleece.com with your store URL — it's usually a one-minute fix on our side. --- # Going live URL: https://docs.charmloyalty.com/getting-started/going-live Charm's customer-account block is live the moment you install. The storefront surfaces are opt-in so you can launch on your schedule. Turn on surfaces Under Visibility, enable the surfaces you want: Floating widget — the launcher on every storefront page. Product-page points — "earn X points" on product pages. Membership block — presents paid plans on product pages. Customer account hub — the loyalty page inside Shopify customer accounts. Checkout & thank-you — earn/redeem at and after checkout. Each storefront block is a theme app block — adding it in the theme editor is a one-time step. Charm auto-detects when a block is live and shows its status on the Visibility page. The floating widget starts off on a new install, so nothing reaches your storefront until you enable it. You can place and style every block in the theme editor before launch: it previews your real staged program, not placeholders. Use the Launch Center The Launch Center on the Charm home page is the short path to a live program: it tracks the preparation steps, reports live counts from your actual rules (not a snapshot taken during onboarding), and surfaces the strongest earn rules you're missing as links straight into the editor. Nothing is written for you. Activation sits in its own bar rather than in the checklist, so the progress bar only measures preparation. Verify it renders After adding a block in the theme editor: 1. Open the storefront and confirm the block appears. 2. Log in as a test customer — the widget should show a real balance. 3. Place a test order and confirm points are awarded — earning happens automatically once the order is paid. If a block doesn't appear or the widget never loads, re-add it in the theme editor and check the Visibility page; still stuck, email hello@appfleece.com. Launch checklist [ ] Earning rules and point value set [ ] At least one redeemable reward customers can reach early [ ] Floating widget + customer-account hub on [ ] A test order earned points end-to-end [ ] Lifecycle emails reviewed (or Klaviyo connected) That's it — the program is live. --- # Install & connect URL: https://docs.charmloyalty.com/getting-started/install Charm installs like any Shopify app — one click from the App Store, then a short guided onboarding. Install 1. Open the Charm listing and click Add app. 2. Approve the requested access scopes (see below). 3. Charm opens its onboarding wizard. It scans recent orders and products to suggest a starting program — you can accept or customize. It reads a few store signals — currency, recent paid orders, and catalog — to choose a sensible starting draft you can tune before launch: Stores with order history — Charm reads your recent paid orders (average order value, currency, order frequency) and sizes the points-per-spend rate and reward thresholds to your real economics, so the draft matches how customers already buy. Brand-new stores — with too few paid orders to learn from, Charm shows a "Fresh store? No problem" note and starts with a Balanced draft based on your currency. As orders come in, that data can guide stronger recommendations later. Either way, nothing is locked in — you can adjust points, rewards, emails, and widget styling before launch. Access scopes Charm requests only the scopes it needs to run loyalty natively: | Scope | Why | |-------|-----| | , | Read customer accounts; tag and segment members | | | Keep loyalty balances correct when two customer profiles are merged | | , | Award points on orders, detect refunds/cancellations, add a reward line to an order | | | Attribute store revenue to members in Analytics | | , , | Product/variant targeting, membership selling plans | | , | Mint redemption discount codes | | , , | Store-credit cashback and credit rewards | | , | Detect which storefront, checkout, and customer-account surfaces are live | | , , , | Localized copy and correct storefront links across Shopify Markets | | | Link your store's terms and privacy policy from the program's join step | | | Upload reward and program images to your Shopify Files | After install Customer accounts — Charm renders a native loyalty block in the Shopify customer account; no theme work required. Storefront widget — off by default. Turn it on under Visibility when you're ready (see Going live). Data migration — moving from another app? See the importer under Settings → Data migration (there's a built-in Rivo preset with a dry-run and revert). Next: Your first program → --- # Your first program URL: https://docs.charmloyalty.com/getting-started/your-first-program A loyalty program in Charm is three decisions: how customers earn, what they can redeem, and where it shows up. This page covers the first two — built from Program → Ways to earn and Ways to redeem; the third is Storefront surfaces. 1. Choose how customers earn Charm ships 18 earning rules across three groups. Most stores start with 3–5 and add more over time. Each rule has its own points value, caps, and cooldowns; the base point value (e.g. 1 point per $1) is set once and is separate from the rules, so changing it re-prices liability without rewriting earn history. Getting started | Earning rule | What it does | |---|---| | Points per amount spent | Reward customers for every order they place — with optional tiers for larger ones. | | Signup bonus | Give points when a customer creates an account. | | Celebrate a birthday | Award points on each customer's birthday — with an optional waiting period that blocks instant claims. | | Cashback as store credit | Credit a percentage of each paid order back as store credit. | Engagement | Earning rule | What it does | |---|---| | Order count milestones | Reward repeat buyers at milestones (e.g. 3rd, 5th, 10th order). | | Digital punch card | Reward repeat buyers automatically — every N orders earns a reward, then the card resets. | | Order from a collection | Bonus points when an order includes items from a collection you choose. | | Start a subscription | Bonus points when an order includes a subscription item. | | Order a specific product | Award bonus points when a customer orders a specific product. | | Post a product review | Reward reviews from Judge.me, REVIEWS.io, Okendo, Yotpo, Stamped, Loox, Fera, or Air Reviews — see review apps. | | Visit a URL | Reward customers for visiting a specific page or link. | | Custom action | Create your own claimable action — watch a video, join Discord, complete a profile. Add as many as you like. | Social media | Earning rule | What it does | |---|---| | Follow on TikTok | Reward customers for following your TikTok account. | | Like page on Facebook | Reward customers for liking your Facebook page. | | Share on Facebook | Reward customers for sharing your store on Facebook. | | Follow on Instagram | Reward customers for following your Instagram account. | | Follow on X | Reward customers for following your X account. | | Share on X | Reward customers for sharing your store on X. | Referral conversions also award points — that's the separate Referrals program. To start, try Set up a signup bonus or Reward a collection purchase. 2. Choose what customers redeem Charm ships six reward types, set up from Program → Ways to redeem: | Reward | What it does | |---|---| | Amount discount | Customers redeem points for a fixed amount off. | | Percentage discount | Customers redeem points for a percentage discount. | | Store credit | Redeem points for store credit, auto-applied at checkout. | | Free shipping | Customers redeem points for free shipping on their order. | | Product discount | Redeem points for a free or discounted product. | | Collection discount | Customers redeem points for a percentage off items from a specific collection. | Rewards can be stackable or exclusive, carry minimum-order requirements, and expire after a configurable window. Per-customer redemption caps prevent abuse, and each reward can be redeemed online or in-store (POS). 3. Layer on tiers, referrals & memberships (optional) With earn and redeem in place, three optional programs deepen loyalty — each stacks on top of the points economy you just built. VIP tiers — free, points-based cohorts your most engaged customers earn into automatically (Bronze → Silver → Gold → Platinum), each with its own earn multiplier and perks. Referrals — reward a customer when a friend they refer places a first qualifying order; tune the referrer/referee split, hold-back delay, and caps, and set a custom referral code prefix. Paid memberships — a plan customers buy (one or more tiers) whose perks stack on top of VIP tiers and points. 4. Eligibility & anti-fraud Configure order eligibility (which orders earn), points expiry (default: 12 months of inactivity), and anti-fraud cooldowns. See Eligibility & expiry. When the program looks right, take it live →. --- # Show loyalty data in Gorgias tickets URL: https://docs.charmloyalty.com/integrations/gorgias Give your support team the customer's loyalty picture next to every ticket: points balance, VIP tier, active discount codes, referral link and the latest points activity — without leaving Gorgias. The connection uses Gorgias's HTTP integration together with Charm's API, so there is nothing to install on either side. Set it up in two stages: 1. The card (this is the whole integration for most teams) — a read-only widget in the ticket sidebar. 2. Action buttons (optional) — let agents adjust a balance or redeem a reward straight from the ticket, using the same API key. Before you start Ask Charm support to enable API access for your store. The API is available on every plan, but it is switched on per store so we can keep an eye on the first days of traffic. Settings → API keys shows the current state — the API access toggle reads Active once you're set. Step 1 — Create the API key in Charm Charm has a Gorgias card that sets the key up for you, so you never have to work out the scopes yourself. 1. In Charm, go to Settings → Integrations, find the Gorgias card, expand How to set it up and click Create the API key. 2. The dialog opens already named , with exactly the scopes this integration uses ticked and nothing else. Click Create key. Those three are the whole story: is what the sidebar card reads, and plus are what the optional action buttons need. The greyed and come along automatically, because a scope always includes its read sibling. 3. Click Copy key and paste the token somewhere safe for the next step. Charm stores only a hash of the token, so this is the one moment it is readable. Lose it and you rotate the key rather than recover it. Step 2 — Create the HTTP integration in Gorgias 1. In Gorgias, go to Settings → Account → HTTP integration and click Add HTTP Integration. 2. Name it . 3. Under Triggers, tick Ticket created and Ticket updated. 4. Set the URL to: The Gorgias card in Charm has this as Request URL with a Copy button next to it, so you can paste it instead of typing it. 5. Set the HTTP Method to and Response content type to . 6. Under Headers, add one row — a fixed value, so leave Editable and Required clear: | Type | Label | Key | Value | |---|---|---|---| | | | | | 7. Leave the OAuth2 toggle off and click Add integration. The field hint under the URL box suggests . Ignore it — Charm matches the customer by e-mail address. Step 3 — Check that it runs The integration page has an Events tab listing every call it has made, with the status code and the full response body. That is the fastest way to see whether the connection works. A whose body starts with means everything is wired up. If you'd rather test from a terminal: | Response | What it means | |---|---| | with | Working | | with | Working — that e-mail simply isn't a program member | | | Wrong key, a rotated key, or a key from a different store | | | Support hasn't enabled API access for the store yet | | | The key is missing the scope | | | The ticket had no customer e-mail address | Step 4 — Add the widget to the sidebar Gorgias only offers the widget once the integration has successfully fetched data for the customer on the ticket you have open. On a ticket that existed before you set this up, nothing has been fetched yet. 1. Open a ticket whose customer is a loyalty member. 2. If the sidebar offers nothing, add a tag to the ticket. That fires Ticket updated, which runs the integration. Reload the page. 3. Click the gear icon on the right of the ticket sidebar, hover Edit widget data and choose Add new widget. 4. Drag the Charm block from the left list into the sidebar on the right, then click Save changes. In the same editor you can rename any label, hide rows you don't need, and reorder the widget against your other sidebar cards. What the card shows The card is an overview plus up to three collapsible sections, so the numbers an agent needs at a glance stay at the top and the detail folds away. Overview Points balance, plus pending points when the customer has any still in their waiting period Points expiry date, if your program expires points VIP tier, how long it lasts, the next tier and how much is missing to reach it Member since Email — the address the card was matched on, which is how you spot a ticket carrying a helpdesk relay address instead of the shopper's own Discount codes — every code the customer has redeemed but not yet used, newest first, each on its own row with the reward it came from and the date it expires. This answers the most common support ticket of all: "my code doesn't work", so the section deliberately shows all of them rather than the most recent handful. Referral — the customer's referral code and their share link, ready to paste into a reply. Timeline — the eight most recent points events, one per row. Reward names, history titles and the expiry wording are all written in your storefront's language. Rows and whole sections only appear when they carry information. A customer with no pending points has no "pending points" row at all, rather than a row saying zero. A customer already on your top tier has no "next tier" row. An excluded customer shows a red Excluded from program row; a normal one shows nothing, because "nothing is wrong" doesn't deserve a line in a sidebar. If you don't run a referral program, there is no Referral section — not an empty one. "How long the tier lasts" only appears if your VIP tiers re-qualify each calendar year. Rolling windows slide day by day and lifetime tiers never expire, so on those programs there is no honest deadline to show and the row stays away. Each code and each timeline entry is its own row rather than one list, because Gorgias renders a list as a single run-on paragraph you can't copy a code out of. Hide the ones you don't want in Edit widget data — for example keep three codes if your sidebar is crowded. Gorgias draws sections in alphabetical order and offers no way to reorder them, which is why they read Discount codes, Referral, Timeline. Renaming a section's label in the editor changes what agents see but not where it sits. The card also carries a Customer id row. It exists so the optional action buttons below can target the right customer; if you're not using them, hide it in the widget editor. The customer's name isn't part of the card — Gorgias already shows it directly above the widget. A shopper who isn't a member returns , which is a normal outcome rather than an error, so tickets from non-members render cleanly. Use loyalty data in macros Gorgias exposes the integration's response as template variables, so a saved macro can quote the balance back to the customer: Every field the card shows is available the same way — , , and so on. The path follows the name you gave the integration in step 2: an integration named answers to . If you named it something else, Gorgias's variable picker shows the exact path. A macro can only quote what the integration has already fetched for that customer, so on a ticket where the card has never loaded, variables come back empty. That is the same precondition as the widget — and the same fix: add a tag to fire Ticket updated, then reload. --- Bonus — action buttons Beyond showing data, Gorgias buttons can call Charm back to adjust a points balance or redeem a reward from inside the ticket. Gorgias writes a confirmation message into the conversation afterwards, so the action leaves an audit trail. There is no new key to make: and are already on the key from step 1, so the buttons send the same token as the card. The key's name is written into every history entry it creates, so keep it recognizable — reads far better in a customer's timeline than an auto-generated name. Add an "Adjust points" button In the widget editor, click Add Button on the Charm widget and configure the HTTP action: | Field | Value | |---|---| | Button title | | | Method | | | URL | | Under Headers, add two rows — again pasting your own key after , exactly as in step 2. Both are fixed values the agent never sees, so leave Editable and Required clear on each: | Type | Label | Key | Value | Editable | Required | |---|---|---|---|:---:|:---:| | | | | | | | | | | | | | | Under Query Parameters, add the two fields the agent does fill in. The Label is what they read in the button's dialog; without one Gorgias falls back to the raw key and your team gets a box called : | Type | Label | Key | Value | Editable | Required | |---|---|---|---|:---:|:---:| | | | | leave empty | ✓ | ✓ | | | | | leave empty | ✓ | | Body comes last in the dialog and stays empty — leave the that Gorgias pre-fills. The amount travels in the query string, not the body; the caution below explains why that is not a matter of taste. is a signed whole number and the same field does both directions: adds two hundred points, deducts them. No plus sign is needed for adding — and none is accepted, so don't prefix . A deduction larger than the balance is capped at the balance rather than going negative. is stored on the adjustment and shows up as the second line of that entry in the customer's Timeline history in Charm — see it below. It is not posted into the Gorgias conversation; the ticket only gets the one-line record that the action ran. Anything past 500 characters is truncated, and if you leave it blank Charm falls back to a localized "Awarded via API". comes from the card itself, which is why the widget must be in the sidebar before buttons can work. The header is what stops a double-click from paying a customer twice, and is a constant — it belongs in a header precisely because a header is fixed at configuration time and never reaches the agent. Charm reads the key from a query parameter too, but only a value the agent must edit per run belongs there, and with there is nothing to edit. What it actually does. Once saved, the button appears on the Charm widget. Clicking it asks the agent for the two fields under the labels you gave them, not the raw keys — the amount and the note. Nothing else: Execute runs it, and the ticket keeps a record of who did what and when: The balance moves in Charm the moment the agent hits Execute — no sync, no delay. The adjustment lands in that customer's Timeline history with the note the agent typed and the name of the key that made it, so the loop from ticket to loyalty record closes end to end: This is also why the key's name matters: in that line tells you at a glance the points came from the helpdesk rather than an import or a manual edit in the admin. Redeem a reward A second button can spend a customer's points on a reward and mint them a real discount code, without the agent leaving the ticket. It is built the same way as Adjust points: two headers, nothing in the body, and the reward travels as a query parameter the agent picks from a dropdown. 1. Copy the reward list from Charm The Gorgias card in Charm has this ready: Settings → Integrations → Gorgias shows Rewards for the redemption dropdown with a Copy button — the exact semicolon-separated list to paste in the next step, built from every enabled reward. The list uses each reward's name where it is unique and falls back to its id where it is not, because a Gorgias dropdown shows the agent exactly the values it sends — and Charm's API accepts either. Names are matched generously (, and are all one reward), but a name shared by several rewards is refused with a listing the candidates rather than one being picked for the customer. Out of the box the list is all ids, because Charm names every reward after its type — three amount rewards are all called . When that is the case the card shows Use readable names: one click renames those rewards to the label customers already see (Sleva 250 Kč na celou objednávku, …) and the list regenerates as readable text. Nothing customer-facing changes — the storefront never showed these names — and rewards you have named yourself are left alone. Two things worth knowing: Renaming a reward breaks a dropdown built from its old name — the button in Gorgias then returns a . Ids keep working forever, names only until the next rename; after renaming, re-copy the list from the Charm card. Prefer the API? with the key from step 1 returns each reward's and . 2. Add one button for all of them Click Add Button again and fill in the HTTP action: | Field | Value | |---|---| | Button title | | | Method | | | URL | | Headers are the same two as on the Adjust points button — your own key after , and — both fixed and invisible to the agent: | Type | Label | Key | Value | Editable | Required | |---|---|---|---|:---:|:---:| | | | | | | | | | | | | | | Under Query Parameters there is just one row — the reward the agent picks. Editable cannot be ticked on a and does not need to be: choosing from the list is the editing. | Type | Label | Key | Value | Editable | Required | |---|---|---|---|:---:|:---:| | | | | your reward names or ids, separated by semicolons | | ✓ | The Body stays empty — leave the Gorgias pre-fills. 3. What the agent gets There is no amount and no note to type — the agent picks a reward and hits Execute, and the run is logged in the conversation like any other action. Charm deducts the points, mints a real discount code for that customer, and the code appears at the top of the card's Discount codes section — ready to paste into a reply — the next time the card refreshes. The spend lands in the Timeline in the same breath. A redemption made by mistake can be reversed — in the API undoes it — but there is no button for that in the sidebar, which is the other reason to keep one button per reward and name it after exactly what it grants. Why the Idempotency-Key matters Every write in Charm's API requires an idempotency key so a retry cannot repeat the operation. Real integrations generate a fresh one per call, but a Gorgias button cannot: its configuration is fixed, so whatever you type in is what every run sends. That is why the buttons above send the literal instead of a key — Charm then works one out from the request itself, which is something a fixed configuration can say once and never revisit. What that means in practice: | What the agent does | What happens | |---|---| | Double-clicks the button | The second click is refused; the customer is charged once | | Runs it again within a minute, identically | — the action did not run twice | | Runs it again with a different amount, note or reward | A new operation, straight away | | Runs the identical action again a minute later | A new operation — the deliberate repeat you meant | So the agent never types a key, never sees one, and cannot get it wrong. The second row is deliberately an error rather than a quiet success. Charm could hand back the first run's result and say nothing, which is the right answer for software retrying a timed-out call — but here a person is clicking, and telling them "done" when nothing happened is the one failure they cannot spot. The response says how long ago the identical action ran and gives both ways forward: wait out the minute, or change something — the reason, the amount, the reward — which makes it a separate action that goes through immediately. The card does not refresh itself Gorgias fetches the card when one of your triggers fires and then renders what it stored. Running an action button is not a trigger, so the balance and timeline an agent sees straight after adjusting points are still the ones from the last fetch. Reloading the ticket brings them up to date. If you want the card to catch up on its own, tick Ticket message created in the HTTP integration as well: Gorgias writes a confirmation message into the ticket after every action, which fires that trigger. The cost is a request per message in every conversation, which is well within the limits but no longer the quiet two-trigger setup this guide recommends. Troubleshooting Every call returns . The key was rotated (rotating a key revokes the old one instantly), or it was created in a different store from the one you're calling. Create a fresh key in the right store and paste it again — including the word before it. Everything returns . API access hasn't been switched on for your store yet. Ask in the support chat. A reply went out with visible in it. The braces were typed into the reply box instead of applied from a macro — Gorgias only interpolates variables when a macro is applied. Save the text as a macro in Settings → Macros and insert it from there. An action button returns right after a successful run. With this is the duplicate guard, not a misconfiguration: the identical action already ran within the last minute and was not repeated. Wait a minute, or change the reason, amount or reward — any difference makes it a separate action that runs straight away. Check the balance before retrying; the first run did work. An action button returns every time, including a repeat with different values. The button is sending a fixed key of its own rather than — usually left over from an older setup, which every run repeats unchanged. Set the header to , and delete any query parameter left beside it. The first run of a button always works, so this only shows up on the second action on the same ticket. The widget isn't offered in the sidebar editor. The integration hasn't fetched anything for that ticket's customer yet. Add a tag to the ticket to fire Ticket updated, reload, and look again. The card says for a customer you know is a member. The ticket's customer e-mail differs from the one in Charm — test tickets in particular often carry a Gorgias relay address like rather than the shopper's real address. The card shows the address it looked up, so compare that with the one on the customer in Charm. A mentioning e-mail. The ticket has no customer e-mail at all, which happens on phone and SMS tickets. Related Charm API overview Connect Klaviyo Shopify Flow --- # Connect a marketing platform URL: https://docs.charmloyalty.com/integrations/marketing Connect a marketing or SMS platform so Charm's loyalty data powers your email and SMS. Charm writes each customer's loyalty state onto their marketing profile or contact and streams every loyalty event, so you can build loyalty segments and trigger automations — and optionally send loyalty emails from your platform instead of Charm. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Marketing and SMS apps. 2. In the Marketing provider dropdown, pick your platform. 3. Authorize or enter the platform's credentials, then click Connect. The badge flips to Connected and Charm starts syncing. Supported platforms Klaviyo — connects over OAuth. Two-way sync of loyalty events (as metrics) and profile properties, and you can optionally hand loyalty-email delivery to Klaviyo flows. Ecomail — connects with an API key + list ID. Sync-and-segment mode: Charm keeps each contact's loyalty fields current and streams events; Charm keeps sending the emails. Omnisend — connects with an API key. Sync-and-segment mode like Ecomail: loyalty fields as contact properties plus custom events; Charm keeps sending the emails. Mailchimp — connects with an API key plus an audience. Sync-and-segment mode: loyalty fields as merge fields on the audience's members plus member events for Customer Journeys; Charm keeps sending the emails. Per-platform guides Connect Klaviyo Connect Ecomail Connect Omnisend Connect Mailchimp Related Concept: Campaigns Connect a review app Set up Shopify Flow triggers and actions --- # Connect Ecomail URL: https://docs.charmloyalty.com/integrations/marketing/ecomail Connect Ecomail so every customer's loyalty state — points balance, VIP tier, and referral details — is written onto their Ecomail contact, and every loyalty event is sent to Ecomail's tracker, ready to trigger automations and build segments. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Marketing and SMS apps. 2. In the Marketing provider dropdown, choose Ecomail. 3. Enter your Ecomail API key (from your Ecomail account settings) and the List ID of the subscriber list you sync to, then click Connect. The badge flips to Connected and Charm starts syncing contact fields and events. What syncs Once connected, Charm keeps each contact's custom fields current: Loyalty state — , , , , and (a direct link to the customer's loyalty page). Referral data — , , and any active , so a "share your link" or give-get automation can pull the real, current values. Events — loyalty moments (points earned, reward redeemed, tier achieved, birthday, referral completed, and the bonus-campaign teasers) are sent to Ecomail's , so automations can trigger on them. Tier changes push immediately, so tier-gated segments and automations stay current without waiting for the next email. Sync your contacts Click Sync contacts now to update your existing Ecomail contacts on demand. The result reports how many synced, how many were not in your Ecomail list yet, and any errors. A background job keeps larger lists current. Email delivery stays with Charm Charm keeps sending its loyalty emails. Ecomail runs in sync-and-segment mode — there is no "hand delivery to Ecomail" toggle. If you want Ecomail to send a given message instead, build a matching Ecomail automation and turn off the equivalent Charm email so customers don't get both. Related Concept: Campaigns Connect a marketing platform — overview of all supported platforms Connect Klaviyo Set up Shopify Flow triggers and actions --- # Connect Klaviyo URL: https://docs.charmloyalty.com/integrations/marketing/klaviyo Connect Klaviyo over OAuth so every loyalty event becomes a Klaviyo metric and each customer's loyalty state is written onto their Klaviyo profile — ready to trigger flows and build segments. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Marketing and SMS apps. 2. In the Marketing provider dropdown, choose Klaviyo, then click Connect. 3. Authorize Charm in the Klaviyo OAuth window. When it returns, the badge flips to Connected and Charm starts syncing events and profile properties. Once connected, you can provision locale-aware starter flow templates and send a sample event to test the sync — both from the same Klaviyo card. Switch email delivery to Klaviyo flows By default Charm keeps sending its own loyalty emails while it syncs events to Klaviyo. To hand sending over to Klaviyo, click Pause Charm delivery and use Klaviyo flows on the Klaviyo card. Charm stops sending those emails through Postmark, so customers only receive them where you have matching Klaviyo flows live. Click Resume Charm emails to switch back. Related Concept: Campaigns Connect a marketing platform — overview of all supported platforms Connect Ecomail Set up Shopify Flow triggers and actions --- # Connect Mailchimp URL: https://docs.charmloyalty.com/integrations/marketing/mailchimp Connect Mailchimp with an API key and pick an audience, and Charm writes each customer's loyalty state onto their audience member as merge fields, then sends every loyalty event as a Mailchimp member event — ready to trigger a Customer Journey. Charm keeps sending the loyalty emails itself; Mailchimp gets the data. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Marketing and SMS apps. 2. In the Marketing provider dropdown, choose Mailchimp. 3. Paste your Mailchimp API key — create it in Mailchimp under Account → Extras → API keys — and click Connect. Charm verifies the key with Mailchimp before saving it. 4. Pick the Mailchimp audience Charm should sync into, then click Save audience. The badge flips to Connected and syncing starts. What the connection does Merge fields — Charm creates five hidden merge fields in the audience and keeps them current, so you can segment on them: | Merge tag | Holds | |---|---| | | Points balance | | | VIP tier | | | Link to the customer's loyalty page | | | Their referral link | | | Their referral code | Member events — every loyalty moment is sent as a member event you can pick as a Customer Journey trigger: , , , , , , , , , , and the three campaign events (, , ). A daily sync plus a manual one — Charm refreshes the merge fields for all members once a day so segments stay fresh between events, and you can trigger a full sync anytime from the Mailchimp card. The card shows the last run: synced, not-yet-in-Mailchimp, and error counts. Related Concept: Campaigns Connect a marketing platform — overview of all supported platforms Connect Klaviyo Connect Omnisend Connect Ecomail --- # Connect Omnisend URL: https://docs.charmloyalty.com/integrations/marketing/omnisend Connect Omnisend with an API key so Charm writes each customer's loyalty state onto their Omnisend contact and streams every loyalty event as a custom event — ready for segments and automations. Charm keeps sending the loyalty emails itself; Omnisend gets the data. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Marketing and SMS apps. 2. In the Marketing provider dropdown, choose Omnisend. 3. Paste your Omnisend API key — create it in Omnisend under Store settings → API keys — then click Connect. Charm verifies the key against Omnisend before saving it; the badge flips to Connected and syncing starts. What the connection does Contact properties — -prefixed custom properties (points balance, VIP tier, membership state, and friends) are kept current on each contact, so you can build loyalty segments in Omnisend. Custom events — every loyalty event (points earned, reward redeemed, tier reached, referral completed, …) is sent as an Omnisend custom event, named the same way as Charm's Klaviyo metrics, so automations can react the moment something happens. A daily sync plus a manual one — Charm reconciles all members once a day, and you can trigger a full sync anytime from the Omnisend card. The card shows the last sync's result: synced, not-yet-in-Omnisend, and error counts. Related Concept: Campaigns Connect a marketing platform — overview of all supported platforms Connect Klaviyo Connect Ecomail --- # Connect a review app URL: https://docs.charmloyalty.com/integrations/reviews Connect your review provider so a verified review automatically awards loyalty points. Charm supports nine paths, each with its own connection method. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Review apps. 2. In the Review provider dropdown, pick your provider. 3. Provide what that provider needs, then connect: - Judge.me — paste your Judge.me private API token and click Connect Judge.me. Charm registers the webhooks for you. (Full step-by-step guide →) - REVIEWS.io — paste your public store key and private API key, then click Connect REVIEWS.io. Charm creates the product-review webhook. - Stamped, Okendo, Fera — click Generate setup, then paste the shown Payload URL and Secret into the provider's webhook settings. - Loox, Yotpo, Air Reviews, custom — click Generate setup, then send a POST to the Payload URL from a Shopify Flow workflow using that app's review trigger (or any custom webhook). Charm normalizes every provider into the same review event, so the points reward fires the same way regardless of source. Per-provider guides Connect Judge.me Keep review rewards from being farmed The award is deduped per review, but nothing stopped a customer reviewing all seven items of one order and banking seven rewards. Two opt-in controls on the Post a product review rule (Program → Ways to earn) close that: Cap rewarded reviews per customer — set a maximum and a period: monthly (resets at the start of each calendar month, so regular reviewers keep earning over time) or lifetime. Reviews beyond the cap still publish in your review app; they simply earn nothing and don't advance review milestones. A review rewarded within the cap keeps its photo/video bonus. Only reward verified purchases — a review earns only when the review app confirms the reviewer actually bought the product. Reviews from people who never ordered earn nothing. An unrecognized verification status counts as unverified, so the gate can only ever withhold a bonus, never grant one unearned. Both are off by default, so turning them on never changes what you've already paid out. Bonus points for a photo or video Extra points for a review that includes media are a switch (Give bonus points for a photo or video) plus an amount. A review with media counts as one review for both the cap and the milestone ladder, even when it also earns the bonus. Review milestones Beyond the per-review points, the review rule can carry an optional milestone ladder: a bonus after the customer's 3rd review, a free product after their 10th — any thresholds, each paying out once per customer. Configure it by editing the Post a product review rule under Program → Ways to earn and enabling Review milestones. Each milestone can grant bonus points, a free product, an amount or percentage off, or free shipping. A review with a photo or video counts as one review, even when it also earns the media bonus. Milestones work even with per-review points set to zero — the review is still recorded and counted. Counting starts when you add the ladder, so long-running review programs don't trigger a retroactive payout. Customers see the next milestone's reward and their progress ("1 / 3 reviews") on the review tile in the storefront widget and account hub. Related Concept: Points & rewards Connect Klaviyo Connect Ecomail Set up Shopify Flow triggers and actions --- # Connect Judge.me URL: https://docs.charmloyalty.com/integrations/reviews/judgeme Connect Judge.me so a verified Judge.me review automatically awards loyalty points. Judge.me is the most common review provider, so here's the full setup, end to end. 1. Copy your Judge.me private API token 1. In your Shopify admin, open Judge.me ⭐ Product Reviews. 2. Go to Settings → Integrations (). 3. Click View API token in the top right. 4. Copy the Private API token — that's the one Charm needs. You can ignore the Public API token. 2. Paste it into Charm 1. In your Shopify admin, open Charm and go to Settings → Integrations → Review apps. 2. Pick Judge.me in the Review provider dropdown. 3. Paste the token into Judge.me private API token and click Connect Judge.me. Charm registers the Judge.me review webhooks for you using that token — there's nothing to set up on the Judge.me side. 3. Confirm it's connected The badge flips to Connected and shows the last four characters of the token in use. Verified Judge.me reviews now award loyalty points automatically. Related Connect a review app — overview of all supported providers Concept: Points & rewards Set up Shopify Flow triggers and actions --- # Set up Shopify Flow triggers and actions URL: https://docs.charmloyalty.com/integrations/shopify-flow Wire loyalty into any automation: start a Flow workflow from a Charm loyalty event, or run a Charm action from any Flow trigger — no glue code. Steps 1. From your Shopify admin, open Charm and go to Settings → Integrations → Shopify Flow. 2. Review the available Triggers merchants can use and Actions merchants can run (listed below), then click Open Shopify Flow. 3. In the Flow editor, build a workflow that uses a Charm trigger to start it, or add a Charm action to a workflow started by Shopify or another app. Triggers (Charm → Flow) Start a workflow when a loyalty moment happens: Loyalty points earned Loyalty points redeemed VIP tier achieved VIP tier approaching — carries the next tier's name, ID and handle, the remaining gap as ready-to-send text, and the customer's current tier ID Store credit issued Actions (Flow → Charm) Make Charm do something from any Flow workflow: Award loyalty points Deduct loyalty points Award store credit For example: "VIP tier achieved → add a customer tag," or "tag added → award 200 points." Charm also ships ready-to-use templates (VIP-tier tags and bonus, high-value-order bonus, redemption tag) you can install from Flow's template library. The Award loyalty points action also has a Charm rule ID field. Paste in the ID of a Custom action earning rule to show the reward on your Ways to earn list and let Flow grant its points — a clean way to reward any action Charm doesn't track natively. Referral data on the customer record Charm writes each customer's referral details to their Shopify customer record as metafields in the **** namespace, so a Flow condition or action — and the email it sends — can read them directly: — the customer's personal share link — their referral code — their active single-use discount code, if the rule grants one Reference them in a Flow step with Liquid, for example — handy for a post-purchase "share your link" workflow (Order fulfilled → Wait → Send email). The same fields also sync to Klaviyo profiles and Ecomail contacts, so the link is available wherever you build the automation. Related Concept: Campaigns Connect Klaviyo Connect a review app --- # Ask Shopify Sidekick about your loyalty program URL: https://docs.charmloyalty.com/integrations/sidekick With Charm installed, Shopify's Sidekick assistant understands your loyalty program out of the box. There is nothing to set up — no API key, no connector, no toggle. Open Sidekick in your Shopify admin and ask. What you can ask Program setup — "How is my loyalty program configured?" Sidekick sees whether the program is enabled, your points name, every earning rule, reward, VIP tier and the referral setup. One customer — "How many points does jane@example.com have?" Balance, VIP tier, enrollment status and lifetime points earned and redeemed, with a link that opens the customer's loyalty detail in Charm. Member lists — "Who are my top Gold members?" Program members filtered by tier and/or minimum balance, sorted by points. Performance — "How did the program do this month?" New members, total members, points earned and spent, member orders and member revenue for a recent period. How it works Sidekick calls a set of read-only data tools that Charm registers with Shopify. The tools run through the same authenticated backend as the Charm admin, scoped to your store — Sidekick sees exactly what you would see in the app, and cannot change anything: no tool can move points, redeem rewards or edit the program. Sidekick, or Claude and ChatGPT? Sidekick lives in the Shopify admin and is read-only by design. If you want the same answers outside the admin — or an assistant that can also act (award points, redeem a reward) with a properly scoped key — connect Claude or ChatGPT over our MCP server instead. The two work fine side by side. Related MCP for AI assistants API overview --- # Subscription apps URL: https://docs.charmloyalty.com/integrations/subscriptions There is nothing to connect. Charm reads subscriptions straight off the Shopify order, so every subscription rule works the moment you switch it on — no API key, no webhook, no app-to-app setup. Which apps work Any subscription app that bills through Shopify's native subscription APIs, including: Shopify Subscriptions (native) Appstle Subscriptions Recharge Seal Subscriptions Loop Subscriptions Skio Bold Subscriptions Subi PayWhirl The list isn't a compatibility matrix Charm maintains per app — it's simply what "bills through Shopify" means in practice. Charm never talks to the subscription app at all. How it works When a subscription app bills a customer through Shopify, the resulting order carries a selling plan on the line item. Charm looks for exactly that, which is why it doesn't care which app put it there: Charm counts orders, not subscription contracts. Every paid order containing a selling-plan line counts as one subscription payment. Because the signal is a native Shopify field, switching subscription apps doesn't break your loyalty program — history keeps counting. What you can build on it | Rule | What it does | |------|--------------| | Start a subscription | One-time bonus the first time a customer subscribes — the nudge from one-off buying to subscribing | | Subscription payment milestones | A reward after the 3rd, 6th, 12th payment — any thresholds you like, each paying out once per customer | | Points per amount spent | Recurring orders earn like any other order | Milestone rewards don't have to be points. Each step can grant bonus points, a free product, an amount or percentage off, or free shipping — so a one-year subscriber can receive an actual thing on their anniversary rather than a number. Three behaviours worth knowing 1. Counting starts when you create the rule. Payments made before that don't count, so switching milestones on in a store with long-running subscribers never triggers a surprise mass payout. 2. Refunds and cancellations self-correct. A refunded order stops counting and progress rolls back. 3. One payment per calendar month is capped by default. A customer with three parallel subscriptions progresses one step per month instead of jumping three steps every billing cycle. Switch it off to count every subscription order. Check it in 30 seconds If you want to confirm your setup before building rules on it: 1. Open any recent subscription order in your Shopify admin. 2. Look at a line item — a subscription order shows the selling plan / delivery frequency on the line. If it's there, Charm sees it. If a line has no selling plan, that order was created outside Shopify's subscription APIs and won't count as a subscription payment — rare, and usually a sign of a legacy checkout integration. Redeeming rewards on subscription orders By default, a customer's redeemed reward discount codes do apply to subscription orders. To restrict rewards to one-time purchases, turn on Exclude subscription orders — see exclude subscription orders from rewards. Related Subscription payment milestones — full guide to the milestone ladder Exclude subscription orders from rewards Punch cards — a repeating every-N-orders reward Concept: Points & rewards --- # Connect Vocato URL: https://docs.charmloyalty.com/integrations/vocato Vocato is Charm's free companion Shopify app for Czech, Slovak, and Polish stores. It supplies correct name declensions ("Ahoj Jane" instead of "Ahoj Jan") plus each customer's name-day date. There's nothing to configure or authorize — Charm detects Vocato by itself once it's installed. Steps 1. In Charm, go to Settings → Integrations and find the Vocato — name days & declensions section. 2. Click Get Vocato — free and install the app from the Shopify App Store. 3. In Vocato, run its one-click customer sync — it fills the name data automatically. 4. Back in Charm, click Check again. The badge flips from Not installed to Active, vocative greetings turn on, and the name-day earning rule becomes available. What the connection unlocks Vocative greetings — the Loyalty Hub greeting and join card address customers in the vocative case. Use the Vocative greetings toggle on the card to turn this off; it falls back to the plain first name whenever no vocative is available. (Czech and Polish get vocative forms; modern Slovak dropped the vocative, so Slovak greetings keep the plain name.) Name-day rewards — the Celebrate a name day earning rule can resolve each customer's date from the Czech, Slovak, or Polish calendar. See Set up a name-day bonus. Customer backfill — click Sync customer data to run a one-time sync so existing customers get their name data right away; new storefront visits refresh automatically. The card shows the last sync's result (customers checked, how many have a name day or vocative). Related Set up a name-day bonus Set up a birthday bonus Connect Klaviyo --- # Add perks to a membership program URL: https://docs.charmloyalty.com/memberships/add-membership-perks Decide what paid members get for their money — Charm uses the same benefit engine as VIP tiers, so a membership can grant shipping, discounts, cashback, points, or a custom perk card. Steps 1. Go to Program → Memberships and open the membership to edit (or + Add membership). 2. Under Member benefits, click + Add benefit, pick a type — Free shipping, Percentage discount, Amount discount, Free / discounted product, Store credit cashback, Monthly store credit, Bonus points, or Custom benefit — and set its value. 3. Click Done, repeat for each perk, then Save. Free shipping, Percentage discount and Amount discount can each require a minimum order value — see require a minimum order for a perk. Monthly store credit turns the membership fee into spendable credit: each time the membership subscription bills successfully, the member receives the configured Credit per billing cycle as store credit — a $10/month member getting $10 back each cycle effectively shops their fee back, usually above its face value. The credit is issued once per billing cycle, and a customer holding two memberships gets the credit of the one that billed. Related Concept: Paid memberships Set a membership term length and grace period Require a minimum order for a perk --- # Give members exclusive access to content URL: https://docs.charmloyalty.com/memberships/exclusive-access Lock chosen pages, products, or collections so only paid members can reach them — non-members see a members-only message or a product stripped of its price and add-to-cart button. Steps 1. In your theme editor, open App embeds and turn on Charm Gate — this is what enforces gating on the storefront before the page paints. 2. Go to Program → Paid memberships and open the membership to edit. 3. Under Member benefits, click + Add benefit and pick Members-only content. 4. Pick what to lock: use Select pages, Select products, and Select collections to build the list. 5. Choose What non-members see on gated products & collections — Blocked with the members-only message or Visible, but price and add to cart are hidden. Optionally set a Custom members-only message. 6. Click Done, then Save. Membership status is written out to customer tags, metafields, and — when connected — Klaviyo and Ecomail, so you can reuse it in segments and flows. Charm republishes the gating rules automatically whenever memberships or tiers change. Related Concept: Paid memberships Add perks to a membership program Require customers to join before redeeming --- # Set a membership term length and grace period URL: https://docs.charmloyalty.com/memberships/membership-term-and-grace Control how long a paid member keeps their perks after buying the membership product, and add an optional buffer before they switch off. Steps 1. Go to Program → Memberships and open the membership to edit. 2. Set Term length (months) for how long perks stay active after purchase, and Grace period (days) for an optional buffer after the term ends. 3. Click Save to apply the change. Related Concept: Paid memberships Add perks to a membership program --- # Paid memberships URL: https://docs.charmloyalty.com/memberships/overview A paid membership is a VIP plan a customer buys (vs. a VIP tier they earn). In Charm a membership is just a Shopify product — the customer purchases it, perks switch on, and they stack on top of points and tiers. Model A membership program links to a product, optionally pinned to a single variant (e.g. monthly vs. annual). The plan inherits that variant's price. Plans can be one-time / term-based (e.g. a 12-month pass) with expiry + a configurable grace window, or auto-renewing subscriptions (currently a preview that needs Shopify subscription approval). Perks use the same vocabulary as VIP tiers (shipping, multiplier, member discounts, custom benefit cards) and resolve through the same checkout discount Function, so member + tier perks compound. Lifecycle 1. The customer buys the membership product through normal checkout. 2. As soon as the order is paid, the membership activates and its perks switch on. 3. Perks are enforced automatically at checkout (and at POS) for as long as the membership is active. 4. When the term ends, the membership lapses after the configurable grace window; lifecycle emails (welcome / expiring / expired) fire along the way. Important behaviors No platform cut. Membership sales settle through Shopify checkout like any order — Charm never takes a percentage or per-member fee. Fees don't earn points. Membership purchases are auto-excluded from point earning across every surface (order earning, refunds, on-page estimate, checkout preview) so a plan can't circularly earn against its own multiplier. Revenue tracking. Each purchase captures amount + currency; analytics report lifetime and active membership revenue, not just member counts. Self-service auto-renewal. Once the auto-renewing subscription preview is enabled for your store, a subscription bought through the membership block auto-applies its selling plan (with auto-renew copy). Customers can Cancel renewal from the membership card in their account — access continues to the end of the paid period — and Charm skips the expiring-soon email for anything still set to auto-renew. Storefront Memberships show up wherever the customer already is, with nothing to place or configure: Floating widget — a Paid memberships row opens a view of its own. Someone who isn't a member yet sees each plan as a card: icon, price, billing cadence in their own language, and the full perk list. Buy now adds the plan to the cart with its selling plan attached — so a subscription renews exactly as it would from the product page — and drops the shopper at the cart; View plan is the quieter route to the product page. A member sees Your membership instead: active or grace status, the renewal or end date, the perks they're getting, and Cancel renewal. Loyalty Hub in customer accounts — the same plan cards under Become a member for anyone who isn't one, each leading to the product page with View plan. Membership theme block on product pages, and the POS customer view. Prices come from the Shopify product and are re-read every time you save the membership or open the memberships page, so a price change on the product follows through to the cards on its own. The cadence line is translated into all 35 storefront languages, and every string is editable per language under Visibility → Customer copy. See Theme app blocks. Related how-tos Add perks to a membership program Set a membership term length and grace period Stop points earning on membership purchases --- # Set up a birthday bonus URL: https://docs.charmloyalty.com/points/birthday-bonus Give customers points or a discount reward on their birthday — a low-cost reason to come back — with controls that stop people from setting a birthday just to grab the reward instantly. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Celebrate a birthday from the rule list. 3. Pick the Birthday reward — Bonus points (default 200), Free product, Amount off, Percentage off, or Free shipping. 4. (Discount rewards only) Turn on Limit how long the reward is valid and set Days the discount code stays valid (default 7), so the birthday code doesn't linger forever. 5. (Optional) Turn on Require advance setup and set Days the birthday must be on file before the reward unlocks (default 30). This blocks the "sign up and instantly claim" trick. 6. (Optional) Turn on Require birth year if your program or compliance needs a full birth date instead of just month and day. 7. Add the rule and click Save. How it's delivered Charm checks birthdays daily and issues the reward automatically once per customer per year — customers don't have to claim anything. The Birthday Reward email goes out when the reward is issued, and as the day approaches customers see a countdown in the floating widget and the account Loyalty Hub card. The countdown is eligibility-aware: a customer still inside the waiting period sees when their reward actually unlocks instead of a date that won't pay out. With Require advance setup on, the rule is also honest up front: the birthday entry form warns that the date must be saved the set number of days in advance ("if it's coming up sooner, your first reward will arrive next year"), and a birthday added too close to the day shows a note on the saved card that the first reward arrives next year — so nobody waits on a reward that isn't coming. Per-tier values The birthday bonus can pay a different number of points in each VIP tier (for example 1,500 in the entry tier and 5,000 in the top one) — see per-tier rule values. Related Concept: Points & rewards Set up a name-day bonus Connect Vocato Set up a signup bonus for new customers Concept: Eligibility, expiry & anti-fraud --- # Combine reward codes with other product discounts (Plus) URL: https://docs.charmloyalty.com/points/combine-product-discounts By default Shopify allows only one product discount per line item, so a Charm product reward and one of your own product promotions can't both land on the same product. On Shopify Plus, Charm can combine them — the reward code and your other product discount apply together on the same item. Steps 1. Go to Settings → Points program → Reward discount codes. 2. Make sure the Reward discount type stays Product discount — same-line combining needs product discounts to be allowed. 3. Turn on Combine with other product discounts on the same item. 4. In Discount tags to combine with, enter the tags of your other product discounts, comma-separated (for example ). 5. Save. Both sides have to opt in Combining is deliberately mutual, so nothing stacks by accident: On your other discounts, add the tags you listed above and allow Charm's own discount tags (Charm shows the exact tags to add in the help text under the setting). Charm applies the change to newly issued product reward codes and tier benefits — existing codes already in customers' hands keep the rules they were minted with. If you leave the tag list empty, nothing can combine — at least one shared tag is required on both sides. Related Choose the reward discount type Per-tier multipliers Concept: Points & rewards --- # Customize the reward discount code prefix URL: https://docs.charmloyalty.com/points/discount-code-prefix Set the prefix Charm puts on every reward discount code it generates, so redeemed codes look branded and are easy to spot in your orders. Steps 1. Go to Settings → Points Program → Branding → Reward discount codes. 2. Turn on Set up a custom discount prefix, then type your prefix into Discount code prefix (letters, numbers, and hyphens only). 3. Check the Preview, then Save. Related Concept: Points & rewards Choose between a fixed-amount and a percentage discount reward Rename 'Points' (including per-language names) --- # Choose between a fixed-amount and a percentage discount reward URL: https://docs.charmloyalty.com/points/discount-type Pick whether a reward takes a set cash amount off an order or a percentage of it — each behaves differently as basket size changes. Steps 1. Go to Program → Ways to redeem and click Add reward. 2. Under Discount type, choose Amount off for a fixed cash value or Percentage off for a share of the order. 3. Set the Amount or Discount percentage (%), set the points cost, then Save. Related Concept: Points & rewards Customize the reward discount code prefix Limit a reward to specific product variants Combine reward codes with other product discounts (Plus) --- # Limit a reward to specific product variants URL: https://docs.charmloyalty.com/points/limit-reward-to-variants Restrict a free-product reward to chosen variants — a single size, color, or pack — instead of letting it apply to the whole product. Steps 1. Go to Program → Ways to redeem and open a Free product reward to Edit. 2. Under Variant eligibility, switch to selected variants and pick the ones to allow under Eligible variants. 3. Click Save to apply the change. Related Concept: Points & rewards Choose between a fixed-amount and a percentage discount reward Set an expiry window for when a reward can be redeemed --- # Set up a name-day bonus URL: https://docs.charmloyalty.com/points/nameday-bonus Celebrate name days (svátek / meniny / imieniny) the way you celebrate birthdays — a beloved tradition in Czech, Slovak, and Polish markets. Charm resolves each customer's date from a national name-day calendar supplied by Vocato, our free companion app, and issues the reward automatically every year. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Celebrate a name day from the rule list. 3. Pick the Name day reward — Bonus points (default 100), Free product, Amount off, Percentage off, or Free shipping. 4. (Discount rewards only) Turn on Limit how long the reward is valid and set Days the discount code stays valid (default 7). 5. Choose the Name day calendar — Czech, Slovak, or Polish. 6. Add the rule and click Save. How it's delivered Charm checks name days daily and issues the reward once per customer per year — no claiming needed. Customers see a countdown card in the Loyalty Hub as their day approaches, and the Name Day Reward email (under Emails → Name day) goes out when the reward is issued. Fix an individual customer's date The calendar date comes from the customer's first name, so an unusual spelling can miss. To override it, go to Customers, open the customer, and next to Name day click Edit — in the Set name day dialog enter Month and Day, then Save name day. The override shows a manual tag, survives Vocato re-syncs, and Clear override returns the customer to the automatic calendar date. Related Connect Vocato Set up a birthday bonus Concept: Points & rewards --- # Reward newsletter and SMS signups URL: https://docs.charmloyalty.com/points/newsletter-signup-bonus Give customers a one-time points bonus for subscribing to your email newsletter or SMS marketing — the bonus is awarded on Shopify's marketing consent itself, so it works no matter where the customer signs up. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Subscribe to the newsletter (email) or Subscribe to SMS updates — you can add both; they award independently. 3. Set Bonus points (default 100 for the newsletter, 150 for SMS). 4. Choose what happens for Customers who are already subscribed: - Can claim the bonus too (default) — existing subscribers claim it themselves from the widget or Loyalty Hub; there is never a mass award. - Don't receive the bonus — only new subscriptions earn it. 5. Add the rule and click Save. How customers earn it Shopify's marketing consent on the customer profile is the source of truth. The moment a customer's consent changes to subscribed — from Charm's own subscribe form, the checkout opt-in box, a popup, or a marketing app such as Klaviyo or Postscript — the bonus is awarded. Each customer can receive each bonus once, ever; unsubscribing keeps the points, and resubscribing never re-awards. In the storefront, members who aren't subscribed yet see the rule with a subscribe flow: the floating widget shows an inline form with a consent checkbox, and the account Loyalty Hub opens a claim dialog. For the SMS rule, if the account has no mobile number on file the flow asks for one in international format, saves it to the customer, and shows the standard marketing-consent disclosure. Related Concept: Points & rewards Set up a signup bonus for new customers Require customers to opt in before enrolling Connect Klaviyo --- # Points & rewards URL: https://docs.charmloyalty.com/points/overview The points ledger Every customer has a points balance backed by an append-only ledger. Earning, redemption, manual adjustments, refunds, and migration imports are all ledger entries — so balance is always and every change is auditable (who, what, when, why). Earning is driven automatically by your earning rules — most commonly when an order is paid. The base earn rate reads as "N points per Y spent", and Y doesn't have to be 1: on the spending rule, set Points earned and For every amount spent (e.g. 1 point per 10 € spent). Any bonus tiers share the same denominator, and storefront surfaces spell out the full "points per amount spent" phrasing. Redemption deducts points and mints a discount code, store credit, or free product. Refunds / cancellations reverse the points awarded for the affected order. Manual adjustments require a logged reason and appear in the customer's history. Point value (e.g. 1 point = $0.05) is a separate setting from earning rules, so you can re-price loyalty liability without rewriting earn history. Outstanding liability = . Rewards Charm ships six reward types: | Type | Behavior | |------|----------| | Amount discount | A fixed amount off, auto-generated and emailed at redemption | | Percentage discount | A percentage off (store-wide or scoped to a collection) | | Store credit | Native Shopify store credit, applied at checkout (and at POS) | | Free shipping | Free-shipping discount applied at checkout | | Product discount | A free or discounted product, granted via a Shopify Function discount | | Collection discount | A percentage off items from a specific collection | Rewards support stack/exclusive flags, minimum-order requirements, expiry windows, and per-customer redemption caps. Each reward also carries a channel — redeemable everywhere (default), online only, or at the register only — so you can run in-store-exclusive rewards without extra apps. Layering on the other programs Points are the base layer. On top of them you can layer VIP tiers (earned cohorts with multipliers and perks), referrals, and paid memberships. They all resolve through the same checkout discount Function, so a customer can be in a tier and a paying member and get both — compounded — with no conflicts. Related how-tos Set up a signup bonus for new customers Rename 'Points' (including per-language names) Control when an order earns points (paid vs authorized vs pending) Reward purchases from a specific collection Reward a custom action with Shopify Flow Combine reward codes with other product discounts (Plus) Launch (or pause) your loyalty program Audit loyalty activity in the Activity Log --- # Pause an earning rule without deleting it URL: https://docs.charmloyalty.com/points/pause-an-earning-rule Temporarily stop an earning rule from awarding points — for a promo break or a seasonal pause — while keeping all of its settings intact. Steps 1. Go to Program → Ways to earn. 2. Find the rule and flip its toggle switch to off. 3. Click Save to apply the change. Related Concept: Points & rewards Reward purchases from a specific collection Set up a signup bonus for new customers --- # Set up points expiration URL: https://docs.charmloyalty.com/points/points-expiration Expire unused points after a set period of inactivity so balances stay current and your liability doesn't grow unchecked. Steps 1. Go to Settings → Points Program → Points expiry. 2. Turn on Enable points expiry, then set Months until expiry (the inactivity window, 1–60 months). 3. Click Save to apply the change. What happens when points expire Charm checks daily. Once the expiry date a customer was shown has fully passed, their balance is zeroed and a Points expired entry appears in their points history — so a customer told "expires 15 May" keeps their points through the whole of 15 May. The date in the job, in the storefront display and in the warning email is always the same one; they can't disagree. The deduction itself sends no email — the warning already went out. Expired points don't reset the inactivity clock, don't count toward VIP tier qualification, and don't touch lifetime points earned, so nobody drops a tier just because their balance expired. Related Concept: Eligibility, expiry & anti-fraud Set an expiry window for when a reward can be redeemed --- # Punch cards URL: https://docs.charmloyalty.com/points/punch-cards A punch card rewards repeat buyers automatically. Every qualifying order is a punch; once a customer fills the card — reaches orders — they get a reward and the card resets. It then repeats, so a punch card is an ongoing loop rather than a one-time bonus. How it works Set orders per card (, minimum 2) and the reward a completed card grants. Each paid, eligible order adds one punch. Progress within the current card is ; a customer who has placed 7 orders on a 5-order card has completed one card and is 2 punches into the next. Completion is idempotent and derives from the order ledger, so webhook replays never double-grant. If an order is refunded or cancelled it stops counting, and progress self-corrects on the next recalculation — the reversed order disappears from the storefront card and the POS view too, not just from the award. Only count orders over a minimum Optionally require an order to reach a value before it earns a stamp — "every 5 orders over €30". Turn on Only count orders over a minimum in the punch-card rule and set Minimum order value. It's off by default, so existing cards keep counting every paid order. The minimum is measured on the order subtotal: after discounts, taxes as charged, shipping excluded. That's the same basis Shopify checks for a discount's minimum purchase, so the number means the same thing here, on order milestones, on the referral minimum, and in a reward's own minimum purchase. Customers see the condition on the card ("Orders over €30") on every surface. Head start: gift the first stamps Optionally, every card can start with free starter stamps — 1 to 3 gift stamps that appear pre-filled the moment a customer (or visitor) first sees the card. Turn it on with Give cards a head start in the punch-card rule; new punch cards have it on by default with 1 gift stamp. Why it exists: the endowed progress effect. In the classic study (Nunes & Drèze, 2006), a 10-stamp card with 2 stamps pre-filled beat an 8-stamp card requiring identical effort — 34% vs 19% completion. A card that is visibly begun feels worth finishing; a card at zero feels like a chore not yet started. How it works: The starter stamps are real. They count toward completion, so an 8-order card with 2 starter stamps completes after 6 orders. "Orders per card" always stays exactly the number you typed — the gift shortens the customer's path to the reward, it doesn't inflate the card. Gift stamps render as ★ tiles, visually distinct from earned ✓ stamps, with a short note ("We've added your first stamps to get you started") so the gift is explained — the research shows unexplained endowment underperforms. Progress counters switch to plain stamp numerals ("3 / 8") so no surface ever overstates real orders placed. The head start applies to guests and members alike, so visitors browsing the widget or the landing page see a card that's already begun before they even join. When cards get the head start | Option | What it does | |--------|--------------| | Every card | The gift reappears each cycle. Permanently shorter cards — the strongest nudge, and the most expensive | | First card only | Only the first card opens with stamps; later cycles run at full length | | First card + comeback stamp | The first card opens with stamps, and after any completed card an order placed within a comeback window you set (default 14 days) earns a bonus stamp on the new card. Customers see the exact deadline | The comeback option trades the permanent gift on later cards for a stamp the customer earns by coming back quickly, so the endowment keeps working without paying for it every cycle. Because the starter stamps count, changing this setting changes your program economics: a card that used to pay out every 8 orders pays out every 6 once you gift 2 stamps on every card. Check the reward's value against the shorter cycle before switching it on. Reward on a completed card A punch card can grant any of: | Reward | Behavior | |--------|----------| | Bonus points | Points land on the customer's balance | | Free product | Granted via a Shopify Function discount | | Amount off | Fixed-value discount code | | Percentage off | Percentage discount code | | Free shipping | Free-shipping discount code | Discount-type rewards are issued exactly once per completed card through the same battle-tested discount path redemptions use, and the customer gets the completion email automatically. A minimum purchase on the reward. Amount-off, percentage and free-shipping card rewards can carry their own minimum purchase, the same field a redemption reward has. Without it a "€6.50 off" card reward can be spent on a €6.50 order where the customer pays shipping and nothing else. How the free product is delivered A card whose reward is a free product has a How the reward is delivered choice: | Option | Behavior | |--------|----------| | Discount code (default) | A one-time code goes out by email, redeemable on a later order | | Add it to the completing order for free | The product is added to the very order that fills the card, at 100% off | In-order delivery is the stronger moment — the customer gets the reward in the box rather than a code to remember. Orders that can't be edited (already fulfilled, POS) fall back to a code automatically, so nothing is lost. Existing cards stay on Discount code until you change it. Punch card vs. order-count milestone They look similar but solve different jobs: Order-count milestone — a one-time bonus the first time a customer reaches a threshold (e.g. "200 points on your 3rd order"). Punch card — a repeating card that resets and runs again every cycle (e.g. "every 5th order is free, forever"). Use a milestone to celebrate a one-off moment; use a punch card to build a durable buy-again habit. And for rewarding customers who stay subscribed, see subscription payment milestones. The order-count milestone ladder carries the same Only count orders over a minimum switch, on the same subtotal basis, and its step rewards can carry a minimum purchase too. Where it shows up Punch-card progress appears on the storefront widget and the customer account hub as a "{filled}/{N}" progress row, so shoppers always see how close the next reward is. Configure it under Ways to earn → Digital punch card. --- # Rename 'Points' (including per-language names) URL: https://docs.charmloyalty.com/points/rename-points Replace the generic word "Points" with your own term — Stars, Gems, Coins — and set a separate name for each storefront language. Steps 1. Go to Settings → Points Program → Branding → Points name. 2. Turn on Set a custom points name, then flip Customize on the primary language row and type your name into each plural form. 3. Open Show more languages to set a name per language, then Save. How the number itself is written Charm groups the digits in a point count the way your store's currency does, everywhere points appear — widget, loyalty page, cart, checkout, POS and emails. A shop selling in rupees sees 1,00,000 points where a euro shop sees 100,000. There's nothing to set; it follows the store currency. Related Concept: Points & rewards Customize the reward discount code prefix Change the admin language --- # Reward purchases from a specific collection URL: https://docs.charmloyalty.com/points/reward-a-collection Give bonus points when an order includes products from a chosen collection — handy for pushing a category, brand, or seasonal range. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Order from a collection from the rule list. 3. Set Bonus points, pick the Collection, choose When to award, then add the rule and Save. Related Concept: Points & rewards Set up a signup bonus for new customers Pause an earning rule without deleting it --- # Reward a custom action with Shopify Flow URL: https://docs.charmloyalty.com/points/reward-a-custom-action Charm's built-in earning rules cover the common cases (orders, signups, reviews, referrals…). When you want to reward something Charm doesn't track natively — a completed survey, a user-generated post, an event check-in, a support-portal action — use a Custom action rule. Charm shows it as a way to earn; your own automation (Shopify Flow) grants the points. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Custom action (points via Shopify Flow). 3. Set the points value to show on the card. (Charm only displays this — your Flow awards the actual points, so keep the two in sync.) 4. (Optional) Turn on Add a link to give customers a Link to take part, and set your own Button text. Visiting the link earns nothing on its own. 5. Copy the Rule ID shown on the rule — you'll need it in Flow. (It becomes active once you save the rule.) 6. Add the rule and click Save. Connect it to Shopify Flow The points are granted by Flow's Award loyalty points action: 1. In Shopify Flow, build (or edit) the workflow that detects your action — its trigger is whatever signals the action happened (a tag added, a webhook, an app event, and so on). 2. Add the Award loyalty points action (provided by Charm — see Shopify Flow). 3. Paste your rule's Rule ID into the action's Charm rule ID field. 4. Set the points to award — matching the number you put on the card. Charm then links each award back to this rule, so it can attribute the points correctly and track completion for the customer. What completion tracking does Once an award arrives with a matching Charm rule ID, Charm treats the action as done for that customer: Their Ways to earn card for the action is marked completed (a checkmark), so it stops showing as still-available on the storefront widget and Loyalty Hub. The rule's name appears on their points history for that award (e.g. "Complete a survey"), instead of a generic "Awarded by Shopify Flow". They receive the standard points-earned email, same as any other earning rule. Linking is per-award via the Rule ID — it's the only opt-in. An award without a matching ID still credits the points, but it won't tick the card or carry the rule's name; and an ID that matches no rule never fails the award (the customer keeps the points, you just don't get the checkmark). Related Concept: Points & rewards Set up Shopify Flow triggers and actions Pause an earning rule --- # Set an expiry window for when a reward can be redeemed URL: https://docs.charmloyalty.com/points/reward-redemption-window Make a specific reward available only within a date range — for a launch, a holiday push, or a limited-time offer. Steps 1. Go to Program → Ways to redeem and open the reward to Edit. 2. Turn on Limit when this reward is available, then set Starts at and Ends at (with start and end times). 3. Click Save to apply the change. Related Concept: Points & rewards Limit a reward to specific product variants Set up points expiration --- # Set up a signup bonus for new customers URL: https://docs.charmloyalty.com/points/signup-bonus Give customers an initial points reward the moment they join, so they start with a balance worth coming back for. Steps 1. Go to Program → Ways to earn and click Add way to earn. 2. Choose Signup bonus from the rule list. 3. Set Bonus points and choose Who can earn this bonus. 4. Under When to award the bonus, choose As soon as the account is created (default), After the customer's first paid order, or After the customer opts into email marketing. Then add the rule and Save. Related Concept: Points & rewards Reward purchases from a specific collection Pause an earning rule without deleting it --- # Set an expiry on store-credit rewards URL: https://docs.charmloyalty.com/points/store-credit-expiry Decide how long the store credit from a store-credit reward stays spendable. By default it never expires; turning on an expiry keeps long-forgotten credit from accruing as liability forever. Steps 1. Go to Program → Ways to redeem and open a Store credit reward to Edit. 2. Turn on Expire the credit, then set Credit valid for (days). 3. Click Save to apply the change. If a customer's order is refunded and their reward reversed, points come back first and an already-expired credit surfaces as an explicit message in the admin — nothing is silently retried. Related Concept: Points & rewards Set an expiry window for when a reward can be redeemed Set up points expiration --- # Subscription payment milestones URL: https://docs.charmloyalty.com/points/subscription-milestones Subscription payment milestones reward customers for staying subscribed, not just for signing up. Every paid order that contains a subscription (selling-plan) item counts as one payment; when the customer's payment count crosses a threshold you configured, that milestone's reward pays out — once per customer. How it works Add the Subscription payment milestones rule under Program → Ways to earn and configure any number of milestones (e.g. after the 3rd, 6th, and 12th payment), each with its own reward. Charm counts orders, not subscription contracts — so it works with any subscription app that bills through Shopify: native Shopify subscriptions, Recharge, Appstle, Seal, Loop, Skio, and others. There is nothing to connect. Counting starts when you create the rule. Payments made before that don't count, so enabling the rule on a long-running store never triggers a surprise mass payout. If an order is refunded or cancelled it stops counting, and progress self-corrects. One payment per month (recommended) The rule ships with Count at most one subscription payment per calendar month switched on. With the cap, a customer with three parallel subscriptions progresses by loyalty over time — one step per month — instead of jumping three steps ahead each billing cycle. Switch it off if you'd rather count every subscription order. Rewards Each milestone can grant any of: | Reward | Behavior | |--------|----------| | Bonus points | Points land on the customer's balance | | Free product | A discount code for the picked product, or the product added to the subscription order itself | | Amount off | Fixed-value discount code | | Percentage off | Percentage discount code | | Free shipping | Free-shipping discount code | Discount-type rewards are issued exactly once per milestone, appear in the customer's My discount codes, and trigger the reward email automatically. Points-mode milestones fold into the same points-earned email as the order itself. A free product milestone has a How the reward is delivered choice: a discount code, or the product added straight into the subscription order that hit the milestone at 100% off. If that order can't be edited, the customer gets a code instead, automatically. Where it shows up The subscription ladder gets the same featured treatment as the order-count ladder on every customer surface: Floating widget — a node scroller, each node reading "Payment 3", with a live count of subscription payments underneath. Account hub — its own full-width section. Landing page — a full-width featured card, with its own checkbox in the theme editor so you can hide it on the page without touching the rule. All three show the next milestone's reward and live progress ("2 / 6 subscription payments"). Once every milestone has paid out, the tile retires from Ways to earn. Related Punch cards — a repeating every-N-orders reward Review milestones — the same ladder concept for product reviews, configured on the review rule Concept: Points & rewards --- # Control when an order earns points (paid vs authorized vs pending) URL: https://docs.charmloyalty.com/points/when-orders-earn-points Decide which payment status an order must reach before Charm awards points, so points fire at the moment that fits your fulfilment flow. Steps 1. Go to Settings → Points Program → Order rules. 2. Turn on Customize points calculation, then in Award points when order is choose Paid, Authorized, Partially paid, or Pending. 3. Click Save to apply the change. What "orders over €30" measures Several rules let you require a minimum order value: the punch card, the order-count milestone ladder, the referral qualifying order, and a reward's own minimum purchase. All four measure the same thing — the order subtotal: after discounts, taxes as your store charges them (included in prices, or added on top), excluding shipping. That's the basis Shopify itself checks when it enforces a discount's minimum purchase, so the €30 you type in one field is the same €30 in every other. This is deliberately not the same question as "what am I willing to pay points on" — the earning basis can exclude tax, shipping, gift cards or specific products without changing what counts as a €30 order. Tiered earning (spend ladder) When your Points per amount spent rule has two or more bonus tiers, the Loyalty Hub shows them as a full-width "spend more, earn more" ladder instead of a single line — each tier's spend threshold and earning rate, so customers see exactly what they earn at each level. The ladder appears automatically; there's nothing to switch on. To edit the line above the ladder, go to Visibility → Customer copy and set Spend ladder intro. It shows in each customer's storefront language. Reward historic purchases When a shopper joins the program, Charm can award points for the guest purchases they made before signing up (matched by email, capped at 50 orders, and never reaching before your program's launch). 1. Go to Settings → Points Program → Order rules. 2. Turn on Reward historic purchases — a window picker appears. Choose 1, 3, 6 or 12 months (1 month is the default). Leave the switch off to award nothing for pre-signup orders. 3. Click Save. The backfill runs both when an account is created and when an existing customer joins through the widget or the loyalty page. Related Concept: Points & rewards Reward purchases from a specific collection Customize Loyalty Hub card titles and icons Concept: Eligibility, expiry & anti-fraud --- # Cap how many referral rewards a customer can earn URL: https://docs.charmloyalty.com/referrals/cap-referral-rewards Put a ceiling on how many successful referrals one customer can be paid for — useful for curbing abuse without turning the program off. The limit can count for all time, or reset each calendar month so regular advocates keep earning. Steps 1. Go to Program → Referral program. In the Referrer reward card, turn on Limit rewards per customer — leave it off to keep rewards unlimited. 2. Enter the number in Max referral rewards per customer. 3. Under Limit period, choose All time or Each calendar month. With the monthly period, only friends' first orders in the current calendar month count, and the limit resets when a new month starts. 4. Click Save to apply the change. Related Concept: Referrals Delay referrer points to verify the referred order Set different rewards for the referrer vs the referred friend --- # Set a custom referral code prefix URL: https://docs.charmloyalty.com/referrals/custom-referral-code-prefix Every customer's referral link and code is built from a shared prefix plus a unique suffix — for example . A custom prefix puts your brand in front of every share and makes codes easy to recognize at checkout. Steps 1. Go to Program → Referral program. 2. Turn on Set up a custom referral code prefix. 3. Enter your prefix in Referral code prefix — up to 12 characters. The Preview below shows the resulting share link, e.g. . 4. Click Save to apply the change. Related Concept: Referrals Set different rewards for the referrer vs the referred friend Cap how many referral rewards a customer can earn --- # Delay referrer points to verify the referred order URL: https://docs.charmloyalty.com/referrals/delay-referrer-points Add a waiting period before a referrer's points are released, giving you time to catch refunds or fraudulent referrals before you pay out. Steps 1. Go to Program → Referral program and Edit the rule to open Complete a referral. 2. In Wait before awarding referrer points (days), enter how many days to hold the points after the friend's order — set 0 to award instantly. 3. Click Save to apply the change. Related Concept: Referrals Cap how many referral rewards a customer can earn Set different rewards for the referrer vs the referred friend --- # Referrals URL: https://docs.charmloyalty.com/referrals/overview Referrals turn happy customers into a growth channel. A customer shares their referral link; when a referred friend places a qualifying first order, both sides can be rewarded. The reward A referral rule has two payouts: The referrer's reward — points, a single-use discount code, a free product, or a combination, awarded to the advocate who shared the link (points default 500). See referrer vs friend rewards. The referred friend's reward — points and/or a discount after their first qualifying order (points default 200), optionally with a free product on top. A referral counts as successful only when the friend completes a qualifying purchase — not on link clicks or sign-ups alone. A product instead of points Both sides can be paid in product. Pick the product in the referral settings and Charm issues a single-use code that covers it in full. The friend's gift has one extra choice — How the gift is delivered: | Option | Behavior | |--------|----------| | Add it to the friend's first order for free | The product drops into that order at 100% off | | Single-use code for a later order | A code goes out instead | Orders that can't be edited fall back to a code automatically. How a referral is attributed Charm reads the referral from two independent places, so a friend doesn't have to behave in any particular way for it to count: The referral discount code, when the friend uses it at checkout. The link, which the storefront carries into the cart and Charm then reads off the order itself. This path needs no account and no sign-in, so it covers guest checkout. Whichever arrives first wins; a friend can never be attributed twice, and a replayed order never double-counts. Protecting the program Referrals are the rule most exposed to abuse, so Charm builds in three guards: Cooldown — days to wait after the friend's order before the referrer's reward is released. This absorbs refunds and fraudulent orders before you pay out. It covers the whole reward: points, the discount code, and a product gift alike, so a refunded order can't cost you a product. 30 days is recommended; set 0 to award instantly. Per-customer cap — optionally cap how many referral rewards a single advocate can earn. Minimum order value — the referrer is paid only when the friend's order reaches the subtotal you set. A smaller order doesn't burn the referral: it stays open, so a later qualifying order still converts it. See what the subtotal measures. Milestone bonuses — award extra points when an advocate reaches a referral count (e.g. a bonus after 3 successful referrals), on top of the per-referral reward — great for powering your most active advocates. See Eligibility, expiry & anti-fraud for how qualifying orders and cooldowns interact. Where it shows up The referral share link and progress surface in the storefront widget and the customer account hub, alongside the customer's other ways to earn. Each customer's referral link, code, and active discount code are also written to their Shopify customer record as metafields, so Shopify Flow, Klaviyo, and Ecomail can read them into automations and emails. Related how-tos Cap how many referral rewards a customer can earn Delay referrer points to verify the referred order Set different rewards for the referrer vs the referred friend --- # Set different rewards for the referrer vs the referred friend URL: https://docs.charmloyalty.com/referrals/referrer-vs-referee-rewards Reward the customer who shares their link and the friend who buys with the incentive that makes sense for each side of a referral. The referrer can earn points, a single-use discount code, or both. Steps 1. Go to Program → Referral program and Edit the rule to open Complete a referral. 2. Under How to reward the referrer, choose Points, Discount code, or Points + discount code. - For points, set Points for the referrer. - For a discount code, set the Referrer discount type (Percentage off or Amount off) and its value. Optionally turn on Require a minimum order for the referrer's code and Expire the referrer's code (default 30 days). 3. Set Points for the referred friend for the new customer. 4. Optionally turn on Require a minimum order value and set Minimum the friend's order must reach — the referrer is only rewarded when the friend's order reaches this subtotal. Without it, a referral attributed by the share link alone pays out on an order of any size (the friend's discount code enforces its own minimum, but a link-attributed referral does not). A below-threshold order leaves the referral open, so a later qualifying order still converts it. 5. Click Save to apply the change. Related Concept: Referrals Cap how many referral rewards a customer can earn Delay referrer points to verify the referred order --- # Add the floating loyalty widget to your storefront URL: https://docs.charmloyalty.com/surfaces/add-floating-widget Put a floating launcher on every storefront page that opens a drawer with the shopper's balance, ways to earn, and redeemable rewards. It's one of several storefront surfaces you can enable in Charm. Steps 1. Go to Visibility → Floating widget. 2. On the Widget card, click Set up (it becomes Customize once live) to open the theme editor with the Charm app embed selected. 3. Toggle the app embed on and Save. What Charm weighs on a page Charm loads only what a page actually uses: | Situation | What the page downloads | |-----------|-------------------------| | App embed on, launcher hidden, nothing else on the page | ~3 KB — the runtime isn't preloaded and no loyalty data is prefetched | | Product or collection page with the points block | ~4 KB of CSS (the product-points, points-badge and membership blocks share one small bundle) | | Floating widget or panel in use | The widget bundle, loaded when it's needed | | Landing page | Its own bundle, on that page only | The runtime is served from your theme's own content-hashed asset through Shopify's CDN wherever possible, with Charm's app proxy as a fallback. Nothing here is configurable — it's how the surfaces load. Related Concept: Storefront surfaces Show points earned on the product page Check whether a storefront block is live --- # Customize brand colors across surfaces URL: https://docs.charmloyalty.com/surfaces/brand-colors Charm seeds a master brand palette when you install, and it cascades to every storefront surface — the widget, Loyalty Hub, landing page, emails, membership block, cart prompt, and product-page points. You style once and everything stays consistent, or you override the colors on a single surface without affecting the rest. Steps 1. Open any surface's page under Visibility — for example Visibility → Store widget. 2. Expand the Color theme section. It's collapsed by default and shows a Customized badge when this surface diverges from your brand. 3. Edit the pickers, grouped into Text and buttons (Primary, Text), Surfaces (Background, Secondary background, Border), and Icons (Icon colour, Icon background). Each picker starts on the color the surface currently resolves to; changing one overrides just that field, while the rest keep tracking your brand. 4. Watch the surface's live preview update as you edit. 5. Save. When colors aren't enough The pickers cover what Charm can express; your theme sometimes needs more — a font that has to cascade in, a nav that outranks the widget, spacing between stacked landing blocks. The Branding page carries a global Custom CSS field for exactly that, and it reaches every surface at once. A surface's own Custom CSS is applied after it, so per-surface rules still win. Related Concept: Storefront surfaces Custom CSS across every surface Add a loyalty landing page Add the Loyalty Hub to customer accounts Theme app blocks --- # Let customers redeem points in the cart URL: https://docs.charmloyalty.com/surfaces/cart-redeem Show a redeem prompt right in the cart so shoppers can turn points into a discount before they head to checkout. Steps 1. Go to Visibility → Storefront pages. 2. On the Redeem points at the cart card, click Set up (or Customize to edit placement, style, and wording). 3. Pick a Placement (see below) and Save. Automatic placement works for most themes out of the box. 4. Make sure the Charm loyalty widget app embed is enabled in the theme editor — the block won't render without it. Placement options Automatic (recommended) Charm injects the block into your cart drawer or cart page at a CSS selector. Leave the selector blank to use built-in defaults for popular themes, or enter your own (for example ) if the default spot doesn't suit your layout. Each surface (drawer and cart page) also has an Insert position choice — place the block at the top or bottom of the matched element, handy for themes that keep totals or a shipping bar pinned in one spot. Theme block — cart page If your store sends shoppers to a full cart page, add the Charm redeem points block to the cart template — the Open theme editor button on the placement card opens the cart template with the block ready to drop in, exactly like the other theme app blocks. You control the position; no code needed. Manual snippet — custom cart drawers Shopify doesn't allow app blocks inside cart drawers. If automatic placement doesn't land where you want it, a developer can paste this snippet into the drawer's Liquid template (Online Store → Themes → Edit code): The block renders exactly where the snippet sits, and a placed snippet always takes precedence over automatic placement. Button or link Under Call to action, choose how the prompt invites the shopper to act: Button — a tappable button at the end of the row. Easier to hit on a phone and harder to scroll past; this is the default. Link — underlined words inside the sentence, for a more understated look. The two styles read your wording differently. Text you wrap in becomes the clickable part of the sentence when you pick Link; with Button, the bracketed text is dropped from the line altogether, because the button carries its own label. Checking the placement before launch In the theme editor the block renders a localized sample line in your brand style, even while the program (or the nudge itself) is still off — so you can see exactly where it lands and style it before launch. It used to render nothing there, which made an empty cart section impossible to distinguish from a broken placement. The sample is generic: it's built from the cart total with default wording, and it never fetches a real point balance or reward estimate. On the live storefront nothing changes — the block stays silent until the program is on. See previewing blocks before the program is live. Styling with custom CSS The surface's editor (Visibility → Redeem points at the cart → Advanced) has a Custom CSS field whose rules are injected on the storefront whenever the nudge is active. Target the class names below — they are a stable styling API: they keep working across app updates, unlike the short internal class names you may also see in the markup (), which can change without notice. Stable selectors | Selector | Element | |----------|---------| | | The nudge line in the cart (pill or inline layout) | | | The "redeem for a discount" link inside the nudge | | | The guest "sign in and earn" link variant | | | Full-screen overlay behind the popup | | | The popup card itself | | | Popup title | | | Close (✕) button | | | Points-balance line under the title | | | Container holding all reward groups and rows | | | Group heading (Discounts / Shipping / Product rewards) | | | One reward row | | | Reward thumbnail tile | | | Reward name | | | Points-cost line under the name | | | Quantity stepper (stackable amount-off rewards) | | | The − and + stepper buttons | | | The quantity number between them | | | The Redeem / Apply button on a row | | | Reassurance footnote at the bottom of the popup | | | "Add a little more to your cart" message | | | The "Discount applied" confirmation view | The most-used selectors are also shown as click-to-copy chips right under the Custom CSS field in the editor. This field styles the cart prompt only. For rules that should reach every Charm surface at once, use the global Custom CSS field in Settings — the prompt's own CSS is applied after it, so anything you put here still wins. Related Concept: Storefront surfaces Enable earn & redeem at checkout Check whether a storefront block is live --- # Check whether a storefront block is live URL: https://docs.charmloyalty.com/surfaces/check-block-status Confirm each storefront surface is actually rendering on your store without checking it manually. Steps 1. Go to Visibility and find the Block detection panel in the right sidebar. 2. It lists every surface (Widget, Loyalty Hub, Checkout, Points earned, and more) with a status badge. 3. Read each badge — Active means real traffic has passed through the block, Detected means Charm sees it placed, and Inactive means it still needs setup. Related Concept: Storefront surfaces Enable earn & redeem at checkout Add the floating loyalty widget to your storefront --- # Enable earn & redeem at checkout URL: https://docs.charmloyalty.com/surfaces/checkout-earn-redeem Show earn-and-redeem messaging inside checkout so shoppers can apply points before they pay. Steps 1. Go to Visibility → Checkout editor. 2. On the Redeem points & Points to earn card, click Set up (or Customize to edit wording), then Open editor. 3. Add the Redeem points and Points to earn blocks near the order summary and Save. How exact is the "points to earn" figure? It's a live estimate of what the order will actually award, built from the cart as checkout reports it. Charm accounts for how your store prices tax — whether tax is included in your prices or added on top — so the preview matches the award instead of drifting by the tax rate. It also follows your earning rules: if shipping or tax is excluded from earning, it isn't previewed as earning either. Related Concept: Storefront surfaces Control when an order earns points Show points earned on the thank-you page Check whether a storefront block is live --- # Add custom CSS to every Charm surface URL: https://docs.charmloyalty.com/surfaces/custom-css Charm is built to inherit your theme: the surfaces use your theme's fonts, and their colors come from your brand palette. Sometimes a theme still needs a nudge — a font that cascades where it shouldn't, a sticky header that sits above the floating widget, or two stacked landing blocks that want more room between them. Branding → Custom CSS is one CSS box for all of it. The rules load on every storefront page where a Charm block or the app embed runs, so a single field covers the landing page, the floating widget, product-page points, the cart prompt, and the membership block. No theme files are edited, and nothing is left behind if you uninstall — which also means agencies and freelancers can style Charm without theme code access. Steps 1. Go to Settings → Branding and scroll to Custom CSS. 2. Paste your rules. Write plain CSS — no tag, no Liquid. 3. Save. Reload your storefront to see the change. Stable selectors Only these four top-level class names are a styling contract — they keep their names across app updates: | Selector | Surface | |----------|---------| | | Every landing page block | | | The floating widget (launcher and panel) | | | Product-page points | | | The cart redeem prompt | Two surfaces also publish their own deeper stable selectors, documented on their own pages: the cart prompt () and the header chip (). Examples Match a theme's body font, when the theme's own rules cascade into the landing page: Lift the floating widget above a theme header with a very high : Add breathing room between stacked landing blocks: Hide a surface on small screens: Good to know Global vs. per-surface. The header chip and the cart prompt each keep their own Custom CSS field under Advanced. Those still work, and they are applied after the global CSS — so a rule there wins over an equally specific global rule. Use them for surface-specific tweaks and the Branding page for anything that should reach more than one surface. Specificity. Your CSS is injected after Charm's stylesheets, so an equally specific rule of yours wins. If a rule doesn't take, it is almost always specificity, not ordering: add a parent selector before reaching for . Limit. 4,000 characters — enough for theme fixes, not for a stylesheet. If you need more than that, use the Contact us button in the app; a fix that big usually belongs in Charm itself. It applies everywhere Charm renders, including surfaces you may not have in mind, so prefer scoped selectors over bare element rules. It is not applied inside the Loyalty Hub or the checkout and thank-you blocks — those are Shopify-rendered extensions that don't accept custom CSS. Style them from their own settings instead. Theme editor preview. Custom CSS is applied in the theme editor too, so you can check your changes before publishing. --- # Customize Loyalty Hub card titles and icons URL: https://docs.charmloyalty.com/surfaces/customize-loyalty-hub-cards Every "ways to earn" and "ways to redeem" card on the Loyalty Hub can carry its own title, translations, and icon — and you can recolour every icon at once. It all renders on the storefront with no theme changes. Rename and re-icon a single card 1. Go to Program → Ways to earn (or Ways to redeem) and open the rule you want to edit. 2. Expand the Customer-facing appearance section and click Edit. 3. Under Card title, pick a Language and type the Title for it. Leave a language blank to fall back to the default — the shopper sees the title for their own storefront language. 4. Under Icon, choose an icon from a category (Shopping, Rewards, Social, or General) or Search for one. To use your own, paste an HTTPS image URL under Or use a custom icon (URL). 5. Click Done, then Save. Set the global icon colour and background 1. On Program → Ways to earn, find the Icon appearance panel. 2. Set the Icon colour and an optional Icon background tile. 3. Click Done. The colour applies to every library icon on every earn and redeem card in the Loyalty Hub. Set the card shape and hide icons The Hub lives in the Shopify customer account, so it has no theme editor — the two layout controls the landing block exposes in the theme sit in the Charm admin instead. 1. Go to Visibility → Customer copy and set Surface to Loyalty Hub. 2. Under Display options, set: - Featured card image shape — Square (1:1), Portrait (3:4), or Landscape (4:3). Every featured reward photo is cropped to the shape you pick, so the cards line up no matter how the product images were shot. - Show card icons — turn it off for a text-only hub. Product photos and VIP tier badges are not affected. 3. Click Save. Related Add the Loyalty Hub to customer accounts Concept: Storefront surfaces Rename 'Points' (including per-language names) --- # Edit the loyalty FAQ URL: https://docs.charmloyalty.com/surfaces/edit-faq Charm auto-generates an FAQ from your program's real settings — points name, tier basis, referral rewards, expiry, and reward-combining policy — localized into every published language. You can reorder it, rewrite any answer, hide questions, and add your own. It shows on the Loyalty Hub, the floating widget, and the landing page. Steps 1. Go to Visibility → FAQs. 2. Under Questions, drag any row by its handle to reorder — predefined and custom questions mix freely. 3. To rewrite a predefined question, click its Edit (pencil) icon and change the Question or Answer. Leave a field blank to keep the automatic text for that language. 4. To hide a predefined question, turn off its toggle. It stays in the list marked Hidden. 5. To add your own, click Add question, fill in the Question and Answer, and click Done. 6. In the Where to show card, toggle Landing page, Loyalty Hub, and Store widget on or off. 7. Save. Related Concept: Storefront surfaces Add a loyalty landing page Add the Loyalty Hub to customer accounts Add the floating loyalty widget to your storefront --- # Show a points chip in your theme header URL: https://docs.charmloyalty.com/surfaces/header-chip The header chip puts your loyalty program in the most-seen spot of your store: the theme header. Signed-in members see a personal greeting and their live points balance (optionally with their VIP tier); guests see a "Sign in to earn rewards" nudge. Clicking the chip opens the floating widget panel — or, if you prefer, links to the loyalty landing page or the account hub. Steps 1. Go to Visibility → Header chip and switch the chip on. 2. Under Placement, keep Automatic — Charm detects the header structure of popular themes (the Dawn family, Horizon, and others). If your theme isn't matched, choose a custom selector, paste a CSS selector for your header container, and pick the insert position (before / after / start / end of the element). 3. Choose the click behavior, tier display, and device visibility (see below). 4. Save — the page shows a live desktop/mobile, member/guest preview as you edit. Merge it into your theme's account icon Instead of a standalone chip, turn on Merge into the theme's account button. The chip then renders inside the theme's own account element (auto-detected — on Horizon-style themes; override with the selector field), sharing one outline with the account icon so the two read as a single control. In merge mode the chip is display-only: your theme's account button keeps its own click behavior, so nothing about the header's navigation changes. Options | Option | Choices | Notes | |--------|---------|-------| | Click | Widget panel (default) · Landing page · Account hub · None | "None" renders a display-only chip | | Tier display | Name · Tier icon · Hidden | Shown next to the balance | | Appearance | Inherit theme (default) · Brand accent · Filled | Inherit blends into the header; accent/filled pull your brand palette | | Corners | Rounded · Pill · Square | | | Devices | Desktop only (default) · Mobile only · Both | Mobile can use its own selector + position — e.g. mount the chip inside the mobile menu or cart drawer instead of the cramped header | | Texts | Greeting, guest title, guest subtitle | Overridable per storefront language on the card | Good to know The chip inherits your header's font and colors by default, so it looks like part of the theme rather than an app. If the configured selector matches nothing, the chip simply doesn't render — it will never break a header layout. It renders during page load with the member's last known balance and updates live once fresh data arrives — no flicker, no layout shift. The greeting follows your program's tone of voice and is localized into all storefront languages; in Czech and Polish it addresses customers in the correct grammatical case (via Vocato or Charm's built-in declensions). Related Concept: Storefront surfaces Add the floating loyalty widget Loyalty landing page --- # Add a loyalty landing page URL: https://docs.charmloyalty.com/surfaces/landing-page Give your program its own storefront page: a hero pitch, ways to earn, rewards, VIP tiers, a refer-a-friend card, and an FAQ — one of Charm's storefront surfaces. Signed-in members see a personal greeting and live balances; guests see the join pitch. Everything is localized into all your published languages and inherits your brand colors. Steps 1. Go to Visibility → Landing page. Use the Preview (toggle Preview as signed-in customer) to see each section, and edit any wording under Translations & text — including the Advanced — all text expander for shared strings. Adjust the Color theme section if this page should diverge from your brand. Save. 2. In Shopify admin, create the page: Online Store → Pages → Add page. Give it a title (for example "Rewards") and save. 3. Back on the Landing page settings, open the Add to your theme card and click Open theme editor. Select the page you created, then Add block and drop Landing: Hero onto it. 4. Add the sections you want beneath the hero — Landing: How it works, Landing: Ways to earn, Landing: Ways to redeem, Landing: VIP tiers, Landing: Referral, Landing: FAQ, and Landing: Sign-up banner. Reorder them by dragging. Save the theme. 5. Return to Visibility → Landing page and check the Status card shows recent activity for the page. Layout and card style Visibility → Landing page → Layout controls how the page's cards are built. The live preview updates as you change them. | Setting | Options | |---------|---------| | Card layout | Full — icon above a centred title. Roomy, best when the page leads with the program. Compact — icon beside the title with details paired underneath, so more fits on screen | | Show card icons | Hide the icons entirely for a plainer, typographic page | | Corners | Match the floating widget, or set the page's own: Rounded, Pill, or Square | Featured rewards Rewards you mark as featured render as large cards with their product photo. Two controls sit on the Landing: Ways to redeem block: Featured cards position — put the featured group above or below the regular reward list. Featured rewards heading — the heading above the group, editable per language under Translations & text. Card image shape — Square (1:1), Portrait (3:4), or Landscape (4:3). Every card photo is cropped to the shape you choose, on desktop and mobile, so the row lines up however the product images were shot. The Loyalty Hub has the same control in the Charm admin, so the two surfaces can differ. Featured product photos run edge to edge by default, matching the Loyalty Hub; the glyph fallback used when a reward has no photo keeps its inset. Keep long lists short Landing: Ways to earn and Landing: Ways to redeem both fold past a point you choose, so a long programme doesn't turn the page into a wall of tiles. Everything below the fold sits behind a Show more button — nothing is removed, and one tap reveals the rest. | Block | Setting | Default | |-------|---------|---------| | Ways to earn | Ways to earn before "Show more" | 8 (two desktop rows) | | Ways to redeem | Rewards before "Show more" | 4 (one desktop row) | | Ways to redeem | Featured rewards before "Show more" | 4 | Set any of them to 0 to always show the full list with no button. On the earn block, the full-width featured sections (order-count milestones, subscription payment milestones, punch card, reward for spending) are never folded — only the compact grid beneath them is. Each featured section has its own checkbox on the Landing: Ways to earn block, so you can hide one on the page without touching the rule. Before you launch While the loyalty program is switched off, the landing blocks render nothing on the live storefront — shoppers never see a half-built page. In the theme editor the same blocks render your real staged configuration, so you can place and style the whole page before launch. See previewing blocks before the program is live. If the blocks are placed but the program is off, the Visibility page says so directly rather than reporting the page as broken. Related Concept: Storefront surfaces Theme app blocks Customize brand colors across surfaces Edit the loyalty FAQ Add the Loyalty Hub to customer accounts Show a points chip in your theme header --- # Add the Loyalty Hub to customer accounts URL: https://docs.charmloyalty.com/surfaces/loyalty-hub Give shoppers a full loyalty destination inside their Shopify account for balance, rewards, and history — one of Charm's storefront surfaces. Steps 1. Go to Visibility → Customer Account editor. 2. On the Loyalty Hub card, click Customize to edit copy and branding, or Open live page to view it. 3. Add the Loyalty Hub page to your customer account navigation and Save. Make the cards your own Each "ways to earn" and "ways to redeem" card on the hub can have a custom title (with per-language translations) and icon, and you can recolour every icon to match your brand — all without touching your theme. See Customize Loyalty Hub card titles and icons. Related Concept: Storefront surfaces Customize Loyalty Hub card titles and icons Add the floating loyalty widget to your storefront Show a points chip in your theme header Check whether a storefront block is live --- # Storefront surfaces URL: https://docs.charmloyalty.com/surfaces/overview Charm lives on Shopify's native surfaces — no iframes, no scripts injected into checkout. Each surface is a Shopify extension you control from Visibility. At a glance | Surface | What the shopper sees | How it's added | |---------|-----------------------|----------------| | Floating widget | Launcher on every page: balance, rewards, tier progress, membership card | Theme app block () | | Header chip | Greeting + live points balance in the theme header — standalone or merged into the account icon | Rendered by the widget embed — see Header chip | | Product-page points | "Earn X points with this product" on PDPs | Theme app block () | | Membership block | Paid plans + "you're a member" state | Theme app block () | | Landing page | Dedicated page promoting the program: hero, earn, rewards, tiers, referral, FAQ | Theme app blocks () | | Cart redemption | Apply points as a discount from the cart drawer or cart page | Theme app block () — see Cart redemption | | Points anywhere | Live point values placed in any part of your theme | Theme app block or snippet — see Points Anywhere | | Customer account hub | Full loyalty page inside Shopify customer accounts | Customer-account UI extension (live on install) | | Checkout | Earn/redeem during checkout | Checkout UI extension | | Thank-you & order status | Points-earned confirmation after the order | Checkout UI extension | | POS | Loyalty at the register | POS UI extension — see POS | Each surface in detail Floating widget The always-on launcher. A logged-in shopper opens it to see their points balance, the rewards they can afford right now, progress to the next VIP tier, and — if you sell memberships — their membership card. Guests see a sign-in prompt and your earning highlights. To turn it on, see Add the floating loyalty widget. Product-page points A small "Earn X points with this product" line on the product page, so the reward is visible at the moment of intent. The number reflects the customer's active multipliers (VIP tier, live campaigns), so a Gold member browsing during a 2× weekend sees the boosted figure. See Show points earned on the product page. Membership block Presents your paid plans on the product page and flips to a "you're a member" state for customers who already own one. Use it on a dedicated membership product, or alongside a hero collection. Landing page A dedicated storefront page that sells the program — a hero pitch, ways to earn, rewards, VIP tiers, a referral card, and an FAQ, built from theme app blocks you drop onto a Shopify page. Signed-in members get a personal greeting and live balances; guests see the join pitch. A program-aware FAQ, managed once, also renders here alongside the Loyalty Hub and widget. See Add a loyalty landing page and Edit the loyalty FAQ. Cart redemption A redemption box in the cart itself, so points become a discount before the shopper ever reaches checkout. It can run in the cart drawer, on the cart page, or both, and you choose whether it sits above or below the cart contents. See Redeem points from the cart. Customer account hub The full loyalty page inside Shopify's native customer accounts — balance, point history, rewards to redeem, referrals, tier status, and memberships. It's live the moment Charm is installed; no theme work required. Each earn and redeem card can carry a custom title and icon. See Add the Loyalty Hub to customer accounts. Checkout Two checkout blocks: a Redeem points field where a shopper applies a reward without leaving checkout, and a Points to earn line showing what this order will add to their balance. Both are Shopify Checkout UI extensions, so they're allowed in checkout on every plan including Plus — nothing is injected. See Enable earn & redeem at checkout. Thank-you & order status After the order, a Points earned card confirms the points the customer just earned and their new balance — on both the thank-you page and the order-status page they return to later. See Show points earned on the thank-you page. POS The same loyalty engine at the register — look up a member, earn, and redeem at the counter, with one balance shared across web and POS. Covered in detail on POS loyalty. How data reaches the storefront Shared content (perks, plan prices, styling) is cached with the page so guest pageviews stay fast, while per-customer data (balance, owned memberships, affordable rewards) loads only for logged-in shoppers — pages stay quick for everyone and personal for members. Live-detection Charm pings a lightweight surface-status signal when a block renders, so the Visibility page shows each surface as Active, Detected, or Inactive without you reporting it manually. See Check whether a storefront block is live. See Theme app blocks for how to add them. Related how-tos Add the floating loyalty widget to your storefront Add a loyalty landing page Enable earn & redeem at checkout Show points earned on the product page Add the Loyalty Hub to customer accounts Show points earned on the thank-you page Edit the loyalty FAQ Customize brand colors across surfaces Check whether a storefront block is live --- # Show points anywhere (collections, quick view & more) URL: https://docs.charmloyalty.com/surfaces/points-anywhere The points on product page block covers the product template. For everywhere else — collection grids, search results, quick-view modals, featured-product sections, custom landing pages — Charm supports a lightweight custom placement: a plain you paste into your theme code. All divs on a page resolve in one batched request, and the line reuses the styling, wording, tone, and reward-page link you configured under Visibility → Points on product page. There is nothing new to configure in the app. Modern themes: add it in the theme editor (no code) On modern themes whose product cards are built from blocks — Shopify's Horizon family and other recent themes — you don't need code at all: 1. Open Online Store → Themes → Customize and navigate to a page with a product grid (for example, a collection or a Featured collection section). 2. Select the Product card group and click Add block → Charm points on cards (under Apps). 3. In the block's settings, connect Product to the closest product using the dynamic-source picker (on many placements Shopify connects it automatically). The Style setting defaults to Compact — a subtle one-liner tuned for cards; switch to Standard for the full sentence with icon (better for featured-product sections). 4. Save. Every repeated product card now shows the points estimate for its own product. If the "Add block" list inside the product card doesn't offer apps, your theme doesn't accept app blocks there — use the code snippet below instead. Any theme: add it with a code snippet 1. In Shopify admin, go to Online Store → Themes → ⋯ → Edit code. 2. Open your theme's product card snippet — in Dawn that's , in Horizon . 3. Paste the snippet where you want the points line to appear (for example, under the price): The line makes the snippet work across themes: Dawn exposes the card's product as , while Horizon and most modern themes use . 4. Save. Every product card that renders through this snippet — collections, search results, product recommendations — now shows the points estimate. Other placements Anywhere you have a Liquid object, the same snippet works — and on modern themes the Charm points on cards app block can be added to any section that accepts app blocks: Featured-product section: add the badge app block (its Product setting autofills from the section's product), or use the snippet with the section's product variable. Quick-view modals: most themes render quick view from the same card or a product snippet — the div is picked up automatically when the modal opens. Custom pages/sections: pass any product's ids the same way. Attribute reference | Attribute | Required | What it does | |-----------|----------|--------------| | | yes | Marks the div for Charm to fill. | | | recommended | Charm resolves the exact shop-currency price and the product's collections from this id, so the estimate matches the product page and real awards exactly. | | | recommended | Needed for product-specific bonus rules and product exclusions. | | | fallback | Major units (e.g. ). Only used if the variant lookup fails. | | | optional | (recommended in cards) renders a subtle one-liner — no icon, regular weight, points value in your accent color, short "+650 points" text. Omit for the full sentence with icon. | | | fallback | Comma-separated collection ids; only used if the variant lookup fails. | Good to know No layout shift: the div stays empty until the estimate loads, and renders nothing when the program is off, the product is excluded, or the estimate is 0 points. Estimates match everywhere: the batched lookup runs the same server logic as the product page — base rate, VIP multipliers, bonus campaigns, and collection/product bonus rules. AJAX-friendly: collection filtering, infinite scroll, and quick view are detected automatically. Compact copy: the compact text defaults to "+650 points" in every language (the points name is localized and declined automatically). You can reword it per language via the Compact card message field under Visibility → Points on product page → Text and translations. Styling hooks: the rendered line carries (and for the compact style) for card-specific CSS tweaks. Colors and the icon follow your Visibility settings. On the product template, prefer the Charm product points block — it updates live with variant and quantity changes. Related Show points earned on the product page Concept: Storefront surfaces Check whether a storefront block is live --- # POS loyalty URL: https://docs.charmloyalty.com/surfaces/pos Charm's POS extension brings the same loyalty engine to the register: one balance across web and counter, no second app or login. What staff see Smart Grid tile + customer block — points balance, current tier and perks, active membership, store-credit balance, affordable rewards, and the next reward the customer is working toward. Redeem modal — redeem any reward type in person: discount code, store credit (native POS tender), or free product. Post-sale block — confirms points earned and the new balance on the receipt screen. How it works Earning needs no separate configuration — POS orders earn on the same rules as online orders, and earning reconciles itself after the sale, so a flaky connection at the counter never costs a customer points. Notes Store credit redeems as native POS tender; it settles through the POS payment flow. The extension is localized in all 32 languages Charm ships and follows the device's active language. --- # Show points earned on the product page URL: https://docs.charmloyalty.com/surfaces/product-page-points Display an estimated points total in the product information section so shoppers see the reward before they add to cart. Steps 1. Go to Visibility → Storefront pages. 2. On the Points on product page card, click Set up (or Customize to edit display and wording). 3. Add the Charm product points block to your product template and Save. Link the text to your rewards page If you promote the program on a dedicated page (for example the loyalty landing page), the block's text can link to it. In the Reward page link section of the card, enter the page URL, then wrap any part of the block's wording in square brackets — — and that part becomes the link. No brackets makes the whole line clickable; leaving the URL empty renders the brackets away. This works even with the floating widget switched off, so it suits stores that route everything through a rewards page. Related Concept: Storefront surfaces Add the floating loyalty widget to your storefront Check whether a storefront block is live --- # Show points earned on the thank-you page URL: https://docs.charmloyalty.com/surfaces/thank-you-points Show a post-purchase summary of the points an order earned on the thank-you page (and the order status page). Steps 1. Go to Visibility → Checkout editor. 2. On the Points earned card, click Set up (or Customize to edit wording), then Open editor. 3. Add the Points earned block once on the thank-you page and once on the order status page, then Save. Related Concept: Storefront surfaces Enable earn & redeem at checkout Check whether a storefront block is live --- # Theme app blocks URL: https://docs.charmloyalty.com/surfaces/theme-app-blocks Charm's storefront surfaces are theme app blocks. You add them in the Shopify theme editor — no Liquid editing or code required. Blocks | Block | Where it goes | |-------|---------------| | Loyalty widget | App embed — floating launcher on every page | | Product points | Product template — "earn X points" | | Membership | Product template — presents paid plans | | Redeem points | Cart page — the cart redemption box (the cart drawer needs no block) | | Points badge | Any section — show live point values anywhere with Points Anywhere | | Gate | Any template — members-only content when you require program opt-in | | Landing: Hero (+ How it works, Ways to earn, Ways to redeem, VIP tiers, Referral, FAQ, Sign-up banner) | A Shopify page — the loyalty landing page sections | Adding a block 1. Online Store → Themes → Customize. 2. For the widget: App embeds → enable Charm loyalty widget. 3. For product blocks: open a product template → Add block → pick Charm product points / Charm membership. 4. Save. Charm auto-detects the live block and marks the surface Active under Visibility. Once enabled, the widget renders as a floating launcher on every storefront page. Styling Colors, copy, and icon visibility are configured in the Charm admin — the blocks pick the settings up automatically, so you style once and every surface stays consistent. Changes appear on the storefront after the next page refresh. Custom themes: when a section won't accept app blocks App blocks can only be dropped into sections that declare support for them. Most published themes do; hand-built themes sometimes don't — the block simply never appears in that section's Add block list. The fix is two lines in the section's schema and render loop, done once by whoever maintains the theme: After saving, every app block (Charm's and any other app's) becomes available in that section in the theme editor. For placements where even that isn't possible — product cards in classic themes, quick-view modals — use the points-anywhere div instead. Previewing blocks before the program is live In the theme editor, every block you place renders your real staged configuration — your actual earn rules, rewards, VIP tiers, referral values and FAQ — even before the program is switched on. You style what shoppers will actually see, not grey placeholders. One rule governs it: the editor previews the blocks you place; program switches don't apply there. The points master switch, the referral rule, and the tiers switch decide what customers see. Inside the editor you control the preview by adding and removing blocks, so a points-off shop and a referrals-off shop behave identically. Placeholders appear only where something is genuinely unconfigured. Two things that look like bugs but aren't: On the live storefront, blocks render nothing while the program is off. That's deliberate — no half-launched program leaks to shoppers, and it's why the Visibility page tells you your landing blocks are placed but the program is off. The blocks come alive the moment the program is activated. The product points block shows an illustrative sample (a points figure roughly equal to the product price) rather than your earn rate. If the preview product costs 0 — a tour, a gift card — the sample bottoms out at "earn 1". Pick a normally priced product in the editor's preview picker to see a sensible sample. Surface toggles are still respected in the editor: hiding the floating launcher or the header chip is a "where does UI appear" choice, not program state. Which blocks need the app embed The Charm Loyalty app embed is the shared runtime — it powers the floating widget and a few surfaces that plug into it. Several blocks carry their own script and work even with the embed off: | Surface | Needs the app embed? | | --- | --- | | Floating widget & panel | Yes — it is the embed | | Header chip | Yes | | Redeem points at the cart | Yes — the embed's runtime powers the popup | | Points-anywhere divs | Yes (the embed's scanner fills them) | | Charm product points (product page) | No — self-contained | | Charm points on cards | No — ships its own scanner | | Landing page blocks | No | Turning the floating launcher off in Charm → Visibility → Store widget does not disable the embed — the runtime keeps powering the chip, cart redemption, and points-anywhere placements. The separate Charm members-only gate embed (formerly "Charm Gate") handles members-only content gating and renders nothing unless gating rules exist. --- # Lock content to a VIP tier URL: https://docs.charmloyalty.com/tiers/exclusive-access Give a tier real exclusivity: lock chosen pages, products, or collections so only customers who reached that tier can get in. Everyone else sees a members-only message, or the product with its price and add-to-cart button hidden. Steps 1. In your theme editor, open App embeds and turn on Charm Gate — this is what enforces gating on the storefront before the page paints. 2. Go to Program → VIP tiers and open the tier that should get the access. 3. Under Perks, click + Add perk and pick Members-only content. 4. Build the list with Select pages, Select products and **Select collections**. A perk with nothing selected can't be saved. 5. Choose What non-members see on gated products & collections — **Blocked with the members-only message or Visible, but price and add to cart are hidden. Optionally set a Custom members-only message**. 6. Click Done, then Save. How access is decided Gating is by tier level, not by exact tier: lock something to Silver and every tier above Silver gets in too. If a paid membership locks the same page, the two merge into a single rule with a combined audience — the membership or the qualifying tier passes. Related Concept: VIP tiers Give members exclusive access to content Set different rule values and reward costs per tier --- # Add a grace period before a customer drops a tier URL: https://docs.charmloyalty.com/tiers/grace-period Give customers a buffer so they don't lose their tier the instant their activity dips below the threshold. Steps 1. Go to Settings → VIP tiers → Grace period. 2. Turn on Enable grace period. 3. Set Grace period (days) to how long a customer keeps their tier after dropping below its threshold, then Save. Related Concept: VIP tiers Reset VIP qualification each year (or use a rolling window) Make VIP tiers qualify by spend instead of points --- # Add multi-criteria tier qualification (e.g. points AND spend) URL: https://docs.charmloyalty.com/tiers/multi-criteria-qualification Make a tier harder to reach by combining several requirements — for example points and a minimum spend. Steps 1. Go to Program → VIP tiers and expand Configure tier levels. 2. On the tier you want, each requirement is a row in its criteria list. Click + Add another criterion, then set the row's type — Points earned, Amount spent, Orders placed, Successful referrals, or Customer tag — and its Minimum value. 3. With two or more criteria, a How criteria combine selector appears. Choose Require all criteria (points AND spend) or Qualify if any one is met. 4. Click Save. Related Concept: VIP tiers Give different point multipliers to each VIP tier Make VIP tiers qualify by spend instead of points --- # Nudge customers who are close to the next tier URL: https://docs.charmloyalty.com/tiers/notify-approaching-next-tier A customer who is nearly at the next tier is the easiest customer to bring back. Charm can send them a nudge — as its own email, or as a Shopify Flow trigger you route to SMS or your marketing tool. Steps 1. Go to Emails and open Approaching next tier (under the VIP group). 2. Turn it on — it ships switched off. 3. Edit the subject, heading, body and button text per language, then Save. The email quotes what's left in the customer's own language and currency, e.g. "You're only 400 points away from Gold". When it fires when the customer crosses 90% of the way to the next tier; once per tier — the marker resets whenever the customer's tier changes, so the same customer can be nudged again on the next rung; only on tiers that qualify by points or spend. Ladders that qualify by orders, referrals or a customer tag are skipped; during normal tier evaluation (earning, redeeming, opening the Loyalty Hub), so there's no nightly job and no delay. Send it somewhere else instead The same moment fires the VIP tier approaching Shopify Flow trigger, which carries the next tier's name, ID and handle, the remaining gap as ready-to-send text, and the current tier ID — enough to build an SMS or a push without touching Charm's own email. With Klaviyo connected it also lands as the Charm VIP Tier Approaching metric. Related Concept: VIP tiers Turn off an email Set up Shopify Flow triggers and actions --- # VIP tiers URL: https://docs.charmloyalty.com/tiers/overview VIP tiers split customers into named cohorts they earn by their behavior. Each tier carries: a point multiplier (e.g. Gold earns 2×), perks — free/discounted shipping, member discounts, tier-exclusive rewards, members-only content, custom benefit cards, a branded icon and an automated celebration (in-app bar + tier email + Klaviyo event). Tiers are free and points-based — your most engaged customers move up automatically, no purchase required. They build directly on the points economy. How customers qualify A tier can qualify customers on one criterion or several. Each tier picks from: | Criterion | Qualifies on | |-----------|--------------| | Points | Points earned in the qualification window | | Amount spent | Spend in the window | | Orders placed | Order count in the window | | Successful referrals | Converted referrals | | Customer tag | A Shopify customer tag you control (comma-separated = "any of these") | When a tier uses more than one criterion, you choose how they combine: All — the customer must meet every criterion (e.g. spent $500 and has the tag). Any — meeting one is enough. Simple points- or spend-only tiers keep working exactly as before — multi-criteria qualification is additive, so existing ladders need no migration. Tier perks resolve through the same checkout discount Function as memberships, so a customer who is both a paying member and a VIP tier gets both — compounded — with no conflicts. Tier achievement and downgrades are configurable (lifetime, annual review, or rolling inactivity), with reminder emails before a downgrade. Related how-tos Make VIP tiers qualify by spend instead of points Give different point multipliers to each VIP tier Set different rule values and reward costs per tier Lock content to a VIP tier Nudge customers who are close to the next tier Add multi-criteria tier qualification (e.g. points AND spend) Reset VIP qualification each year (or use a rolling window) Add a grace period before a customer drops a tier Rename a tier or change its icon --- # Hide a rule or reward from a specific tier URL: https://docs.charmloyalty.com/tiers/per-tier-availability A VIP tier can change what a rule pays and what a reward costs — see per-tier values. It can also decide whether the rule or reward exists for that tier at all: save a reward for Gold, or keep the entry tier deliberately simple. Steps 1. Go to Program → VIP tiers and find the tier you want to restrict. 2. On the tier's card, look for the Availability in this tier box. It reads Everything available, or 3 hidden in this tier once you've restricted something. 3. Click the pencil to open the availability editor. Your earning rules appear under Ways to earn and your rewards under Ways to redeem, each with a checkbox, all ticked by default. Each line shows the rule's or reward's value, so three rewards of the same kind stay tellable apart. 4. Untick anything members of this tier shouldn't get, click Done, then Save. What "hidden" means A hidden earning rule can't be completed while the customer is in that tier: it doesn't appear on the widget, loyalty page or account page, and the action doesn't award points even if they reach it another way. A hidden reward can't be redeemed while the customer is in that tier: it isn't shown among their rewards, and a redemption attempt is refused. Both are tied to the customer's current tier. Move up and the rules and rewards of the new tier apply immediately — nothing is deleted, so promoting a customer restores whatever their old tier was hiding. What always stays available Some of the program is its backbone and is never hidden, in any tier: base points for purchases store credit cashback punch cards milestones referrals the signup bonus That guarantee means no tier can end up with no way to earn. Related Concept: VIP tiers Set different rule values and reward costs per tier Apply per-tier points multipliers Give a tier exclusive access --- # Give different point multipliers to each VIP tier URL: https://docs.charmloyalty.com/tiers/per-tier-multipliers Reward your best customers with faster earning by giving each tier its own points multiplier. Steps 1. Go to Program → VIP tiers and expand Configure tier levels. 2. Select a tier and set its Points multiplier (for example, 1.5 earns 1.5× the base rate). 3. Repeat for each tier, then Save. The multiplier row is optional on every tier, the entry tier included: remove it with the × to return that tier to the base rate, or keep a 1× row visible on purpose — a kept 1× row is shown as a perk in your storefront too, which some brands use to spell out the base rate on the entry tier. Related Concept: VIP tiers Set different rule values and reward costs per tier Add multi-criteria tier qualification (e.g. points AND spend) Rename a tier or change its icon --- # Set different rule values and reward costs per tier URL: https://docs.charmloyalty.com/tiers/per-tier-rule-values VIP tiers can adjust the whole program, not just add perks: an earning rule can award a different number of points in each tier, and a reward can cost a different number of points. Set per-tier values on an earning rule 1. Go to Program → Ways to earn and open the rule. 2. Turn on Use different values for each tier. 3. Each tier shows a points field — the value members of that tier receive. Leave a field empty to inherit the rule's base value (shown as the placeholder). 4. Click Update. Per-tier values are available on birthday and name-day bonuses, newsletter and SMS signup bonuses, social follows and shares, visit-a-page and custom-action rules. The signup bonus deliberately has no per-tier values — every new member starts in the entry tier. The purchase rule scales through per-tier multipliers instead. Set per-tier costs on a reward 1. Go to Program → Ways to redeem and open the reward. 2. Turn on Use different point costs for each tier. 3. Fill a cost per tier; an empty field inherits the base cost. 4. Click Update. Customers always pay the price they see: the widget, loyalty page, cart and checkout, POS and loyalty emails all quote the customer's own tier price, and redemption charges exactly that number. If a limited-time reward sale is also running, the customer pays the lower of the sale price and their tier price. Where you see the adjustments Each tier's card on the Program page and the VIP tiers preview panel list the tier's rule adjustments. The program summary in the sidebar breaks per-tier values into sub-bullets. Notes Guests and members without an assigned tier see the base program. Everything here works with tiers that are configured but not yet launched, so you can prepare the matrix before enabling tiers. --- # Reset VIP qualification each year (or use a rolling window) URL: https://docs.charmloyalty.com/tiers/qualification-period Control the window of activity that counts toward a tier so status stays current instead of accumulating forever. Steps 1. Go to Settings → VIP tiers → Qualification period. 2. Set Count activity from to Lifetime (all time), Current calendar year, or Rolling window. 3. For Rolling window, set Window length (months) to how many months back count, then Save. What customers see With Current calendar year, the next-tier progress line on the account page and Loyalty Hub includes the deadline — for example "Spend $250 by 12/31 to reach Gold" — so the reset works as an incentive instead of a surprise. Lifetime and rolling windows show the same line without a date. The amount is always expressed in whatever the next tier qualifies on: spend, orders, referrals, or points. Related Concept: VIP tiers Add a grace period before a customer drops a tier Make VIP tiers qualify by spend instead of points --- # Make VIP tiers qualify by spend instead of points URL: https://docs.charmloyalty.com/tiers/qualify-by-spend Decide what counts toward a VIP tier — points earned, money spent, orders placed, and more — so your tiers reward the behaviour you care about. Steps 1. Go to Program → VIP tiers and expand Configure tier levels. 2. At the top of the tier list, set Tiers qualify by to Amount spent (or Points earned, Orders placed, Successful referrals, or Customer tag). This bulk-switches the main requirement on every tier. 3. Adjust each tier's Minimum if needed, then click Save. Related Concept: VIP tiers Reset VIP qualification each year (or use a rolling window) Add multi-criteria tier qualification (e.g. points AND spend) --- # Rename a tier or change its icon URL: https://docs.charmloyalty.com/tiers/rename-a-tier Customize how a VIP tier looks to customers by renaming it or swapping its icon. Steps 1. Go to Program → VIP tiers and expand Configure tier levels. 2. Select the tier and edit the Tier name. To rename the internal Handle, open the tier actions menu and choose Edit handle. 3. Set the Icon style — built-in icon sets, Custom icons (an HTTPS image URL per tier), or No icons — then Save. Related Concept: VIP tiers Give different point multipliers to each VIP tier Add multi-criteria tier qualification (e.g. points AND spend) --- # Require a minimum order for a perk URL: https://docs.charmloyalty.com/tiers/require-minimum-order-for-a-perk Free shipping for your top tier is generous. Free shipping on a €4 order is expensive. A minimum order value keeps the perk attractive without making every small basket unprofitable. Steps 1. Go to Program → VIP tiers and open the tier (or Program → Memberships and open the membership). 2. Under Perks, open the perk you want to gate — Free shipping, Percentage discount, or Amount discount. 3. Turn on Require minimum purchase and enter the amount in your store's currency. 4. Click Done, then Save. How the minimum is measured The threshold is checked against the cart subtotal at checkout — what the customer is spending on products, before shipping. A customer below the threshold simply doesn't get the perk on that order; nothing is blocked and no error is shown. Only these three perk types take a minimum. Cashback, bonus points, monthly store credit, free or discounted products, members-only content and custom perk cards have no minimum-order option. Related Concept: VIP tiers Add perks to a membership program Set different rule values and reward costs per tier Hide a rule or reward from a specific tier ---