v1.0.0-alpha · Premium

OLoyalty v1.0.0-alpha

A WooCommerce loyalty, rewards, and referrals engine. A real points ledger, member tiers with qualification rules, a reward catalog with cart, product, and gift-card payouts, store credit balances, and a fraud-aware referral program. Thirteen tables, idempotent ledger writes, REST + WP-CLI surface, native suite integration with OEngage, OMailer, OCart, OForms, OFeedback, OIntel.

WordPress plugin WP 6.4+ · PHP 8.1+ WooCommerce 8.0+ GPL-2.0+ v1.0.0-alpha · alpha
01 · Overview

What OLoyalty does

OLoyalty sits on top of WooCommerce. It tracks every point earned and spent in an append-only ledger, qualifies members into tiers based on configurable rules, ships a catalog of redeemable rewards (cart discounts, product unlocks, gift cards, store credit, custom payloads), runs a referral program with fraud scoring, and dispatches every change as a typed event for the rest of your stack to react to.

🎯
Points engine
Earn rules with caps, multipliers, exclusions. Append-only ledger with balance_after on every row
🏆
Tiers
Bronze, Silver, Gold, Platinum. Configurable qualification rules and per-tier perks
🎁
Rewards catalog
Cart % / fixed, product % / fixed, free product, free shipping, gift card, store credit, custom
💳
Gift cards
Issue, schedule delivery, redeem, void. Code is UNIQUE; transaction history per card
💰
Store credit
Balance per member per currency. Auto-applied at checkout. Full transaction log
🤝
Referrals
Per-member referral code, fraud score, configurable referrer + friend payouts
📣
Campaigns
Multipliers, bonuses, win-back, holiday triggers. Scheduled with start + end windows
🪝
Event bus
Typed dispatch over do_action. 15 canonical events for every loyalty mutation
🧭
REST + WP-CLI
Full oloyalty/v1 namespace with OpenAPI, plus 8 wp oloyalty commands
🔌
Suite integration
First-party bridges: OEngage XP, OMailer transactionals, OCart funnels, OForms signup, OFeedback rate, OIntel analytics
🧾
Audit log
Every admin action recorded with diff, actor, IP, timestamp
📊
Liability reporting
Outstanding-points liability snapshot. Configurable value-per-point
02 · Installation

Getting installed

⚠️
Alpha release. Run OLoyalty in shadow mode for one full week (capture only, do not pay out rewards) before flipping payouts on for live shoppers. Toggle the master kill-switch at oloyalty_settings.points.enabled = false to record events without crediting points.
1
Install and activate WooCommerce 8.0+. OLoyalty guards on WooCommerce being present and exits gracefully if it is not.
2
Upload the oloyalty folder to /wp-content/plugins/ and activate via Plugins → Installed Plugins.
3
On activation: creates 13 custom database tables (all prefixed {prefix}oloyalty_), seeds default tiers and earn rules, registers capabilities, declares HPOS and cart-checkout-blocks compatibility via WooCommerce's FeaturesUtil.
4
Open OLoyalty → Dashboard in wp-admin (slug oloyalty). Default settings are sensible for shadow-mode evaluation.

Requirements

WordPress
6.4+
PHP
8.1+
8.2+ recommended
WooCommerce
8.0+
Tested up to 9.5
Database
MySQL 5.7+
MariaDB 10.3+
03 · Quick Start

First program in 5 minutes

From fresh activation to a live loyalty program with one earn rule, one tier upgrade, and one redeemable reward.

1
Open OLoyalty → Settings. Set points.value_per_point (default 0.01 = 1 cent per point) and points.expire_after_days (default 365).
2
Open OLoyalty → Earn Rules. The default order.completed rule awards 1 point per $1 spent. Add a tier multiplier so Gold members earn 1.5x.
3
Open OLoyalty → Rewards and click + New Reward. Pick type cart_fixed, name "$10 off $50+", points cost 400, conditions cart_min_total 50.
4
Drop the shortcodes [oloyalty_balance], [oloyalty_rewards], and [oloyalty_referral] into the My Account page (or use the matching Gutenberg blocks).
5
Run wp oloyalty member show {user_id} to confirm the points are flowing in after a test order.
04 · File Structure

