Additional API features, improvements and fixes that shipped to production in mid April 2026, on top of the earlier late March 2026 release.
Added phone-number verification via SMS one-time passcode (OTP) during user signup and phone-number change, controlled by a chain-level setting.
Added a reward object to the interact-campaign response when a reward is issued, so clients can display the reward that was won (for example in scratch-card-style flows).
Added content pages to the Resources API via the /resources/content_pages resource, including filtering by name, a parent link for page hierarchy, and display_name, order and active/inactive support.
Changed add-product and add-product-variant (and the related product and product-variant importer scripts) so that price is now optional; products and variants can be created without a price where one is not yet known.
Fixed a case where email-marketing-consent state from Shopify customer payloads was not recognised consistently across webhook and GraphQL shapes, which could leave subscribed customers stored as unsubscribed.
Fixed basket-campaign distribution when a basket_fixed rule is not set, so distribution totals are calculated correctly for these campaigns.
Fixed a case where a campaign with only spend assignments would incorrectly allow every basket item to qualify for the reward when no items matched the spend assignments.
Additional API features, improvements and fixes that shipped to production in late March 2026, on top of the earlier mid-March 2026 release.
Added a new composable campaign type that combines configurable reward-handling behaviour (independent or random_draw, for example competition-draw rewards), reward methods with their own restrictions, usage limits and usage costs, and voucher-style rewards. Composable campaigns can also be triggered via interact-campaign for scratch-card-style flows.
Added a rewards_handling_behaviour field (independent/random_draw) on composable campaigns.
Added a usage_cost restriction on composable campaigns so that a wallet balance is deducted per interaction.
Added usage_limit and selection fields on reward methods, including competition-style random-draw weighting.
Added reward-method-level restrictions (currency, business, basket_item) so that spend-context restrictions can be applied directly to a reward method.
Added an honour_voucher reward-method type with honour_code configuration.
Added member-number-range fields to chain endpoint responses.
Added a chain-level setting that controls how long after a user is created a referral_code can still be applied to trigger referral-campaign rewards.
Added a new auth/apply-referral-code endpoint so that an existing user can submit a referral code after signup (within the chain's configured submission window).
Added explicit is_default create and alter handling to loyalty campaigns, with the API enforcing that only one active default loyalty campaign can exist per chain.
Changed loyalty-level-change side effects so they are only triggered for the campaign that owns the progress entry, preventing duplicate side effects when a chain has multiple active loyalty campaigns.
Improved database performance for voucher and voucher-distribution reporting through additional database indexes.
Fixed min_earn_quantity handling for fixed-monetary and quantity-unit basket campaigns so that an empty min_earn_quantity no longer triggers a type error, and a submitted value of 0 is preserved rather than silently coerced to 1.
Fixed claim-basket so that campaign barcode assignments are preloaded consistently with add-basket, ensuring only items matching a campaign's barcode-assignment list qualify for rewards.
Fixed delete-voucher and expire-voucher so they no longer delete or expire a voucher that has already been redeemed (previously this could incorrectly restore wallet balance for wallet-campaign vouchers).
Additional API changes, improvements and fixes that shipped to production in mid-March 2026, on top of the earlier early March 2026 release.
Improved phone-number validation so that certain additional South African number prefixes (+27500, +27501, +27502) that were previously rejected as invalid are now accepted.
API changes, improvements and fixes that shipped to production in March 2026, on top of the earlier late February 2026 release.
Changed admin-user handling across add-user, get-user, alter-user, and delete-user so admin operations are strictly scoped to the requested chain: existing admin users can be granted permissions for an additional chain via a cross-chain upsert, duplicate adds for the same chain return user_already_exists, chain-scoped super-users can only see and alter other admins within the requested chain, and delete-user removes only the requested chain's permissions before fully deleting an account once no permissions remain.
Changed alter-user admin handling so admins cannot alter their own permission fields or login_2fa_exempt flag (self-escalation protection).
Changed chain endpoints (including alter-chain) so image_url, receipt_logo_url, and password_reset_url can be cleared by passing an empty string or null.
Improved basket campaign reward-exclusion performance by caching and reusing campaign-type information, reducing repeated campaign lookups during reward calculation on larger baskets.
Fixed a Shopify integration issue where an empty username in an alter-user request could null out the customer's Shopify email address and disable the Shopify customer account.
Additional API features, improvements and fixes that shipped to production in late February 2026, on top of the earlier February 2026 release (1.6.3).
Added support for a product unit field via add-product, returned by the product endpoint (for example g, l, or item).
Added a chain-level option to exclude rewards on basket items that have already been discounted by a basket campaign.
Added a chain-level multiplier for scaling competition win rates per chain or region.
Added a till_code field on baskets, exposed through basket and transaction documents.
Changed basket campaigns so they no longer require campaign rules; rule-free basket campaigns now qualify and apply implicitly.
Changed claim-basket so admin users and privileged-auth requests are no longer subject to the anonymous-basket claim rate limit.
Changed the product variant importer so it accepts either owner_code or product_variant_owner_code as input, and allows a blank owner code.
Changed the Resources API so mutating requests (POST, PUT, PATCH) must use a JSON object body, lookups or deletes with empty identifiers are rejected, unknown resource types fail deterministically, and singular and plural routes no longer accept each other's reserved parameters.
Changed the Resources API Business resource so business_id is no longer globally required in its OpenAPI schema.
Improved voucher redemption_count so it is normalised consistently across receipts and indexing (taking min_earn_quantity into account).
Improved database performance for user phone number lookups.
Fixed matching item threshold campaign reward distribution across multiple basket items so the correct remaining quantity is used.
Fixed get-webhooks and get-webhook so webhook secrets shorter than three characters are obfuscated correctly in API responses.
Fixed campaign responses so minimum_matching_item_value is returned as null (rather than 0) when the value is unset.
Fixed an authentication issue affecting user-wallet-ledger for user and Shopify authentication.
Fixed Stripe subscription webhook handling so the interaction result is captured and reported when a subscription interaction does not complete.
This release introduces a refreshed campaign management experience, change tracking, voucher redemption restrictions, and an improved calendar for better planning.
Campaign form overhaul
A redesigned, sectioned layout with sticky headers and smoother in-form navigation.
Clearer form sections with improved save controls.
A new "Tips & guidance" panel that shows activation tasks and links directly to relevant sections.
Targeting feature improvements
Business targeting now uses improved region/format multi-selects with clearer help text.
Store, channel, and currency targeting layouts are now more consistent and responsive.
New voucher redemption restrictions
You can now apply channel and store redemption restrictions to vouchers.
Campaign change history (BETA)
We added a new Change history tab on campaign pages.
You can now see what changed, when it changed, and who changed it.
Historical versions now include highlighted field-level differences for easier auditing.
Campaign groups
Campaign Groups now has separate List and Calendar views.
We added a new year-style calendar view, including fullscreen mode, to improve campaign planning.
We added bulk actions to Enable all campaigns and Disable all campaigns within a group, with progress feedback and activation checks.
We improved empty states and general Campaign Group navigation consistency.
Reporting
We added a new Campaign group audit report.
The report includes campaign group breakdowns by region, format, and campaign type, with CSV export support.
Other
We improved discount value display consistency across campaign lists and overviews.
We fixed a range of campaign form, barcode assignment, and navigation issues.
Additional UI and under-the-hood performance improvements were made across Campaigns and Analytics.
We have created a new integrated filter for analytics data in Console that includes the following improvements and new features:
You can now filter on store regions and formats (you can add store regions and formats in the settings in Console and then set these on the relevant stores).
You can now filter by multiple stores at a time
Channel, region, format and store filters now also work across more data types in Spaaza
Campaign reporting periods
On Campaign and Campaign Group pages the reporting periods now default to the campaign start and end date, with the option to set a custom period
Customer Personal Pricing Discounts tab
We improved the Discounts tab on Customer pages to make it easier to see a customer's redemption history for a active Personal Pricing campaigns.
Our early September release includes some small user interface improvements and bug fixes. Additional Personal Pricing campaign restrictions now also apply for select customers (these restrictions need to be activated by Spaaza Support).
1. Campaign Management Improvements
New restrictions on product and region assignments required for Personal Pricing campaigns (configuration required by Spaaza support to activate)
Improved campaign list summary messaging to highlight products assigned
Assign a campaign to a Store Group region (see below)
We added an improved search by campaign name feature
Download the Barcodes/GTINS assigned to a campaign in CSV
Improved store selector UX for assigning stores to a campaign
Set the claim status of vouchers issued for Lucky Shopper campaigns
2. Store Groups (new)
We've added a new Store Groups feature to allow you to better manage groups of stores
Store Groups can be created and managed in Settings
3. Switching between client environments
Analytics now automatically updated when you change environments (no more refresh required)
All open tabs will switch to new environment when switched in any other tab
Automatically redirected to the home page after changing environment
Our late August 2025 update brings significant improvements to task management, campaign functionality, and overall system performance. This release focuses on enhancing user experience through better navigation, improved task workflows, and refined campaign management tools.
1. Campaign Management Improvements
Campaign paging and filtering improvements
Product Assignment Management: Add and delete individual barcodes (GTINs) on a campaign
Decreased campaign page load times
Campaign Group titles can no longer be edited once the group is active
"Draft" campaigns are now referred to as "Disabled" (this is only a terminology change)
2. Voucher Management
New voucher detail page
Change the expiry date for a voucher
3. Enhanced Task Management
New Exports page: dedicated "Exports" section in navigation for better organization of exported reports and tasks
Dedicated page for tasks to issue vouchers to a group of customers
Dedicated page for tasks to issue wallet entries to a group of customers
Dedicated page for loyalty review tasks (via Settings)
3. Filters and tables
New predefined filters on Vouchers, Wallet Entry, Transactions and Personal Pricing tables
Use standard transaction and voucher tables and filters on customer pages
The Summer 2025 update represents one of our most significant releases to date. The core functionality in Console remains the same but this update brings major improvements to the user interface, introduces AI-powered features with Oribi, and enhances overall system performance and reliability.
We're excited to introduce Oribi, our new AI-powered data scientist that revolutionizes how you interact with your data. Oribi provides intelligent briefings and alerts with personalized insights and recommendations and enables natural language conversations for instant data queries. Talk to a member of the Spaaza team to activate Oribi.
2. New design
Console has been completely redesigned with a modern design system featuring fresh, clean aesthetics and improved typography. We've implemented responsive layouts that provide better mobile and tablet support through container-fluid layouts, ensuring a consistent experience across all devices. The navigation has been enhanced with a redesigned sidebar with improved organization for better usability.
3. Updated Dashboard and date filtering
Console's home page dashboard has been improved and the date filtering system has been redesigned with timezone support. YOu can now also set the precise times you want reported on.
4. Campaign Groups
We've introduced new campaign grouping functionality for better organization. A campaign group now needs to be created before creating campaigns. All campaigns within a group share the same start and end date and will soon also share other attributes. This makes managing member-pricing, micro-programs and other collections of campaigns much easier. Groups also have reports and summary and approval document generation features.
5.App pages
You can now create and edit new pages for your app using Console's Content Management System (CMS). This makes it easy to support initiatives like Clubs, Microprograms and Missions in Spaaza's apps. You can read more about the updates to the mobile app and content management system in the documentation.
Added - added add-note, get-notes, delete-note endpoints to manage Note objects (these endpoints are restricted to admin authentication)
Added - added get-content-pages and delete-content-page endpoints to manage content pages
Added - Added opt_in_secondary_last_modified_date to a user, which is a datetime field that records the last time opt_in_secondary date changed
Added - added non-payment error response to API to indicate when Spaaza customers are in payment default and cannot use the API
Added - it is now possible to configure an optional maximum_basket_total_value_spend in a campaign - a maximum basket total value for a reward to be redeemed in a basket
Added - it is now possible to configure an optional maximum_basket_total_value_earn in a campaign - a maximum basket total value for a reward to be earned
Added - the add-basket and get-basket-price endpoints can now override the campaign redemption grace period. By specifying a redemption grace period in a specific basket, the campaign's default grace period can be overridden
Added - the alter-chain and get-chain endpoints can now set a chain redemption grace period, which is the number of hours during which a campaign's vouchers can still be redeemed correctly after the active_date_until has passed
Added - user authentication against the Shopify API is now supported, allowing end-users to authenticate against the Shopify API using their Spaaza credentials, such as when using the Spaaza whitelabel mobile app
Added - issue a reward when a customer subscription renewal is received via a Stripe webhook
Improved — improved retry handling when making calls to external APIs such as Magento 2, Green Solutions and other providers
Improved - it is now possible to apply basket value restrictions (maximum_basket_total_value_spend and maximum_basket_total_value_earn) to matching item campaigns, allowing for more control over the redemption process
Improved - improvements in content page campaign handling
Improved - it is now possible to restrict redemption of a competition grand prize to the store in which the prize was issued
Improved - updates to IOS mobile pass wallet handling
Improved - completed Shopify API communication migration to Shopify GraphQL admin API
Improved - improvements to win distribution time algorithm for store-budgeted competition campaigns
Improved - performance improvements in competition budget checking when issuing instant win vouchers
Improved - webhook handling for Stripe subscription features
Improved - event pipeline performance improvements for wallet mutation events
Improved - locale (language) field is now synchronised between Spaaza user account and Shopify customer account, allowing for better localisation of content and campaigns
Improved - performance when user member number updates take place
Improved - issue-avoidance when processing simultaneous duplicate webhooks received from Shopify
Fixed - issues in Shopify account activation flow
Fixed - bug in matching non-product campaign assignments
Fixed - issue with missing title when creating Shopify discount code for wallet voucher
Fixed - issue with unhandled exception when no response is received from Green Solutions (formerly Garden Connect) API
Fixed - issue with voucher redemption after campaign active date has passed
Fixed - issue where wallet mutation event was not dispatched correctly when a customer used points to receive a reward
Deprecated - the user-specific notes field has been replaced by the new Note object in the add-note, get-notes and delete-note endpoints, which allows for more flexible and structured note management. The notes field will be removed from the response to the get-card endpoint in version 1.6.0.