Earning rules you configure, not code
Fixed, percentage or banded awards, with daily, weekly, monthly and lifetime caps and cooldowns.
PURCHASE
1 point for every $1 spent
- Up to 500 points a day
- 2,000 a week
- 10 minute cooldown
- Lifetime cap off
Points, tiers and rewards over one API. Your customers see your brand. You see every point.
Illustration, showing 6 example businesses in turn. Now showing: Online shop. On a customer's phone, the Halden Coffee app takes a $52.40 order. The app calls the Loyalty Pilot earning endpoint, which awards 52 points: the balance moves from 1226 to 1278 and the customer reaches Gold, with new perks. At the same moment the merchant's console shows the points issued, the new Gold member and a level.changed webhook delivered.
Online, in an app, at the till or across a marketplace. If it can make an HTTP call, it can award points.

Award points at checkout and let customers spend them on their next order.

Reward renewals, referrals and streaks from inside your product.

Your till calls the same API as your website. Customers earn wherever they pay.

Run one programme across many sellers, with every movement on the ledger.
How it works
One per integration: your web shop, your app, your tills. Each keeps its own customers and points, in Test or Live.
New application
OAuth 2.0 client credentials. Exchange them for a token that can only ever reach that application.
Credentials
Shown once. Store it in your secret manager.
POST $IDENTITY_URL/connect/token
grant_type=client_credentials
scope=loyalty.apiCall the earning endpoint, or map events you already emit to rules. Caps, cooldowns and tiers apply on their own.
Award points
POST /api/v1/Engine/Earning
{
"externalCustomerId": "CUST-20417",
"ruleCode": "PURCHASE",
"amount": 52.40,
"idempotencyKey": "order-40912"
}200pointsChanged 52, newBalance 1278
Or map events you already send
order.completed to rule PURCHASE
Members, points issued, redemptions and every webhook that failed, for each application.
Halden web shop
Example dataNew application
Fixed, percentage or banded awards, with daily, weekly, monthly and lifetime caps and cooldowns.
PURCHASE
1 point for every $1 spent
Members move up and down on every transaction, and the perks follow them.
Customers see what they can afford right now.
Every movement, with the balance after it and your own key.
| Change | Balance after | Idempotency key |
|---|---|---|
| +52 | 1,278 | order-40912 |
| -400 | 1,226 | redeem-7781 |
| +118 | 1,626 | order-40388 |
Balance, tier and redemption events, each signed with HMAC-SHA256.
POST /hooks/loyalty
X-Loyalty-Signature: sha256=9f2c41e07b…
{ "event": "level.changed", "level": "Gold" }
Signature verified
Map your own event names to rules and let the engine decide what each one earns.
One account, many applications. Isolation is enforced in the data layer on every query, so a token for your web shop can never read your tills.
REST, gRPC or the .NET SDK. Send an idempotency key with every award and a retried request can never pay out twice.
curl -X POST "$LOYALTY_API/api/v1/Engine/Earning" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"externalCustomerId": "CUST-20417",
"ruleCode": "PURCHASE",
"amount": 52.40,
"idempotencyKey": "order-40912"
}'200Response
{
"success": true,
"result": {
"transactionId": "01JXB2K7…",
"pointsChanged": 52,
"newBalance": 1278,
"success": true
}
}Every application has its own dashboard: who joined, what was earned, what was redeemed, and why something was not awarded.
Web shop
Live application
Recent activity
Every query is filtered to one application in the data layer.
Client credentials per application, with tokens scoped to it.
HMAC-SHA256 signatures, so you can prove a delivery came from us.
The same idempotency key never awards twice.
Every movement recorded with the balance after it.
Start with a Test application and your own data. Go Live when you are ready.