Plugin architecture

oloyalty/ ├── oloyalty.php Plugin bootstrap, HPOS guard, WC dependency guard ├── uninstall.php Drop tables on plugin delete ├── includes/ │ ├── class-oloyalty-bootstrap.php Wires every engine after WooCommerce loads │ ├── class-oloyalty-db.php 13 table schemas, dbDelta migrations, seed_if_empty │ ├── class-oloyalty-events.php Typed event bus over do_action │ ├── class-oloyalty-settings.php Single options row with typed accessors │ ├── class-oloyalty-capabilities.php Area capabilities (manage / members / rewards / referrals / reports) │ ├── class-oloyalty-admin.php Top-level menu + submenus │ ├── class-oloyalty-rest.php REST routes at oloyalty/v1, includes /openapi │ ├── class-oloyalty-export.php CSV export for members, ledger, redemptions │ ├── class-oloyalty-templates.php Email + storefront template loader │ ├── class-oloyalty-blocks.php Registers balance / rewards / referral blocks │ ├── class-oloyalty-free-tier.php Free-tier launcher + branding gate │ ├── class-oloyalty-logger.php Structured leveled logger │ ├── members/ Member enrollment, profile, suspend / ban │ ├── points/ Points engine, ledger, earn rules, birthdays sweep │ ├── tiers/ Tier evaluator, recalc cron │ ├── rewards/ Reward catalog, redemption, codes │ ├── giftcards/ Issue, schedule delivery, redeem, void, transactions │ ├── credit/ Store credit balances + transactions │ ├── referrals/ Conversion, fraud scoring, payout │ ├── campaigns/ Multipliers, bonuses, win-back, holiday │ ├── liability/ Outstanding-points snapshot + reporting │ ├── storefront/ My Account widgets, shortcodes, launcher │ ├── integrations/ OEngage, OMailer, OCart, OForms, OFeedback, OIntel bridges │ └── cli/ 8 wp oloyalty commands ├── lib/orravo-core/ Mini-core, steps aside if full Orravo Core present ├── admin-views/ Admin templates and assets ├── blocks/ Gutenberg blocks: balance, rewards, referral ├── templates/ Frontend + email templates └── assets/ Admin CSS + JS
05 · Database Tables

13 database tables

All prefixed with {prefix}oloyalty_. Created on activation through dbDelta. Hot queries are indexed: member-by-user_id, ledger-by-(member_id, created_at desc), giftcard-by-code, referral-by-referrer.

TablePurpose
oloyalty_membersOne row per enrolled customer. user_id UNIQUE, referral_code UNIQUE. Tracks points_balance, lifetime_earned, lifetime_redeemed, current tier_id, status (active / suspended / banned)
oloyalty_ledgerAppend-only points journal. type (earn / redeem / adjust / expire / reverse / transfer), points delta, balance_after, source, source_id, expires_at. Indexed (member_id, created_at)
oloyalty_tiersTier definitions per program: name, rank, qualification_rules JSON, perks JSON, color, icon
oloyalty_rewardsReward catalog. type ENUM (cart_pct / cart_fixed / product_pct / product_fixed / free_product / free_ship / gift_card / store_credit / custom), points_cost, value JSON, conditions JSON
oloyalty_redemptionsOne row per redeemed reward. code UNIQUE, status (pending / applied / consumed / reversed), order_id, points_spent, issued_at, consumed_at
oloyalty_giftcardsGift card records. code UNIQUE, initial_amount, balance, currency, issued_to_email, issued_via (purchase / redemption / manual / bulk / api), status, expires_at
oloyalty_giftcard_transactionsPer-card transaction log. type (issue / redeem / refund / adjust / void), amount, balance_after, optional order_id
oloyalty_credit_balancesStore credit per member per currency. UNIQUE (member_id, currency)
oloyalty_credit_transactionsStore credit ledger: type (issue / redeem / refund / adjust / expire), amount, balance_after, source
oloyalty_referralsReferral records. referrer_member_id, referred_email, referred_user_id, referred_order_id, status (invited / signed_up / purchased / rewarded / flagged / rejected / reversed), fraud_score, fraud_signals JSON
oloyalty_earn_rulesRule definitions. action (e.g. order.completed, review.left, birthday), points, formula JSON, multipliers JSON, caps JSON, exclusions JSON
oloyalty_campaignsPromotional campaigns. type (multiplier / bonus / win_back / holiday), config JSON, starts_at, ends_at, status
oloyalty_audit_logEvery admin action with action, object_type, object_id, diff JSON, IP, user_id, timestamp
06 · Admin Interface

