=== NeoGrow: Loyalty Points, Rewards Program & Photo Reviews for WooCommerce ===
Contributors: mtpamir
Tags: woocommerce, loyalty program, points and rewards, photo reviews, ugc
Requires at least: 6.6
Requires Plugins: woocommerce
Tested up to: 7.1
Requires PHP: 7.4
WC requires at least: 8.0
WC tested up to: 11.0
Stable tag: 1.2.7
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Turn first-time buyers into repeat customers. Reward purchases and photo reviews with points they spend at checkout. Free, with nothing metered.

== Description ==

NeoGrow is a free WooCommerce plugin that gives customers loyalty points for buying and for leaving photo reviews, which they spend as a discount at checkout. Everything runs on your own store — no account, no subscription, nothing metered.

**NeoGrow helps a WooCommerce store sell more without cutting its prices.**

* **Get the reviews that sell.** Customers earn points for writing one, and more for adding a photo.
* **Win the second order.** A points balance waiting in the basket is a concrete reason to come back.
* **Stop competing on price.** A library of real reviews cannot be copied. A discount can be matched tomorrow morning.
* **Costs nothing at any size.** Unlimited reviews, photos and points, with no per-contact pricing.

It does that with the two things that actually move revenue: the reviews that convince a stranger to place a first order, and the loyalty points that bring that customer back for a second one. One plugin owns both, on your own store, for free.

Picture a shopper comparing your product with a cheaper one somewhere else. The cheaper page has no reviews. Yours has forty, several with photographs. Most people pay the difference, because forty strangers with nothing to gain are more persuasive than any product description you could write.

That is the whole idea. Your price can be undercut tomorrow morning. Your reputation cannot be copied at all.

### What it does for your revenue

**1. It gets you the reviews that do the selling.**
Customers will happily photograph what they bought — they just need a reason to bother. NeoGrow pays them in points for a review, and pays more for one with a photo. Published research from 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 was larger on higher-priced products than on cheap ones. Reviews are worth more to you the more you charge.

**2. It gets you the second order.**
Roughly a quarter of first-time customers ever come back on their own. A points balance waiting in the basket is a concrete reason to return, and the second order is the one that matters: once a customer has ordered twice, the odds of a third rise sharply. Points are shown on the product page before the sale, and spent right in the basket — the customer enters how many to use and the discount comes off the subtotal — because a reward nobody spends buys you nothing.

**3. It stops you competing on price.**
Discounting takes margin off every order, permanently, and any competitor can match it. A library of real reviews takes effort once per product and cannot be copied. NeoGrow is how you build that library on purpose rather than hoping for it.

**4. It costs nothing to run, at any size.**
Hosted review and loyalty platforms charge by review requests sent, contacts stored, or minutes of video kept — so a good year raises your bill. NeoGrow is free and unlimited. Ten customers or ten thousand, the price is the same.

