Skip to main content

Console Mid August release

David Sevenoaks
Co-Founder

Our mid August release adds Survey campaigns, expands basket-mission and transaction-outlier reporting, and includes improvements released since our early August update.

Surveys

  • New Survey campaigns can collect first-party feedback, preferences, profile data, or consent signals, then issue a configured reward when the customer completes the survey.
  • Surveys support single choice, multiple choice, rating, NPS, short text, long text, and consent questions, including required questions and multi-page question sets.
  • Larger surveys have a searchable Questions workspace with one question editor and a live preview. Questions can also be imported from CSV and reviewed before they are added to the campaign.
  • The campaign Preview, Report, and Responses pages make it possible to review the customer experience, analyse answer shares, ratings, NPS and demographic insights, and export individual responses.
  • A new Surveys guide explains when to use surveys and how to create them.

Survey overview page with interactive preview

Survey report showing answer distribution, response shares, and demographic insights

Basket missions and transaction outliers

  • Realtime reports now include Basket missions, with views of mission mix, average basket value, shopping times, category mix, private-label share, and comparisons across stores and store formats.
  • A new Outliers report helps teams find stores with unusual transaction activity and investigate the timing, discount at stake, campaigns, products, customers, and tills involved.
  • Basket-mission and outlier information is also available in relevant customer, transaction, store, and campaign views.
  • Analytics cards now provide more plain-language explanations of what each visual shows and how to use it.
  • These Insights are switched on for your business by Spaaza. Contact Spaaza to enable Customer enrichment or Transaction outlier score.

Wallets and campaigns

  • Spend Target campaigns now appear as Spend Target Wallets in wallet creation, All wallets, and customer Wallet Entries. Their monetary progress can be reviewed and adjusted from the customer profile.
  • Composable campaigns with multiple reward methods now use a searchable Reward methods workspace, with clearer overview summaries and value-calculation choices.
  • Survey campaigns are clearly identified as Survey in campaign lists.
  • Cancelling campaign edits now asks for confirmation before unsaved changes are discarded.

Competition draws

  • Competition wallets now include a Winners page for reviewing draw results.
  • Completed draw cards show each named set and provide a direct View winners action for that set.
  • Winner results can be filtered and exported as CSV.

Other improvements

  • Report filters now reload the latest data more reliably, including when a date or another filter changes while an earlier request is still loading.
  • Resource filter libraries can now be searched by name or description and show a clear result count.
  • Entity tabs remain on one scrollable row, making pages with many sections easier to navigate on narrower screens.
  • Content and survey previews now provide desktop, laptop, and mobile sizes, with manual resizing when a custom width is needed.
  • Virtual POS inputs and scrolling have been polished for clearer use on shorter screens.
  • Numerous smaller layout and styling fixes have been made across Console.

Enjoy!