Admin interface

Top-level menu OLoyalty (slug oloyalty) with capability-scoped submenus. Built with the same admin chrome as the rest of the Orravo suite for first-party feel.

SubmenuSlugCapability
Dashboardoloyaltyoloyalty_manage
Membersoloyalty-membersoloyalty_manage_members
Points & Ledgeroloyalty-pointsoloyalty_manage_members
Tiersoloyalty-tiersoloyalty_manage
Rewardsoloyalty-rewardsoloyalty_manage_rewards
Gift Cardsoloyalty-giftcardsoloyalty_manage_rewards
Store Creditoloyalty-creditoloyalty_manage_rewards
Referralsoloyalty-referralsoloyalty_manage_referrals
Campaignsoloyalty-campaignsoloyalty_manage
Reportsoloyalty-reportsoloyalty_view_reports
Integrationsoloyalty-integrationsoloyalty_manage
Settingsoloyalty-settingsoloyalty_manage
07 · Settings Reference

Settings reference

All settings stored in wp_options under key oloyalty_settings as a single nested array. Access via OLoyalty_Settings::get('group.key').

points

KeyDefaultDescription
value_per_point0.01Currency value of one point. Used for liability snapshots
expire_after_days365Earned points expire after this many days. 0 disables expiry
allow_negative_balancefalseWhether redemptions can take a member negative
shadow_modetrue (alpha)Capture events but do not credit / debit. Flip off for live payouts

referrals

KeyDefaultDescription
referrer_points500Points awarded to the referrer on conversion
friend_points250Points awarded to the referred friend
fraud_threshold0.7Score at or above this routes the referral to manual review
min_friend_order_total10Minimum first-order subtotal for the conversion to count

tiers

KeyDefaultDescription
recalc_crondailyHow often the tier engine re-evaluates membership thresholds
downgrade_grace_days30Days a member can drop below threshold before being demoted
08 · Points engine

Points engine

Earn rules describe how members accumulate points. The ledger is append-only: every change writes a row with the new balance_after, so balances are auditable end to end. Adjustments, expirations, and reversals are first-class types alongside earn / redeem.

Default earn rules (seeded)

ActionPointsNotes
order.completed1 per $1Tier multiplier applied. Cap 2,000/day per member
account.created100One-shot signup bonus
review.left50Cap 1/day per member
birthday250Auto-fired by daily birthdays sweep
referral.converted500Awarded to the referrer on friend's first qualifying order

Ledger types

  • earn: positive points from a triggering event
  • redeem: negative points spent on a reward
  • adjust: manual admin adjustment, positive or negative
  • expire: negative points removed by the expiry sweep cron
  • reverse: rollback of a prior earn or redeem (e.g. order refunded)
  • transfer: balance moved between members (rare, requires capability)
09 · Tiers

Member tiers

Tiers are ordered by rank. Qualification rules are a JSON document evaluated against the member's lifetime stats. Perks JSON is read by the points engine, rewards engine, and any custom code that calls OLoyalty_Tiers::perks_for($member).

TierDefault qualificationDefault perks
Bronze (rank 1)Always1x point earn
Silver (rank 2)500 lifetime points1.25x earn, free shipping at $50+
Gold (rank 3)2,000 lifetime points1.5x earn, priority support, early access
Platinum (rank 4)5,000 lifetime points2x earn, birthday bonus, quarterly gift, priority support
ℹ️
Override the perks list per tier with the oloyalty/tier/perks filter. Override qualification with oloyalty/tier/qualifies for full programmatic control.
10 · Rewards catalog

Rewards catalog

