Tiers & status

Reward your best customers with status levels.

View as MarkdownInstall skills

Tiers grant escalating benefits as members qualify through spend or points. VINR tracks qualification, promotion, and demotion automatically, emitting events at every transition so your app and your member communications stay in sync.

How tiers fit a programAsk

A program holds an ordered list of tiers, each with a numeric rank (0 is the entry tier). A member always sits in exactly one tier. VINR continuously evaluates each member's qualifying value against tier thresholds and moves them up or down — you never write promotion logic yourself.

ConceptMeaning
tierA status level: a name, a rank, a threshold, and benefits.
Qualifying valueThe metric measured against thresholds (points, spend, or a custom counter).
Tier periodThe rolling or fixed window over which qualifying value accumulates.
Promotion / demotionAutomatic transitions when qualifying value crosses a threshold.

Tiers are status, not a balance. A member can spend their entire points balance on rewards and keep their Gold tier — qualification and spendable points are tracked separately.

Defining tiersAsk

Define tiers on the program, lowest rank first. Each tier names a threshold expressed in the program's qualifying metric.

import { Vinr } from '@vinr/sdk';
const vinr = new Vinr({ secretKey: process.env.VINR_SECRET_KEY });

await vinr.loyalty.programs.update('prog_default', {
  tierConfig: {
    qualifyOn: 'spend',          // 'spend' | 'points' | 'custom'
    period: { type: 'rolling', months: 12 },
    tiers: [
      { name: 'Member', rank: 0, threshold: 0 },
      { name: 'Silver', rank: 1, threshold: 50000 },   // EUR 500 spend
      { name: 'Gold',   rank: 2, threshold: 150000 },  // EUR 1,500
      { name: 'Platinum', rank: 3, threshold: 500000 },// EUR 5,000
    ],
  },
});

Thresholds use the same minor-unit integers as everywhere else in VINR when qualifyOn is spend (50000 = EUR 500.00), or raw point counts when qualifyOn is points.

Prop

Type

Qualification criteriaAsk

The qualifyOn setting decides what counts toward status:

qualifyOnQualifying valueTypical use
spendSum of completed payment amounts in the period.Spend-based status (airlines, retail).
pointsPoints earned in the period (not balance).Points-as-status programs.
customA counter you increment via the API.Visits, nights, or any domain metric.

For custom, advance a member's qualifying value yourself — for example, one credit per completed stay:

await vinr.loyalty.accounts.recordQualifyingActivity('loy_abc123', {
  amount: 1,                       // one qualifying unit
  reason: 'stay.completed',
  reference: 'pay_9f2a',
});

When qualifyOn is points, earned points drive status, not the redeemable balance. Redeeming or expiring points never demotes a member within the active period.

Promotion & demotionAsk

VINR re-evaluates a member whenever their qualifying value changes — after a payment.completed, a points award, or a recorded custom activity. Transitions are immediate and idempotent.

Qualifying value updates

A payment completes or a custom activity is recorded. Engagement recomputes the member's qualifying value for the current period.

Threshold crossed upward

If the value now meets a higher tier's threshold, the member is promoted at once. VINR emits loyalty.tier.changed with direction: "up".

Period closes below threshold

At period close (or on each rolling recalculation), if accumulated value falls below the current tier's threshold, the member is demoted by one rank and loyalty.tier.changed fires with direction: "down".

Subscribe to the transition event to trigger member communications or unlock app features:

const event = vinr.webhooks.verify(payload, signature); // x-vinr-signature

if (event.type === 'loyalty.tier.changed' && event.data.direction === 'up') {
  await sendCongratsEmail(event.data.account, event.data.toTier);
}

Tier benefitsAsk

Benefits are configuration, not code — VINR applies them automatically when a member acts. Common benefits:

  • Earn multipliers — Gold earns 1.5x points per euro. Stacks with earning rules.
  • Exclusive rewards — gate catalog items to a minimum rank so only Platinum can redeem them.
  • Reduced redemption cost — discount the points price of rewards for higher tiers.

Read a member's current tier and active benefits at any time:

const member = await vinr.loyalty.accounts.retrieve('loy_abc123');
console.log(member.tier.name);            // "Gold"
console.log(member.tier.earnMultiplier);  // 1.5
console.log(member.qualifyingValue);      // 162000 (EUR 1,620 this period)

Tier periods & resetsAsk

The period controls how qualifying value accumulates and when it resets.

period.typeBehaviour
rollingA moving window (e.g. trailing 12 months). Status reflects recent activity continuously.
calendarA fixed window (e.g. each calendar year) that resets all members at once on a reset date.

Many programs grant a grace period after demotion. Set softLanding: true so a demoted member drops only one rank per period rather than falling straight to entry level — a common retention practice.

A reset re-baselines qualifying value to zero but never touches a member's redeemable points balance. To preview where members stand before a calendar reset, query qualification without waiting for the period to close:

const standings = await vinr.loyalty.accounts.list({
  program: 'prog_default',
  tier: 'Gold',
  atRisk: true,          // below threshold for next period
});

Next stepsAsk

Was this page helpful?
Edit on GitHub

Last updated on

On this page