API mid August 2026 improvements (1.6.8)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in mid August 2026, on top of the earlier late July 2026 release.

  • Added survey campaigns, a composable campaign with context: "survey". The survey questions are configured on the campaign through survey_definition in add-campaign and alter-campaign, client applications fetch the definition and the shopper's completion state with GET /survey, and answers are submitted with POST /submit-survey. Completion is idempotent per shopper and campaign, issues the campaign's direct reward methods, and enforces the campaign's segment restriction on both retrieval and submission. Completed responses can be retrieved with GET /internal/get-survey-responses.
  • Added email address verification, configured per chain with the email_verification_method option (off, otp or deeplink) through alter-chain and returned by get-chain. See verifying user contact details for the full flows.
  • Added an email one-time passcode flow: otp-request and otp-verify accept an email parameter to send a six-digit passcode to a user's email address and verify it, mirroring the existing phone number flow with the same rate and attempt limits.
  • Added an email verification link flow with the new email-verify-request and email-verify endpoints, which email a signed, single-use verification link that is valid for three days.
  • Added an email_status field to the user, returned by get-user, showing whether the email address has been verified (1) or not (0). Changing a user's email address through add-user or alter-user resets email_status to unverified.
  • Added privileged authentication for the Resources API, so a service client can use a bearer access token in the X-Spaaza-Access-Token header instead of an administrator session. See authentication for the resources and operations available.
  • Added end-user (shopper) authentication for the Resources API, allowing a customer to retrieve their own data with the session credentials returned by login plus the X-Spaaza-MyPrice-App-Hostname header. GET requests are supported on the Business, Voucher and ContentPage resources, results are limited to the customer's own data and their app's chain, and properties that are only relevant to administration are omitted from the response.
  • Changed the default voucher filtering for end-user Resources API requests: GET /resources/vouchers returns only vouchers with status generated or claimed unless redeemed vouchers are requested explicitly, for example GET /resources/vouchers?status=redeemed.
  • Improved authentication handling so that a customer session is validated against the chain of the app making the request, and can no longer be used with an app belonging to a different chain.
  • Fixed purchase progress distribution so that a campaign contributing progress into a wallet or stamp card honours its own earn_on_promotional_items setting, and no longer awards progress for promotional items when that setting is false.
  • Fixed the counting of issued honour_voucher rewards against a reward method's usage_limit, so a composable campaign can no longer issue more rewards than the configured stock allows.
  • Fixed the status filter on Resources API voucher requests, so GET /resources/vouchers?status=claimed now returns the matching vouchers.
  • Fixed Shopify registration and customer synchronisation: registering with an email address that already exists in Shopify now returns the intended duplicate email error rather than a generic server error, customer lookups require an exact email address match so a similar address is never adopted, and synchronising existing Shopify customers into Spaaza no longer fails for customers without an existing programme opt-in.

Console Early August release

David Sevenoaks
Co-Founder

Our early August release adds support for stamp cards as wallets, redesigns customer profiles, and improves campaign filtering and Content Management.

Stamp cards and wallets

  • Item Count campaigns now appear as Item Count Wallets throughout Console.
  • Item Count Wallets can be used as digital stamp cards. Qualifying purchases add stamps, customers progress towards a target, and reaching the target can issue a reward.
  • Standard campaigns can issue bonus stamps into an Item Count Wallet for actions such as completing a profile or joining a promotion.
  • The wallet chooser makes it easier to find compatible active, scheduled, or completed wallets.
  • A new Stamp cards guide explains how to plan and create a stamp-card program.

Customer profiles

  • The customer Overview page has been redesigned to bring transaction activity, customer score, RFM information, channels, Favorite store, membership date, notes, and profile details into one page.
  • Purchases, Wallets, and Available vouchers now provide quick summaries with links to the complete history.
  • Wallet Entries now brings points, credit, competition, and Item Count wallets into one place, including balances, entry history, and manual adjustments.
  • The customer Discounts page now has stronger campaign filters, including campaign groups.

Campaigns and Content Management

  • Campaign lists can now be filtered by campaign group. Active groups are shown first, while More groups can be used to find scheduled or completed groups.
  • Campaign action menus now follow campaign permissions more consistently.
  • Content zones without a title are now clearly identified by their zone ID.
  • Content Management action menus and layouts have received several small consistency improvements.

Reporting and other improvements

  • Wallet and time-series charts now handle empty and zero-value data more clearly.
  • Segment links now show a clearer customer preview when you hover over them.
  • Numerous small styling and usability improvements have been made across Console.

Enjoy!

