> ## Documentation Index
> Fetch the complete documentation index at: https://docs.priceos.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

At its core, PriceOS answers one question:

> "What features does this person have access to?"

Instead of hard coding feature access and pricing logic in your application, PriceOS gives you a single source of truth.

***

## How it Works

By integrating with your Stripe account, we make the mapping between your customers and feature access effortless.

1. <b>Integrate Stripe</b> - We import and sync your products, prices, and customers
2. <b>Create features</b> - e.g. Team Seats, Priority Support, etc.
3. <b>Define feature access</b> - In your imported [Stripe products](/products-overview#stripe-products) or [custom products](/products-overview#custom-products)
4. <b>Evaluate feature access</b> - In your application using our [API or SDK](/backend-integration).

That's it. We'll handle the rest.

Since we integrate with your Stripe account we'll know which customers are subscribed to which products for which you define feature access.

export const OverviewDiagramReact = () => <div style={{
  marginTop: "1.5rem",
  borderRadius: "16px",
  border: "1px solid #E5E7EB",
  overflow: "hidden",
  background: "#F9FAFB"
}}>
    <svg viewBox="0 0 1200 740" width="100%" height="100%" role="img" aria-label="Features, products, Stripe sync, and customers">
      <defs>
        <pattern id="grid" width="24" height="24" patternUnits="userSpaceOnUse">
          <path d="M 24 0 L 0 0 0 24" fill="none" stroke="#E5E7EB" strokeWidth="1" />
        </pattern>
        <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
          <feDropShadow dx="0" dy="4" stdDeviation="6" floodColor="#111827" floodOpacity="0.12" />
        </filter>
      </defs>

      <rect width="1200" height="740" fill="url(#grid)" />

      <text x="120" y="80" fontSize="22" fontWeight="600" fill="#111827">
        Features
      </text>
      <text x="520" y="80" fontSize="22" fontWeight="600" fill="#111827">
        Products
      </text>
      <text x="940" y="80" fontSize="22" fontWeight="600" fill="#111827">
        Customers
      </text>

      <g filter="url(#shadow)">
        <rect x="730" y="40" width="170" height="100" rx="12" fill="#EEF2FF" stroke="#C7D2FE" />
        <text x="815" y="75" fontSize="20" fontWeight="700" fill="#4338CA" textAnchor="middle">
          Stripe
        </text>
        <text x="815" y="99" fontSize="13" fill="#3730A3" textAnchor="middle">
          Products + Subscriptions
        </text>
      </g>

      <g filter="url(#shadow)">
        <rect x="700" y="230" width="205" height="90" rx="10" fill="#FFFBEB" stroke="#FCD34D" />
        <text x="802" y="257" fontSize="14" fontWeight="700" fill="#92400E" textAnchor="middle">
          Feature access definitions
        </text>
        <text x="802" y="279" fontSize="12" fill="#92400E" textAnchor="middle">
          live on products
        </text>
        <text x="802" y="299" fontSize="12" fill="#92400E" textAnchor="middle">
          (middle column)
        </text>
      </g>

      <g filter="url(#shadow)">
        <rect x="80" y="150" width="200" height="120" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <line x1="80" y1="190" x2="280" y2="190" stroke="#E5E7EB" />
        <line x1="80" y1="230" x2="280" y2="230" stroke="#E5E7EB" />
        <text x="140" y="178" fontSize="16" fill="#111827">Credits</text>
        <text x="130" y="218" fontSize="16" fill="#111827">Team Seats</text>
        <text x="120" y="258" fontSize="16" fill="#111827">Priority Support</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="440" y="130" width="220" height="150" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <text x="550" y="158" fontSize="16" fontWeight="600" fill="#111827" textAnchor="middle">Basic</text>
        <line x1="440" y1="182" x2="660" y2="182" stroke="#E5E7EB" />
        <line x1="440" y1="216" x2="660" y2="216" stroke="#E5E7EB" />
        <line x1="440" y1="250" x2="660" y2="250" stroke="#E5E7EB" />
        <text x="550" y="205" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">1000</tspan> credits
        </text>
        <text x="550" y="239" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">1</tspan> Team seat
        </text>
        <text x="550" y="273" fontSize="14" fill="#111827" textAnchor="middle">x Priority Support</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="440" y="290" width="220" height="150" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <text x="550" y="318" fontSize="16" fontWeight="600" fill="#111827" textAnchor="middle">Pro</text>
        <line x1="440" y1="342" x2="660" y2="342" stroke="#E5E7EB" />
        <line x1="440" y1="376" x2="660" y2="376" stroke="#E5E7EB" />
        <line x1="440" y1="410" x2="660" y2="410" stroke="#E5E7EB" />
        <text x="550" y="365" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">5000</tspan> credits
        </text>
        <text x="550" y="399" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">5</tspan> Team seats
        </text>
        <text x="550" y="433" fontSize="14" fill="#111827" textAnchor="middle">x Priority Support</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="440" y="450" width="220" height="150" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <text x="550" y="478" fontSize="16" fontWeight="600" fill="#111827" textAnchor="middle">Enterprise</text>
        <line x1="440" y1="502" x2="660" y2="502" stroke="#E5E7EB" />
        <line x1="440" y1="536" x2="660" y2="536" stroke="#E5E7EB" />
        <line x1="440" y1="570" x2="660" y2="570" stroke="#E5E7EB" />
        <text x="550" y="525" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">5000</tspan> credits
        </text>
        <text x="550" y="559" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">5</tspan> Team seats
        </text>
        <text x="550" y="593" fontSize="14" fill="#111827" textAnchor="middle">Priority Support</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="440" y="630" width="220" height="70" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <text x="550" y="658" fontSize="16" fontWeight="600" fill="#111827" textAnchor="middle">Extra credits</text>
        <text x="550" y="682" fontSize="14" fill="#111827" textAnchor="middle">
          <tspan fontWeight="700">1000</tspan> credits
        </text>
      </g>

      <g filter="url(#shadow)">
        <rect x="860" y="170" width="220" height="50" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <circle cx="885" cy="195" r="10" fill="#6B7280" />
        <circle cx="905" cy="195" r="8" fill="#9CA3AF" />
        <text x="930" y="200" fontSize="14" fill="#111827">Jim Bob</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="860" y="300" width="220" height="50" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <circle cx="885" cy="325" r="10" fill="#6B7280" />
        <circle cx="905" cy="325" r="8" fill="#9CA3AF" />
        <text x="930" y="330" fontSize="14" fill="#111827">Sam Altman</text>
      </g>

      <g filter="url(#shadow)">
        <rect x="860" y="420" width="220" height="50" rx="10" fill="#FFFFFF" stroke="#D1D5DB" />
        <circle cx="885" cy="445" r="10" fill="#6B7280" />
        <circle cx="905" cy="445" r="8" fill="#9CA3AF" />
        <text x="930" y="450" fontSize="14" fill="#111827">Acme Inc.</text>
      </g>

      <path d="M 280 210 C 340 210, 360 200, 440 200" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 280 210 C 340 260, 360 360, 440 360" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 280 210 C 340 340, 360 525, 440 525" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 280 230 C 340 430, 360 665, 440 665" stroke="#6B7280" strokeWidth="2" fill="none" />

      <path d="M 660 200 C 740 210, 800 200, 860 195" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 660 360 C 740 360, 800 340, 860 325" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 660 525 C 740 505, 800 470, 860 445" stroke="#6B7280" strokeWidth="2" fill="none" />
      <path d="M 660 665 C 740 600, 800 420, 860 325" stroke="#6B7280" strokeWidth="2" fill="none" />

      <path d="M 700 275 C 685 295, 675 325, 660 360" stroke="#D97706" strokeWidth="2" fill="none" />
      <path d="M 660 360 L 668 350" stroke="#D97706" strokeWidth="2" fill="none" />
      <path d="M 660 360 L 671 360" stroke="#D97706" strokeWidth="2" fill="none" />

      <path d="M 730 90 C 700 130, 680 170, 660 200" stroke="#4F46E5" strokeWidth="2" strokeDasharray="6 6" fill="none" />
      <path d="M 900 90 C 920 130, 940 170, 960 195" stroke="#4F46E5" strokeWidth="2" strokeDasharray="6 6" fill="none" />
    </svg>
  </div>;

<OverviewDiagramReact />

For customers that exist outside of Stripe, you can use [Custom products](/products-overview#custom-products).

***

## How feature access is evaluated

When PriceOS evaluates feature access for a customer, it applies this order:

<Steps>
  <Step title="Determine the customer's active products">
    For Stripe customers: read active subscriptions, then map subscription prices to products.

    Add any manually assigned custom products.

    If no products are active, use the [default custom product](/custom-products#default-custom-products) (if one is configured).
  </Step>

  <Step title="Merge feature access from those products">
    <b><a href="/creating-features#boolean-features">Boolean features</a></b>: `true` if any active product grants access.

    <b><a href="/creating-features#limit-features">Limit features</a></b>: add limits<sup>\*</sup> across active products.

    <div><small>\* - If customer has multiple quantities of a Stripe product, multiply limit by quantity first. </small></div>
  </Step>

  <Step title="Apply customer overrides">
    [Customer overrides](/creating-overrides) are applied on top of product-based access for that specific customer.
  </Step>

  <Step title="Apply bonuses">
    [Bonuses](/granting-bonuses) are returned in a separate field ([`bonusRemaining`](/api-reference/endpoint/feature-access#response-200-usage-bonus-remaining)) and do not get tacked on the [`limit`](/api-reference/endpoint/feature-access#response-200-limit) field. In the API they only factor into the [`hasReachedLimit`](/api-reference/endpoint/feature-access#response-200-usage-has-reached-limit) field.
  </Step>
</Steps>