A reward is a row in oloyalty_rewards with a typed payout and an optional points cost. Redemption issues a single-use code (UNIQUE) that maps cleanly onto a WooCommerce coupon, gift card, store credit issuance, or any custom payload your site cares about.

Reward typePayout
cart_pctPercentage off the entire cart
cart_fixedFixed amount off the entire cart
product_pctPercentage off a specific product or category
product_fixedFixed amount off a specific product or category
free_productA specific product added free with the next order
free_shipFree shipping on the next order
gift_cardIssues a row in oloyalty_giftcards with the configured amount
store_creditCredits the member's credit_balances row
customFires oloyalty/reward/issued with arbitrary value JSON for your own handler
11 · Gift cards

Gift cards

Gift cards have a UNIQUE code, fixed initial amount, and configurable expiry. Issuance writes a row in oloyalty_giftcards plus an issue transaction. Each redemption appends a redeem transaction with the new balance, so the audit trail is complete.

Code format

Default format is strtoupper(bin2hex(random_bytes(8))). Override with the oloyalty/giftcard/code_format filter to plug in your own scheme (Luhn-checksummed, prefix-by-merchant, etc).

Statuses

  • pending: scheduled for delivery in the future
  • active: delivered, balance > 0, ready to redeem
  • redeemed: fully drawn down to balance 0
  • void: voided by an admin (capability-gated)
  • expired: past expires_at, balance frozen
12 · Store credit

Store credit

Store credit lives on the member record (UNIQUE per member + currency). It auto-applies at checkout and never has a code, so it can never leak. Every change writes a row in oloyalty_credit_transactions with the new balance.

TypeUse
issueManual admin issuance, or from a reward redemption
redeemAuto-applied at checkout against the member's order total
refundIssued back when an order is refunded after credit was used
adjustManual correction with admin note
expireRemoved by an expiry sweep (off by default)
13 · Referrals

Referral program

On enrollment each member gets a UNIQUE referral_code. Friends apply the code at checkout (or land via ?ref=CODE). The conversion handler runs fraud scoring first, and a score at or above referrals.fraud_threshold (default 0.7) routes the referral to manual review.

Fraud signals (configurable)

  • ip_match: referrer and friend share an IP
  • ua_match: identical user agent
  • email_disposable: friend's email is on a disposable-domain list
  • velocity: more than N referrals from the same referrer in 24h
  • billing_match: shared billing address
ℹ️
Plug in your own scoring with the oloyalty/referral/fraud_score filter. The filtered float is clamped to 0.0..1.0 and stored in fraud_score; signals are persisted as JSON in fraud_signals for review.
14 · WC integration hooks

WooCommerce integration

OLoyalty hooks WooCommerce's order lifecycle directly. Points are awarded on woocommerce_order_status_completed and woocommerce_order_status_processing; reversed on refund or cancellation; and the review-points rule listens for comment_post on product comments.

WC hookOLoyalty handler
woocommerce_order_status_completedAward order.completed points (with tier + campaign multipliers)
woocommerce_order_status_processingSame as completed (configurable; off by default for cards-on-file flows)
woocommerce_order_status_refundedReverse the original earn entry (type=reverse)
woocommerce_order_status_cancelledReverse the original earn entry
comment_postApply review.left rule when a product gets a comment
woocommerce_cart_calculate_feesAuto-apply store credit balance against the cart total
HPOS-compatible (declared via FeaturesUtil::declare_compatibility('custom_order_tables')). Cart-checkout-blocks compatible (declared via cart_checkout_blocks).
15 · Shortcodes & blocks

Shortcodes & blocks

Three shortcodes plus three matching Gutenberg blocks. All render the current member's data with no configuration required.

[oloyalty_balance]
Renders the current member's points balance, current tier, and progress toward the next tier.
[oloyalty_balance]
[oloyalty_balance show_tier="false" show_progress="true"]
[oloyalty_rewards]
Renders the rewards catalog with redeem buttons. Filters by member tier and by points the member can afford.
[oloyalty_rewards]
[oloyalty_rewards type="cart_fixed,gift_card" affordable_only="true"]
[oloyalty_referral]
Renders the member's referral code with a copy button and share links. Click counts are tracked.
[oloyalty_referral]
[oloyalty_referral show_code="true" share_buttons="email,whatsapp,x"]
ℹ️
Block names: oloyalty/balance, oloyalty/rewards, oloyalty/referral. Same attributes as the shortcodes; configurable in the block inspector.
16 · Suite integrations

