Title: Pixalink Loyalty for WooCommerce
Author: pixalink
Published: <strong>November 5, 2026</strong>
Last modified: November 6, 2026

---

Search plugins

![](https://ps.w.org/pixalink-loyalty-for-woocommerce/assets/banner-772x250.png?
rev=3785104)

![](https://ps.w.org/pixalink-loyalty-for-woocommerce/assets/icon-256x256.png?rev
=3785104)

# Pixalink Loyalty for WooCommerce

 By [pixalink](https://profiles.wordpress.org/chengkangzai/)

[Download](https://downloads.wordpress.org/plugin/pixalink-loyalty-for-woocommerce.1.0.3.zip)

 * [Details](https://wordpress.org/plugins/pixalink-loyalty-for-woocommerce/#description)
 * [Reviews](https://wordpress.org/plugins/pixalink-loyalty-for-woocommerce/#reviews)
 *  [Installation](https://wordpress.org/plugins/pixalink-loyalty-for-woocommerce/#installation)
 * [Development](https://wordpress.org/plugins/pixalink-loyalty-for-woocommerce/#developers)

 [Support](https://wordpress.org/support/plugin/pixalink-loyalty-for-woocommerce/)

## Description

Pixalink is a customer loyalty platform for retail and F&B businesses. This plugin
connects a WooCommerce store to a Pixalink outlet so online orders count exactly
like in-store purchases.

 * **Earn on every order.** Paid orders are sent to Pixalink and the shopper earns
   points on the same programme as your outlets.
 * **Vouchers and points at checkout.** Verified members redeem Pixalink vouchers
   and convert points into a discount in both the Cart & Checkout blocks and the
   classic checkout.
 * **My Account › Loyalty.** Members see their balance, tier, vouchers and a QR 
   code to scan at your outlets.
 * **Phone number and marketing consent.** Checkout captures an international phone
   number and an explicit, separately recorded marketing consent.
 * **Reliable delivery.** Order events are sent to Pixalink as soon as the shopper’s
   page has loaded, and also queued on your site and retried with Action Scheduler,
   so short outages never lose an order.

The plugin is compatible with High-Performance Order Storage and the Cart & Checkout
blocks. It sends no telemetry.

A Pixalink account is required. Store owners who are not on Pixalink yet can request
access from the plugin’s Connect screen.

### External services

This plugin connects to the **Pixalink Commerce API** (`https://explore.pixalink.
io/api/commerce/v1`), operated by Pixalink, to run the loyalty programme you configure
in Pixalink. Nothing is sent until a store administrator connects the store.

What is sent, and when:

 * **When you connect the store:** your site URL, the plugin, WordPress and WooCommerce
   versions, and a one-time authorisation code. You sign in on pixalink.io; your
   Pixalink password is never entered on your site.
 * **When you choose “Request access” (stores not on Pixalink yet):** your store
   name, site URL, your name and e-mail address, the store’s country, currency, 
   time zone, language and checkout type, the plugin, WordPress, WooCommerce and
   PHP versions, and your choice in the optional Pixalink marketing box, so Pixalink’s
   team can contact you. Nothing is sent until you click the button, and you submit
   the request on pixalink.io.
 * **Periodically while connected (heartbeat, every 6 hours):** your site URL, plugin
   and WooCommerce versions, and the number of queued and failed order events. Pixalink
   answers with the features switched on for your store and your member portal’s
   name, logo, colours, address and sign-in page.
 * **When you disconnect:** a request asking Pixalink to revoke the store’s key.
 * **When an order is paid for, completed, cancelled, refunded or (unpaid) deleted:**
   the order number and key, totals, currency, line items (product name, SKU, category,
   quantity, price), coupons, shipping total, and the shopper’s name, e-mail address,
   phone number, WordPress user id (if logged in) and marketing-consent choice with
   its time and the hash of the consent text shown.
 * **When an administrator sends a test ping from the settings:** an empty test 
   event.
 * **When a shopper verifies their phone number (My Account › Loyalty):** the phone
   number to look the member up; if Pixalink has no member with it, the shopper’s
   WordPress user id, name, e-mail address, phone number and country, and their 
   recorded marketing choice, to create one. Pixalink then sends a one-time code
   by WhatsApp or SMS, and the plugin sends the code the shopper types.
 * **When a member arrives from the Pixalink member portal (the `pixalink_sso` link):**
   the single-use sign-in ticket in the link and, if they are logged in to a customer
   account, their WordPress user id (never the id of a staff account: editors, shop
   managers and administrators are never linked to a member). Pixalink answers with
   the member’s id, phone number, name and e-mail address, which the plugin uses
   to sign the member in or create their customer account.
 * **When a verified member clicks a portal button:** their Pixalink customer id,
   WordPress user id and the page to open; Pixalink answers with a one-time sign-
   in link, which the browser is sent to at once.
 * **When a shopper presses Sign in with the member portal:** the browser goes to
   the Pixalink portal with the store page to return to and a random check value;
   Pixalink sends back a one-time sign-in ticket. The store then redeems that ticket
   with the check value as described for the `pixalink_sso` link above.
 * **When Pixalink offers OAuth sign-in to your store (after a heartbeat):** your
   store’s sign-in return address (`/?pixalink_oauth=callback` on your site), to
   register the store’s sign-in client; Pixalink answers with the client’s id and
   secret.
 * **When a shopper presses Sign in with the member portal or Verify with WhatsApp
   and OAuth is offered:** the browser goes to the Pixalink portal with the store’s
   client id, its return address, the requested permissions (`profile store:link`),
   a random check value and a PKCE challenge. When the member comes back, the store
   sends the one-time code, its return address and the PKCE verifier to Pixalink’s
   token address with the client id and secret, then sends the access token it receives
   and, if the shopper is logged in to a customer account, their WordPress user 
   id. Pixalink answers with the member’s id, phone number, name and e-mail address,
   as for the `pixalink_sso` link above, and revokes the token.
 * **When a verified member views My Account › Loyalty, the My Account dashboard
   or the loyalty shortcodes:** their Pixalink customer id, to show points, credits,
   tier, vouchers, memberships, recent activity and the member QR code (drawn in
   the browser; no image service is used).
 * **When a shopper changes their loyalty phone number or marketing choice (checkout,
   registration, Account details) or links their account:** a customer update with
   their WordPress user id, Pixalink customer id, phone number and country, e-mail
   address, name and marketing choice with its time, where it was given and the 
   hash of the wording shown.
 * **When a verified member opens checkout or changes the rewards they use:** their
   Pixalink customer id and the cart contents needed to price vouchers, points and
   credits (product names, SKUs, categories, quantities and prices, store discounts,
   shipping and tax totals).
 * **When a member places an order using vouchers, points or credits:** the order
   key, the cart contents and the rewards to hold for the order; when payment fails
   or an unpaid order is abandoned, a request to release them.

Pixalink also calls the store: `POST /wp-json/pixalink-loyalty/v1/webhook` receives
signed notifications (a member’s details or balance changed, a voucher was issued)
so cached balances refresh and a withdrawn marketing consent is recorded. Requests
are verified with the same key and rejected unless correctly signed and recent.

Every request is signed with a key derived from your outlet API key. Pixalink processes
this data as your service provider under its terms.

 * Pixalink Terms and Conditions: https://pixalink.io/terms
 * Pixalink Privacy Policy: https://pixalink.io/privacy-policy

The member QR code is drawn with [qrcode-generator](https://github.com/kazuhikoarase/qrcode-generator)
by Kazuhiko Arase (MIT License, see `assets/js/THIRD-PARTY-LICENSES.txt`), bundled
in the plugin.

Self-hosted builds downloaded from the plugin’s GitHub releases (not the WordPress.
org version) also check GitHub (`https://api.github.com`, repository Pixalink-MY/
pixalink-woocommerce-plugin) for plugin updates about twice a day, and download 
an update from GitHub when one is installed. Each check is a standard WordPress 
HTTP request, which carries the site URL in its User-Agent. GitHub Privacy Statement:
https://docs.github.com/site-policy/privacy-policies/github-general-privacy-statement

## Screenshots

[⌊My Account › Loyalty: the member card with points, tier and progress to the next
tier, vouchers ready to use at checkout, and recent activity.⌉⌊My Account › Loyalty:
the member card with points, tier and progress to the next tier, vouchers ready 
to use at checkout, and recent activity.⌉[

My Account › Loyalty: the member card with points, tier and progress to the next
tier, vouchers ready to use at checkout, and recent activity.

[⌊Checkout: members apply a voucher in the order summary, see the discount, and 
see the points the order will earn.⌉⌊Checkout: members apply a voucher in the order
summary, see the discount, and see the points the order will earn.⌉[

Checkout: members apply a voucher in the order summary, see the discount, and see
the points the order will earn.

[⌊The member card on the My Account dashboard.⌉⌊The member card on the My Account
dashboard.⌉[

The member card on the My Account dashboard.

[⌊WooCommerce › Settings › Pixalink Loyalty: the connection to Pixalink and its 
health.⌉⌊WooCommerce › Settings › Pixalink Loyalty: the connection to Pixalink and
its health.⌉[

WooCommerce › Settings › Pixalink Loyalty: the connection to Pixalink and its health.

## Installation

 1. Install and activate WooCommerce.
 2. Upload the plugin and activate it through **Plugins**.
 3. Open **WooCommerce › Settings › Pixalink Loyalty** and choose **Connect to Pixalink**.
    Sign in with your Pixalink vendor account and pick the outlet that represents your
    online store.

Advanced: the outlet API key can be set in `wp-config.php` with `define( 'PIXALINK_LOYALTY_API_KEY','...');`,
which overrides the key stored by the Connect screen.

## FAQ

### Do shoppers need a Pixalink account?

No. Guests earn points with the phone number they enter at checkout. Shoppers who
want to spend points or vouchers verify their phone number once with a one-time 
code.

### Do shoppers need a code to verify?

Not if your member portal can sign them in. Logged-in shoppers who have not verified
yet see **Verify with WhatsApp** on My Account › Loyalty and on the dashboard card.
It takes them to your Pixalink member portal, which confirms their number the way
your portal normally signs members in (for example by sending a WhatsApp message
to Pixalink), and brings them straight back to the Loyalty tab with their membership
linked. If their browser is already signed in to the portal, they only confirm it
is them. Shoppers can still choose **Or get a code by WhatsApp or SMS** instead.
The button shows once Pixalink offers secure portal sign-in (OAuth) to your store,
while **Sign in from Customer Portal** is on and your store is connected; it never
shows to staff accounts or to accounts that are already linked, and it never switches
an account that is linked to another member. The checkout’s “Verify now” link opens
the same Loyalty tab.

### What happens if Pixalink is unreachable?

Checkout keeps working. Order events are normally sent right after the page that
created them has loaded; when Pixalink cannot be reached they wait in a queue on
your site and are retried automatically. Redemptions are only offered while Pixalink
confirms them.

### Which phone number earns the points?

The mobile number entered in the “Mobile number for loyalty points” field at checkout(
also on the registration and Account details forms). It is stored in international
format, so 012-345 6789 in Malaysia becomes +60123456789. Once a member verifies
a number, forms never overwrite it; they verify a new number on the Loyalty tab 
instead.

### Is the marketing box ever ticked for the shopper?

No. It starts unticked at checkout and registration, and an unticked box records
nothing. Under Account details it shows the shopper’s saved choice so they can withdraw
at any time. The exact wording shown is recorded (as a hash) with every answer.

### Can I still create my own coupons whose code starts with “PXL-“?

No. Coupon codes starting with `PXL-` (any case) are reserved for Pixalink: vouchers
appear at checkout as `PXL-` coupons, and points and credits as `pxl-points` and`
pxl-credits`. A store coupon with such a code is ignored while the plugin is active.

### How do points and credits discounts work with tax?

Like any WooCommerce fixed cart coupon: in a store whose prices exclude tax, the
discount comes off the price before tax, so the order total falls by the discount
plus its tax. Credits are applied as a discount, so the part of an order paid with
credits does not earn points.

### What does the loyalty card on the My Account dashboard show?

Verified members see their points balance, the next points to expire, their tier
and progress to the next one, and how many vouchers they can use in your online 
store, with a link to the Loyalty tab for the details. Shoppers who have not verified
their phone number see one line that takes them to the Loyalty tab to do so. If 
your store is not connected or Pixalink cannot be reached, the card is simply left
out. Turn it off under **WooCommerce › Settings › Pixalink Loyalty › My Account ›
Dashboard summary** (it also disappears when the Loyalty tab is off). Themes can
override it by copying `templates/myaccount/dashboard-card.php` to `yourtheme/pixalink-
loyalty/myaccount/dashboard-card.php`.

### What does “Match your member portal” do?

With it on (the default), My Account (the Loyalty tab, the dashboard card and the
phone verification form) and the loyalty panel in both checkouts use the logo and
colours of your Pixalink member portal, so members see one brand in your store and
in the portal. Turn it off under **WooCommerce › Settings › Pixalink Loyalty › My
Account › Match your member portal** to use your theme’s colours instead; the layout
stays the same. The colours arrive with the six-hourly connection check, so a change
in Pixalink shows up within a few hours.

Theme developers can override the colours with CSS custom properties on the plugin’s
own wrappers (`.pixalink-loyalty-account`, `.pixalink-loyalty-dashboard-card`, `.
pixalink-loyalty-link` and `.pixalink-loyalty-panel`): `--pxl-primary` (brand fill:
member card, buttons, points slider), `--pxl-on-primary` (text on the brand fill),`--
pxl-ink` (brand colour as text on white), `--pxl-accent` (tints only) and `--pxl-
tier` (the member’s tier colour). While the portal colours are in use the wrappers
also carry the `is-branded` class.

### Do members have to sign in again to open the member portal?

No. For a member who verified their phone number, “View all rewards”, “Full points
history”, “Credits” and “Open member portal” open the Pixalink member portal already
signed in. The link is created by Pixalink at the moment of the click, works once
for 60 seconds, is never shown in the page or stored, and the redirect asks the 
browser not to pass the store’s address on. If Pixalink cannot be reached, the member
gets the portal’s normal sign-in page instead. Shoppers who have not verified their
phone number get the portal’s normal sign-in page. A portal button clicked after
the shopper’s store session ended takes them to your store’s login form first, and
back to the Loyalty tab once they are logged in.

### How does “Sign in from Customer Portal” work?

Logged-out shoppers see an “or” line and a **Sign in from Customer Portal** button
under the login form on My Account and in the classic checkout’s “Returning customer?”
form (the Checkout block has no login form, so it does not show there). With “Match
your member portal” on, the button uses your portal’s logo and colours; otherwise
it takes your theme’s text colour.

When a member presses it, they go to your Pixalink member portal. If they are not
signed in there yet, they sign in (or join) the way they always do. The portal then
sends them straight back to the page they started on, signed in to your store.

A member who has no account in your store gets one automatically, even if you have
turned shop registration off, as long as Pixalink has an e-mail address for them.
Without an e-mail address they stay a guest for that visit and still earn points
on their order. An existing store account with the same e-mail address is never 
taken over: the member is asked to log in to it with their password. Staff accounts(
editors, shop managers, administrators) are never signed in this way.

The button only works in the browser that pressed it: the store keeps a random check
value in a short-lived cookie and only accepts the sign-in when the value comes 
back with it. Where Pixalink offers it, the round trip uses OAuth 2.1 (authorization
code with PKCE): the store registers its own sign-in client with Pixalink automatically
and keeps its secret encrypted, and no sign-in token is stored. The button appears
once the connection check has received the portal’s sign-in details from Pixalink.
To turn it off, untick **WooCommerce › Settings › Pixalink Loyalty › My Account ›
Sign in with your member portal**. Themes can override it by copying `templates/
global/portal-sign-in.php` to `yourtheme/pixalink-loyalty/global/portal-sign-in.
php`, and restyle it with `--pxl-primary`, `--pxl-on-primary` and `--pxl-ink` on`.
pixalink-loyalty-sign-in`.

### Does uninstalling delete my data?

Only if you enable **Delete all data on uninstall** in the plugin settings. Order
notes and order meta stay with your orders either way.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Pixalink Loyalty for WooCommerce” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ pixalink ](https://profiles.wordpress.org/chengkangzai/)
 *   [ Pixalink ](https://profiles.wordpress.org/pixalink/)

[Translate “Pixalink Loyalty for WooCommerce” into your language.](https://translate.wordpress.org/projects/wp-plugins/pixalink-loyalty-for-woocommerce)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/pixalink-loyalty-for-woocommerce/),
check out the [SVN repository](https://plugins.svn.wordpress.org/pixalink-loyalty-for-woocommerce/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/pixalink-loyalty-for-woocommerce/)
by [RSS](https://plugins.trac.wordpress.org/log/pixalink-loyalty-for-woocommerce/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.3

 * Members can verify with WhatsApp: “Verify with WhatsApp” on My Account › Loyalty
   sends them to your member portal and back, linked. Sign in from Customer Portal
   now uses OAuth 2.1 when your Pixalink account has it turned on.
 * The one-time code by WhatsApp or SMS stays available.

#### 1.0.2

 * Settings now show the right organisation after the store’s outlet API key is 
   changed to another merchant’s outlet.

#### 1.0.1

 * Security: loyalty output from shortcodes, My Account and checkout is escaped 
   with an explicit allow-list, including theme template overrides.
 * Security: the phone and marketing-consent fields on registration and Account 
   details are only saved when the form’s nonce verifies.
 * The “connect your store” reminder now shows only on the Plugins screen.

#### 1.0.0

First public release.

 * Foundation: requirements checks, HPOS and Cart & Checkout blocks compatibility,
   encrypted credential storage, signed API client.
 * Connect screen under WooCommerce › Settings › Pixalink Loyalty: connect with 
   your Pixalink sign-in or an outlet API key, request access, test and disconnect;
   connection heartbeat and admin notices.
 * Phone number (international format) and a separate, unticked marketing-consent
   box at checkout (blocks and classic), registration and Account details.
 * My Account › Loyalty: phone verification with a one-time code, points, credits,
   tier, vouchers, memberships, activity and a member QR code; `[pixalink_loyalty_summary]`
   and `[pixalink_loyalty_qr]` shortcodes.
 * Sign-in from the Pixalink member portal, signed webhooks from Pixalink, and personal
   data export and erasure.
 * Checkout: members use Pixalink vouchers, points and credits in the Checkout block
   and the classic checkout; they are held when the order is placed and released
   if payment fails or the order is cancelled or abandoned.
 * Staff accounts (editors, shop managers, administrators) are never linked to a
   Pixalink member: a portal link opened while signed in as staff links nothing 
   and says so, and the Loyalty tab explains it instead of offering the phone code.
 * Members the portal recognises but who have no account on the store (or cannot
   get one automatically) are told they will earn points on this visit, and how 
   to create an account where the store allows it.
 * My Account and checkout match the member portal’s logo and colours (“Match your
   member portal”, on by default); the Loyalty tab and dashboard card show a member
   card, and portal buttons open the member portal already signed in.
 * “Sign in from Customer Portal” on the My Account and classic checkout login forms:
   members sign in through the portal and come back signed in, with a store account
   created for them when they have none (“Sign in from Customer Portal” setting,
   on by default).
 * When Pixalink pauses a store, points and vouchers switch off and the store admin
   is told why; orders placed meanwhile are kept and sent to Pixalink automatically
   once the store is turned back on.
 * Order updates reach Pixalink right after the checkout or order screen has loaded
   instead of waiting for WordPress background tasks, so members see their points
   at once on quiet stores; the event delivery panel warns when an update has waited
   more than 5 minutes.

## Meta

 *  Version **1.0.3**
 *  Last updated **2 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 7.0 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [Loyalty](https://wordpress.org/plugins/tags/loyalty/)[membership](https://wordpress.org/plugins/tags/membership/)
   [points](https://wordpress.org/plugins/tags/points/)[Rewards](https://wordpress.org/plugins/tags/rewards/)
   [vouchers](https://wordpress.org/plugins/tags/vouchers/)
 *  [Advanced View](https://wordpress.org/plugins/pixalink-loyalty-for-woocommerce/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/pixalink-loyalty-for-woocommerce/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/pixalink-loyalty-for-woocommerce/reviews/)

## Contributors

 *   [ pixalink ](https://profiles.wordpress.org/chengkangzai/)
 *   [ Pixalink ](https://profiles.wordpress.org/pixalink/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/pixalink-loyalty-for-woocommerce/)