Skip to content

Products & Features

Define what you sell. Create products with one or more variants, attach reusable features for entitlement-based access control.

Proyecta Commerce uses three concepts: products, variants, and features.

  • Product — the thing you sell (e.g. “Pro Plan”, “T-shirt”, “Strategy Call”)
  • Variant — a pricing tier or configuration of a product (e.g. “Pro Monthly $29”, “Pro Annual $290”, “T-shirt – Large”)
  • Feature — a reusable entitlement key your app checks at runtime (e.g. pro_features, unlimited_projects, api_access)

A product can have multiple variants. A product also has one or more resources attached — usually features — that grant access when a customer subscribes.

In Dashboard > Commerce > Products, click Create product (or ask the AI: "Create a Pro plan at $29/month and a Business plan at $99/month."). Each product needs:

  • A display name (e.g. “Pro”)
  • At least one variant

Each variant carries its own pricing:

FieldNotes
nameDisplay label for the variant (“Monthly”, “Annual”, “Large”)
currencyThree-letter ISO code — USD, EUR, GBP, JPY, BRL, MXN, INR… (the SDK supports 130+)
unit_amountPrice in the smallest currency unit (cents). 2900 = $29.00
recurringOptional — { interval: 'day' | 'week' | 'month' | 'year', interval_count?: number }. Omit for one-time prices.
is_defaultMark one variant as the default checkout option
mediaAttach images or videos by CDN file ID (see Files)

Pricing is immutable. Once a variant is created, its price can’t be changed — create a new variant instead. This protects existing subscribers from accidental price changes.

Features are the access-control primitive. Create a feature once, then attach it to one or more products.

// Create a feature
const pro = await proyecta.commerce.features.create({
name: 'Pro features',
description: 'Unlocks the Pro tier capabilities',
// optional custom id, must start with 'feat_'
});

When you create a product, you attach features to it via “resources”. Customers who subscribe to a product gain access to every feature attached to it.

Then, in your app, check whether a customer has access:

const { has_access } = await proyecta.commerce.check({
customer_id: 'cus_123',
resource_id: pro.id,
});

This is how you gate Pro-only pages, API endpoints, or features in your app code.

SaaS subscriptions

Create products: Free ($0/month), Pro ($29/month, $290/year), Business ($99/month, $990/year).
Attach a 'pro_features' feature to Pro and Business so I can gate access in my code.

Physical goods

Create a T-shirt product with three variants: Small, Medium, Large at $25 each.

Digital goods

Create a course product with a single one-time variant at $149.

Donations

Create a donation product with three variants: $25, $50, $100 — all one-time.

Proyecta Commerce does not currently track inventory for physical products. If you sell stocked items, manage stock counts in your app’s database and check them in your checkout flow.

  • Checkout field customization — collect additional info from buyers
  • Pay-what-you-want pricing
  • Built-in inventory tracking for physical products