NeoGrow Plugin Documentation

1. Introduction

1.1 Welcome to NeoGrow & Features

Welcome to NeoGrow, the ultimate Loyalty & Photo Reviews Engine designed specifically for modern, high-performance WooCommerce stores.

NeoGrow helps you abandon expensive, bloated SaaS platforms in favor of a lightweight, native solution. Our goal is to help you turn one-time buyers into loyal brand advocates by combining a robust Points Reward System with User-Generated Content (UGC) tools. It is a WooCommerce points and rewards plugin and a WooCommerce photo reviews plugin in one install, so the two halves share a single ledger.

💡 Why NeoGrow? Unlike other plugins that lock "Photo Reviews" behind a Pro paywall, NeoGrow includes Photo Reviews for FREE. We believe visual social proof is a right, not a luxury.

Everything documented here works in the free plugin unless it carries a Pro badge — those features are provided by NeoGrow Pro, a separate add-on plugin.

Core Features

Points Log
Transaction Log: Full audit trail of every point movement.
Settings
Global Settings: Configure earn rates, review rewards, and more.
NeoGrow Dashboard
NeoGrow Dashboard: Real-time analytics and loyalty health overview.
Design Customization
Design Editor: Customize colors to match your brand perfectly.

1.2 System Requirements

To ensure optimal performance, your store should meet the following requirements:

Component Requirement
WordPress Version 6.6+
WooCommerce Version 8.0+
PHP Version 7.4+ (8.0+ Recommended)
Elementor (optional) Version 3.24+ for the four NeoGrow widgets. The free version is enough; Elementor Pro is not required. Without Elementor nothing changes, and the shortcodes still work.
Documented version NeoGrow 1.2.18

1.3 What’s New in 1.2.18

Earlier: what 1.2.13 to 1.2.17 brought

Earlier: what 1.2.5 to 1.2.11 brought

Earlier: what 1.2.12 brought

Earlier: what 1.2.4 brought

Earlier: what 1.2.3 brought

Earlier: what 1.2.2 brought

Earlier: what 1.2.1 brought

Earlier: what 1.2.0 brought

Earlier: what 1.1.0 brought

Version 1.1.0 was the largest release since launch. If you are upgrading from 1.0.x, these are the changes that affect how you use the plugin:

Cart and Checkout Blocks, natively

A documented developer API

Corrections worth knowing about

💡 Performance in 1.1.0: The daily expiry job is now processed in batches instead of loading every customer at once, and the review photo lookup no longer runs one query per review on product pages.

2. Installation & Setup

2.1 How to Install NeoGrow

Getting started with NeoGrow is simple. You can install the plugin directly from your WordPress dashboard or manual ZIP upload.

Option A: Install via WordPress Dashboard (Recommended)

  1. Log in to your WordPress Admin Dashboard.
  2. Navigate to Plugins > Add New.
  3. In the search bar, type: NeoGrow.
  4. Find NeoGrow: Loyalty Points & Photo Reviews in the results.
  5. Click Install Now, then click Activate.

Option B: Manual ZIP Upload

  1. Download the neogrow-loyalty.zip file from the repository.
  2. Go to Plugins > Add New and click the Upload Plugin button at the top.
  3. Choose the .zip file from your computer and click Install Now.
  4. Once installed, click Activate Plugin.

2.2 First-Time Setup Wizard

Upon activating the plugin, you will be automatically redirected to the NeoGrow Setup Wizard. This zero-config onboarding process gets your loyalty program running in less than 2 minutes.

Setup Wizard Welcome
Step 1: Welcome - Get your loyalty program running in minutes.
Setup Point Value
Step 2: The Basics - Set your Earning and Redemption rates.
Setup Review Points
Step 3: Viral Growth - Incentivize users to upload photo reviews.

The Wizard Steps:

  1. Welcome: Click "Get Started" to begin.
  2. The Basics (Points Value):
    • Earning Rate: Define how many points a customer earns for every $1 spent (Default: 1 Point).
    • Redemption Rate: Define the value of your points (Default: 100 Points = $1 Discount).
  3. Viral Growth (Reviews):
    • Photo Points: Set the reward for uploading a photo review (Recommended: 50 Points).
    • Text Points: Set the reward for a standard text review (Default: 10 Points).

Once you click Finish & Launch 🚀, your program is live!

Missed the Wizard? If you skipped the setup wizard, you can configure all these options manually by navigating to Marketing > NeoGrow > Settings in your WordPress dashboard.

2.3 The "Classic Cart & Checkout" Setup

NeoGrow is fully compatible with both the modern WooCommerce Cart & Checkout Blocks as well as the traditional Classic Shortcode layouts. If you prefer to use the classic layout, or if your theme requires it, you can set it up in a few simple steps.

Step 1: Create the Classic Pages

  1. In your WordPress dashboard, navigate to Pages > Add New.
  2. Create a new page and give it a title (e.g., "Classic Cart").
  3. Add a Shortcode Block to the page and enter the shortcode: [woocommerce_cart].
  4. Repeat this process to create a checkout page (e.g., "Classic Checkout") using the shortcode: [woocommerce_checkout].
  5. Publish both pages.

Step 2: Assign the Pages in WooCommerce

  1. Go to WooCommerce > Settings from your WordPress dashboard.
  2. Click on the Advanced tab.
  3. Under the Page setup section, locate the dropdown menus for Cart page and Checkout page.
  4. Select the new classic pages you just created from the respective dropdowns.
  5. Scroll to the bottom and click Save changes.
💡 Note: The NeoGrow Point Redemption Form automatically shows up on the classic cart & checkout pages. There is no need for any additional setup!
⚠️ Note: If user is not logged in or if the user has no point to redeem, the redemption form will not be visible.

2.4 Block Cart and Checkout Setup

If you are using the modern Gutenberg Cart and Checkout Blocks, no setup is required. NeoGrow adds its own redemption block to both pages automatically, positioned directly above the Add coupons row.

That position is deliberate. Redeeming points is a discount, so it belongs alongside the coupon field and above every calculated line — subtotal, shipping, tax and the order total all update beneath it. A panel placed below the total would suggest points are applied to an already-final figure.

💡 No page editing needed: The panel appears on existing Cart and Checkout pages without you changing anything. It is only shown to logged-in customers who actually have a points balance, so it stays out of the way for everyone else.

Optional: Placing the Panel Somewhere Else

