Skip to main content
Hayon offers two subscription plans: Free and Pro. Both plans give you full access to the platform’s core features — the difference is in the usage limits applied per billing cycle.

Available plans

Free

Get started at no cost. Schedule posts, connect platforms, and generate AI captions with generous monthly limits.

Pro

Double your limits for power users and small teams who publish frequently and rely heavily on AI-generated captions.

Plan comparison

FeatureFreePro
Posts per billing cycle3060
AI caption generations per cycle1530
Multi-platform publishingYesYes
Post schedulingYesYes
Analytics dashboardYesYes
Real-time notificationsYesYes
Platform integrations (Bluesky, Tumblr, Facebook, Threads, Mastodon)YesYes
Stripe billing portal accessYes
Promotion code supportYes
Plan limits are per billing cycle, not per day. On the Free plan, the cycle is open-ended (no automatic reset). On Pro, usage counters reset automatically on each monthly renewal when Stripe fires the invoice.payment_succeeded event.

How usage limits work

Two middleware functions enforce plan limits at the API layer before any write operation is allowed.

Post limit (checkUserPostLimit)

Every request to create a post passes through checkUserPostLimit. The middleware reads the user’s usage.postsCreated counter and their limits.maxPosts value from the database.
  • Free plan: maxPosts = 30
  • Pro plan: maxPosts = 60
If usage.postsCreated >= limits.maxPosts, the API returns a 403 with a message telling the user their limit and whether to upgrade or wait for the next cycle.
{
  "message": "Post creation limit reached (30/30). Upgrade to Pro for more.",
  "usage": 30,
  "limit": 30
}

AI caption generation limit (checkUserGenerationLimit)

Caption generation requests pass through checkUserGenerationLimit, which checks usage.captionGenerations against limits.maxCaptionGenerations.
  • Free plan: maxCaptionGenerations = 15
  • Pro plan: maxCaptionGenerations = 30
When the limit is reached, the API returns:
{
  "message": "AI generation limit reached (15/15). Upgrade to Pro for more.",
  "usage": 15,
  "limit": 15
}
Usage counters and limits are stored on each user document in MongoDB. They are set at account creation using the PLAN_LIMITS configuration and can be updated by an admin at any time.

Free tier limitations

The Free plan is designed for users who are getting started or publishing at a moderate pace. Key constraints to be aware of:
Free plan users do not have a recurring billing cycle. Usage counters reset only when an admin manually updates the user’s plan, or when the user upgrades to Pro and then renews their first billing period.
The Stripe billing portal is only available to users who have an active Pro subscription with a stripeCustomerId. Free users are redirected to start the checkout flow instead.
The cancel endpoint (POST /api/payments/cancel) returns a 400 error for Free plan users since there is no active subscription to cancel.

Upgrading to Pro

1

Initiate checkout

Call POST /api/payments/create-checkout with your authentication token. The API returns a Stripe-hosted checkout URL.
2

Complete payment

Visit the checkout URL. Stripe handles card entry, 3D Secure, and receipt. Promotion codes are supported if you have one.
3

Automatic activation

Once payment succeeds, Stripe fires the checkout.session.completed webhook. Hayon processes this event and upgrades your account to Pro with updated limits and billing period dates — no manual action required.
4

Verify your plan

Call GET /api/payments/status to confirm your plan is now pro and check your new usage limits.

Downgrading from Pro

You can cancel your Pro subscription at any time. Cancellation is always at period end — you keep Pro access until the end of the current billing cycle.
1

Request cancellation

Call POST /api/payments/cancel. The API sets cancelAtPeriodEnd = true on your subscription in both Stripe and the Hayon database.
2

Continue using Pro

You retain full Pro access (60 posts, 30 caption generations) until the billing period ends.
3

Automatic downgrade

When the period expires, Stripe fires the customer.subscription.deleted webhook. Hayon downgrades your account to the Free plan and clears the Stripe subscription reference.
Once your subscription is scheduled for cancellation, calling POST /api/payments/cancel again returns a 400 error: "Subscription is already scheduled for cancellation". Use the billing portal if you need to reactivate.

Checking your current plan

You can always check your current plan, usage, and limits programmatically:
curl http://localhost:5000/api/payments/status \
  -H "Authorization: Bearer <token>"
The response includes your full subscription object:
{
  "subscription": {
    "plan": "pro",
    "status": "active",
    "cancelAtPeriodEnd": false,
    "currentPeriodStart": "2025-03-01T00:00:00.000Z",
    "currentPeriodEnd": "2025-04-01T00:00:00.000Z"
  },
  "usage": {
    "postsCreated": 12,
    "captionGenerations": 5
  },
  "limits": {
    "maxPosts": 60,
    "maxCaptionGenerations": 30
  },
  "plan": "pro"
}

Build docs developers (and LLMs) love