Billing & Credits
Entitlements and the AI credit wallet are two separate systems — the plan catalog, how they work together, and how checkout is validated.
Billing & Credits
Access in VeriWorkly is not a simple "free vs. premium" boolean. Two independent systems work together.
Entitlements
Named capability grants, checked individually wherever a feature is gated:
| Entitlement | Unlocks |
|---|---|
ai_credits | AI writing actions and the AI-powered ATS analysis layer. |
portfolio_publish | Publishing a portfolio publicly. |
custom_subdomain | A {username}.veriworkly.com subdomain instead of the shared path. |
seo_controls | Portfolio SEO meta title, description, and social share image. |
analytics | Portfolio analytics. |
watermark_removal | Removing the "Built with VeriWorkly" badge. |
Each grant carries a source (SUBSCRIPTION, MANUAL, PROMOTION, or SYSTEM) and its own
start/end window. Because access checks read entitlements rather than plan names, a manual admin
grant, a promotion, and a paid subscription all behave identically.
Several limits key off entitlements, not plans
The free-tier one-document-per-type cap and the profile-import cooldowns both lift for anyone
holding either ai_credits or portfolio_publish.
The plan catalog
Three purchasable products, defined in apps/server/src/services/productCatalog.ts.
| Product | Key | Entitlements | Monthly | Annual |
|---|---|---|---|---|
| AI Standalone | ai_credits | ai_credits | $5.99 | $59.90 (≈ $4.99/mo) |
| Creator Pro | portfolio_pro | All five portfolio entitlements | $9.99 | $95.88 (≈ $7.99/mo) |
| Job Hunter Bundle (recommended) | bundle | ai_credits + all five portfolio entitlements | $14.99 | $143.88 (≈ $11.99/mo) |
Included AI credits
| Product | Monthly | Annual |
|---|---|---|
| AI Standalone | 1,000 credits | 12,000 credits |
| Job Hunter Bundle | 1,000 credits | 12,000 credits |
| Creator Pro | — (no AI credits; add AI Standalone or choose the Bundle) | — |
Subscription credits do not roll over between billing cycles.
An interval is only purchasable if its product ID is configured
Each plan/interval pair maps to a Dodo Payments product ID supplied by environment variable. The public catalog reports only the intervals whose product ID is actually set, so what appears on the pricing page depends on deployment configuration, not just on this table.
Time-boxed passes
Short-window access with no subscription, sold under the bundle product key:
| Pass | Price | Duration | Credits | Includes |
|---|---|---|---|---|
| 3-Day | $2.99 | 3 days | 150 | Portfolio publishing, ATS tools, unlimited exports |
| 7-Day | $5.99 | 7 days | 400 | Portfolio publishing, ATS tools, unlimited exports |
Naming quirk in the data model
The billing interval enum calls these ONE_DAY and SEVEN_DAY, but ONE_DAY maps to 3
actual calendar days. It is a naming inconsistency, not a functional bug — the 3-Day pass really
does last three days.
Pass-granted credits expire when the pass window ends.
One-time AI credit top-ups
For extra credits without changing a subscription:
| Pack | Key | Credits | Expiry |
|---|---|---|---|
| 250 extra credits | credit_pack_250 | 250 | 90 days from purchase |
| 500 extra credits | credit_pack_500 | 500 | 90 days from purchase |
Pack prices are set on the corresponding Dodo Payments product, not hardcoded in application code — the currently published prices are $2.99 and $4.99 respectively. Per the Terms of Service, pack credits may also expire immediately on cancellation of an associated subscription where stated.
The AI credit wallet
A full ledger, not a counter.
CreditWallet— current balance, reserved amount, and lifetime credited/debited totals.CreditGrant— each batch of credits with its own expiry date.CreditReservation— a two-phase reserve → commit/release record for an in-flight AI call, so a failed generation does not burn credits.CreditTransaction— the user-visible history: action, reason, amount, resulting balance.CreditUsageAllocation— which grant(s) funded each transaction.
FIFO multi-grant allocation
A debit does not simply subtract from one balance. CreditUsageAllocation records exactly which
grant(s) funded each transaction on a FIFO-by-expiry basis, so a user holding a subscription
grant plus a leftover top-up is billed from the soonest-to-expire grant first — the balance you
are about to lose is spent before the one you are not.
Reserved credits are not spendable until the reservation is committed or released. AI actions have separate Standard and Expert cost tiers, defined in the private AI policy rather than in application code — see AI Writing Assistant.
In-app pages
| Page | Contents |
|---|---|
/credits | Wallet balance, per-action Standard/Expert costs, lifetime totals, upcoming grant expiries, and the full transaction history. |
/billing | Plan status, active entitlements, credit top-up purchase, billing history, and subscription management/cancellation. |
/checkout | The purchase flow. It validates the requested product key and billing interval against the catalog whitelist before handing off to Dodo Payments. |
Billing engine
Dodo Payments is the payment provider. VeriWorkly does not use Stripe anywhere.
- Webhook-driven and idempotent. Every webhook is recorded in
BillingWebhookEventkeyed by the provider's event ID, with a processing status and retry count, so duplicate delivery cannot double-grant credits or entitlements. This table also powers the user-facing billing history list. - A last-webhook timestamp on the subscription keeps out-of-order delivery from corrupting state.
- Processing a payment event grants entitlements and credits, updates portfolio publish access, and triggers affiliate commissions.
- Free trial — 7 days, applied automatically for first-time monthly Creator Pro subscribers specifically, not for other plans or intervals.
- Grace period — if a subscription lapses, portfolio publish access enters a grace period
(
PORTFOLIO_GRACE_DAYS, default 7) before the hourly portfolio access job suspends the site. - API keys are invalidated when a subscription lapses to cancelled or inactive — the webhook busts the auth cache immediately.
API
See the Billing API reference for the full endpoint list.
Related
- AI Writing Assistant
- Portfolio: Publishing & Analytics
- ATS Checker — paid scan quotas.
- Environment Variables