How tier membership is computed from a customer’s XP balance, why it can move in both directions, and what changes when it does.
A tier is a rule you define under your tenant: a name and a minimum XP threshold, with optional benefits text, an accent colour and an icon. A customer is in a tier when their XP balance has reached its threshold.
Nothing writes a tier onto a customer. The tier a customer is in is the one whose threshold is the highest at or below their current balance, and that tier’s band runs up to the next higher threshold. The balance it is computed from is the on-chain one, summed across the wallets KINTRA manages for the customer, which is the same number a balance read answers. Two things follow from that, and both catch an integration that assumed a stored membership. Membership moves when the balance moves, which is when the chain work settles. An earn or a redemption is accepted and queued, and the balance changes when the mint or the burn is indexed. A customer does not cross a threshold at the moment your write returns.
Membership can move down. Eligibility is evaluated against the current balance rather than against a lifetime total, so a redemption that takes a customer below a threshold they had passed takes them out of that tier.
Under one tenant no two tiers may share a name, and no two may share a threshold. A duplicate name returns 409 TIER_DUPLICATE_NAME and a duplicate threshold returns 409 TIER_DUPLICATE_THRESHOLD, on a create and on an update alike. That is worth relying on: your thresholds are distinct, so their order is total and exactly one of them is the highest a given balance has reached. Creating a tier and updating one are both writes that require X-Idempotency-Key. A threshold comes back as a string on a read and is sent as a whole number on a write, which is the same split XP amounts have.
GET /gateway/customers/{userId}/tier/{tierId}/eligibility answers data.eligible for one tier: true when the customer’s balance is at or above that tier’s threshold. A tier id that is not yours returns 404 TIER_NOT_FOUND. No operation answers which tier a customer is in. To show a tier, read your tiers with GET /gateway/tiers, read the customer’s balance, and take the highest threshold at or below it. That is the same computation the platform runs, on the same two inputs. Give that comparison a tie rule. The duplicate-threshold refusal is a check the API runs before the write rather than a constraint the database holds, so two tiers at one threshold is a state your tooling can reach by creating both at once. If your list ever comes back with two, pick between them on a stable field such as the tier id and use the same rule everywhere you show a tier, rather than taking whichever the list happened to return first.
Inside KINTRA a tier move changes one thing: which rewards the customer can redeem. A reward carrying a minimum tier is refused with 403 REWARD_TIER_LOCKED while the balance sits below that tier’s threshold, and the cost is never compared when it does. Everything else a tier means is yours. The benefits description, the colour and the icon are fields you fill in and render, and the platform stores them without acting on them. There is no moment at which the platform records a customer crossing a threshold, because there is no membership record to write. A product that reacts to a tier change computes the tier when it needs it and compares that against what it last showed.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"KINTRA","colors":{"primary":"#35cbff","light":"#5be7ff","dark":"#0b7fa3"},"logo":{"light":"https://mintcdn.com/kintra/aV869_4X610yKJzW/logo/light.png?fit=max\u0026auto=format\u0026n=aV869_4X610yKJzW\u0026q=85\u0026s=d55bc842096a5d67e57c9ab099d58762","dark":"https://mintcdn.com/kintra/aV869_4X610yKJzW/logo/dark.png?fit=max\u0026auto=format\u0026n=aV869_4X610yKJzW\u0026q=85\u0026s=e0a69c1f9fff02d0cacd13175c0b4336"},"favicon":"https://mintcdn.com/kintra/aV869_4X610yKJzW/favicon.ico?fit=max\u0026auto=format\u0026n=aV869_4X610yKJzW\u0026q=85\u0026s=136dbc7fc4ffe42622617d330e1d8f34","api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","javascript","python"],"prefill":true,"autogenerate":true}},"appearance":{"default":"dark","strict":true},"background":{"color":{"dark":"#121212"}},"fonts":{"heading":{"family":"Plus Jakarta Sans"},"body":{"family":"Plus Jakarta Sans"}},"banner":{"content":"Production environment","dismissible":false},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kintra","hasAudioNarration":false,"actualSubdomain":"kintra","customDomains":["docs.kintra.io"],"gitSource":{"type":"github","owner":"marco-pellar","repo":"kintra-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a82feba3ea465de84fb99ea","collectionId":"93576bd7-eee2-4565-b6b0-ced101e57af4","liveDeploymentHistoryId":"6a82feba3ea465de84fb99ea","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a82feba3ea465de84fb99ea:success","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"API reference","count":94},{"language":"default","tag":"Portal API","count":59},{"language":"default","tag":"Gateway API","count":34},{"language":"default","tag":"Customers","count":24},{"language":"default","tag":"Documentation","count":13},{"language":"default","tag":"Rewards","count":11},{"language":"default","tag":"Tiers","count":11},{"language":"default","tag":"Analytics","count":10},{"language":"default","tag":"Cohorts","count":7},{"language":"default","tag":"Concepts","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--kintra-code-bg:#0e0e0e;--kintra-code-surface:rgba(255, 255, 255, 0.04);--kintra-code-stroke:rgba(255, 255, 255, 0.08)}pre{background-color:var(--kintra-code-bg);border:1px solid var(--kintra-code-stroke);border-radius:12px}pre code{background-color:transparent;border:0}:not(pre)>code{background-color:var(--kintra-code-surface);border:1px solid var(--kintra-code-stroke);border-radius:6px}"}],"page":{"pagePath":"concepts/tiers","slug":"/concepts/tiers","pageMetadata":{"title":"Tiers","description":"How tier membership is computed from a customer's XP balance, why it can move in both directions, and what changes when it does.","href":"/concepts/tiers"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How tier membership is computed from a customer’s XP balance, why it can move in both directions, and what changes when it does.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`A tier is a rule you define under your tenant: a name and a minimum XP threshold, with optional benefits text, an accent colour and an icon. A customer is in a tier when their XP balance has reached its threshold. `}),`\n`,_jsx(Heading,{level:`2`,id:`membership-is-computed-not-stored`,children:`Membership is computed, not stored`}),`\n`,_jsx(_components.p,{children:`Nothing writes a tier onto a customer. The tier a customer is in is the one whose threshold is the highest at or below their current balance, and that tier’s band runs up to the next higher threshold. `}),`\n`,_jsx(_components.p,{children:`The balance it is computed from is the on-chain one, summed across the wallets KINTRA manages for the customer, which is the same number a balance read answers. `}),`\n`,_jsx(_components.p,{children:`Two things follow from that, and both catch an integration that assumed a stored membership. `}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Membership moves when the balance moves, which is when the chain work settles.`}),` An earn or a redemption is accepted and queued, and the balance changes when the mint or the burn is indexed. A customer does not cross a threshold at the moment your write returns. `]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Membership can move down.`}),` Eligibility is evaluated against the current balance rather than against a lifetime total, so a redemption that takes a customer below a threshold they had passed takes them out of that tier. `]})}),`\n`,_jsx(Heading,{level:`2`,id:`thresholds-are-distinct-and-ordered`,children:`Thresholds are distinct and ordered`}),`\n`,_jsxs(_components.p,{children:[`Under one tenant no two tiers may share a name, and no two may share a threshold. A duplicate name returns 409 `,_jsx(_components.code,{children:`TIER_DUPLICATE_NAME`}),` and a duplicate threshold returns 409 `,_jsx(_components.code,{children:`TIER_DUPLICATE_THRESHOLD`}),`, on a create and on an update alike. `]}),`\n`,_jsx(_components.p,{children:`That is worth relying on: your thresholds are distinct, so their order is total and exactly one of them is the highest a given balance has reached. `}),`\n`,_jsxs(_components.p,{children:[`Creating a tier and updating one are both writes that require `,_jsx(_components.code,{children:`X-Idempotency-Key`}),`. `]}),`\n`,_jsx(_components.p,{children:`A threshold comes back as a string on a read and is sent as a whole number on a write, which is the same split XP amounts have. `}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-api-answers-about-a-tier`,children:`What the API answers about a tier`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /gateway/customers/{userId}/tier/{tierId}/eligibility`}),` answers `,_jsx(_components.code,{children:`data.eligible`}),` for one tier: true when the customer’s balance is at or above that tier’s threshold. A tier id that is not yours returns 404 `,_jsx(_components.code,{children:`TIER_NOT_FOUND`}),`. `]}),`\n`,_jsxs(_components.p,{children:[`No operation answers which tier a customer is in. To show a tier, read your tiers with `,_jsx(_components.code,{children:`GET /gateway/tiers`}),`, read the customer’s balance, and take the highest threshold at or below it. That is the same computation the platform runs, on the same two inputs. `]}),`\n`,_jsx(_components.p,{children:`Give that comparison a tie rule. The duplicate-threshold refusal is a check the API runs before the write rather than a constraint the database holds, so two tiers at one threshold is a state your tooling can reach by creating both at once. If your list ever comes back with two, pick between them on a stable field such as the tier id and use the same rule everywhere you show a tier, rather than taking whichever the list happened to return first. `}),`\n`,_jsx(Heading,{level:`2`,id:`what-changes-when-a-customer-moves`,children:`What changes when a customer moves`}),`\n`,_jsxs(_components.p,{children:[`Inside KINTRA a tier move changes one thing: which rewards the customer can redeem. A reward carrying a minimum tier is refused with 403 `,_jsx(_components.code,{children:`REWARD_TIER_LOCKED`}),` while the balance sits below that tier’s threshold, and the cost is never compared when it does. `]}),`\n`,_jsx(_components.p,{children:`Everything else a tier means is yours. The benefits description, the colour and the icon are fields you fill in and render, and the platform stores them without acting on them. `}),`\n`,_jsx(_components.p,{children:`There is no moment at which the platform records a customer crossing a threshold, because there is no membership record to write. A product that reacts to a tier change computes the tier when it needs it and compares that against what it last showed. `}),`\n`,_jsx(Heading,{level:`2`,id:`where-to-go-next`,children:`Where to go next`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/xp-and-the-ledger`,children:`XP and the ledger`}),` for the balance every threshold is compared against.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/rewards-and-redemptions`,children:`Rewards and redemptions`}),` for the tier gate on a reward and the refusal it produces.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/onchain-xp`,children:`On-chain XP`}),` for why a balance changes when it does.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/customers`,children:`Customers`}),` for the record a tier is computed for.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Tiers","description":"How tier membership is computed from a customer's XP balance, why it can move in both directions, and what changes when it does.","href":"/concepts/tiers"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Membership is computed, not stored","slug":"membership-is-computed-not-stored","depth":2,"children":[]},{"title":"Thresholds are distinct and ordered","slug":"thresholds-are-distinct-and-ordered","depth":2,"children":[]},{"title":"What the API answers about a tier","slug":"what-the-api-answers-about-a-tier","depth":2,"children":[]},{"title":"What changes when a customer moves","slug":"what-changes-when-a-customer-moves","depth":2,"children":[]},{"title":"Where to go next","slug":"where-to-go-next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"kintra","siteName":"KINTRA","title":"Tiers - KINTRA","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-17T12:30:09.651Z","originalFileLocation":"concepts/tiers.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"dark\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How tier membership is computed from a customer\u0026#x27;s XP balance, why it can move in both directions, and what changes when it does.\">\u003cmeta data-mint-head name=\"application-name\" content=\"KINTRA\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tiers - KINTRA\">\u003cmeta data-mint-head property=\"og:description\" content=\"How tier membership is computed from a customer\u0026#x27;s XP balance, why it can move in both directions, and what changes when it does.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"KINTRA\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kintra.io/concepts/tiers\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kintra.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Tiers\u0026amp;description=How+tier+membership+is+computed+from+a+customer%27s+XP+balance%2C+why+it+can+move+in+both+directions%2C+and+what+changes+when+it+does.\u0026amp;theme=7168baa81e08787f570d323b\u0026amp;signature=6149c1bf6becd251cb063272bedb5824f02d1d2ed506d9dd84fa277007a0662b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Tiers - KINTRA\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How tier membership is computed from a customer\u0026#x27;s XP balance, why it can move in both directions, and what changes when it does.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kintra.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Tiers\u0026amp;description=How+tier+membership+is+computed+from+a+customer%27s+XP+balance%2C+why+it+can+move+in+both+directions%2C+and+what+changes+when+it+does.\u0026amp;theme=7168baa81e08787f570d323b\u0026amp;signature=6149c1bf6becd251cb063272bedb5824f02d1d2ed506d9dd84fa277007a0662b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kintra/ZtFEHcUbLmdYiJ-1/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"KINTRA\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#35cbff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kintra.io/concepts/tiers\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/tiers.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kintra.io/#organization\",\"name\":\"KINTRA\",\"url\":\"https://docs.kintra.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kintra/aV869_4X610yKJzW/logo/light.png?fit=max\u0026auto=format\u0026n=aV869_4X610yKJzW\u0026q=85\u0026s=d55bc842096a5d67e57c9ab099d58762\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kintra.io#website\",\"name\":\"KINTRA\",\"url\":\"https://docs.kintra.io\",\"publisher\":{\"@id\":\"https://docs.kintra.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kintra.io/concepts/tiers#webpage\",\"url\":\"https://docs.kintra.io/concepts/tiers\",\"name\":\"Tiers\",\"description\":\"How tier membership is computed from a customer's XP balance, why it can move in both directions, and what changes when it does.\",\"dateModified\":\"2026-08-17T12:30:09.651Z\",\"isPartOf\":{\"@id\":\"https://docs.kintra.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kintra.io/concepts/tiers#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kintra.io/concepts/tiers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.kintra.io/concepts/tenants\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tiers\",\"item\":\"https://docs.kintra.io/concepts/tiers\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kintra.io/concepts/tiers#article\",\"headline\":\"Tiers\",\"name\":\"Tiers\",\"description\":\"How tier membership is computed from a customer's XP balance, why it can move in both directions, and what changes when it does.\",\"url\":\"https://docs.kintra.io/concepts/tiers\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kintra.io/concepts/tiers#webpage\"},\"dateModified\":\"2026-08-17T12:30:09.651Z\",\"publisher\":{\"@id\":\"https://docs.kintra.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kintra.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"KINTRA\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"KINTRA","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"KINTRA","href":""},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"},{"title":"Request conventions","href":"/conventions"},{"title":"Architecture","href":"/architecture"}]},{"group":"Concepts","pages":[{"title":"Tenants","href":"/concepts/tenants"},{"title":"Customers","href":"/concepts/customers"},{"title":"XP and the ledger","description":"XP as a ledger of signed integer movements, what a balance is, and what an earn and a redemption actually do.","href":"/concepts/xp-and-the-ledger"},{"title":"Tiers","href":"/concepts/tiers"},{"title":"Rewards and redemptions","description":"The lifecycle from a reward you publish to a redemption that has settled, with the refusals along the way and what each record means.","href":"/concepts/rewards-and-redemptions"},{"title":"On-chain XP","href":"/concepts/onchain-xp"}]},{"group":"Walkthroughs","pages":[{"title":"Onboard a customer","href":"/walkthroughs/onboard-a-customer"},{"title":"Award and redeem XP","href":"/walkthroughs/award-and-redeem-xp"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/overview"}]}]},"title":"Tiers - KINTRA","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}