API late July 2026 improvements (1.6.8)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in late July 2026, on top of the earlier mid July 2026 release.

  • Added support for campaigns contributing progress into a stamp card. Any campaign that supports purchase progress (for example a matching_item campaign) can add stamps to an item_purchase_count campaign by setting its recipient_campaign_id to the stamp card's campaign_id and its recipient_reward_method to points. The card's reward is issued when its target_count is reached, whether the completing stamps come from the card's own qualifying items, from contributions, or from a combination of both within the same basket. Existing stamp card behaviour is unchanged.
  • Added an owner_code field to composable campaign reward methods, settable through alter-reward-method and returned by get-reward-method and get-reward-methods. It is a short label of your own choosing (maximum 64 characters) used to identify a reward method when several are listed together, and has no effect on how rewards are calculated or issued.
  • Changed the max_basket_items_considered field on the reward-method basket_item restriction so that it counts individual items rather than basket lines. A single basket line with a quantity of 3 now counts as three items, exactly as three separate quantity-1 lines would, and the same limit is applied when the reward value is distributed across the matched items.
  • Fixed the promotional state of stored basket items so that it is no longer re-derived from current product data when a basket is processed again, for example by claim-basket or a return. An item that was not on promotion when it was bought continues to earn from campaigns configured with earn_on_promotional_items set to false, even if the product has since been flagged as promotional.
  • Fixed the handling of non-boolean item_is_promotional values in add-basket. Values such as "false", "0" and 0 are now interpreted as not promotional, values such as "true" and 1 as promotional, and any unrecognised value defaults to not promotional.

Console Late July release

David Sevenoaks
Co-Founder

Our late July release gives Spaaza Console a refreshed look, adds more control over competition draws, improves Content Management, and makes team member details easier to export.

A refreshed Console

  • Console now has a more consistent look across navigation, forms, buttons, tables, filters, and pop-up windows.
  • Reporting charts and cards have been refreshed with clearer colours, labels, and spacing.
  • Success messages, warnings, and errors are now easier to see and can be dismissed.

Competition draws

  • Competition draws can now use the whole competition period or a selected date range.
  • Draws can be split into named sets, with separate numbers of winners and backups for each set.
  • Sets can be limited to a region, business format, or specific store.
  • Backups can be drawn independently or from the same store as each winner.
  • Previous winners and backups are automatically excluded from later draws for the same competition.

Campaigns and Content Management

  • Campaign dates now follow the reporting time zone selected for the business.
  • Creating or saving a campaign now shows a clear success message.
  • Rewards can now be removed from a composable campaign without preventing the campaign from being saved.
  • Mass voucher issuing now starts the correct process.
  • The Content Management page picker now shows the selected page more clearly and makes parent and child pages easier to browse.

Team members

  • The Team members page now includes Export CSV for downloading names, email addresses, and permissions.
  • Super users also see whether each team member is exempt from two-factor authentication in the export.

Other

  • Numerous small styling improvements and bug fixes.

Enjoy!

API mid July 2026 improvements (1.6.8)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in mid July 2026, on top of the earlier early July 2026 release.

  • Added a require_unique_phone_number chain option (set via alter-chain, returned by get-chain). When enabled, add-user and alter-user reject any request that would give two active accounts in the same app the same phone number, returning the new phone_number_already_exists error (code 555). When disabled (the default), duplicate phone numbers are still allowed and are only flagged via the phone_number_duplicate field. Enforcement applies to new writes only; accounts that already share a phone number are left unchanged when the option is enabled.
  • Added two value_calculation_rule options for wallet_contribution reward methods on composable campaigns, configured through alter-reward-method: fixed_value_per_basket awards the configured value once per qualifying basket, and fixed_value_per_spend awards the value for each spend_step of basket spend (using the new spend_step reward-method field). Unlike the existing per-item fixed_value rule, both are independent of item quantity.
  • Added the get-campaign-barcode-conflicts endpoint. Given a chain, a list of barcodes and a reference date window, it returns each barcode that is shared with another campaign whose active date window overlaps the reference window, along with those campaigns' details. This makes it possible to detect barcode and scheduling clashes between campaigns in a single request.
  • Changed the chain basket_campaign_require_format_assignment option so that a Business (store) assignment now also satisfies the requirement. When the option is enabled, an active BasketCampaign is accepted if it has either a Business Format assignment or a Business (store) assignment, aligning the API with the Console campaign activation checklist.
  • Changed date-time fields in Resources API responses to RFC 3339 format (a profile of ISO 8601), normalised to UTC (for example 2026-07-07T15:30:23+00:00), for API version 1.6.8 and above. Earlier API versions continue to receive the previous Y-m-d H:i:s format for backwards compatibility.
  • Removed the shopper object from the transaction/receipt response. Member identity is now carried solely by the user field, which already contains the same name, contact, membership and address details, so the duplicate shopper block is no longer returned.