Suite integrations

First-party bridges to other Orravo plugins. Each is togglable in Settings → Integrations and runs zero-config when both plugins are active.

IntegrationBehavior
OEngageEvery loyalty point earned also awards XP via do_action('oengage_award_xp', $user_id, $xp, 'oloyalty.points_earned'). The oloyalty/oengage/xp_per_point filter controls the conversion ratio (default 1:1).
OMailerTriggers transactional sends on oloyalty.giftcard_issued, oloyalty.reward_issued, oloyalty.tier_changed. Templates ship in the box and can be overridden per-program.
OCartRenders the rewards selector inside the OCart funnel and applies redemption codes against the OCart cart context.
OFormsReferral signup form auto-links the entry to the referrer's code. Form submissions can fire any earn rule.
OFeedbackRate-after-redeem trigger fires the OFeedback widget after a redemption is consumed.
OIntelStreams every loyalty event into the OIntel analytics warehouse for dashboards and segmentation.
17 · REST API

REST API

Namespace oloyalty/v1. Auth via standard WordPress nonces (admin-side) or application passwords (server-to-server). All routes return JSON. The /openapi endpoint serves a live OpenAPI 3.0 spec for codegen.

MethodRoutePurpose
GET/pingHealth check
GET/openapiOpenAPI 3.0 spec for the namespace
GET/membersList enrolled members (paginated, filterable)
GET/members/{id}Get a single member with current balances and tier
GET/members/meCurrent authenticated user's member record
POST/members/{id}/adjustManually adjust points balance (capability-gated)
GET/members/{id}/ledgerPaginated ledger entries (filter by type, source, date)
POST/members/{id}/banSuspend or ban the member
POST/members/{id}/unbanLift a suspension
GET/tiersList tier definitions
POST/tiers/recalculateForce a full tier recalc (long-running, runs async)
GET/rewardsList active rewards in the catalog
POST/rewards/{id}/redeemRedeem a reward for the current member
GET/giftcardsList issued gift cards
GET/giftcards/{code}Look up a gift card by code
POST/giftcards/{code}/redeemApply a gift card to an order
POST/giftcards/{code}/voidVoid a gift card (capability-gated)
GET/credit/{member_id}Get store credit balances for a member
POST/credit/{member_id}/issueIssue store credit (capability-gated)
GET/referralsList referral records
POST/referrals/{id}/approveApprove a flagged referral
POST/referrals/{id}/rejectReject a flagged referral
GET/reports/liabilityOutstanding-points liability snapshot
18 · Developer hooks

Developer hooks

OLoyalty ships a typed event bus (OLoyalty_Events::dispatch) that mirrors every emission through do_action. You can subscribe to any event with vanilla add_action.

Canonical events

  • oloyalty/booted: fired once after the engine wires up
  • oloyalty/member/enrolled: a new member row was created
  • oloyalty/points/earned: points awarded (member, ledger entry)
  • oloyalty/points/redeemed: points spent on a reward
  • oloyalty/points/expired: expiry sweep removed points
  • oloyalty/points/adjusted: manual admin adjustment
  • oloyalty/tier/changed: member moved between tiers
  • oloyalty/giftcard/issued: a gift card was created
  • oloyalty/giftcard/redeemed: balance reduced by a redemption
  • oloyalty/giftcard/voided: admin voided a card
  • oloyalty/giftcard/delivered: scheduled delivery completed
  • oloyalty/credit/issued: store credit issued
  • oloyalty/credit/redeemed: store credit applied to an order
  • oloyalty/referral/created: a new referral row was inserted
  • oloyalty/referral/converted: friend completed first qualifying order
  • oloyalty/referral/flagged: fraud score above threshold
  • oloyalty/liability/recalculated: liability snapshot completed