If you want the redemption form in a different position, you can still place it by hand with the shortcode. Use this only if the automatic position does not suit your layout — otherwise you will end up with two panels on the page.

  1. Open your Cart or Checkout page in the WordPress editor.
  2. Click on the Document Overview icon (Shift+Alt+O) on the top left of the screen (it looks like 3 vertical bars).
  3. A left panel will open, displaying all the cart or checkout block elements in a structural tree.
  4. Navigate down through the tree to find the exact, desired element where you want the point redemption form to appear.
  5. Add a new Paragraph block at that specific location.
  6. Inside the paragraph block, enter the NeoGrow shortcode: [neogrow_cart_redemption].
  7. Update the page to save your changes.
Adding Shortcode Block
Gutenberg Block: Adding the NeoGrow shortcode block manually — only needed for custom placement.

2.5 Admin Settings Configuration

NeoGrow lives under Marketing > NeoGrow in the WordPress admin menu, alongside WooCommerce's own marketing tools. If the WooCommerce Marketing menu is disabled on your site, it appears under WooCommerce > NeoGrow instead — direct links to the page work either way.

NeoGrow under the Marketing menu
Where to find it: NeoGrow sits under Marketing in the admin menu.

You can fine-tune every aspect of your loyalty program from the Marketing > NeoGrow > Settings page. Here is a breakdown of every available option:

Main Settings Panel
Main Settings Panel: Flexible configuration for any store type.
Setting Name Description & Usage
Points per $1 Spent Controls the "Earn Rate". E.g., if set to 1, a $50 order earns 50 points. Set to 0.5 to earn 1 point per $2 spent.
Redemption Value ($) per 100 Points Controls the "Burn Rate". E.g., if set to 1.00, 100 points = $1 discount.
Points for a Text Review The reward for a review without a photo (e.g., 10 points).
Points for a Photo Review The reward for a review with a photo attached (e.g., 50 points). It replaces the text reward rather than adding to it: a review earns one or the other.
Photo Size Limit Shows the largest photo your server will accept. The ceiling comes from your server’s PHP configuration, not from WordPress or NeoGrow. Tick the box to show the limit on the review form.
Show Review Disclosure On by default. Shows a short statement above the review form saying customers can earn points for reviewing. See 4.1 Configuration.
Disclosure statement The wording of that statement. Leave blank for the default. {product_name} is replaced with the product being reviewed.
Points Expiry Pro In the free plugin, points expire on a fixed 6-month schedule via FIFO logic — there is nothing to configure. With the NeoGrow Pro add-on active, a Points Expiry (Months) field appears here so you can choose any window, or set 0 to never expire points.
💡 Not sure what a setting does? Since 1.2.13, a play button beside the earn rate, the redemption value, the two review rewards, the disclosure and the review reminder settings opens a short clip showing the result on the screen a customer sees. Clips are fetched from NeoGrow’s own page on WordPress.org only when you click one, so they add nothing to the download or to a store that never opens them.

Design Customization Tab

Design Settings Tab
Design Settings: Fully customize the look and feel to match your store.

Switch to the "Design" tab to match NeoGrow to your brand:

2.6 On Your Store

Marketing > NeoGrow > On your store answers the question most merchants have in the first two minutes: what did installing this actually change? It lists every change NeoGrow makes to your storefront, using your own earn rate and prices rather than examples, and tells you whether each one is live right now.

Why the screen exists. NeoGrow changes seven things on your storefront with no configuration at all — but four of them render nothing until somebody has points. The redemption panel, the My Account balance, the order-received line and the points line in your order emails are all invisible on a shop that has not issued any points yet. That is correct behavior, not a fault, and without somewhere saying so a new store looks as though the plugin did nothing.

Each row tells you four things: what a shopper sees, whether it is live, where to change it, and a link that opens it on your own shop.

Status What it means
Live Running, and there is something to look at right now.
Live — nothing to show yet Running, but it needs data before it renders — a customer with points, or a photo review. Expected on a new store.
Off Switched off in your settings. The row links to the setting that turns it back on.

Seeing it the way a customer does

The screen can lend you a balance so the surfaces that need points appear on your real storefront — your theme, your prices, your currency — without placing an order or giving yourself points. Three settings:

Nothing is written to your points history. The balance is borrowed for the length of the preview and never recorded in the Points Log. No customer can see it — it applies only to you, and a bar at the top of every page says it is on, with a link to switch it off. It ends by itself after thirty minutes.
Points cannot actually be applied to an order while a preview is running. If you enter points and press Apply, NeoGrow refuses and says so, and no discount is added to the cart — the borrowed balance can never become money off a real order. You can click through checkout safely to see how it looks.

What might be stopping a change from showing

The same rows report anything about your particular store that changes what you should expect to see. None of these is a fault; each one changes the picture:

Where the Quick Start went. The Guide tab used to list where each feature appears. This screen does the same job with your store’s own figures and its live status, so Guide > Quick Start now points here instead. Two details live in the Guide rather than on this screen: points for an order arrive when the order is marked Completed, and points for a review are credited once you approve it.

3. Configuring Loyalty Points

This section controls the "economy" of your loyalty program. By balancing how points are earned and burned, you can protect your margins while maximizing customer retention.

3.1 Earning Rules (The "Earn" Ratio)

The Earning Ratio determines how generous your program is. It defines how many points a customer receives for every dollar (or currency unit) they spend.

⚠️ Changed in 1.2.0. Versions before 1.2.0 calculated points on the order total, so tax and shipping earned points despite the documentation saying otherwise. A $50 order with $10 postage awarded 60 points; it now awards 50. This lowers what new orders pay out on any store charging tax or postage — check your earn rate is still where you want it. Points already awarded are not recalculated.

3.2 Redemption Rules (The "Burn" Ratio)

The Redemption Rules control the value of your points during checkout. This is where you set the "Conversion Rate" and safety limits.

💡 Do not set this so tight that nobody redeems. It is tempting to protect margin by making points hard to spend, but that inverts the point of the program. McKinsey’s loyalty research found members who actually redeem spend around 25% more than members who enrolled and never did, and that programs relying on unspent points are booking a lost opportunity as a saving. A point only costs you anything when a customer returns to spend it — which means the cost lands on an order you would not otherwise have had.

3.3 Points Expiry & FIFO Logic