Console Early July release

David Sevenoaks
Co-Founder

Our early July release expands campaign and wallet reporting, adds competition draws, adds voucher zones to Content Management and adds a Virtual POS basket simulator.

Reporting and campaign analytics

  • Campaign reports now use clearer report sections, including Summary, Customer response, Basket context, Channel performance, Product entries, and Price and mechanics where the campaign data supports them.
  • Campaign and campaign group reports now include deeper product, store, format, region, basket, customer-response, time-of-week, and price-mechanics cards for promotions with assigned products or redemption activity.
  • A dedicated Levels report is now available in Realtime reports for current level membership and level joins over time.
  • Wallet campaign reports now include clearer wallet activity, entry contribution, channel, mutation, and top-customer breakdowns.
  • Reports now have a new "i" option where an explanation of the data shown and how it can be used is provided

Content Management and app pages

  • Content Management now supports Voucher zones. A voucher zone shows each user their own vouchers instead of manually assigned campaigns.
  • Voucher zones can show available vouchers, redeemed vouchers, or vouchers issued by a specific campaign.
  • Console now shows example voucher previews for voucher zones, makes clear that the real result is personalized per customer, and limits voucher zones to the Card layout.

Campaigns, tasks, and rewards

  • Entries wallets now include a Draws tab for competition draws.
  • Competition draws can be started from Console by entering the number of winners and backup winners to draw. The draw uses the campaign's active date range when one is set, tracks status while it is running, and exposes the finished result download from the draw card.
  • Campaign lists now include status filters for Active, Scheduled, Completed, and Disabled campaigns.
  • Campaign group pages now separate wallet campaigns from other campaigns when no filters are active, making campaign groups easier to scan.

Virtual POS basket simulator

  • The developer basket tool has been redesigned as Virtual POS: simulate basket requests.
  • Teams can now select a store and customer, add products or manual line items, preview rewards and discounts, complete a basket, and review generated receipt artefacts from one screen.
  • A new side panel shows the current request, latest price response, completed basket response, and request history.
  • Usage in production is restricted to accounts flagged as "Virtual POS tester". Please talk to the Spaaza team to add an account/s

Other

  • Numerous bug fixes and small improvements

Enjoy!

API early July 2026 improvements (1.6.7)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in early July 2026, on top of the earlier mid June 2026 release.

  • Added manufacturer, private_label and listing_source product fields. These are returned in product responses (for example get-product) and can be set when creating or updating products, including through the product feed import.
  • Added a visible_to_all_user_segments option to the composable campaign segment restriction. When true (the default) a segment-restricted campaign is still shown to everyone in get-campaigns and get-card, and the segment only affects whether the reward applies; set it to false to also hide the campaign from users who are not in the segment.
  • Changed the composable campaign segment restriction to accept a single segment id for user_segment_id and excluded_user_segment_id. Comma-separated lists of segment ids are no longer accepted.
  • Fixed composable interaction campaigns (such as scratch cards) so their reward methods can once again carry redeem-shaping restrictions (basket_item, business, currency), matching the behaviour already documented for these campaigns.
  • Fixed composable voucher redemption so that when a reward-method redeem restriction (basket_item, business or currency) matches nothing in the basket, the voucher now redeems on nothing instead of applying its full value across all basket items.
  • Removed the unused business_format and business_region composable restriction types. Filtering by business format or region remains available through the business restriction using its business_formats and business_regions fields.

Console Mid June release

David Sevenoaks
Co-Founder

Our mid June release improves Reporting, adds new Insight documentation, expands team member permissions, and adds more campaign controls for percentage discounts.

Reporting and analytics

  • Reporting is now organised around Realtime reports and Downloadable reports, making it clearer whether you are opening live on-screen analysis or generating a file for later collection.
  • The main loyalty dashboards now have dedicated report pages for Loyalty, Signups, Baskets, Top Customers, Wallet Entries, Vouchers, and Personal Pricing.
  • A new Transaction value buckets report helps teams review basket value distribution by configurable transaction buckets.
  • Several analytics reliability improvements have been added, including more accurate comparison date ranges and more resilient campaign sales reporting for large barcode sets.