Filters

  • oloyalty/earn/eligible: gate whether an event qualifies for earn rules
  • oloyalty/earn/points: override the computed point value
  • oloyalty/earn/campaign_multiplier: override the active campaign multiplier
  • oloyalty/ledger/allow_negative: permit a redemption to take a member negative
  • oloyalty/tier/qualifies: override tier qualification logic
  • oloyalty/tier/qualifies_rules: rewrite qualification rules per evaluation
  • oloyalty/tier/perks: rewrite the perks list returned for a tier
  • oloyalty/redeem/eligible: gate reward redemption eligibility
  • oloyalty/redeem/value: override the cart-side discount value at apply time
  • oloyalty/giftcard/code_format: override gift card code generation
  • oloyalty/referral/fraud_score: plug in your own fraud scorer
  • oloyalty/oengage/xp_per_point: ratio of OEngage XP awarded per loyalty point
  • oloyalty/liability/value_per_point: override the per-point currency value
  • oloyalty/launcher/suppress: hide the storefront launcher widget
  • oloyalty/free_tier/show_branding: render the small "Powered by Orravo" mark on free tier
19 · Helper functions

Helper functions

Procedural helpers for the common stuff. Wraps the underlying classes so themes and snippets stay readable.

FunctionPurpose
oloyalty_award_points($user_id, $points, $source, $ctx = [])Award points and write a ledger entry
oloyalty_get_balance($user_id)Return the current points balance
oloyalty_get_member($user_id)Return the member row, or null if not enrolled
oloyalty_enroll($user_id, $args = [])Enroll a customer; idempotent
oloyalty_redeem_reward($user_id, $reward_id)Redeem a reward and return the redemption row
oloyalty_issue_giftcard($args)Issue a gift card (amount, recipient, expiry)
oloyalty_get_credit($user_id, $currency = 'USD')Return the store credit balance
oloyalty_referral_url($user_id)Build a shareable referral URL
oloyalty_log($message, $context = [])Structured leveled logger
20 · WP-CLI

WP-CLI

Eight wp oloyalty commands cover member, points, tiers, giftcard, credit, referral, report, and reward operations. Wire them into your deploy pipeline or cron jobs.

$ wp oloyalty member list --tier=gold --format=table
→ 6 gold-tier members listed

$ wp oloyalty points adjust 42 +500 --reason="customer service credit"
→ ledger #4912 written · balance 4,820 → 5,320 · ok

$ wp oloyalty tiers recalc
→ recalculated 30 members · 2 promotions · 0 demotions · 14 unchanged

$ wp oloyalty giftcard issue --to=adaeze@velluma.com --amount=25
→ issued GC-3F8A1C90 · $25.00 · expires 2027-05-07 · email queued

$ wp oloyalty credit issue --member=42 --amount=10
→ credit_transactions #318 · balance 0.00 → 10.00

$ wp oloyalty referral approve 14
→ referral #14 approved · referrer +500 · friend +250

$ wp oloyalty report liability
→ 30 members · 142,840 pts outstanding · $1,428.40 liability @ $0.01/pt

$ wp oloyalty reward list --status=active
→ 10 active rewards · 22,400 pts spent (30d window)
21 · Capabilities

Admin capabilities

Six area capabilities so loyalty operations can be split across roles. Granted to the administrator role on activation; reassign to your own roles via standard add_cap.

CapabilityGrants
oloyalty_manageTop-level admin: settings, tiers, campaigns, integrations
oloyalty_manage_membersMembers & ledger CRUD, manual adjustments
oloyalty_manage_rewardsRewards catalog, gift cards, store credit
oloyalty_manage_referralsReferrals approval, rejection, fraud review
oloyalty_view_reportsReports + liability snapshots, read-only
oloyalty_exportCSV exports of members, ledger, redemptions
22 · Liability reporting

Liability reporting

Outstanding loyalty points are a real liability on your books. The liability snapshot computes total outstanding points, multiplies by your configured value_per_point, and stores the result with a timestamp so you can chart it over time.

GET /wp-json/oloyalty/v1/reports/liability