*More on the research behind this, with sources: [Why product reviews matter more than price in WooCommerce](https://neoplugin.com/blog/why-product-reviews-matter-more-than-price-in-woocommerce).*

### Why NeoGrow rather than a monthly subscription

**Nothing sits between the review and the reward.**
Elsewhere this takes two plugins wired together: one collects reviews, the other hands out points and watches for them. That join is fragile, and when it quietly breaks you find out from a customer who was promised points and never got them. NeoGrow does both jobs itself, so there is no join to break.

**You keep everything if you stop.**
Reviews, photos and every point balance sit in your own database. There is no account to create and no company holding a copy, so there is no month where cancelling a subscription empties your product pages. A hosted platform cannot offer this, because holding the data is what it is.

**Growing does not cost you more.**
Unlimited reviews, unlimited photo uploads, unlimited points, no per-contact pricing and no licence key. Software running on your own store has nothing to meter.

**It gives away what you meant to give away.**
Points are earned on the order subtotal, so tax and postage never inflate what you hand out. On a multi-currency store the order converts through the exchange rate that order actually used, so you are not overpaying customers in one country and underpaying them in another. Each of those is pinned by tests — and each is a bill you would otherwise pay quietly for years.

**Built for AI-first commerce — coming soon.**
Search is shifting toward answer engines that read structured data rather than pages. NeoGrow already owns the review content that matters for this; what turns it into machine-readable `Review` and `AggregateRating` markup is [NeoSEO](https://neoplugin.com/product/neoseo), a separate free plugin in development. NeoGrow does not require it and works fully without it — the two simply cover different halves of the same job.

https://youtu.be/Oq2QNXUuZS4

### Core Features

**1. Loyalty Points Engine — wins the second order**
Give customers a balance worth coming back for, and make it trivial to spend.
* **Points for Purchases:** Award points based on the amount spent (e.g., Earn 1 Point for every $1 spent).
* **Point Redemption:** Customers can redeem their points for discounts directly at the Checkout or Cart page.
* **Works in the new Cart and Checkout:** The redemption panel appears by itself in the block-based Cart and Checkout, and the order total updates live as points are applied — nothing to paste in, no workarounds. The classic checkout is covered too.
* **Points expire on their own:** Points last 6 months from the day they are earned, and the oldest ones are always spent first. Choosing your own window, or switching expiry off, is part of NeoGrow Pro.
* **My Account Integration:** Customers can track their live balance and full Transaction History inside their account dashboard.
* **Correct on Multi-Currency Stores:** Points are always calculated against your store's base currency, so the same basket earns the same points whatever currency the customer paid in, and redemption discounts are shown in the currency they are browsing. WooPayments, CURCY and FOX are supported with no configuration; other switchers connect through two documented filters. If a switcher is converting prices and NeoGrow cannot read its rate, it tells you rather than calculating quietly with the wrong one.
* **Ready for a busy store:** Fully compatible with WooCommerce's High-Performance Order Storage, so your store stays fast as orders build up.

**2. Photo Reviews — wins the first order**
The proof that convinces the next shopper, collected automatically and paid for in points rather than cash.
* **Incentivized Uploads:** Configure bonus points for photo reviews vs standard text reviews.
* **Visual Social Proof:** Display customer photos in a beautiful, native lightbox overlay on product pages.
* **Seamless Moderation:** Approve or reject reviews directly from the standard WordPress/WooCommerce comments queue.
* **Frictionless Form:** A clean "Upload Photo" button is automatically injected into your theme's existing review form.

**3. Analytics & Branding — shows you what it is earning**
* **Growth Dashboard:** See at a glance how many points you have given out, how many customers have spent, and how the photos your customers upload are performing.
* **Branding Settings:** Customize the core color palette (Primary & Success colors) to match your store's identity.
* **Audit Trail:** A global Points Log keeps a permanent record of every point movement (expiry, earn, spend, or manual adjustment).
* **Built not to slow you down:** Points are kept in the plugin's own purpose-built database tables rather than in the general-purpose ones WordPress uses for everything else, so your checkout stays fast however long your points history gets.

### Documentation
For detailed setup guides, shortcode lists, and advanced configuration, please visit our official documentation:
[NeoGrow documentation](https://neoplugin.com/docs/neogrow/)

== External services ==

This plugin does not connect to any external service during normal operation. Your store data, points ledger and review photos never leave your server.

There is exactly one optional exception:

**Deactivation feedback survey (neoplugin.com)**

When you deactivate this plugin from the Plugins screen, a short survey asks why. It is entirely optional — "Skip & Deactivate" and "Cancel" send nothing, and selecting "It's only temporary / troubleshooting" sends nothing.

If you choose to submit the survey, your answer is sent from your server to `https://neoplugin.com/neo-deactivation/receiver.php`. The request is made by your site, not by your browser.

* **Always sent when you submit:** the plugin slug, the plugin version, the reason you selected, and any free-text comment you typed.
* **Only sent if you tick the consent box** (unticked by default): your site URL, WordPress version, PHP version, WooCommerce version, whether HPOS is enabled, your active theme name, the folder names of your active plugins, your site locale, and the number of days the plugin has been installed.

No personal data about your customers, no order data and no points data are ever transmitted.

This service is provided by NeoPlugin. Terms: https://neoplugin.com/terms/ — Privacy policy: https://neoplugin.com/privacy-policy/

== Installation ==

1. Upload the plugin files to the `/wp-content/plugins/neogrow-loyalty` directory, or install through the WordPress plugins screen.
2. Activate the plugin. A notice on the Plugins screen offers the 2-minute **Setup Wizard** — click **Set up NeoGrow**.
3. Set your point values and review rewards. You can run the wizard again any time from **Marketing > NeoGrow > Guide**.
4. Navigate to **Marketing > NeoGrow** to fine-tune your configuration or design.

== Frequently Asked Questions ==

= Will this actually increase my sales? =
It works on the two moments where sales are won or lost. The first is a stranger deciding whether to trust you: research from 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 NeoGrow's job is to get those reviews written by making it worth a customer's while. The second is whether that customer ever comes back — most do not, unless they have a reason. A points balance waiting in their basket is a reason.

Nothing here is magic, and no plugin can promise a number. What it can do is make the two things that reliably drive revenue happen on purpose rather than by luck.

= Won't giving away points just cost me money? =
It is a real cost, and the right question to ask. Three things keep it in your favour. You set the earn rate yourself, so you decide what a point is worth before a single one is issued. Points are calculated on the order subtotal, so you never pay out on tax or postage. And a point only becomes a discount when the customer returns to spend it — which means the cost lands on an order you would not otherwise have had.

= How many reviews do I need before it makes a difference? =
Fewer than most people expect. The measured conversion benefit largely arrives with the first five reviews on a product, so the urgent gap to close is five rather than five hundred. Confidence keeps climbing after that, so treat five as the starting line.

= Won't a bad review hurt my sales? =
Less than a spotless page does. Purchase likelihood peaks around 4.0 to 4.7 stars and falls as a rating nears a perfect 5.0, because shoppers read flawless as edited. NeoGrow rewards a customer for writing a review, never for the rating they give, so you are never in the position of having paid for five stars.

= Where is the NeoGrow menu? =
NeoGrow lives under **Marketing > NeoGrow**, 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 `admin.php?page=neogrow` keep working either way.

= How does NeoGrow affect my site speed? =
NeoGrow is built for scale. Point calculations run against the plugin's own purpose-built database table rather than the general-purpose ones WordPress uses for everything else, so even with thousands of active customers your checkout stays quick and your server load stays low.

= Does NeoGrow work with the Cart and Checkout blocks? =
Yes. The redemption panel appears automatically in both the block-based Cart and Checkout and the classic shortcode versions, with no setup needed. Points are applied through the WooCommerce Store API, so the order totals update live without a page reload.

The [neogrow_cart_redemption] shortcode is still available if you want to place the form somewhere else, such as a custom landing page.

= Why is the redemption form hidden for some users? =
To maintain a clean and high-converting checkout experience, NeoGrow intelligently hides the redemption form if:

* The user is a Guest (not logged in).
* The user has a 0 point balance.
We believe in showing users only the actions they can actually take.

= Can I customize the look of the "Redeem" form? =
Absolutely. NeoGrow is designed to inherit your theme's styling for buttons and inputs automatically. If you need more granular control, the form is wrapped in unique CSS classes (.neogrow-redemption-wrap), allowing you to apply custom styles without editing core files.

= Points weren't awarded after a purchase! =
Please verify three things:

* Is the Order Status set to Completed? (Points are issued upon successful completion).
* Was the user logged in during checkout? (Guest checkouts cannot track point history).
* Have you saved your settings? Ensure you’ve clicked "Save" in the NeoGrow dashboard at least once to initialize the engine.

= Images aren't uploading to reviews! =
Ensure your `/wp-content/uploads/` directory is writable. Also, check that the image size doesn't exceed your server's maximum upload limit.

= Why don't my dashboard stats update immediately? =
To ensure high performance, NeoGrow caches dashboard statistics for **one hour**. Your live points data is safe; the analytics just take a moment to refresh.

= Does NeoGrow count my past reviews or orders? =
No. NeoGrow starts tracking from the moment it is activated. It is not retroactive. You can use the "Manual Adjustment" feature to reward long-time customers if needed.

= Are Shipping/Taxes included in points? =
No. Points are calculated 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 lets you change that if you would rather it did.

= What happens if I refund an order? =
Points are not adjusted automatically. Go to **Users > Edit User** to add or remove points by hand, with a reason recorded in the Points Log. Automatic adjustment on refund and cancellation is available in NeoGrow Pro.

= Do points expire? =
Yes. Points expire 6 months after they were earned. NeoGrow uses a **FIFO (First-In, First-Out)** system, so the oldest points are always spent first. Setting your own expiry window, or turning expiry off entirely, is available in NeoGrow Pro, a separate add-on.

= Can I reward customers for their birthdays? =
NeoGrow is designed to work seamlessly with **[NeoLite Birthday Bash](https://wordpress.org/plugins/birthday-bash/)**. While NeoGrow handles the points engine, Birthday Bash automates the 'Happy Birthday' rewards, creating a complete retention loop for your store.

= What is the notice above the review form? =
NeoGrow pays points for reviews, and in several markets an incentivised review programme is expected to say so — the disclosure protects you, the merchant. Since 1.2.5 a short statement sits directly above the review form: "Customers can earn points for leaving a review on this store." You can edit the wording — or switch the disclosure off with the "Show Review Disclosure" toggle — under Marketing > NeoGrow > Settings, and it only appears while review points are actually switched on — zero both review point options and it disappears.

= Is it compatible with my Theme? =
Almost certainly, and we test rather than assume. NeoGrow is run against the most-installed WooCommerce themes on WordPress.org before each release, in a real browser on a real store, checking the seven places its output has to appear: the points message on a product page, review titles and customer photos, the photo upload control, the redemption panel on the cart and at checkout, the points-earned notice after an order, and the balance card on My Account.

**As of version 1.2.2: 89 themes tested, 87 fully compatible, 0 broken.** That includes 25 themes that override WooCommerce's own templates — the case most likely to break a plugin.

Two themes are listed as partial, and in both the reason is the same: the theme itself does not render the WooCommerce output NeoGrow attaches to. There is nothing for any plugin to hook onto there.

If your theme is not on the list, that means it has not been tested yet, not that it does not work: NeoGrow renders through standard WooCommerce hooks, so any theme that fires them works. Ask and we will add yours.

= Still have questions? =
Our engineers are here to help! Please open a ticket in the WordPress.org support forum, and we’ll help you get NeoGrow running perfectly on your store.

== Screenshots ==

1. **Growth Dashboard** - Visualize your points economy and retention trends.
2. **Setup Wizard** - 2-minute onboarding to get your program live.
3. **Point Value Settings** - Define your earning and redemption rates.
4. **Review Reward Rules** - Incentivize photos with higher point rewards.
5. **Branding & Design** - Match the plugin's UI to your store's colors.
6. **Admin Settings** - Fine-tune your loyalty program configuration and global rules.
7. **Manual Points Adjustment** - Easily add or subtract points with log notes.
8. **Global Transaction Log** - Full audit trail of every point movement.
9. **Product Page Nudge** - Display potential earnings to drive conversion.
10. **Frictionless Review Form** - Integrated "Upload Photo" button in your theme.
11. **Visual Social Proof** - Customer photos displayed neatly below reviews.
12. **Photo Lightbox Overlay** - High-resolution gallery display for UGC.
13. **Customer Points Hub** - Points balance and history in "My Account".
14. **Checkout Redemption** - AJAX-powered redemption form for instant discounts.

== Changelog ==

= 1.2.7 =
* Changed: Activating NeoGrow no longer takes over your screen with the setup wizard. WooCommerce asks extensions not to redirect on activation, so a short notice on the Plugins screen now offers the wizard instead, and a "Set up" link sits beside NeoGrow on the Plugins screen until you have run it, skipped it or dismissed the notice. Stores updating from an earlier version are not asked again.
* New: Finishing the setup wizard now ends on a summary of what you set up, in money — "a $50 order earns 50 points, worth $0.50 off a later order" — with links to see it on a product page, turn on review reminders and change the design. The wizard shows which step you are on, has Back buttons, and can be run again any time from the Guide tab.
* New: Customers can now see what their points are worth before they spend them. The My Account balance reads "115 points, worth $1.15", and the redemption panel in the cart and checkout — classic and block — says "You have 115 points available, worth $1.15" with the rate beneath it ("100 points = $1.00"). Until now the value only appeared after points had been applied, so "Earn 55 points" turned out at checkout to be 55 cents. The value is shown in the currency the customer is browsing in.
* Fix: A review photo the store cannot accept no longer disappears without a word. The photo button now only offers the types the store accepts (JPG, PNG and WebP by default), and a file of the wrong type or over the size limit is refused as soon as it is chosen, with the reason, before the review is sent. A chosen photo shows its file name and a Remove button. If the server still cannot attach a photo, the customer is told on the page they return to that their review was kept without it — until now it vanished silently and the review was paid the text-review points.
* Fix: The "your order is complete" email told customers "You will earn 110 points once this order is complete" — in the very email saying it was. It now confirms the points they earned with their new balance, and carries the invitation to review what they bought, as it was always meant to.
* Fix: Saving NeoGrow's Settings or Design tab now shows "Settings saved." Until now the page reloaded looking exactly the same, with no sign the save had worked.
* Fix: On a phone, the Points History in My Account showed each value with no column name — ": 13 September 2026", ": -5". Each value is now labelled Date, Event and Points.
* New: Customers can now mark a review helpful. Each review shows how many people found it useful — "8 people found this helpful" — above a Helpful button, and clicking it again takes the vote back, so nobody is left wondering whether the first click registered. Voting needs an account: a signed-out visitor sees the same button, which takes them to sign in and returns them to the review they were reading. That is deliberate rather than a limitation. Identifying voters by cookie or IP address only stops casual repeat voting, blocks genuine customers who share an office or household connection, and would mean storing an IP for every visitor who clicks. Requiring sign-in means NeoGrow stores no IP address at all for this. You cannot vote on your own review, and the button never appears under a shop owner's reply.
* New: Customers can report a review to you. A Report link beside the Helpful button opens a small window asking why — spam or advertising, offensive or abusive, contains personal information, or not about this product — and you are emailed when a review is reported. Reporting does **not** hide the review, and no number of reports ever will: nothing is hidden automatically at any threshold. That is a deliberate refusal, not a missing feature. Automatically hiding reviews people complain about is review suppression, it is prohibited under the FTC's 2024 rule on consumer reviews, and it would let anyone bury an honest one-star review simply by reporting it. A report asks a person to look; you decide. The window says so in plain words, and so does the email. There is also no "inaccurate" or "I disagree" among the reasons, because those turn a moderation tool into a request to delete criticism.
* New: A Reported column on WooCommerce's Product Reviews screen, showing how many open reports each review has. Sort by it to bring anything needing attention to the top, follow "View review" to read it on your storefront in a new tab, then "Dismiss" once you have dealt with it — which clears the count without touching the review itself. Dismissed reports are kept as a record that something was questioned and handled. Hiding a review stays a separate, deliberate action using WooCommerce's own Unapprove, Spam and Trash controls, after reading it.
* New: One report per person per review, and at most ten reports per person per day, so a review cannot be buried under repeat complaints from one account. You are emailed once per review per day rather than once per report: a hundred people reporting the same review sends one email, while a hundred different reviews send a hundred, because that really is a hundred reviews to read.
* New: Helpful votes and review reports are included in WordPress's personal data export and erasure tools. An export tells a customer which reviews they voted on or reported and when — never who wrote them, because that is somebody else's information. Erasing a customer removes their votes and reports and corrects every count they had contributed to.
* Note for developers: the review actions bar is extensible through the new `neogrow_review_actions` filter, and the helpful tally is public API as `ReviewVotes::META_COUNT`. The extension API is now 1.4.

= 1.2.6 =
* Fix: On the Astra theme, the "Earn X points with this item!" message appeared below the Add to cart button and the product details, instead of beside the price. Astra builds the product summary its own way, so NeoGrow now also uses Astra's own position straight after the price. Every other theme is unchanged: the message was already right after the price there.
* Changed: The review reminder setting now links straight to the reminder email's own screen in WooCommerce, where you edit its subject, heading and wording, instead of only naming the menu path.
* New: NeoGrow now knows how large a photo your server will actually accept, and says so. Settings shows the limit in force under Marketing > NeoGrow > Settings, with an (i) explaining that the ceiling comes from your server's PHP configuration rather than from WordPress or NeoGrow, so you know who to ask to raise it. If NeoGrow was set to allow more than the server does, the screen now says so plainly instead of letting uploads fail silently. A new "Show this limit on the review form" option, on by default, tells customers the maximum before they choose a file.
* Performance: NeoGrow's styles now load only on the pages that use them. There was one 7.4 KB stylesheet on every page of your site; there are now two small ones. The product-page styles (review photos, the photo upload, the "Earn X points" message) load on product pages, and the loyalty styles (the points card, the redemption form, My Account) load on the cart, checkout and My Account. Your home page, shop and blog no longer load any NeoGrow CSS at all. Both are minified, to 2.2 KB and 2.6 KB.
* Performance: NeoGrow's front-end scripts are minified too, 11.2 KB down to 5.0 KB across the five of them. They already loaded only where needed. For both styles and scripts, set SCRIPT_DEBUG to true and the readable versions are served instead, so debugging is unaffected.
* Note for developers: the `neogrow-frontend` stylesheet handle is replaced by `neogrow-reviews` and `neogrow-loyalty`, with the Design colours on `neogrow-design`. `neogrow-frontend` is still registered as an alias of both, so a stylesheet that depends on it keeps working, but dequeueing it no longer removes anything — dequeue the two new handles instead. NeoGrow markup rendered outside the pages above, such as the redemption shortcode in a sidebar, loads its own stylesheet.
* Performance: Posting a review with a photo no longer makes the customer wait while WordPress builds every thumbnail size for it. The review is saved and the points are awarded straight away, and the thumbnails are generated in the background moments later. A photo taken on a phone can take several seconds to process, and until now the customer sat on a loading page for all of it. Note that for the short period before the background job finishes, the photo is displayed at its original size, so it may take a moment longer to load on the product page. Nothing about which points are awarded has changed.

= 1.2.5 =
* Fix: On a phone or a narrow window the NeoGrow admin tabs were cut off with no way to reach them — the strip had no scrollbar, so Settings, Design and Guide were simply unreachable. The tabs now scroll sideways, and the tab you are on is brought into view when the page loads, so it is never stranded off-screen. Tabs and content padding are also tighter below 782px.
* New: Nothing on the storefront said that reviews can earn points — a disclosure gap regulators in several markets care about, and one the merchant carries. A short statement now appears directly above the review form on product pages: "Customers can earn points for leaving a review on this store." The wording is editable under Marketing > NeoGrow > Settings, where a "Show Review Disclosure" toggle (on by default) can switch it off entirely, and the statement only shows while review points are actually switched on — set both review point options to zero and it disappears, because it would no longer be true. It renders on classic and block themes alike.

= 1.2.4 =
* Fix: Review titles and photos now appear on block themes using the product reviews block. Until now they only rendered through the classic reviews template, so a shopper on a block-based product page could upload a photo, earn the higher photo-review points, and never see the photo on the page — it was stored and paid for but invisible. Photo capture and points were always unaffected; this fixes the display. Add-on media (extra photos, video from NeoGrow Pro) renders on the block path too, with no Pro update needed.
* Performance: The Loyalty Points column on the Users screen now reads all balances for the page in one query instead of one query per user.
* Developer: Orders now record the earn rate that was actually applied (after the neogrow_earn_rate filter) in the _ng_earn_rate_applied order meta, so a rate multiplier's contribution stays auditable later. Also documented how neogrow_earn_rate composes with neogrow_earn_points_for_order — if your code computes points itself on that filter, multiply by the $rate it receives or you will drop any rate multiplier. Extension API stays at 1.3.

= 1.2.3 =
* Fix: The points log screen no longer reads your whole points history to draw one page of it. It was sorting every entry you had ever earned or spent on every page load, and the dashboard chart was reading the whole table too. Both now use an index. On a store with 200,000 log entries the points log went from around 740ms to under a millisecond, and the chart from 800ms to 200ms; on a small store you will not notice a difference, which is why this ships now rather than later.
* Fix: Reactivating the plugin after its files were updated while it was switched off now applies any pending database changes, rather than recording the new version and skipping them.
* Note: This release adds a database index, so the first page load after updating takes slightly longer while it is created — a moment on a typical store, a few seconds on a very large one. It happens once.

= 1.2.2 =
* Changed: "Reviews Rewarded" on the dashboard now counts approved product reviews rather than reward entries in the points log. The two disagreed: a review left by a guest, or approved while the review reward was set to zero, is live on your site earning you trust without ever having created a log entry. Your number may go up slightly, and it now matches what NeoGrow Pro reports.
* Developer: Extension API raised to 1.3. Adds ReviewEarn::points_for_review(), ReviewEarn::best_review_points(), Points::get_review_points_quote() and the neogrow_review_points_quote and neogrow_reminder_review_url filters. Reminders gain `neogrow_reminder_sent`, `neogrow_should_send_reminder` and `neogrow_reminder_email_intro`, and a context array threaded from the send call to both templates — enough for an add-on to build a follow-up sequence, targeting rules and its own copy on top. Admin tabs also accept an `order` (lower is further left; Guide & Help is pinned last) and a `callback` that renders the tab body, so an add-on can take over an existing tab instead of adding another beside it. Tabs registered without a callback still render on `neogrow_settings_tab_{slug}` exactly as before.
* Fix: The dashboard chart skipped a month. On the 29th, 30th or 31st it drew two copies of one month and left another out entirely, and the bars after the gap belonged to the wrong months. It now always shows six consecutive months, and the oldest bar counts from the first of its month rather than from partway through it.
* New: A column on the Orders screen showing when the review reminder went out, so you can answer "did my customer get this?" without opening the order.
* New: A "Send now" button in that column, for inviting one customer by hand without waiting for the schedule — and "Send again" if they say they never received it. It appears only on completed orders, never on processing or on-hold ones, and sending updates the date shown in the column. A customer who has opted out is never shown the button and cannot be sent one.
* New: Review reminder emails. NeoGrow can now email a customer a while after their order asking them to review what they bought, and the email says how many points a review is worth. Off by default — turn it on under Marketing > NeoGrow > Settings. Customers who have already reviewed everything on their order are never emailed, and every message carries a one-click opt-out.
* New: The reminder works on every supported WooCommerce version. WooCommerce 10.8 added a review request of its own; where that is switched on and actually sending, NeoGrow steps aside and simply adds the points line to WooCommerce's email rather than sending a second one. On older WooCommerce, or where that feature is off, NeoGrow sends its own.
* Fix: The points figure quoted for a review is now the larger of the text and photo rewards everywhere it appears. One place quoted the text reward only, which understated a photo review by five to one on default settings.
* Changed: Reminders are now found by a daily check rather than a job queued per order, so changing "Send after (days)" applies to orders already waiting instead of only to future ones. Switching reminders on never reaches back over orders completed before you enabled it.
* Changed: The daily reminder check now queues each email as its own background job instead of sending the whole batch itself. On a store with a slow mail server the old approach could run out of time part-way through, and because the progress marker was only saved at the end, the next day's check would start from the same place and never catch up. Each email is now independently retried, and no customer is emailed twice.
* Fix: The Orders screen no longer runs an extra database query for every row. On a page of orders from twenty different customers that was twenty queries; it is now one.
* Fix: Deactivating the plugin now clears every job it has queued. Previously the expiry batch job could be left behind in the scheduler.
* Fix: Deactivating NeoGrow no longer cancels background jobs belonging to NeoGrow Pro. Both plugins share one job queue, and NeoGrow was clearing the whole of it — which could stop a review-invitation campaign or a review import that was still running.

= 1.2.1 =
* Fix: On a variable product the "Earn X points with this item!" message showed the range for the whole product and never changed, so a product priced $20 to $200 still read "Earn 20 - 200 points" after the $200 option had been chosen. The message now updates to the points that option actually earns, and returns to the range when the selection is cleared. This works with any variation swatch plugin, because it follows WooCommerce's own variation form rather than integrating with a particular one.
* New: The order confirmation page now tells the customer about their points — "You will earn 40 points once this order is complete" before you mark the order complete, and "You earned 40 points on this order" afterwards. Previously the product page promised points and nothing ever confirmed them.
* New: The order emails WooCommerce already sends now carry the same line, so a customer whose order you complete days later is actually told when their points arrive, along with their new balance. The completed-order email also invites them to review what they bought, quoting what a review is worth. This adds a paragraph to your existing emails — NeoGrow does not send any email of its own.
* Both are shown only to logged-in customers, never on guest orders (which cannot earn), never on orders that are cancelled, failed or refunded, and never in the copies sent to you as the shop admin.
* Fix: A customer's points balance is no longer written into the page. If you use a page caching plugin and it was set to cache pages for logged-in visitors, a cached page carrying the `[neogrow_points_balance]` or `[neogrow_points]` shortcode could show one customer another customer's balance. The number is now fetched for each shopper after the page loads, so the cached page contains nobody's balance. Nothing to configure. Your My Account page was never affected, because WooCommerce already tells caches not to store it.
* New: A Site Health check under Tools > Site Health reports whether your points balances are safe from your page cache, and names the caching plugin it found.

= 1.2.0 =
* Fix: Points are now calculated on the order **subtotal**, as the documentation has always stated. Earlier versions used the order total, so tax, shipping and fees earned points too. On a store charging tax or postage this reduces what new orders award — a $50 order with $10 postage now earns 50 points rather than 60. Points already awarded are not changed. Use the `neogrow_earn_base_amount` filter to award on the order total instead, if that is what you want.
* Fix: Correct point earning and redemption on multi-currency stores. Points were previously calculated on the order total in the customer's selected currency while the earn rate is configured in the store's base currency, so a store selling in more than one currency awarded too many or too few points by the exchange rate. Orders are now converted back to the base currency (using the exchange rate recorded on the order where available) before points are calculated. Points already awarded by earlier versions are not changed.
* Fix: The redemption discount is now converted into the customer's selected currency before it is applied to the cart, so the discount shown and charged matches the rest of the cart instead of being a base-currency figure on a converted total.
* Fix: The redemption cap, the product page "Earn X points" message and the My Account earn-rate text now convert between the selected and base currency, so the numbers quoted match the points actually awarded.
* New: If a currency switcher is converting your prices and NeoGrow cannot read the rate it is using, an admin notice now says so, rather than letting points be silently miscalculated. It names the currency, is dismissible, and disappears on its own once the rate can be read.
* New: Native support for three currency switchers, with no configuration needed: the multi-currency built into **WooPayments**, **CURCY (Multi Currency for WooCommerce)** and **FOX – Currency Switcher Professional** (formerly WOOCS). Other switchers can integrate through the new `neogrow_currency_rate` and `neogrow_order_exchange_rate` filters; with no switcher active, behaviour is unchanged.
* Changed: NeoGrow now lives under **Marketing > NeoGrow** (or WooCommerce > NeoGrow when the Marketing menu is disabled), following the WooCommerce navigation guidelines, instead of adding its own top-level menu. All existing links and bookmarks to the page keep working.
* New: The Plugins screen now offers both a Dashboard and a Settings link for NeoGrow.
* Changed: The read-only "Points Expiry (Months)" row has been removed from the settings screen. Point expiry is unchanged — points still expire after 6 months on a FIFO basis; the plugin simply no longer displays a setting that could not be edited. The NeoGrow Pro add-on provides the configurable expiry window.
* Changed: Reworded parts of the plugin description and FAQ.
* Compatibility: Tested up to WordPress 7.1.

= 1.1.0 =
* New: Native support for the WooCommerce Cart and Checkout blocks. The redemption panel now appears automatically in both blocks and updates order totals live through the Store API. The old workaround of pasting a shortcode into a Shortcode block is no longer needed, and the notice asking you to do so has been removed.
* New: In the Cart and Checkout blocks the redemption panel now sits directly above the "Add coupons" row, so points are applied alongside coupons and before shipping, tax and the order total are worked out.
* New: The panel now states the discount your points are worth, for example "You are using 200 points for a $2.00 discount", formatted in your store's currency.
* New: Two filters for add-ons, neogrow_review_media_ids and neogrow_review_media_html, allowing the media shown with a review to be extended or replaced.
* New: A documented developer API of hooks and filters, plus the NeoGrow\API\Points class, so add-ons can extend earning, redemption, reviews, expiry and the admin screens. See the plugin's HookDocs reference.
* New: You can rename "points" to anything you like from a single filter.
* Security: Review photo uploads now require a logged-in user and are restricted to product reviews. The temporary upload permission granted during an upload is scoped to the review author instead of being granted site-wide.
* Fix: Points are no longer over-deducted when the redeemed amount exceeds the cart value. The points debited now always match the discount actually granted, and the balance is re-checked at the moment of purchase.
* Fix: Resolved a fatal error on PHP 7.4 caused by a PHP 8.0-only function on the settings screen.
* Fix: Resolved a fatal error when cart totals are calculated without a customer session (Store API, cron and WP-CLI).
* Fix: The points balance cache now uses a dedicated cache group, preventing collisions with other plugins.
* Fix: Applying no points, or fewer than a required minimum, no longer reports "Applied" on the classic cart and then quietly leaves the discount off. Both are now refused with an explanation, matching how the Cart and Checkout blocks already behaved.
* Fix: Database updates now run on any request rather than only inside wp-admin, so stores administered entirely over WP-CLI or a headless front end are no longer left on an older database version.
* Tweak: The redemption form now shows a message when the requested points cannot be applied, and caps the input at the redeemable amount.
* Tweak: Removed the 500-point seed previously granted to the administrator who activated the plugin. Existing balances are unaffected.
* Tweak: Database tables are now versioned so that future schema changes reach existing installations, and uninstalling now cleans up review photos, review meta and per-site data on multisite.
* Performance: The daily expiry job is now batched instead of loading every customer at once, and the review photo lookup no longer runs one query per review on product pages.

= 1.0.4 =
* Enhancement: Dynamic Admin Colors. settings page now adapts dynamically to match the active WordPress user's selected "Administration Color Scheme".
* UI: Implemented neo-unified-table striped layouts for both the Loyalty & Rewards Settings page and Design Customization page.
* Compatibility: Fully tested and declared compatible with WordPress 7.0.

= 1.0.3 =
* New: Dynamic strategy preview in settings (Real-time ROI calculation).
* Enhancement: Added decimal support for points-per-dollar ratios.
* Stability: Improved input sanitization to prevent calculation errors.

= 1.0.2 =
* Fix: Resolved undefined variable warnings in Frontend Assets.
* New: Added FAQ to documentation.
* Tweak: Optimized asset loading logic.

= 1.0.1 =
* Added 500 bonus points for admin users upon first-time installation.
* Improved WooCommerce Blocks compatibility (Cart and Checkout support).
* Added Official Documentation links in the Guide & Help dashboard.
* Fixed minor UI layout issues in the settings panel.

= 1.0.0 =
* Initial Release.
* Loyalty Points Engine (FIFO Expiry).
* Viral Photo Reviews & Lightbox Display.
* Full HPOS (High-Performance Order Storage) Compatibility.
* Custom Database Table architecture.
* Integrated Setup Wizard.

== Upgrade Notice ==

= 1.2.7 =
Adds helpful votes and a Report link to your product reviews, and fixes the order-complete email so it confirms the points a customer earned. Two new database tables, for votes and reports, are created on the first page load after updating.

= 1.2.6 =
Faster pages: NeoGrow's CSS and JavaScript are now minified and load only where they are used, and review photo thumbnails are generated in the background instead of while the customer waits. A new photo shows at full size for a few seconds until its thumbnails are ready.

= 1.2.3 =
Adds a database index that makes the points log and the dashboard chart fast on a large store. The index is created on the first page load after updating: a moment on a typical store, a few seconds on a very large one, and only once. No setting or balance changes.

= 1.2.0 =
Two corrections change how many points new orders award. Points are now calculated on the order subtotal, as documented, so tax and shipping no longer earn. Multi-currency stores were also calculating in the wrong currency. Balances are untouched. NeoGrow has moved to Marketing > NeoGrow.

= 1.1.0 =
Important security and billing fix. Review photo uploads now require a logged-in user, and points are no longer over-deducted when more points are redeemed than the cart is worth. Update as soon as possible.

= 1.0.1 =
* New: Added 500 bonus points for admin first-install. Improved WooCommerce Blocks (Cart/Checkout) compatibility.