Shopify
Install StickyTier from the Shopify App Store and open it from your Shopify admin — that connects the store; Store connection shows its health. Live orders earn automatically; refunds claw back proportionally; cancellations, GDPR requests and missed webhooks heal via nightly reconciliation. Redemptions become native single-use discount codes. Theme blocks show balances on the storefront; admin blocks show a customer's loyalty card inside Shopify admin. Integration health (webhooks, scopes, last sync) lives on the same page.
StickyTier counts orders from the moment you connect your store — it never quietly rewards older ones. To reward orders from before that, open Import data → Past orders → Reward orders from before you connected: choose How far back (7, 30 or 60 days), press Preview to see how many orders and roughly how many coins that is, then confirm with the “Import … orders” button. Anyone who can run imports can preview; confirming adds coins to members' balances, so it also needs permission to adjust balances (owners and admins have it), and an import worth more than your team's self-serve limit waits for a second approver under Approvals. One import runs at a time, up to 5,000 orders each; orders already in your programme are skipped, so running it again never pays twice. Members aren't emailed when coins from imported orders are added, and imported orders never count towards your plan's monthly order limit. Shopify only shares the last 60 days of orders with apps.
StickyTier asks Shopify for the least it needs: orders, customers, fulfilments and products (product tags drive product boosts), plus discount codes and store credit (to pay out rewards and to check a store-credit payout really landed), and permission to update customers so each member's tier shows in Shopify as a tag and metafields — see Show tiers in your Shopify store. It never reads payments data, so a chargeback is not picked up automatically — if a member’s order is disputed, pause them from their member page until it is settled.
Rewards inside your store
Your rewards page also lives inside your Shopify store, at /apps/loyalty — for example https://yourstore.com/apps/loyalty. It opens in your own theme, with your header and footer, and shows a signed-in customer their membership card (tier, balance and member number), progress to the next tier, the rewards they can redeem there and then, their last few transactions and their referral link. Customers who aren't signed in see what the programme offers and a button to your store's sign-in, which brings them straight back.
To put it in front of shoppers, add it to your store menu: in Shopify admin open Online Store → Navigation, choose your main menu, then add a menu item, name it (say, "Rewards") and paste /apps/loyalty as the link. Nothing else to set up — it works with both new and classic customer accounts.
One sign-in for shoppers
Customers who are signed in to your store never need a second sign-in for their rewards. The theme block's Open my rewards wallet link, and the Open the full rewards page button on /apps/loyalty, take them to your rewards page already signed in. It works the other way round too: your rewards page shows Continue with your store's name as the main way in, with the emailed sign-in link as the alternative.
Shopify vouches for who the customer is; StickyTier never sees their store password. A customer who has shopped but never joined is shown a short join page with your terms first, and joins when they accept — as long as your programme is open for new members (terms and privacy text published) and your plan has room. A store account without a confirmed email address can't be matched to a rewards account, so those customers use the emailed link instead.
Any other stack: the API
WooCommerce, Magento, a custom cart, POS — send commerce events to the /v1 API and the same engine applies the same rules, caps and timings. Keys, scopes and webhooks live under Developers (see Developers & API keys); an isolated test mode (sandbox) ships with every programme. The plain HTTP API is the supported way in. Our Node and PHP client libraries and the WooCommerce plugin are in beta — available on request from support@stickytier.com; the WooCommerce plugin hasn't yet been certified on a live store. Full reference, quickstart and webhook signing guides live in the developer documentation.
curl -X POST https://stickytier.com/v1/events \
-H "Authorization: Bearer sticky_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "order.paid", "order_ref": "POS-1042", "email": "fan@vibe.club", "gross_cents": 99900 }'Migrating from Smile / LoyaltyLion
Import data → Balances from another app takes their CSV exports (Smile.io, LoyaltyLion, or Generic (email + points)): balances, tier names (mapped onto your tiers by name) and referred-by links. Upload & preview runs a dry run first — row counts, errors, totals, nothing written. Confirming credits each customer once. The kill switch is real: Undo this import reverses the entire batch in one go — balances, tier assignments and referral links; members it created stay, with a zero balance. If a member has already spent some of the imported points, the undo takes their balance to zero rather than below it and lists them for you to review.
- Nobody gets a balance twice. Each customer (by email) can have one imported balance at a time. Uploading the same file again, or a fresh export from your old app, skips everyone who already came over — the preview tells you how many. To change a balance that already came over, undo that import and upload the corrected file.
- One bad row doesn't stop the rest. A row whose phone number already belongs to another member (or that shares a phone number with another row) is skipped, and the batch lists each skipped line with the reason.
- An import that stops part-way can be finished or undone. Press Resume to add only the rows that aren't done yet, or Undo this import to reverse what it added so far.
- Adding balances is a balance change. Anyone who can run imports can bring members over, but confirming an import that adds balances, places members into tiers or links referrals (the referred-by column — those count toward referral bonuses) also needs permission to adjust balances — the same permission as changing a balance or a member's tier by hand. Undoing or resuming an import that adds balances needs it too. If your team has a limit for balance changes (under Settings → Programme rules) and the import adds more than that in total, it waits under Approvals for someone else to confirm — no balance is added until they do.
- The numbers are checked when you confirm, not just when you preview. Undoing one import lets its customers come over again, so another import waiting in preview or for approval may now add more than it first showed. We recount at the moment you confirm and again when an approver approves; if an undo made a waiting import bigger, it goes back to preview so you can confirm today's numbers. An import never adds more than the amount that was checked — if it would, it stops and tells you why.
Importing past orders
A Shopify order export (CSV) under Import data → Past orders, in Upload a Shopify order export, brings your order history in, so tiers and reports start from real spend. Orders your store has already sent to StickyTier — matched by order number like #1001 or by Shopify's order id — are skipped and counted once, and importing the same orders again updates them instead of adding copies. Importing orders never adds points to anyone's balance, but it does count toward tiers — so it needs permission to adjust balances and tiers (owners and admins have it), the same as moving a member into a tier by hand.