Short answer
RaftLabs built Instantor Rewards, a B2B loyalty program for plumbers and installers who buy Sanbra Fyffe's Instantor products through Irish builders' merchants. Installers uploaded purchase receipts through iOS, Android, and web apps to earn points toward four tiers and enter competitions. Delivered through BrandFire, the platform launched in about 15 weeks in September 2021 and ran until the program closed at the client's request in December 2024.
Engagement
The Instantor Rewards engagement
- Client
- Sanbra Fyffe, maker of Instantor plumbing products, delivered through BrandFire
- Sector
- Plumbing and heating products sold to installers through builders' merchants in Ireland
- Initial build
- About 15 weeks, from late May to September 2021
- Operation
- September 2021 to December 2024, with maintenance and changes throughout
- Team
- Three engineers on the web platform and backend, one Flutter engineer, and later maintenance support
- Scope
- Installer web app, iOS and Android apps, admin, points and tier engine, competitions, notifications, and consent
- Status
- The program closed at the client's request in December 2024
The situation
Instantor has supplied plumbing products to the Irish trade since 1926. Its customers are plumbers and installers, and they buy Instantor fittings from builders' merchants. That's the problem a B2B loyalty program has to solve first: the brand never sees the sale. There's no checkout to attach points to and no purchase record of its own.
RaftLabs built Instantor Rewards for Sanbra Fyffe, Instantor's maker, through the loyalty agency BrandFire. The receipt the installer already keeps became the purchase record. Installers photograph it in the app, earn points, climb four tiers, and enter competitions. Instantor gets a direct, consented line to the people choosing its products.
The platform went live in about 15 weeks, in September 2021. It ran for more than three years, until the program closed at the client's request in December 2024.

Before and after
From merchant sales Instantor couldn't see to a receipt-based loyalty record
- Installers bought Instantor products at merchants, so the brand had no purchase record for them
- There was no checkout or point of sale to credit points at
- Instantor had no consented channel to tell installers about products, demo days, or surveys
- Installers photograph a receipt, pick the merchant branch, and name the salesperson
- Points land within the same upload flow, based on the competitions running that day
- Four tiers, from Member to Gold, each with Instantor merchandise
- Admins publish competitions, record winners, send notifications, and export program data as CSV
- Installers choose how Instantor may contact them: post, SMS, email, or in-app
The decisions that shaped the program
With no checkout, the receipt became the purchase record
A direct-retail brand credits points at the till. Instantor couldn't, because the till belonged to the merchant.
So the earning action is the one an installer already takes: keeping the receipt. The app asks for a photo, the merchant branch, and the salesperson's name. The branch comes from a picker of 797 builders' merchant branches across all 32 counties of Ireland, seeded before launch. Each receipt therefore records where the installer bought, and from whom, as well as what they spent.
Points were credited first and could be reverted later
A receipt doesn't wait in an approval queue. When it uploads, a background job on a NestJS queue awards its points and writes an entry to the member's point history.
If an admin later deletes a bad receipt, a second job finds that history entry and subtracts exactly the points it added. The history keeps both entries, so every balance can be traced back to the receipts behind it.
The trade-off is plain: an invalid receipt holds its points until someone removes it. In return, installers see their points straight away and the admin team never works through an approval backlog.
Points came from competitions, which created a gap
A receipt's points are the sum of the points offered by every competition running when it was uploaded. That ties earning to the campaign calendar the agency controls.
It also meant a receipt uploaded between competitions earned nothing, an edge case the program had to handle once real installers hit it. Competition timing ran on Hasura scheduled events, which also sent "about to end" notices. In December 2022, one competition failed to go live on schedule and needed a fix.
Notifications took the longest to get reliable
The team built its own notification system rather than using a third-party campaign tool. Admins send to selected installers through Firebase Cloud Messaging or broadcast to everyone, schedule sends ahead of time, and see recipient counts. Every message is also stored in-app with a read status.
That control came at a cost. Notification problems surfaced within weeks of launch in October 2021, and a notifications bug stayed open from March to December 2024.
Marketing consent moved from opt-out to opt-in
At launch, the sign-up form asked installers to tick the channels they did not want to be contacted on. At the client's request, the team reversed that in December 2023. Installers now tick the channels they want: post, SMS, email, or in-app. Nothing is pre-selected.
Tier-upgrade emails respect the same choice. An installer who turns off email doesn't get them.
the build
What installers and the program team worked with
Instantor Rewards ran as a web app, an iOS app, and an Android app for installers, with an admin area for the BrandFire and Instantor teams.
Installers upload a receipt and see their points
Installers photograph an Instantor purchase receipt, choose the merchant branch, and add the salesperson's name. The receipt counts toward every competition running that day, and the points appear on the member's balance and in their point history.

