Intry

Billing

Stripe subscriptions, plan tiers, and trial logic (ADR-005).

Overview

Intry uses direct Stripe — no Clerk Billing. Stripe is the source of truth; Clerk org publicMetadata is the read cache for plan tier in middleware (target).

Deep runbook: docs/TENANT_BILLING.md. Pricing spec: Confluence Pricing & Packaging.

Plan tiers

TierRateKey features
Core$7/unit/moOnboarding, call feed, portal, basic notifications
Standard$9–10/unit/mo + $99/propertyDeliveryScan, Guest Passes, Rolodex, Notification Templates
Pro$12–14/unit/moPortfolio view, Scoped roles, PMS integrations, LPR, Facial recognition

Trial logic

PhaseDurationRate
Phase 1Days 1–30Free (Core only, 75 resident cap)
Phase 2Days 31–90$4/unit
Phase 3Day 91+Full Core rate

Credit card required at trial signup via Stripe SetupIntent.

Data model

LocationFields
TenantstripeCustomerId, billingPlan, billingStatus, planTier
Clerk org publicMetadata (target)plan_tier, stripe_customer_id, stripe_subscription_id, trial_end, billing_unit_count, virtual_number_cap
User.subscriptionPer-user Stripe linkage for B2C flows

After every Stripe webhook, Core should sync DB → Clerk via ClerkBillingSync.syncOrgMetadata() (IN-204). Until fully implemented, middleware may read plan tier from Tenant DB.

Middleware

  • Target: read plan_tier from Clerk session — no DB hit.
  • Fallback: read from Tenant.planTier in DB.
  • Feature gates must not be bypassed — see Tenant.entitlements and plan tier middleware.

Stripe webhooks

PathPurpose
/stripeSubscription lifecycle, invoices

Always verify Stripe-Signature. See docs/STRIPE_WEBHOOKS_SETUP.md.

Admin API

Org billing fields readable on GET /api/admin/tenants/:id/organization. Platform admin only may PATCH billing fields.


Last verified: 2026-06-21 (commit 293c4a7)

On this page