Insights

Campaign controls

  • Percentage-based basket discounts and percentage vouchers can now be limited with Maximum basket discount.

Team members and permissions

  • The Team members settings page now supports filtering by name or email.
  • Team member permission columns are clearer, with new permission visibility for Analytics, Export, and Segment query access.
  • Creating or editing a team member now uses a clearer settings form, including a secure password generator for new users.
  • Console now shows a permission notice when a user tries to open a page they are not allowed to view.
  • Analytics, exports, campaign creation, and the global Create action now respect the relevant team member permissions more consistently.

Other improvements

  • Product, voucher, wallet, and campaign reports include smaller data matching and display fixes.
  • Monetary resource values are now displayed with cents where needed.
  • User form labels and input IDs have been improved.
  • Settings pages have received smaller layout and form consistency improvements.

Enjoy!

API mid June 2026 improvements (1.6.6)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in mid June 2026, on top of the earlier early June 2026 release.

  • Added max_basket_discount_amount campaign field, allowing a per-voucher cap on the discount value of percentage basket vouchers at redemption time. The cap is enforced per voucher during get-basket-price and add-basket.
  • Added new admin permission fields permission_analytics, permission_export, and permission_segment_query on add-user, alter-user, and permission-related endpoints, enabling more granular access control for admin accounts.
  • Added created_date and last_modified_date as sort parameters for the Business and AllowedIpRange resources in the Resources API.
  • Changed percentage basket voucher application on chains that allow double discounting: get-basket-price and add-basket now apply all eligible campaign-level standalone percentage basket vouchers by threshold allocation — sorted by campaign reward_priority, then cap-aware delivered discount for same-priority vouchers, then created_date — instead of keeping only the single best percentage voucher. The max_basket_discount_amount cap applies per voucher.
  • Changed voiding/cancelling a transaction via an empty get-basket-price (no items and basket_total_value 0) to also unlock the shopper's standalone vouchers: any claimed, non-expired voucher locked to the same retailer_basket_code / voucher_locking_code now has its lock cleared, not only on-the-fly basket campaign vouchers.
  • Improved event handling so that deferred events (such as OTP SMS notifications) are no longer triggered when the API request that staged them fails.
  • Improved get-basket-price to no longer return misleading warnings for auto-loaded vouchers that do not match campaign spend-assignment parameters.
  • Fixed an issue where voucher key generation under high concurrency could produce duplicate keys.
  • Fixed a get-basket-price error that occurred when the basket had no items and the user held vouchers from inactive campaigns.

Console Early June release

David Sevenoaks
Co-Founder

Our early June release improves customer filtering, Personal Pricing safeguards, and reporting reliability.

Customer lists, segments, and exports

  • Customer lists now use the improved resource table experience, giving a more consistent filtering and export workflow.
  • Segment filters are easier to manage, with clearer save, rename, and delete actions.
  • Deleting a segment now makes clear that only the segment is removed, not the customer profiles inside it.
  • Filtered customer views are more stable when navigating, refreshing, or sharing filtered pages.

Personal Pricing settings

  • A new Personal Pricing settings page has been added to Settings.
  • Teams can now require active Personal Pricing basket campaigns to include barcode, store format, or store/store group targeting before they can be enabled.
  • These settings help reduce the risk of activating promotions with incomplete targeting.

Personal Pricing settings

Reporting and analytics

  • Campaign assignment and barcode reporting now handles grouped barcode assignments more reliably.
  • Barcode reporting now shows missing sales data more clearly instead of hiding affected rows.
  • Product and campaign reporting views include smaller reliability and data-matching improvements.

Embed Elements

  • Spaaza Embed Elements integrations have been simplified by removing the old environment wrapper requirement.
  • Event and error handling documentation has been updated to make web and mobile app integrations easier to support.