Creating urgency is key to retention. Points Expiry automatically removes unused points after 6 months, nudging customers to return and buy before they lose their rewards. The free plugin's window is fixed at 6 months; choosing your own window, or turning expiry off entirely, is part of Pro, which adds a Points Expiry (Months) setting (0 disables expiry).

The Points Expiry setting added by NeoGrow Pro
With NeoGrow Pro: the Points Expiry (Months) field appears in Settings, alongside the add-on's other setting groups.

NeoGrow uses a smart FIFO (First-In, First-Out) system. This means when a customer redeems points, the system automatically uses their "oldest" points first, keeping their "newest" points safe.

📚 Real-World Example: The Customer Journey

To understand how NeoGrow calculates expiry, let's look at a real customer's transaction log. In this example, the expiry is set to 6 Months.

The Transaction Log (As of Feb 9, 2026):

Date Points Status Description
2026-04-25 -63 Expired Expired unused points
2026-04-22 -120 Redeem Redeemed on Order #72
2026-04-18 +10 Safe Review Earn (1 Week ago)
2026-02-25 +50 Safe Review Earn (2 Months ago)
2025-10-25 +50 At Risk Review Earn (Exactly 6 mos)
2025-10-25 +133 At Risk Order Earn (Exactly 6 mos)

💡 The "FIFO" Story: How we calculated -63 Expired Points

The system runs an expiry check on Feb 9, 2026. The "Cut-off Date" is exactly 6 months ago: Aug 9, 2025. Any points earned before that date are at risk.

Here is the step-by-step math:

1. Identify "At Risk" Points

2. Apply Redemptions (FIFO Protection)
The customer redeemed 120 Points on Feb 6 (Event 5). NeoGrow intelligently pulls these from the "At Risk" pile first to try and save them.

3. The Final Calculation

Result: Only the 63 unused old points expire. The newer points from December and February (Event 3 & 4) are kept safe.

3.4 Multi-Currency Stores

If your store sells in a single currency, this section does not apply to you and nothing in NeoGrow behaves differently. Skip to section 4.

Everything you configure in NeoGrow — the earn rate, the redemption value of 100 points, and the Pro redemption limits — is expressed in your store’s base currency, the one set at WooCommerce > Settings > General. A currency switcher, meanwhile, converts the prices and totals your customer sees. NeoGrow keeps those two worlds apart deliberately:

Currency switcher Support
WooPayments (built-in multi-currency) Native. Detected automatically, no configuration.
CURCY — Multi Currency for WooCommerce (VillaTheme) Native, free and paid editions. Detected automatically, no configuration.
FOX — Currency Switcher Professional (formerly WOOCS) Native. Detected automatically, and its per-order rate is used where recorded.
Any other currency switcher Connect it with the neogrow_currency_rate and neogrow_order_exchange_rate filters — see 9.2 Hooks & Filters.
No switcher installed No conversion is applied anywhere. Behavior is identical to earlier versions.
💡 You will be told if something is missing. If a currency switcher is converting your prices and NeoGrow cannot read the rate it is using, an admin notice appears naming the currency — because the alternative is points that are quietly wrong by the exchange rate with nothing on screen to say so. It disappears by itself once the rate can be read, whether you switched to a supported plugin or wired up the filter. It is dismissible, and neogrow_currency_notice_enabled turns the check off entirely — useful in the one case that legitimately looks unreadable, a second currency pegged 1:1 to your base.
⚠️ Points awarded before version 1.2.0 are not recalculated. If you ran an earlier version on a multi-currency store, historical balances may reflect the old, incorrect figures. NeoGrow deliberately leaves the ledger alone rather than rewriting customer history — correcting a specific balance is a manual adjustment at Users > Edit User, which records your reason in the Points Log.
💡 Sanity check: Switch your storefront to a second currency, add one product to the cart and compare the “Earn X points” figure with the same product in your base currency. The two should match. If they do not, your switcher is not exposing a rate NeoGrow can read — wire up neogrow_currency_rate and it will.

4. Setting Up Photo Reviews (UGC)

Text reviews build trust, but Photo Reviews drive sales. NeoGrow transforms your standard WooCommerce review form into a powerful User-Generated Content (UGC) engine, allowing customers to upload real photos of your products.

💡 Why this matters: Northwestern University’s Spiegel Research Center found a product showing five reviews was 270% more likely to be purchased than the same product showing none, and that the lift is larger on higher-priced products than on cheap ones. Photographs answer the size, color and condition questions that text cannot, which is why hosted platforms charge extra to collect them. NeoGrow includes them for free, with no cap on how many you gather. The research, in full →

4.1 Configuration

Navigate to Marketing > NeoGrow > Settings to control how photos are handled:

The review disclosure statement

Paying for reviews is something regulators in several markets expect a store to say, and the obligation is the merchant’s. Since 1.2.5 a short statement sits directly above the review form on product pages: “Customers can earn points for leaving a review on this store.”

Reviews from WooCommerce’s Review Order page

WooCommerce’s own review request email links to a Review Order page that collects stars and text for every product on an order. Since 1.2.16 those reviews earn points too: NeoGrow records the order’s account holder against the review and pays them the text reward, at once when the review is approved automatically or when you approve it. Orders without an account earn nothing, since a guest has no balance for points to land in.

Uploads require a logged-in customer. Since 1.1.0 the photo upload is only offered to logged-in users and only on product reviews. Guests can still leave a text review if your store allows it, but they cannot attach a photo. The temporary upload permission granted during an upload is scoped to the review author rather than the whole site.
💡 Changing the accepted file types or size limit: both are filterable — see neogrow_review_upload_allowed_mimes and neogrow_review_upload_max_bytes in 9.2 Hooks & Filters.

4.2 The Moderation Workflow

We highly suggest moderating all comments and reviews to maintain site quality. When a review is moderated, NeoGrow follows a strict safety workflow to ensure points are only awarded for legitimate content:

  1. Customer Uploads: The customer attaches an image (JPG, PNG, or WebP) and submits the review.
  2. Pending Status: Points are NOT awarded immediately. The review enters the moderation queue.
  3. Admin Approval: Go to Products > Reviews in your WordPress dashboard. Since 1.2.10 the photo a customer attached shows beside their review, so you can check it without opening the review; click the thumbnail for the full picture.
  4. Instant Reward: The moment you click Approve, the points are automatically calculated and deposited into the customer's account.
⚠️ Technical Note: The largest photo a customer can upload is set by your server’s PHP configuration, not by WordPress or NeoGrow. If your server accepts 2MB uploads, that is the limit here too. Photo Size Limit in 2.5 Admin Settings shows the current figure and can display it on the review form. Supported formats: JPG, PNG, WebP.

