Skip to main content

Entitlements & tier limits

Every feature in LightningHire is gated by an entitlement check. The source of truth is src/lib/entitlements.ts — this page documents the exact numbers shipped in that file. When the code changes, this page is the first thing to update.

The free tier is real — not a 14-day trial or a feature-gated demo. Every paid tier includes a 7-day free trial with no credit card.

Tier summary

TierWho it's forMonthly cost
FreeJob seekers exploring the product$0
ProJob seekers in active interview mode$29 after a 7-day trial
Recruiter FreeSolo recruiters trying the hiring workflow$0
Recruiter ProSolo recruiters and small hiring teamsPaid, see pricing page
BYOKSelf-hosted users with their own OpenAI key$0
CreditsPay-as-you-go ($0.01 / credit)No subscription

Pro, BYOK, and active-credit-balance users bypass all numeric caps. BYOK unlocks full feature access by having valid keys saved in Settings. Credits unlock full access while the balance is above zero.

7-day free trial

Pro includes a 7-day free trial. No credit card required to start. Cancel before the trial ends and you're not charged.

Job seeker limits

Exact values from TIER_LIMITS in src/lib/entitlements.ts. window is the counting window: total = lifetime per account, week = rolling 7 days, day = calendar day (local reset).

FeatureFreeProWindowNotes
Interview sessions10UnlimitedtotalLive-session history.
Mock interviews3UnlimitedweekAI-scored practice.
Job applications20UnlimitedtotalPipeline entries.
Resumes3UnlimitedtotalStored resumes.
Resume tailoring1UnlimitedtotalAI tailoring runs.
Saved resume versions1UnlimitedtotalResume-builder drafts.
Tailor resume to job0UnlimitedtotalHard-gated for free.
Contacts15UnlimitedtotalNetworking CRM.
STAR stories5UnlimitedtotalBehavioural-answer library.
Job searches10UnlimiteddayPer-day search quota.
Analytics1UnlimitedtotalLimited view for free.
Company intel3UnlimitedtotalAI briefings per company.
Email templates3UnlimitedtotalAI-generated templates.
Outreach messages2UnlimitedtotalAI-drafted outreach.
Negotiation coach1UnlimitedtotalNegotiation sessions.
Cover letters2UnlimitedtotalAI-generated letters.
AI actions10UnlimiteddayGlobal daily AI budget.
Deep evaluation1UnlimitedtotalA–F match scoring.
Auto-pipeline1UnlimitedtotalOne-click evaluation runs.
ATS PDF generation1UnlimitedtotalKeyword-optimized PDFs.
Offer comparison1UnlimitedtotalMulti-offer analysis.
AI chat5UnlimiteddayRAG conversations.
Company watch3UnlimitedtotalJob-posting watchers.
Gmail / Calendar0ConnectedtotalHard-gated for free.
Job match3UnlimitedtotalAuthenticated job-match searches.
Mini-coursesFree-tagged onlyAlltotalFree-marked courses always accessible.

What counts as an AI action

Every request that uses the AI engine counts against the daily ai_actions budget: mock-interview generation and scoring, resume creation and tailoring, company intel, negotiation drafts, outreach generation, and live-session coaching.

Browsing the app, adding pipeline entries manually, viewing analytics, and reading help do not count.

Recruiter limits

Recruiters get a different shape: higher session caps for interview-heavy workflows, but job-seeker-only features are zeroed out. Overrides live in RECRUITER_TIER_OVERRIDES.

FeatureRecruiter FreeRecruiter ProNotes
Open roles (requisitions)3UnlimitedPer-account.
Candidates (total)75UnlimitedGlobal pool.
Candidates per role25UnlimitedPer-requisition cap (FREE_CANDIDATES_PER_REQUISITION).
Interview sessions20UnlimitedHigher than seeker default.
AI actions10UnlimitedSame daily budget.
Applications / resumes / stories / job search / negotiate / cover letter / auto-pipeline / offer comparison00Seeker-only features — not available on recruiter accounts.

The per-requisition cap is checked in addition to the global candidate cap. Free recruiters who hit 25 candidates on one role must upgrade or move candidates off that role to add more.

Hard-gated features

A handful of features have freeMax: 0 — no amount of waiting unlocks them on free. Upgrade (or add BYOK keys, or credits) to access.

  • Tailor resume to job — the resume-builder's job-targeted tailoring flow.
  • Google integrations — Gmail inbox triage and Calendar sync.
  • All job-seeker features on recruiter accounts — applications, resumes, stories, job search, negotiation coach, cover letters, auto-pipeline, offer comparison.

The entitlement payload

The client fetches /api/entitlements to render paywalls. The response shape (from EntitlementsPayload in entitlements.ts):

{
isPro: boolean;
isSuperAdmin: boolean;
isByok: boolean;
hasByokKeys: boolean;
hasCredits: boolean;
creditBalance: number;
isSelfHosted: boolean;
role: "free" | "pro" | "super_admin";
userType: "jobseeker" | "recruiter";
subscriptionStatus: string;
currentPeriodEnd: string | null;
features: {
[featureKey]: {
allowed: boolean;
currentUsage: number;
limit: number | null; // null = unlimited
remaining: number;
label: string;
upgradeHint: string;
}
};
}

limit: null means unlimited (Pro, super-admin, BYOK, or credits). allowed: false with remaining: 0 means the user has hit the cap and should see a paywall.

Self-hosted and BYOK

When STRIPE_SECRET_KEY is not set, the app is in self-hosted mode. Paywall copy automatically changes from "Upgrade to Pro…" to "Add your own OpenAI API key in Settings to unlock unlimited access." — BYOK is the upgrade path.

BYOK users get the same effective access as Pro for feature gating. They pay their own model provider directly; LightningHire never routes their traffic.

Credits

Credits are pay-as-you-go. 1 credit = $0.01. Packs:

PackCreditsPrice
Starter100$1.99
Job Seeker500$7.99
Power2,000$24.99

While the credit balance is above zero, the user has full feature access (same as Pro). AI actions deduct credits at call time. Unused credits never expire. Auto-replenish is opt-in under Settings.

Checking access programmatically

Server-side, use checkFeatureAccess(userId, feature):

import { checkFeatureAccess } from "@/lib/entitlements";

const access = await checkFeatureAccess(userId, "mock_interviews");
if (!access.allowed) {
throw new AppError(access.upgradeHint, 402);
}

Bulk-fetch all features for the client with getEntitlements(userId) — this is what /api/entitlements returns.

See also

  • API reference — how paywalls surface as HTTP responses.
  • Source: src/lib/entitlements.ts.