Skip to main content
CashCat Pro unlocks premium features and helps support continued development of the app. While CashCat’s core budgeting features are free, Pro subscribers get access to advanced functionality.

Subscription status

CashCat Pro subscription status is managed through the database:
export type SubscriptionStatus =
  | 'active'
  | 'on_trial'
  | 'past_due'
  | 'unpaid'
  | 'cancelled'
  | 'expired'
  | 'paused'
  | 'inactive';

Active statuses

These statuses grant access to Pro features:
  • active — paid subscription in good standing
  • on_trial — free trial period (before first payment)
Founders and internal testers have permanent Pro access regardless of subscription status.

Checking subscription

The checkSubscription function verifies Pro access:
import { checkSubscription } from '@/lib/subscription';

const { isActive, status, variantId, renewsAt, endsAt } = 
  await checkSubscription(userId);

if (isActive) {
  // Grant Pro features
}

Server-side only

The checkSubscription function uses the admin client to bypass RLS. Only call from server-side code (Server Components, API routes).

Response fields

  • isActive — boolean indicating Pro access
  • status — current subscription status
  • variantId — product variant ID (for different plan tiers)
  • renewsAt — next renewal date (ISO string)
  • endsAt — cancellation/expiration date (ISO string)

Forever Pro list

Certain email addresses have permanent Pro access:
const FOREVER_PRO_EMAILS = new Set([
  '[email protected]',
  '[email protected]',
]);
These users:
  • Always return isActive: true
  • Don’t need active subscription in database
  • Used for founders and core team members

Subscription data model

Subscriptions are stored in the subscriptions table:
CREATE TABLE subscriptions (
  user_id UUID REFERENCES auth.users(id),
  status TEXT,
  variant_id TEXT,
  renews_at TIMESTAMP,
  ends_at TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

Database queries

The subscription checker:
  1. Fetches user email from auth.users
  2. Checks against FOREVER_PRO_EMAILS
  3. Queries subscriptions table for user_id
  4. Orders by created_at DESC to get most recent
  5. Returns single subscription record

Pro features

While specific Pro features are still being developed, the infrastructure supports:

Planned Pro features

Advanced reports

Detailed spending reports, trends, and forecasting

Custom categories

Unlimited categories and groups

Multi-currency

Support for multiple currencies and exchange rates

Export data

Export transactions to CSV, Excel, PDF

Bank sync

Automatic transaction imports via OpenBanking

Shared budgets

Collaborate with partner or family members

Priority support

Faster response times for questions and issues

Early access

Try new features before general release

Early access program

CashCat is currently in early access for testers:
  • Free during beta — no subscription required while testing
  • Founder pricing — early users get special lifetime pricing
  • Feedback priority — testers help shape development
  • Discord community — join discussions at https://discord.gg/C9mYnEdAQA
Subscription features are being developed. Current testers have access to all features while the app is in early access.

Subscription management

Subscription lifecycle is managed through:

Creation

  • User signs up for Pro via payment provider
  • Webhook creates record in subscriptions table
  • Status set to on_trial or active
  • User immediately gains Pro access

Renewal

  • Payment provider processes renewal automatically
  • Webhook updates renews_at date
  • Status remains active
  • No interruption in service

Cancellation

  • User cancels via payment provider
  • Webhook updates status to cancelled
  • ends_at set to end of billing period
  • Pro access continues until ends_at

Expiration

  • When ends_at is reached
  • Status changes to expired
  • isActive returns false
  • User loses Pro features

Implementation example

Protecting a feature behind Pro:
import { checkSubscription } from '@/lib/subscription';

export default async function AdvancedReportsPage() {
  const userId = await getCurrentUserId();
  const { isActive } = await checkSubscription(userId);

  if (!isActive) {
    return <ProUpgradePrompt feature="Advanced Reports" />;
  }

  return <AdvancedReports />;
}

Client-side checks

For client components, pass subscription status from server:
// Server Component
const subscription = await checkSubscription(userId);

return (
  <ClientComponent isProUser={subscription.isActive} />
);
// Client Component
function ClientComponent({ isProUser }: { isProUser: boolean }) {
  if (!isProUser) {
    return <LockedFeature />;
  }
  return <ProFeature />;
}

Pricing

Pricing details will be announced when CashCat exits early access. Expected tiers:
  • Free — core budgeting features, unlimited transactions
  • Pro — advanced features, priority support
  • Lifetime — one-time payment for permanent Pro access
Founders and early testers will receive special pricing when subscriptions launch.

Philosophy

CashCat’s subscription model follows these principles:
  • Core features free — zero-based budgeting always free
  • No ads — subscription revenue, not advertisers
  • No tracking — your data stays private
  • Fair pricing — affordable for everyone
  • Transparent — clear feature differences between tiers
The Pro subscription supports ongoing development while keeping essential budgeting accessible to all.

Build docs developers (and LLMs) love