4.3 Review Reminder Emails

Added in 1.2.2. The hardest part of collecting reviews is asking. NeoGrow can email a customer a while after their order, inviting them to review what they bought and telling them how many points that is worth.

Reminders are off by default. Nothing is emailed to anyone until you switch them on. Enabling them never reaches back over orders completed before you did — only orders completed from that point forward are considered.

Turning it on

Go to Marketing > NeoGrow > Settings and find the Review reminders section:

Setting What it does
Send review reminders Off by default. Emails customers after an order asking them to review what they bought.
Send after (days) How long to wait after the order is completed. The default is 14 days. Because reminders are found by a daily check rather than a job queued per order, changing this applies to orders already waiting, not only to future ones.

The wording and styling of the email itself are managed where every other WooCommerce email is: WooCommerce > Settings > Emails.

Who is never emailed

💡 Already using WooCommerce’s own review request? WooCommerce 10.8 added one of its own. Where it is switched on and actually sending, NeoGrow stands down rather than emailing your customer twice — it simply adds the points line to WooCommerce’s email instead. To use NeoGrow’s reminder rather than WooCommerce’s, turn off Customer review request under WooCommerce > Settings > Advanced > Features. Reviews written on the page WooCommerce’s email links to earn points too — see 4.1 Configuration.

Sending one by hand

The Orders screen carries a Review reminder column showing when the reminder went out — Sent, Sent by hand, Not sent, or Nothing to review — so you can answer “did my customer get this?” without opening the order.

The same column offers a Send now button for inviting one customer without waiting for the schedule, and Send again if they tell you they never received it. It appears only on completed orders, never on processing or on-hold ones, and a customer who has opted out is never shown the button.

💡 For developers: the reminder is built to be extended. neogrow_reminder_sent, neogrow_should_send_reminder and neogrow_reminder_email_intro — plus a context array threaded from the send call to both templates — are enough for an add-on to build a follow-up sequence, its own targeting rules and its own copy on top. See 9.2 Hooks & Filters.

4.4 Helpful Votes & Reports

Added in 1.2.7. Every published review carries a Helpful button and a Report link. Both appear by themselves; there is nothing to switch on.

Helpful votes

Review reports

💡 Privacy: votes and reports are included in WordPress’s personal data export and erasure tools (Tools > Export / Erase Personal Data). An export tells a customer which reviews they voted on or reported, never who wrote them.

5. Managing Customers & Points

NeoGrow gives you complete control over your loyalty data. Whether you need to track global performance or adjust a specific customer's balance, you have the tools to do it efficiently.

5.1 The Growth Dashboard

The NeoGrow Dashboard is your command center. Accessible from Marketing > NeoGrow, it provides a real-time health check of your loyalty program.

NeoGrow Dashboard
NeoGrow Dashboard: Real-time analytics and loyalty health overview.

5.2 Managing Individual Users

As a store admin, you often need to manually intervene—whether to reward a loyal VIP or correct a refund error. NeoGrow makes this easy.

View Customer Balances

Navigate to Users > All Users. You will see a dedicated column titled Loyalty Points that displays the current live balance for every customer.

How to Manually Adjust Points

To give "Apology Points" or fix a balance manually:

  1. Go to Users > All Users and click Edit on the specific customer.
  2. Scroll down to the NeoGrow Loyalty Points section.
  3. Locate the "Adjust Points" field.
  4. Enter the amount to change:
    • To Add: Enter a positive number (e.g., 50).
    • To Subtract: Enter a negative number (e.g., -50).
  5. (Optional) Add a Log Note (e.g., "Manual bonus for VIP support").
  6. Click Update User to save.
Manual Points Adjustment
Manual Adjustment: Easily add or subtract points from any user's profile.
💡 Pro Tip: Always add a Log Note when manually adjusting points. This note appears in the Transaction Log and helps other admins understand why the change was made.
⚠️ Note on Refunds or Cancellations: The NeoGrow free version does not automatically readjust points in the event of an order refund or cancellation. If you wish, you can manually adjust them.

5.3 The Transaction Log (Audit Trail)

Transparency is critical for trust. The Points Log allows you to audit every single point movement in your system.

Go to Marketing > NeoGrow > Points Log to access the global ledger.

Transaction Log
Transaction Log: A comprehensive, searchable history of every point movement in your system.

6. The Customer Experience (Frontend)

NeoGrow is designed to feel native to your WooCommerce store. It doesn't just sit in the background; it actively drives sales by nudging customers at every step of their journey.

6.1 Product Page: The "Earn" Nudge

On every product page, NeoGrow automatically calculates and displays the potential earnings for that specific item. This creates an immediate incentive to purchase.

Earn Points Message
Product Nudge: Automatically calculate and display potential earnings on every product page.

Where it appears

6.2 The Review Form: Frictionless Photo Uploads

Text reviews are great, but photo reviews drive higher conversions. NeoGrow empowers customers to share visual social proof effortlessly.

Review Form with Camera
Frictionless UGC: A clean "Upload Photo" button is automatically injected into your WooCommerce review form.

6.3 Visual Social Proof (The Lightbox)

Once you approve a review, it transforms into a rich piece of content on your product page.

Product Page Photo Review
Visual Proof: Approved customer photos appear seamlessly alongside their review text.
Photo Review Lightbox
Lightbox Overlay: Shoppers can admire product details in a high-resolution overlay without leaving the page.

6.4 My Account: The Loyalty Hub

Customers can track their progress in their standard WooCommerce My Account dashboard, turning your store into a gamified experience.

My Account Points History
The Loyalty Hub: Customers can track their live balance and full transaction history directly in their account dashboard.

6.5 Checkout & Redemption

The reward for their loyalty comes at checkout. NeoGrow inserts a frictionless redemption panel just before the payment section. Add NeoGrow redemption form on cart and checkout page.

Checkout Redemption Form
Seamless Redemption: Customers can easily apply their points for an instant discount directly at checkout.
💡 Pro Tip: On the block-based Cart and Checkout the panel is added for you, just above the Add coupons row — no shortcode required. If it is missing there, check that the customer is logged in and has a points balance, since the panel hides itself otherwise. See Section 2.4: Block Cart and Checkout Setup for the automatic behavior and Section 7.2 for the CSS classes used to restyle it.

