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
| Feature | Free | Pro |
|---|---|---|
| Posts per billing cycle | 30 | 60 |
| AI caption generations per cycle | 15 | 30 |
| Multi-platform publishing | Yes | Yes |
| Post scheduling | Yes | Yes |
| Analytics dashboard | Yes | Yes |
| Real-time notifications | Yes | Yes |
| Platform integrations (Bluesky, Tumblr, Facebook, Threads, Mastodon) | Yes | Yes |
| Stripe billing portal access | — | Yes |
| Promotion code support | — | Yes |
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
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.
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
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:Post limit resets only on plan change
Post limit resets only on plan change
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.
No access to the billing portal
No access to the billing portal
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.Cancellation is not applicable
Cancellation is not applicable
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
Initiate checkout
Call
POST /api/payments/create-checkout with your authentication token. The API returns a Stripe-hosted checkout URL.Complete payment
Visit the checkout URL. Stripe handles card entry, 3D Secure, and receipt. Promotion codes are supported if you have one.
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.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.Request cancellation
Call
POST /api/payments/cancel. The API sets cancelAtPeriodEnd = true on your subscription in both Stripe and the Hayon database.Continue using Pro
You retain full Pro access (60 posts, 30 caption generations) until the billing period ends.
