Loyalty & Rewards
Build and manage loyalty programs that drive customer retention. Create tiered reward structures, enroll members, track point balances and transactions, configure rewards and redemptions, and set up automated service reminders.
Get loyalty program
Retrieve the loyalty program configuration for your business.
Request
curl https://api.umbraerp.com/v1/loyalty/program \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": {
"publicId": "abc-123",
"name": "LESRUS Rewards",
"pointsName": "Stars",
"pointsPerCurrency": 10,
"currency": "USD",
"enrollmentType": "automatic",
"pointsExpiryDays": 365,
"isActive": true,
"autoNotify": true,
"dateCreated": "2026-03-17T10:00:00Z"
}
}
Create loyalty program
Create a new loyalty program for your business. Only one program can be active per business.
Required attributes
- Name
name- Type
- string
- Description
The name of the loyalty program (e.g., "LESRUS Rewards").
- Name
pointsName- Type
- string
- Description
What your points are called (e.g., "Stars", "Points", "Miles").
- Name
pointsPerCurrency- Type
- integer
- Description
How many points are earned per unit of currency spent.
- Name
currency- Type
- string
- Description
Three-letter ISO currency code (e.g.,
USD).
Optional attributes
- Name
enrollmentType- Type
- string
- Description
How customers join:
automaticormanual. Default:automatic.
- Name
pointsExpiryDays- Type
- integer
- Description
Number of days before points expire. Set to
0for no expiry.
- Name
autoNotify- Type
- boolean
- Description
Whether to send automatic notifications to members on point changes. Default:
true.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/program \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"name": "LESRUS Rewards",
"pointsName": "Stars",
"pointsPerCurrency": 10,
"currency": "USD",
"enrollmentType": "automatic",
"pointsExpiryDays": 365,
"autoNotify": true
}'
Response
{
"result": "success",
"data": {
"publicId": "abc-123",
"name": "LESRUS Rewards",
"pointsName": "Stars",
"pointsPerCurrency": 10,
"currency": "USD",
"enrollmentType": "automatic",
"pointsExpiryDays": 365,
"isActive": true,
"autoNotify": true,
"dateCreated": "2026-03-17T10:00:00Z"
}
}
Update loyalty program
Update the loyalty program configuration.
Optional attributes
- Name
name- Type
- string
- Description
Updated program name.
- Name
pointsName- Type
- string
- Description
Updated points name.
- Name
pointsPerCurrency- Type
- integer
- Description
Updated points-per-currency ratio.
- Name
enrollmentType- Type
- string
- Description
Updated enrollment type:
automaticormanual.
- Name
pointsExpiryDays- Type
- integer
- Description
Updated expiry period in days.
- Name
isActive- Type
- boolean
- Description
Enable or disable the loyalty program.
- Name
autoNotify- Type
- boolean
- Description
Enable or disable automatic member notifications.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/program \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"pointsPerCurrency": 15,
"pointsExpiryDays": 180
}'
Response
{
"result": "success",
"message": "Loyalty program updated successfully."
}
Delete loyalty program
Delete the loyalty program. This will deactivate the program and remove all associated tiers, but member records are retained for historical reporting.
Request
curl -X DELETE https://api.umbraerp.com/v1/loyalty/program \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"message": "Loyalty program deleted successfully."
}
List tiers
Retrieve all tiers configured for the loyalty program.
Request
curl https://api.umbraerp.com/v1/loyalty/tiers \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "tier-001",
"name": "Bronze",
"color": "#CD7F32",
"minPoints": 0,
"multiplier": 1.0,
"sortOrder": 1
},
{
"publicId": "tier-002",
"name": "Silver",
"color": "#C0C0C0",
"minPoints": 1000,
"multiplier": 1.25,
"sortOrder": 2
},
{
"publicId": "tier-003",
"name": "Gold",
"color": "#FFD700",
"minPoints": 5000,
"multiplier": 1.5,
"sortOrder": 3
},
{
"publicId": "tier-004",
"name": "Platinum",
"color": "#E5E4E2",
"minPoints": 15000,
"multiplier": 2.0,
"sortOrder": 4
}
]
}
Create tier
Add a new tier to the loyalty program.
Required attributes
- Name
name- Type
- string
- Description
The name of the tier (e.g., "Gold").
- Name
minPoints- Type
- integer
- Description
Minimum lifetime points required to reach this tier.
Optional attributes
- Name
color- Type
- string
- Description
Hex color code for the tier badge (e.g.,
#FFD700).
- Name
multiplier- Type
- number
- Description
Points earning multiplier for members in this tier. Default:
1.0.
- Name
sortOrder- Type
- integer
- Description
Display order for the tier.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/tiers \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Diamond",
"minPoints": 50000,
"color": "#B9F2FF",
"multiplier": 3.0,
"sortOrder": 5
}'
Response
{
"result": "success",
"message": "Tier created successfully."
}
Update tier
Update an existing tier.
Optional attributes
- Name
name- Type
- string
- Description
Updated tier name.
- Name
minPoints- Type
- integer
- Description
Updated minimum points threshold.
- Name
color- Type
- string
- Description
Updated hex color code.
- Name
multiplier- Type
- number
- Description
Updated points multiplier.
- Name
sortOrder- Type
- integer
- Description
Updated display order.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/tiers/tier-003 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"multiplier": 2.0,
"minPoints": 4000
}'
Response
{
"result": "success",
"message": "Tier updated successfully."
}
Delete tier
Remove a tier from the loyalty program. Members in the deleted tier will be moved to the next lower tier.
Request
curl -X DELETE https://api.umbraerp.com/v1/loyalty/tiers/tier-003 \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"message": "Tier deleted successfully."
}
List members
Retrieve a paginated list of all loyalty program members.
Optional parameters
- Name
status- Type
- string
- Description
Filter by status:
active,inactive,suspended.
- Name
tier- Type
- string
- Description
Filter by tier public ID.
- Name
search- Type
- string
- Description
Search by member name or email.
- Name
limit- Type
- integer
- Description
Maximum number of records to return (default: 50).
- Name
offset- Type
- integer
- Description
Number of records to skip for pagination.
Request
curl https://api.umbraerp.com/v1/loyalty/members \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "def-456",
"customerName": "John Moyo",
"customerEmail": "john@example.com",
"tierName": "Gold",
"tierColor": "#FFD700",
"pointsBalance": 2400,
"lifetimePoints": 8200,
"status": "active",
"enrolledAt": "2026-01-15T08:30:00Z"
}
],
"totalCount": 142
}
Get member
Retrieve details of a specific loyalty member by their public ID.
Request
curl https://api.umbraerp.com/v1/loyalty/members/def-456 \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": {
"publicId": "def-456",
"customerName": "John Moyo",
"customerEmail": "john@example.com",
"customerPhone": "+263771234567",
"tierName": "Gold",
"tierColor": "#FFD700",
"pointsBalance": 2400,
"lifetimePoints": 8200,
"status": "active",
"enrolledAt": "2026-01-15T08:30:00Z"
}
}
Enroll member
Enroll a customer as a new loyalty program member.
Required attributes
- Name
customerId- Type
- string
- Description
The public ID of the customer to enroll.
Optional attributes
- Name
tierId- Type
- string
- Description
Public ID of the tier to assign. Defaults to the lowest tier.
- Name
initialPoints- Type
- integer
- Description
Starting point balance. Default:
0.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/members \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"customerId": "cust_123",
"tierId": "tier-001",
"initialPoints": 100
}'
Response
{
"result": "success",
"data": {
"publicId": "def-456",
"customerName": "John Moyo",
"customerEmail": "john@example.com",
"tierName": "Bronze",
"tierColor": "#CD7F32",
"pointsBalance": 100,
"lifetimePoints": 100,
"status": "active",
"enrolledAt": "2026-03-17T10:00:00Z"
}
}
Bulk enroll members
Enroll multiple customers into the loyalty program in a single request.
Required attributes
- Name
customerIds- Type
- array
- Description
Array of customer public IDs to enroll.
Optional attributes
- Name
tierId- Type
- string
- Description
Tier to assign to all enrollees. Defaults to the lowest tier.
- Name
initialPoints- Type
- integer
- Description
Starting point balance for each member. Default:
0.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/members/bulk \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"customerIds": ["cust_123", "cust_456", "cust_789"],
"tierId": "tier-001",
"initialPoints": 50
}'
Response
{
"result": "success",
"data": {
"enrolled": 3,
"skipped": 0,
"errors": []
}
}
Update member
Update a loyalty member's status or tier assignment.
Optional attributes
- Name
tierId- Type
- string
- Description
Public ID of the new tier to assign.
- Name
status- Type
- string
- Description
Updated status:
active,inactive, orsuspended.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/members/def-456 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"tierId": "tier-003",
"status": "active"
}'
Response
{
"result": "success",
"message": "Member updated successfully."
}
Delete member
Remove a member from the loyalty program. Their transaction history is retained for reporting.
Request
curl -X DELETE https://api.umbraerp.com/v1/loyalty/members/def-456 \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"message": "Member deleted successfully."
}
List transactions
Retrieve a paginated list of all loyalty point transactions across all members.
Optional parameters
- Name
type- Type
- string
- Description
Filter by transaction type:
earn,redeem,adjust,expire.
- Name
limit- Type
- integer
- Description
Maximum number of records to return (default: 50).
- Name
offset- Type
- integer
- Description
Number of records to skip for pagination.
Request
curl https://api.umbraerp.com/v1/loyalty/transactions \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "tx-789",
"type": "earn",
"points": 50,
"balanceAfter": 2450,
"description": "Earned from Invoice #INV-0042",
"referenceType": "invoice",
"multiplierApplied": 1.5,
"dateCreated": "2026-03-17T14:30:00Z"
}
],
"totalCount": 328
}
Get member transactions
Retrieve all transactions for a specific loyalty member.
Optional parameters
- Name
type- Type
- string
- Description
Filter by transaction type:
earn,redeem,adjust,expire.
- Name
limit- Type
- integer
- Description
Maximum number of records to return (default: 50).
- Name
offset- Type
- integer
- Description
Number of records to skip for pagination.
Request
curl https://api.umbraerp.com/v1/loyalty/members/def-456/transactions \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "tx-789",
"type": "earn",
"points": 50,
"balanceAfter": 2450,
"description": "Earned from Invoice #INV-0042",
"referenceType": "invoice",
"multiplierApplied": 1.5,
"dateCreated": "2026-03-17T14:30:00Z"
},
{
"publicId": "tx-790",
"type": "redeem",
"points": -200,
"balanceAfter": 2250,
"description": "Redeemed: Free Oil Change",
"referenceType": "reward",
"multiplierApplied": 1.0,
"dateCreated": "2026-03-16T09:15:00Z"
}
],
"totalCount": 24
}
Create adjustment
Manually adjust a member's point balance. Use this for corrections, promotional bonuses, or goodwill credits.
Required attributes
- Name
memberId- Type
- string
- Description
Public ID of the member to adjust.
- Name
points- Type
- integer
- Description
Number of points to add (positive) or remove (negative).
- Name
description- Type
- string
- Description
Reason for the adjustment.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/transactions/adjust \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"memberId": "def-456",
"points": 500,
"description": "Welcome bonus for new Gold member"
}'
Response
{
"result": "success",
"data": {
"publicId": "tx-791",
"type": "adjust",
"points": 500,
"balanceAfter": 2900,
"description": "Welcome bonus for new Gold member",
"referenceType": "manual",
"multiplierApplied": 1.0,
"dateCreated": "2026-03-17T15:00:00Z"
}
}
List rewards
Retrieve all rewards available in the loyalty program.
Optional parameters
- Name
isActive- Type
- boolean
- Description
Filter by active or inactive rewards.
Request
curl https://api.umbraerp.com/v1/loyalty/rewards \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "rwd-001",
"name": "Free Oil Change",
"description": "Complimentary oil change service",
"pointsCost": 500,
"rewardType": "service",
"isActive": true,
"totalRedemptions": 42,
"dateCreated": "2026-02-01T09:00:00Z"
},
{
"publicId": "rwd-002",
"name": "10% Discount Voucher",
"description": "10% off your next purchase",
"pointsCost": 200,
"rewardType": "discount",
"discountPercent": 10,
"isActive": true,
"totalRedemptions": 87,
"dateCreated": "2026-02-01T09:00:00Z"
}
]
}
Create reward
Add a new reward to the loyalty program catalog.
Required attributes
- Name
name- Type
- string
- Description
The name of the reward.
- Name
pointsCost- Type
- integer
- Description
Number of points required to redeem this reward.
- Name
rewardType- Type
- string
- Description
Type of reward:
discount,service,product,voucher.
Optional attributes
- Name
description- Type
- string
- Description
Detailed description of the reward.
- Name
discountPercent- Type
- number
- Description
Discount percentage (only for
discounttype rewards).
- Name
isActive- Type
- boolean
- Description
Whether the reward is immediately available. Default:
true.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/rewards \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Free Car Wash",
"description": "Complimentary full car wash",
"pointsCost": 300,
"rewardType": "service"
}'
Response
{
"result": "success",
"message": "Reward created successfully."
}
Update reward
Update an existing reward.
Optional attributes
- Name
name- Type
- string
- Description
Updated reward name.
- Name
description- Type
- string
- Description
Updated description.
- Name
pointsCost- Type
- integer
- Description
Updated points cost.
- Name
rewardType- Type
- string
- Description
Updated reward type.
- Name
discountPercent- Type
- number
- Description
Updated discount percentage.
- Name
isActive- Type
- boolean
- Description
Enable or disable the reward.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/rewards/rwd-001 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"pointsCost": 450,
"description": "Premium oil change with synthetic oil"
}'
Response
{
"result": "success",
"message": "Reward updated successfully."
}
Delete reward
Remove a reward from the loyalty program catalog. Existing redemptions for this reward are not affected.
Request
curl -X DELETE https://api.umbraerp.com/v1/loyalty/rewards/rwd-001 \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"message": "Reward deleted successfully."
}
List redemptions
Retrieve a paginated list of all reward redemptions.
Optional parameters
- Name
status- Type
- string
- Description
Filter by status:
pending,fulfilled,cancelled,expired.
- Name
memberId- Type
- string
- Description
Filter by member public ID.
- Name
limit- Type
- integer
- Description
Maximum number of records to return (default: 50).
- Name
offset- Type
- integer
- Description
Number of records to skip for pagination.
Request
curl https://api.umbraerp.com/v1/loyalty/redemptions \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "rdm-001",
"memberName": "John Moyo",
"rewardName": "Free Oil Change",
"pointsSpent": 500,
"status": "fulfilled",
"voucherCode": "VOUCH-A1B2C3",
"redeemedAt": "2026-03-15T11:00:00Z",
"fulfilledAt": "2026-03-16T09:30:00Z"
}
],
"totalCount": 87
}
Create redemption
Redeem a reward for a loyalty member. The member's point balance will be debited by the reward's point cost.
Required attributes
- Name
memberId- Type
- string
- Description
Public ID of the member redeeming the reward.
- Name
rewardId- Type
- string
- Description
Public ID of the reward to redeem.
Optional attributes
- Name
notes- Type
- string
- Description
Additional notes about the redemption.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/redemptions \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"memberId": "def-456",
"rewardId": "rwd-002",
"notes": "Customer requested via phone"
}'
Response
{
"result": "success",
"data": {
"publicId": "rdm-002",
"memberName": "John Moyo",
"rewardName": "10% Discount Voucher",
"pointsSpent": 200,
"status": "pending",
"voucherCode": "VOUCH-D4E5F6",
"redeemedAt": "2026-03-17T15:30:00Z",
"fulfilledAt": null
}
}
Update redemption
Update the status of a redemption, such as marking it as fulfilled or cancelled.
Required attributes
- Name
status- Type
- string
- Description
Updated status:
pending,fulfilled,cancelled.
Optional attributes
- Name
notes- Type
- string
- Description
Additional notes about the status change.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/redemptions/rdm-002 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"status": "fulfilled",
"notes": "Service completed at workshop"
}'
Response
{
"result": "success",
"message": "Redemption updated successfully."
}
Verify voucher code
Verify whether a voucher code is valid and retrieve its details. Returns the associated reward and redemption status.
Request
curl https://api.umbraerp.com/v1/loyalty/vouchers/VOUCH-A1B2C3/verify \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": {
"valid": true,
"voucherCode": "VOUCH-A1B2C3",
"rewardName": "Free Oil Change",
"memberName": "John Moyo",
"status": "pending",
"redeemedAt": "2026-03-15T11:00:00Z",
"expiresAt": "2026-04-15T11:00:00Z"
}
}
Get loyalty stats
Retrieve aggregate statistics for the loyalty program, including member counts, point totals, redemption rates, and tier distribution.
Request
curl https://api.umbraerp.com/v1/loyalty/stats \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": {
"totalMembers": 142,
"activeMembers": 128,
"totalPointsIssued": 45200,
"totalPointsRedeemed": 12800,
"redemptionRate": 28.3,
"tierDistribution": [
{"name": "Bronze", "count": 80, "color": "#CD7F32"},
{"name": "Silver", "count": 35, "color": "#C0C0C0"},
{"name": "Gold", "count": 20, "color": "#FFD700"},
{"name": "Platinum", "count": 7, "color": "#E5E4E2"}
]
}
}
List service reminders
Retrieve all service reminders configured for the loyalty program. Service reminders automatically notify members when a service is due.
Optional parameters
- Name
isActive- Type
- boolean
- Description
Filter by active or inactive reminders.
Request
curl https://api.umbraerp.com/v1/loyalty/reminders \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"data": [
{
"publicId": "rem-001",
"name": "Oil Change Reminder",
"description": "Remind customers when oil change is due",
"intervalDays": 90,
"bonusPoints": 50,
"isActive": true,
"dateCreated": "2026-02-01T09:00:00Z"
},
{
"publicId": "rem-002",
"name": "Annual Service",
"description": "Yearly vehicle service reminder",
"intervalDays": 365,
"bonusPoints": 200,
"isActive": true,
"dateCreated": "2026-02-01T09:00:00Z"
}
]
}
Create service reminder
Create a new service reminder that will automatically notify members at configured intervals.
Required attributes
- Name
name- Type
- string
- Description
The name of the service reminder.
- Name
intervalDays- Type
- integer
- Description
Number of days between reminders.
Optional attributes
- Name
description- Type
- string
- Description
Detailed description of the reminder.
- Name
bonusPoints- Type
- integer
- Description
Bonus points awarded when the service is completed. Default:
0.
- Name
isActive- Type
- boolean
- Description
Whether the reminder is immediately active. Default:
true.
Request
curl -X POST https://api.umbraerp.com/v1/loyalty/reminders \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Tire Rotation",
"description": "Remind customers to rotate tires",
"intervalDays": 180,
"bonusPoints": 100
}'
Response
{
"result": "success",
"message": "Service reminder created successfully."
}
Update service reminder
Update an existing service reminder.
Optional attributes
- Name
name- Type
- string
- Description
Updated reminder name.
- Name
description- Type
- string
- Description
Updated description.
- Name
intervalDays- Type
- integer
- Description
Updated interval in days.
- Name
bonusPoints- Type
- integer
- Description
Updated bonus points.
- Name
isActive- Type
- boolean
- Description
Enable or disable the reminder.
Request
curl -X PUT https://api.umbraerp.com/v1/loyalty/reminders/rem-001 \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"intervalDays": 60,
"bonusPoints": 75
}'
Response
{
"result": "success",
"message": "Service reminder updated successfully."
}
Delete service reminder
Remove a service reminder from the loyalty program.
Request
curl -X DELETE https://api.umbraerp.com/v1/loyalty/reminders/rem-001 \
-H "Authorization: Bearer <your_access_token>"
Response
{
"result": "success",
"message": "Service reminder deleted successfully."
}