6.6 Elementor & Page Builders

NeoGrow works with Elementor, free and Pro. Since 1.2.18 it adds four widgets of its own, all free, and handles Elementor Pro’s product templates by itself.

What happens automatically

On product pages built with Elementor Pro’s Theme Builder, the “Earn N points with this item!” message appears directly above the add-to-cart button, with nothing to add. Reviews, review photos and the photo upload work through Elementor Pro’s Product Data Tabs widget; the redemption panel works inside its Cart and Checkout widgets; the order-received notice works through the Checkout widget; and the balance card works inside its My Account widget. We test that layout in a real browser before each release.

The four NeoGrow widgets

Open the NeoGrow category in the Elementor panel. Every widget is fully working with Elementor’s free version, with no locked controls.

Widget What it shows Controls
Product Points The “Earn N points” message, priced and updated for variations exactly as on a standard product page. Placing it in a product template switches the automatic position above the add-to-cart button off, so it never shows twice. Product (Current product, or A specific product with a Product ID), Alignment; Style: Text color, Typography.
Product Reviews The reviews and the review form, with NeoGrow review titles, customer photos, the photo upload, and the Helpful and Report controls. Product (Current product, or A specific product with a Product ID).
Points Balance The customer’s balance, for headers, account layouts and landing pages. Text before the balance, Text after the balance (blank uses your points label), For logged-out visitors (Show nothing, Show a message, or Show a log-in link) with Message or link text, Alignment; Style: Text color and typography, Balance color and typography.
Points Redemption The “Redeem Loyalty Points” form for custom cart and checkout layouts, applying points exactly as the built-in panel does. Style: Accent color, Background. Colours otherwise follow Marketing > NeoGrow > Design.

Step by step: using the widgets

The screenshots below were taken on a store running the Hello Elementor theme, Elementor and Elementor Pro.

  1. Open a page or template in Elementor. For a product page, go to Templates > Theme Builder and edit (or add) a Single Product template. For any other page, open it with Edit with Elementor.
  2. Find the widgets. In the Elements panel, type neogrow into Search Widget, or scroll to the NeoGrow category. All four widgets are there.
The Elementor panel searched for neogrow, showing Product Points, Product Reviews, Points Balance and Points Redemption
The NeoGrow widgets in the Elementor panel. In the editor they show a 500-point sample.
  1. Drag Product Points onto a product template, wherever you want the message — here, directly under the product title. Leave Product on Current product so it follows whichever product is being viewed. Once it is placed, the automatic message above the add-to-cart button switches itself off.
An Elementor Pro Single Product template with the Product Points widget selected under the product title
Single Product template: Product Points placed under the title, set to the current product.
  1. On any other page, choose the product. On a landing page there is no product in context, so set Product to A specific product and enter its Product ID (shown when you hover a product under Products). Use Alignment and the Style tab to match your design.
Product Points widget settings: Product set to A specific product, Product ID 15, and Alignment
Product Points settings: a chosen product on a landing page.
  1. Set up Points Balance for headers or account pages: the text before and after the figure, and what logged-out visitors see — nothing, a message, or a log-in link to My Account.
Points Balance widget settings: text before and after the balance, and For logged-out visitors set to Show a log-in link
Points Balance settings, including the choice for logged-out visitors.
  1. Publish, then check the page as a customer. The editor shows samples; your store shows each customer their own figures. Points Redemption appears for logged-in customers with points and something in their cart.
A product page built with Elementor Pro showing Earn 42 - 45 points with this item under the product title
On the store: the message where the widget was placed. It narrows to one figure when the shopper picks a variation.
The Redeem Loyalty Points card from the Points Redemption widget on the cart page
Points Redemption on the cart page, placed above Elementor Pro’s Cart widget.
A landing page using all four NeoGrow widgets: balance, points for the Hoodie, the redemption card and the Hoodie's reviews
All four on one page: a landing page built with Elementor, as a logged-in customer sees it.

In the editor

The editor has no customer and often no product, so the widgets show samples: Points Balance and Points Redemption use a 500-point sample balance, labelled as a sample, and Product Points and Product Reviews show your newest product when the template has no product in context. Nothing is written to any customer’s points.

💡 Caching: NeoGrow’s widgets always render live, even if Elementor’s element cache is switched on. Elementor shows a Cache Settings option on every widget’s Advanced tab; on NeoGrow’s widgets it has no effect, so one customer’s balance or redemption form can never be served to another.

Other page builders

Divi, Bricks, Oxygen, Beaver Builder and custom themes use the shortcodes: [neogrow_product_points] for the points message, [neogrow_points_balance] for the balance, and [neogrow_cart_redemption] for the redemption form. See 9.1 Shortcodes. The automatic position above the add-to-cart button relies on WooCommerce’s own add-to-cart form, which most builders’ add-to-cart modules render; it has been tested with Elementor Pro. If the message is missing on another builder’s template, place the shortcode.

7. Design & Customization

A loyalty program should feel like a natural part of your brand, not a bolt-on. NeoGrow is built to inherit your theme's fonts and styles by default, but it also provides granular controls for you to fine-tune the appearance.

7.1 Branding Settings (No-Code)

Navigate to the Marketing > NeoGrow > Design tab. Here you can configure the core color palette that NeoGrow uses for its frontend elements without writing a single line of code.

