Engagement
Rewards
Issue, track, and redeem loyalty points tied to location events.
Overview
The Rewards module lets you programmatically issue points to users based on location triggers, track balances, and handle redemptions.
Check a balance
typescript
1import { createOxinion } from 'oxinion';
2
3const oxinion = createOxinion({ apiKey: 'pk_...' });
4
5const { data, error } = await oxinion.rewards.getBalance({ userId: 'user-123' });
6
7if (data) {
8 console.log('Balance:', data.balance); // number
9}
Issue points
typescript
1// Requires sk_ key (server-side only)
2const oxinion = createOxinion({ apiKey: process.env.OXINION_API_KEY! }); // sk_...
3
4await oxinion.rewards.issue({
5 userId: 'user-123',
6 points: 50,
7 reason: 'geofence.entered:zone_downtown',
8}); // returns void
Redeem a reward
typescript
1await oxinion.rewards.redeem({
2 userId: 'user-123',
3 rewardId: 'reward_abc',
4}); // returns void
Listen for reward events
typescript
1oxinion.rewards.listen('issued', (event) => {
2 // RewardsIssuedEvent: { userId, points, balance, reason, timestamp }
3 console.log(`+${event.points} pts → balance: ${event.balance}`);
4});
5
6oxinion.rewards.listen('redeemed', (event) => {
7 // RewardsRedeemedEvent: { userId, rewardId, pointsSpent, balance, timestamp }
8 console.log(`Redeemed ${event.rewardId}, spent ${event.pointsSpent} pts`);
9});
10
11oxinion.rewards.listen('tier_changed', (event) => {
12 console.log(`New tier: ${event.tier.name}`);
13});
Methods
rewards.getBalance({ userId })
Returns { balance: number }.
rewards.issue({ userId, points, reason, metadata? })
Issue points to a user. Requires sk_ key. Returns void.
rewards.redeem({ userId, rewardId })
Mark a reward as redeemed. Returns void.
rewards.listRewards()
List available rewards with their pointCost.
rewards.tiers.getCurrent({ userId })
Get the user's current tier and progress to the next.
rewards.tiers.list()
List all configured tiers.
rewards.listen(event, handler)
Events: issued | redeemed | tier_changed.