Other improvements

  • Store, Customer and Product pages now use more of the available screen width for easier table viewing.
  • Several campaign, customer, filtering, and layout issues have been fixed.
  • New and updated guides have been added for Personal Pricing settings, Embed Elements, Shopify data synchronisation, SMS integrations, and Spotler.

Enjoy!

API early June 2026 improvements

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in early June 2026, on top of the earlier mid May 2026 release.

  • Added get-campaigns support for JWT-based shopper authentication, extending the JWT auth support introduced in version 1.6.4 to campaign listing.
  • Added Chain resource to the Resources API with GET, PUT, and PATCH support, including nested allowed_ip_ranges and a new standalone AllowedIpRange resource.
  • Added chain-level configuration flag for partial-redemption voucher regeneration, allowing chains to control whether partially-redeemed vouchers are automatically regenerated with the remaining value.
  • Added chain-level basket campaign assignment restriction settings.
  • Added composable reward-method voucher-shaping configuration fields: voucher_claimed_by_default, voucher_expiry_seconds / voucher_expiry_date, and spend_on_promotional_items, enabling fine-grained control over voucher behavior at the reward-method level.
  • Added reward-method-level return_reclaims_earned_rewards field for wallet_contribution reward methods, allowing chains to prevent clawback of earned purchase progress when the earning purchase is returned.
  • Changed add-user and alter-user to no longer automatically trigger phone number verification SMS; clients must now explicitly initiate verification through the phone verification flow.
  • Improved call-processing error handling across multiple API endpoints to return structured API error responses for concurrent request timeouts.
  • Improved segment CSV exports to handle larger datasets without timing out.
  • Improved task-based data exports to exclude deleted users.
  • Improved Spotler webhook integration with updated payload format.
  • Fixed cashback campaign calculation that incorrectly double-subtracted voucher discounts from item prices.
  • Fixed handling of deleted campaign restrictions.

Console May release

David Sevenoaks
Co-Founder

Our May release improves bulk Personal Pricing campaign creation, improves Settings and makes tables easier to filter and customize.

Personal Pricing campaign imports You can now import Personal Pricing campaigns from CSV, this reduces the time needed to set up large sets of member pricing promotions. See our new guide for more detail on how to use this new feature.

Importing Personal Pricing campaigns

Improved Settings with new configuration option

  • The Settings overview has been reorganized into more focused configuration pages.
  • Program rules is now a dedicated page for reviewing member number ranges, setting whether discounted basket campaign items can earn rewards, and configuring basket claim limits.
  • Store formats now has its own page for adding and removing the format values used in store setup and campaign targeting.

Program rules

Vouchers, Transactions and Wallet Entry table improvements

  • We significantly improved the performance of filtering and loading tables, especially for customers with large scale data in Spaaza.
  • Optional column customization has been improved with search, category grouping and column descriptions.

Transaction insights

  • Transaction tables and overview pages now include new insights to highlight unusual and fraudulent program activity (for some insights the latest version of the add-basket API needs to be used, in particular we require the till code to be included in requests).
  • We have more insights coming soon in upcoming releases.

Other improvements

  • Barcode group activation checks now handle bundle campaigns more accurately.
  • We fixed a bug so "earn" barcodes are preserved when campaign group assignment updates are saved.
  • We also fixed a range of smaller UI, filtering, loading, and data-display issues across Console.
  • New and updated Console guides have been added for campaign imports, settings, program rules, store formats, and store groups.

Enjoy!

API mid May 2026 improvements (1.6.5)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in mid May 2026, on top of the earlier early May 2026 release.

  • Added basket-level discount calculation and percentage-based basket voucher support for composable campaigns, extending composable campaigns to handle basket-discount reward flows.
  • Added win_chance configuration to composable campaign reward methods, enabling probabilistic reward issuance so that only a configured percentage of interactions trigger a reward (for example a 5% chance per basket).
  • Changed get-user-vouchers to return voucher campaign details in a nested campaign object for API version 1.6.5 and above, including bounded campaign assignment rows with assigned business details, assignment_count, assignment_count_by_type, and assignment_types_excluded fields. Older versions keep the legacy flat campaign_* fields.
  • Improved API response times for basket endpoints (get-basket-price and add-basket) through caching improvements.
  • Improved create-voucher with concurrency protection to prevent duplicate voucher creation from simultaneous requests.
  • Improved robustness of API requests involving segment lookup through improved retry logic.
  • Fixed campaign segment-restriction handling so that campaigns with segment restrictions correctly fail closed.
  • Fixed get-tags, get-assigned-groups, and get-reward-methods endpoints returning server errors instead of proper API error responses when the chain_id parameter is missing.