Design Settings
Branding Controls: Match NeoGrow to your store's identity with granular color and style pickers.
Setting Effect & Usage
Primary Brand Color Controls the main interactive elements like the "Apply Points" button and key headings.
Default: WooCommerce Blue (#2271b1)
Accent / Success Color Used for positive reinforcement messages, such as the "Earn 50 Points" nudge on product pages and success notifications.
Default: Growth Green (#46b450)
Border Radius Adjusts the roundness of NeoGrow's buttons and input fields to perfectly match your theme's UI (e.g., Square vs. Rounded).
Default: 4px
💡 Pro Tip: If your changes don't appear immediately, try clearing your browser cache or your caching plugin (WP Rocket, Autoptimize, etc.).

7.2 Advanced CSS Customization

For developers or designers who need pixel-perfect control, NeoGrow wraps all elements in semantic CSS classes. You can add custom CSS to your theme's stylesheet or the WordPress Customizer > Additional CSS section.

Core CSS Classes

Cart & Checkout Block Classes

The block-based Cart and Checkout render their own redemption panel, placed directly above the Add coupons row so points are applied before any total is calculated. It has its own stable class names, which will not change between releases:

Note on specificity: many themes style all button elements (Astra, for example, repaints them as primary buttons). If a rule of yours appears to be ignored, scope it the way the plugin does — .neoplugin-block-redemption button.neoplugin-block-redemption__apply — rather than reaching for !important.

The panel already follows your Design > Border Radius setting through the --neo-border-radius custom property, so changing the radius in settings restyles the panel and its button without any CSS.

Copy-Paste CSS Snippets

Example 1: Highlight the "Earn Points" Message

/* Increase visibility with a background color */
.neogrow-product-message {
    font-size: 16px !important;
    background: #f0fdf4; /* Light Green Background */
    border: 1px solid #c6f6d5;
    padding: 12px;
    border-radius: 8px;
    margin-bottom: 15px;
}

Example 2: Style the "Upload Photo" Button

/* Make the upload button match a dark theme */
.neogrow-review-upload label.button {
    background-color: #000000 !important;
    color: #ffffff !important;
    text-transform: uppercase;
    font-weight: bold;
    letter-spacing: 1px;
}

Example 3: Restyle the Cart & Checkout block panel

/* Tint the panel and make it read as a promotion */
.neoplugin-block-redemption {
    background: #f5f3ff;      /* Light violet */
    border-color: #ddd6fe;
    padding: 24px;
}

.neoplugin-block-redemption__title {
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

/* Scoped so it beats the theme's generic button styling */
.neoplugin-block-redemption button.neoplugin-block-redemption__apply {
    background-color: #7c3aed;
    color: #ffffff;
}

/* Pull the panel tighter to the coupon row below it */
.wp-block-neogrow-points-redemption {
    margin-bottom: 8px;
}

8. Troubleshooting & FAQ

Find answers to the most common questions about NeoGrow. If you can't find what you're looking for, please visit our support forum.

8.1 Common Issues (Troubleshooting)

⚠️ Top Support Question: "Why is the Redeem Form missing?"
"I don't see the Redeem form on Checkout!"

Since 1.1.0 the panel appears automatically in both the Cart and Checkout blocks and in the classic checkout, so no manual placement is needed. If you cannot see it, the usual cause is that it has nothing to show: the panel is only rendered for a logged-in customer who has a points balance.

Still missing? Confirm you are running 1.1.0 or later, then check you are not on a heavily customized checkout template that strips WooCommerce's own hooks. If you deliberately want the form somewhere else, place [neogrow_cart_redemption] by hand as described in Section 2.4 — but remove the manual copy if the automatic panel is also showing, or you will have two.

"Why redemption form is not visible?"

If user is not logged in or if the user has no point to redeem, the redemption form will not be visible.

"Points weren't awarded after purchase!"

Please check the following:

  • Is the Order Status Completed? (Processing orders do not award points).
  • Did you initialize the database? (Go to Marketing > NeoGrow > Settings and click Save).
  • Was the user logged in? (Guest checkout does not earn points).
"Images aren't uploading to reviews!"

This is usually a server permission issue. Ensure your /wp-content/uploads/ folder is writable (755 permissions). Also, check that the file size is not larger than your server's upload_max_filesize limit.

8.2 General & Compatibility

Is NeoGrow compatible with HPOS?

Yes, 100%. NeoGrow uses custom database tables (wp_neogrow_points) instead of the legacy post-meta table. This ensures your order queries remain lightning-fast.

Will this plugin slow down my website?

No. We do not load heavy JavaScript on pages where it isn't needed (like your blog posts), and our database queries are optimized for high-volume stores.

Does it work with my Theme?

Almost certainly. NeoGrow renders through standard WooCommerce hooks, so any theme that fires them works, and we test rather than assume: 154 themes are verified so far, including the premium WoodMart theme, each checked in a real browser on the seven places NeoGrow’s output appears. Review titles and photos also render on block themes that use WooCommerce’s block-based product reviews. Every verified theme is listed on the NeoGrow theme compatibility page; a theme that is not listed has not been tested yet, which is not the same as not working.

Does NeoGrow work with Elementor?

Yes, with the free version and with Elementor Pro, and nothing needs setting up. On Elementor Pro product templates the “Earn N points” message appears above the add-to-cart button by itself, and reviews, the redemption panel, the order-received notice and the My Account balance work through Elementor Pro’s own widgets. To place things yourself, NeoGrow adds four free widgets — Product Points, Product Reviews, Points Balance and Points Redemption — in a NeoGrow category in the Elementor panel. Other builders use the shortcodes. See 6.6 Elementor & Page Builders.

Does NeoGrow work on a multi-currency store?

Yes, as of version 1.2.0. Points are always calculated against your store's base currency, using the exchange rate recorded on the order, so the same basket earns the same points whatever currency the customer paid in. Redemption converts the other way, so the discount is quoted and applied in the currency the shopper is browsing. WooPayments, CURCY (Multi Currency for WooCommerce) and FOX (Currency Switcher Professional) are all supported natively with no configuration, and other currency switchers can be connected with two documented filters. Points awarded by versions before 1.2.0 are not recalculated. See 3.4 Multi-Currency Stores.

Why don't my dashboard stats update immediately?

To keep your WordPress admin fast, NeoGrow updates the dashboard statistics (chart and cards) once every hour. Your live data is safe, it just takes a moment to reflect in the analytics view.

Does NeoGrow count my past reviews or orders?

No. NeoGrow is not retroactive.

The plugin starts tracking data and awarding points from the moment you install and activate it. It does not scan your database history to award points for past orders or count pre-existing reviews in the Growth Dashboard.

Workaround: If you want to reward long-time customers for past loyalty, you can use the "Manual Adjustment" feature (Section 5.2) to give them a starting balance of points.

8.3 Loyalty Points Logic

Are Shipping/Taxes included in points?

No. NeoGrow calculates points on the order subtotal — the value of the products themselves — so tax, shipping and fees never earn points. Sale prices are already reflected in the subtotal; coupon discounts are not, so a coupon does not reduce what a customer earns. The neogrow_earn_base_amount filter changes the base if you want different behavior.

What happens if I refund an order?

The NeoGrow free version does not automatically readjust points in the event of an order refund or cancellation. If you wish to correct the user's balance, you must manually adjust the points by navigating to Users > Edit User > Adjust Points.

Do points expire?

Yes. In the NeoGrow free version, points expire 6 months after they were earned — the window is fixed. We use a FIFO (First-In-First-Out) system, so the oldest points are always spent first. Choosing your own expiry window, or turning expiry off entirely, is available in NeoGrow Pro, a separate add-on.

8.4 Photo Reviews

When are review points awarded?

Points are awarded only after you Approve the review. You can manage and approve reviews by navigating to Products > Reviews in your WordPress dashboard.

What image formats are supported?

We support standard web formats: JPG/JPEG, PNG and WebP. The maximum file size is 5 MB. Both the accepted types and the size cap are filterable — see neogrow_review_upload_allowed_mimes and neogrow_review_upload_max_bytes in 9.2 Hooks & Filters.

8.5 How to Uninstall

We're sorry to see you go! If you wish to remove NeoGrow, please note we follow standard WordPress data procedures:

9. Developer Notes

9.1 Shortcodes

You can use these shortcodes anywhere on your site—in pages, posts, sidebar widgets, the header/footer, or even within your PHP template files (using do_shortcode()).

1. The Balance Badge

Displays the user's current points with your brand styling (Primary Color + Bold Text).

[neogrow_points_balance]

Attributes:

2. The Raw Balance

Returns only the number (integer) of points. Perfect for inline text or when you want to build your own UI around the value.

[neogrow_points]

Example usage in a sentence: "You currently have [neogrow_points] tokens in your wallet."

3. The Redemption Form

Outputs the "Redeem Points" form for use on custom Cart or Checkout pages. This is particularly useful when integrating NeoGrow with Gutenberg Block themes.

[neogrow_cart_redemption]
⚠️ Cart and checkout only — not the product page. This shortcode needs a cart to work against. Dropped onto a product page, or into a page-builder product template, it still renders — the customer is logged in and has a balance — but the cart is empty, so the maximum redeemable works out to zero and the shopper is shown a form they cannot use. It is not a way to put points on a product page.

Since 1.2.18 the form renders once per page. If a page already shows it — the built-in cart panel, or an Elementor widget — a second copy stays empty.

4. The Product Points Message

Added in 1.2.18. Places the “Earn N points with this item!” message anywhere: a product template your page builder composes, a landing page, a category description. It is the same message as on a standard product page, including the update when a shopper picks a variation.

[neogrow_product_points]

Attributes:

💡 One message, not two. The shortcode always prints where you put it, even if the automatic message has already appeared on the page. Placed in an Elementor product layout, it also switches the automatic position above the add-to-cart button off. On a standard theme, where the message already sits under the price, you rarely need it on the product page itself.

9.2 Hooks & Filters

As of 1.1.0 NeoGrow has a public, documented hook surface. Everything below is stable and intended for use by add-ons and custom code. Filters return a modified value; actions are notifications and return nothing. As of 1.2.18 the extension API is at version 2.2; add-ons should compare against NEOGROW_API_VERSION rather than the plugin version.

💡 Where to put this code: a small custom plugin, or your child theme’s functions.php. Do not edit NeoGrow’s own files — your changes would be lost on the next update.

Earning points

HookTypePurpose
neogrow_should_earn_pointsfilterWhether an order earns points at all.
neogrow_earn_points_for_orderfilterThe number of points an order earns. Runs last: if your callback computes points itself instead of adjusting the figure it receives, multiply by the $rate argument or a tier/role multiplier applied via neogrow_earn_rate is silently lost.
neogrow_earn_base_amountfilterThe monetary amount points are calculated from.
neogrow_earn_ratefilterThe earn rate (points per currency unit).
neogrow_earn_trigger_statusesfilterWhich order statuses award points.
neogrow_earn_rate_is_personalfilterReturn true if your earn rate varies per customer. The product-page message then renders the store’s figure and fetches each customer’s own after load, so a cached page never shows one customer’s rate to another. Since 1.2.9.
neogrow_customer_tierfilterA customer’s membership tier, as slug, name and multiplier. NeoGrow ships it empty; an add-on supplies it, and API\Points::get_tier() reads it. Descriptive only — pricing still goes through neogrow_earn_rate. Since 1.2.9.
neogrow_earn_log_entryfilterThe points-log text recorded for an order’s earn entry.
neogrow_points_earnedactionFires after points have been awarded for an order.

Redemption

HookTypePurpose
neogrow_redemption_allowedfilterWhether redemption is permitted for a cart.
neogrow_min_redeemable_pointsfilterThe minimum points redeemable in one go.
neogrow_max_redeemable_pointsfilterThe maximum points a user may redeem.
neogrow_redeem_ratefilterThe redemption rate.
neogrow_points_to_amountfilterThe currency discount a points amount is worth.
neogrow_redeem_discount_amountfilterThe discount written onto the cart for the points being redeemed.
neogrow_redeem_discount_labelfilterThe label shown against the loyalty discount line.
neogrow_points_redeemedactionFires after points have been redeemed against an order.
neogrow_points_reversedactionFires after an order’s points have been taken back, with the reason.

Photo reviews

HookTypePurpose
neogrow_review_should_awardfilterWhether a review earns points.
neogrow_review_pointsfilterThe points a review earns, given whether it has a photo. Must never depend on the rating: rewarding sentiment is what the FTC’s review rule prohibits.
neogrow_review_points_quotefilterThe most a review could earn, quoted before one is written (review form, reminder email). Raise it whenever you raise neogrow_review_points, or the store promises less than it pays.
neogrow_review_text_points_quotefilterThe quote for a surface where no photo can be attached, such as WooCommerce’s Review Order page. Since 1.2.16.
neogrow_review_earnings_notefilterThe line on the review form saying what a review earns. Since 1.2.8.
neogrow_review_media_idsfilterThe media attached to a review.
neogrow_review_media_htmlfilterThe markup for one review media item. Return an empty string to omit it.
neogrow_review_upload_allowed_mimesfilterThe MIME types accepted for review photos.
neogrow_review_upload_max_bytesfilterThe maximum accepted photo size, in bytes.
neogrow_review_rewardedactionFires after a review has been rewarded.
neogrow_review_media_attachedactionFires after a photo has been attached to a review.

Expiry

HookTypePurpose
neogrow_expiry_monthsfilterMonths before points expire. Default 6; NeoGrow Pro supplies its configured window here, and 0 or less disables expiry.
neogrow_expiry_batch_sizefilterHow many users are processed per expiry batch.
neogrow_expiry_amountfilterThe points about to expire for a user. Return 0 to exempt them — how a never-expire tier is built.
neogrow_before_expiry_runactionFires before an expiry batch is processed.
neogrow_points_expiredactionFires after points have expired for a user.

Currency

Two filters, added in 1.2.0, let a currency switcher NeoGrow does not detect natively tell it how to convert. Both are no-ops on a single-currency store. See 3.4 Multi-Currency Stores for the behavior they drive.

HookTypePurpose
neogrow_currency_ratefilterThe exchange rate from your base currency into a given currency code. Return a positive number; anything else is treated as unknown and no conversion is applied.
neogrow_order_exchange_ratefilterThe rate a specific order was converted at. Use this if your switcher stores its own rate on the order, so historical orders stay correct as rates move.
neogrow_currency_notice_enabledfilterWhether NeoGrow watches for a switcher it cannot read a rate for, and warns in the admin. Return false to switch the check off — for a second currency genuinely pegged 1:1 to your base, which is the one case that reads as unresolvable when it is in fact correct.

Example: connecting a third-party currency switcher

add_filter( 'neogrow_currency_rate', function ( $rate, $currency ) {
    // Return how many units of $currency one unit of your base
    // currency buys. Leave $rate untouched if you do not know.
    if ( function_exists( 'my_switcher_get_rate' ) ) {
        return (float) my_switcher_get_rate( $currency );
    }

    return $rate;
}, 10, 2 );

The ledger and balances

HookTypePurpose
neogrow_user_balancefilterA user’s points balance.
neogrow_pre_transactionfilterWhether a ledger entry may be written. Return false to block it.
neogrow_transaction_datafilterThe row about to be inserted into the ledger.
neogrow_transaction_recordedactionFires after a ledger entry has been written.

Presentation

HookTypePurpose
neogrow_points_labelfilterThe word used for points. This is how you rename them store-wide.
neogrow_points_formatfilterA rendered points amount.
neogrow_points_log_columnsfilterThe columns of the admin points log.
neogrow_points_log_column_contentfilterThe rendered content of a points log cell.

Product page

HookTypePurpose
neogrow_product_message_fallback_hooksfilterWhere the “Earn N points” message falls back to on page-builder templates that never fire the product summary, as action => priority. Default woocommerce_before_add_to_cart_form at 10; return an empty array to switch it off. Never prints inside the summary, only for the page’s own product, at most once. Since 1.2.18.

Review reminders

HookTypePurpose
neogrow_core_owns_remindersfilterWhether WooCommerce’s own review request is sending, in which case NeoGrow schedules nothing and only adds its points line to core’s email.
neogrow_should_send_reminderfilterThe targeting veto, applied on every path that sends. A vetoed order is reconsidered if the rule changes.
neogrow_reminder_review_urlfilterWhere the email links each product to. Block themes without the classic #tab-reviews anchor should set this.
neogrow_reminder_email_introfilterThe email’s opening text.
neogrow_reminder_sentactionFires after a reminder has been sent, with the outcome and context.
neogrow_send_review_reminderactionThe Action Scheduler job that sends one order’s reminder (group neogrow).
neogrow_reminder_sweepactionThe daily Action Scheduler job that finds orders due a reminder (group neogrow).
neogrow_reminder_started_atoptionWhen reminders were switched on. The sweep never looks further back, so enabling reminders does not email your order history.

Helpful votes and reports

HookTypePurpose
neogrow_review_actionsfilterExtra controls in the bar under a review, beside the Helpful button. Return escaped markup.
neogrow_review_vote_recordedactionFires after a helpful vote is recorded, with the new count.
neogrow_review_reportedactionFires after a review is reported, with the reason and the open report count.
neogrow_review_reports_dismissedactionFires after a review’s reports are dismissed.
neogrow_review_vote_redirectfilterWhere the shopper is sent back to after voting or reporting without JavaScript.

Admin and lifecycle

HookTypePurpose
neogrow_admin_capabilityfilterThe capability required to manage NeoGrow.
neogrow_settings_tabsfilterThe tabs on the NeoGrow screen. An entry accepts order and a render callback; an add-on can also replace an existing tab’s callback.
neogrow_settings_sectionsfilterThe sections on the settings screen.
neogrow_settings_fieldsfilterThe fields on the settings screen.
neogrow_settings_field_row_classesfilterCSS classes applied to a settings row.
neogrow_dashboard_metricsfilterThe dashboard summary metrics.
neogrow_before_initactionFires before any NeoGrow module is constructed.
neogrow_loadedactionFires once every module has been constructed. The right place to hook an add-on.
neogrow_db_upgradedactionFires after the database has been upgraded.

Example: renaming “points” to “credits”

add_filter( 'neogrow_points_label', function () {
    return 'Credits';
} );

Example: double points on orders over $100

add_filter( 'neogrow_earn_points_for_order', function ( $points, $order ) {
    return $order->get_subtotal() >= 100 ? $points * 2 : $points;
}, 10, 2 );

9.3 The Points API

For reading balances and writing ledger entries, use the NeoGrow\API\Points class rather than touching the database directly. It is the supported surface and handles caching, validation and logging for you. Every method was introduced in 1.1.0.

MethodReturns
get_balance( int $user_id )The balance as an integer. Zero for an unknown or logged-out user.
add( $user_id, $points, $event_type, $ref_id = 0, $note = '' )true when the ledger entry was written.
deduct( $user_id, $points, $event_type, $ref_id = 0, $note = '' )The points actually deducted. Zero when nothing was taken.
get_history( int $user_id, array $args = [] )Ledger rows. Accepts limit (default 20, max 500), offset, event_type and ref_id.
get_total_for_reference( $user_id, $ref_id, $event_type = '' )Net points for one reference. Positive when credited, negative when debited.
get_earn_rate( ?int $user_id = null )Points per currency unit, as a float.
get_redeem_rate( ?int $user_id = null )The redemption rate, as a float.
points_to_amount( int $points )The currency value of a points amount.
amount_to_points( float $amount )The points equivalent of a currency amount.
get_max_redeemable( int $user_id, ?WC_Cart $cart = null )The most the user may redeem against the given cart.

Example: award points for a referral

use NeoGrow\API\Points;

Points::add( $user_id, 250, 'referral', $referred_user_id, 'Referred a new customer' );
Use the event type consistently. $event_type is a short machine key such as referral. It is what the Points Log groups and filters by, so pick one string per reason and stay with it.
© 2026 NeoPlugin. All rights reserved.