Four tiers make the next reward visible
Tiers run from Member through Bronze, Silver, and Gold, each set by a minimum points total. The seeded thresholds were 50, 150, and 300 points, with Instantor merchandise at each level, from mugs and pens up to hoodies and jackets. Crossing a threshold triggers a tier-upgrade email.

Competitions give members a reason to keep uploading
Admins publish competitions with a points value and a schedule. Members see what's running and who won, and get a notice when a competition is about to end. A separate photo contest let installers submit images, with winners picked from the entries.

The program team runs everything from one admin area
Admins manage competitions, record and publish winners, edit the tiers and how-it-works content, and send and schedule notifications. Competitions, receipts, winners, and notification data export as CSV for reporting.

Proof
What the program record shows
The program site and apps are offline, and no usage statistics are available, so this page reports what the project record supports.
| Result | What changed | Period or context | Evidence and limitation |
|---|---|---|---|
| Launch | Platform live in about 15 weeks | Late May to September 2021 | Project-recorded: first commit 27 May 2021; launch around 10 September 2021 |
| Operation | Ran for more than three years | September 2021 to December 2024 | Project records; the program closed at the client's request |
| Consent | Per-channel marketing consent moved to opt-in | December 2023 | Project-recorded code change, made at the client's request |
| Usage | Not published | Program period | Sign-up, receipt, and order-value figures couldn't be verified, so none are shown |
What clients say
What the agency said about the program
Three-year average engagement. Founders and operators describing the work in their own words. No marketing varnish.

Nuala C.
Director, BrandFire
Ireland
They provided ideas that we hadn't really thought of, which helped our program standout.
Timeline
How the program ran
May-Sep 2021
Build and launch
The platform went live in September 2021, about 15 weeks after the first commit, with the Flutter apps built alongside it from late August.
Oct 2021
Post-launch fixes
Notification issues surfaced in the first weeks of live use and took priority.
2022-2023
Changes as the program ran
A competition scheduling fix, an Eircode address field for Irish postcodes, and the move to opt-in marketing consent.
2024
App store compliance and closure
Google Play and App Store compliance work ran through 2024. The program closed at the client's request in December 2024.
The lesson
If your products sell through merchants, the receipt is your checkout
A brand that sells through merchants can't credit points at the till, because it doesn't own the till. Instantor Rewards worked around that by treating the receipt the installer already keeps as the purchase record, then adding the merchant branch and salesperson to make each one useful to the brand.
If you're planning a B2B loyalty program for trade buyers, design the earning record first. Then decide how you'll remove a bad record, and how its points come back out, before launch day.
How it runs
- Flutter
- One codebase gave installers native iOS and Android apps with camera upload, push notifications, and competition and winner screens, while linked pages such as Instantor's about page opened in a built-in web view.
- Next.js
- The installer web app and the admin area shared one Next.js application, installable as a progressive web app for installers who preferred not to download an app.
- NestJS
- NestJS held the program rules: points, tiers, competitions, receipts, and notifications. Queues on Redis ran point awards, reversals, and tier emails in the background so uploads stayed fast.
- Hasura
- Hasura exposed the PostgreSQL data model and ran the scheduled events behind competition timing and scheduled notifications. In this build, every GraphQL request went through NestJS first.
- Firebase
- Firebase handled installer sign-in and delivered push notifications, both to selected installers and to everyone on the program at once.
Common questions
Use the receipt as the purchase record. Instantor's installers bought through builders' merchants, so there was no checkout to credit points at. Installers photographed each receipt in the app and added the merchant branch and salesperson. Points were credited from the upload, and each receipt told Instantor where and from whom the product was bought.
Points were credited on upload, and admins could delete a bad receipt afterwards. Deleting it triggered a background job that found the original points entry and subtracted exactly that amount. The point history kept both entries, so every balance stayed traceable. The trade-off: an invalid receipt kept its points until someone removed it, but there was no approval backlog.
Members moved through four tiers, from Member through Bronze, Silver, and Gold, based on total points. The seeded thresholds were 50, 150, and 300 points, and each tier carried Instantor merchandise such as mugs, hoodies, and jackets. Crossing a threshold sent a tier-upgrade email, unless the installer had turned off email contact.
Ask per channel, and default to nothing. Instantor Rewards first asked installers to tick the channels they didn't want. In December 2023, at the client's request, the form switched to opt-in across post, SMS, email, and in-app contact. Automated messages such as tier-upgrade emails followed the same choice.
Instantor Rewards went live in about 15 weeks, from late May to September 2021. The scope covered a web app, iOS and Android apps, and an admin area. Timelines depend on how points are earned, the number of apps, and the consent and reporting needs. See our B2B loyalty program development service and pricing guide for current planning.
Route requests through Hasura directly. Every GraphQL request went through NestJS first, which meant hand-writing many queries, mutations, and access rules that Hasura can generate and enforce itself. Reversing that would simplify role-based access and cut backend code. We'd also invest earlier in notification monitoring, the part that took longest to get reliable.
Related work