API early May 2026 improvements (1.6.4)

Sam Critchley
Co-Founder

Additional API features, improvements and fixes that shipped to production in early May 2026, on top of the earlier mid April 2026 release.

  • Added stateless JWT-based shopper authentication, allowing chains to configure trusted JWT issuers via jwt_jwks_url, jwt_issuer, and optional jwt_audience fields on alter-chain and get-chain. Shopper JWTs are validated using JWKS with automatic key-rotation support, and alter-user enforces an explicit customer_profile.write scope when called with JWT authentication.
  • Added a fixed_value calculation method to composable campaign reward methods, alongside the existing basket-value and items-value methods.
  • Added a context field to composable campaigns, with context-based filtering of available restrictions and reward methods.
  • Changed composable campaign budget and usage-limit configuration to be set at the reward-method level rather than the campaign level.
  • Changed admin and user permission payloads so that the legacy empty businesses block is no longer included in auth/login, auth/session, auth/get-user-permissions, and get-user responses for API version 1.6.4 and above. Older versions still return businesses: null for compatibility.
  • Improved phone-number verification so that re-submitting the same phone number on alter-user or add-user preserves the VERIFIED status instead of resetting to VALIDATED, avoiding unnecessary OTP re-verification.
  • Improved phone-number validation so that invalid phone numbers submitted via legacy API versions (below 1.6.1) are now stored with INVALID status instead of UNCHECKED, giving better data visibility.
  • Improved Stripe subscription handling to fix cancellation webhooks silently failing when a subscription's annual expiry had passed, and to prevent duplicate Stripe subscriptions being created by failed renewal retries.
  • Fixed composable campaign segment-restriction evaluation returning an incorrect type when the segment response was empty, which could cause campaigns with segment restrictions to behave unexpectedly.

API mid April 2026 improvements

Sam Critchley
Co-Founder

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.

API late March 2026 improvements

Sam Critchley
Co-Founder

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).

API mid-March 2026 improvements

Sam Critchley
Co-Founder

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.

Console Mid-March release

David Sevenoaks
Co-Founder

Our March release introduces a new way to schedule rewards, clearer navigation and a new way to view product variants.

Scheduled rewards

  • You can now create Scheduled rewards campaigns directly from Campaign Groups.
  • Scheduled rewards can issue vouchers or wallet entries once, or on daily, weekly, or monthly schedules.
  • Each scheduled task can target all customers, a segment, or a CSV list.
  • Campaign overviews now show scheduled task timing, audience, and status so it is easier to check whether a campaign is ready to activate.
  • Scheduled rewards campaigns are designed to replace the "Issue vouchers" and "Issue Wallet Entries" functionality.

Scheduled rewards

Campaigns, tasks, and settings

  • Campaign lists now have stronger filtering and sorting, including title, barcode, tag, and type filters.
  • Task pages now support clearer status and type filtering, pagination for larger task lists, and faster status refresh while tasks are running.
  • The Settings page has been reorganized into clearer sections for configuration, integrations, mobile wallets, and scheduled program tasks.

Catalog and transactions

  • The Catalog navigation now separates All products and All variants.
  • Product variant pages show clearer barcode details and improved reporting layouts.
  • Resource tables now link more records directly to their related customer, store, product, campaign, voucher, or transaction page.
  • Transactions now support Till Code in tables, filters, and exports.

Other improvements

  • We also made a range of smaller UI, navigation, and data-display improvements across Console.

Enjoy!

API early March 2026 improvements

Sam Critchley
Co-Founder

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.