{
  "snapshot_at": "2026-05-07T14:42:00Z",
  "members_with_balance": 22,
  "points_outstanding": 142840,
  "value_per_point": 0.01,
  "currency": "USD",
  "estimated_liability": 1428.40,
  "by_tier": {
    "bronze":   { "members": 12, "points":  4820,  "estimated":   48.20 },
    "silver":   { "members":  8, "points": 14620,  "estimated":  146.20 },
    "gold":     { "members":  4, "points": 38400,  "estimated":  384.00 },
    "platinum": { "members":  2, "points": 85000,  "estimated":  850.00 }
  }
}
ℹ️
Snapshots are written by the cron action oloyalty/liability/recalc (default daily). Override value_per_point per-snapshot via the oloyalty/liability/value_per_point filter.
23 · Comparison

vs. the loyalty landscape

FeatureWC Points & RewardsYITH Points & RewardsSmile.io (SaaS)OLoyalty
Points engine with full ledger
Member tiers with qualification rules
Gift cards (issue, schedule, void)paid add-onpaid add-onpaid add-on
Store credit balances per memberpartialpaid add-onpaid add-on
Referral program with fraud scoringpaid add-onpaid add-onpaid add-on
Campaign boosts (multipliers, win-back)paid add-onpaid add-onpartial
Liability snapshot + reportingnopartialno
HPOS + cart-checkout blocks compatible
REST API + WP-CLI surfacepartialpartialpartial Full
Native suite integration (CRM + email)nonopartial OEngage + OMailer
Audit log of every admin actionnonono
Pricing model$249/yr stack$129/yr stackSaaS · per-order$99 once
24 · Pricing

One purchase. Lifetime updates.

No tiers based on member count. No per-redemption tax. Pay once, install on the sites in your tier, get every future update free, including the v1.0 stable release.

// solo · alpha
$99
once · lifetime updates
  • 1 production WooCommerce site
  • All 13 tables
  • Full REST + WP-CLI surface
  • Email support · 48hr
// scale · alpha
$599
once · lifetime updates
  • Unlimited production sites
  • All features
  • Same-day priority support
  • Referral + campaign starter pack
  • Custom integration sprint
25 · Changelog

What's shipped

v1.0.0-alpha.1 2026-05 · Alpha release
  • Points engine with append-only ledger and balance_after on every row
  • Five seeded earn rules (order, account, review, birthday, referral)
  • Earn rule formula, multipliers, caps, exclusions all configurable
  • Tier engine with 4 default tiers and configurable qualification
  • Tier perks JSON read by points engine and rewards engine
  • Reward catalog with 9 reward types (cart, product, gift, credit, custom)
  • Single-use redemption codes (UNIQUE on oloyalty_redemptions.code)
  • Gift cards (issue, schedule delivery, redeem, void, transactions)
  • Store credit balances per member per currency
  • Referral program with per-member referral_code and fraud scoring
  • Campaign boosts (multiplier, bonus, win_back, holiday)
  • Liability snapshots with per-tier breakdown
  • Birthday bonus daily sweep cron
  • Points expiry sweep cron
  • Three shortcodes plus matching Gutenberg blocks
  • HPOS + cart-checkout blocks compatibility declared via FeaturesUtil
  • Typed event bus (OLoyalty_Events) over do_action
  • Six area capabilities
  • REST surface under oloyalty/v1 with OpenAPI spec
  • WP-CLI: 8 wp oloyalty commands
  • Audit log of every admin action
  • Suite bridges: OEngage (XP), OMailer (transactionals)
  • Suite bridges: OCart (funnel rewards), OForms (referral signup)
  • Suite bridges: OFeedback (rate-after-redeem), OIntel (analytics)
  • 13 custom DB tables, full uninstall cleanup
v1.0.0 (planned) Stable release · 2026-Q3 target
  • Visual rule builder (no-JSON earn rules)
  • WooCommerce Points & Rewards importer (round-trip safe)
  • YITH Points & Rewards importer
  • Multi-program support (different programs per brand)
  • Tier-based perks engine v2 (programmatic perk catalog)
  • Multi-currency store credit auto-conversion
  • Per-tier role assignment
  • Documentation: full PHP-Doc surface coverage
✦ Need help?

Got a question about OLoyalty?

Reach out directly. Kenneth replies within 24 hours.