Quota limits per plan

Last updated: May 19, 2026

Quota limits per plan

Wevion enforces seven quota dimensions per plan: seats, ad accounts, fan pages, pixels, catalogs, competitor watchlists, and ad-spend visibility cap. Each plan sets a numeric value (or NULL = unlimited). Check /settings/team/billing → Usage for your current values + current usage.

Who is this for

Admins planning capacity for an upcoming launch, comparing plans for an upgrade, or wondering why a "Connect" button is greyed out.

The seven dimensions

Dimension

Field on plan model

What it counts

Seats

max_users

Team members in the workspace (active + pending invites)

Ad accounts

max_ad_accounts

Sum across Meta + Google + TikTok + Taboola + Snapchat connected accounts

Fan Pages

max_fan_pages

Meta Pages connected

Pixels

max_pixels

Sum across Meta + TikTok + Taboola + Google + Snapchat pixels

Catalogs

max_catalogs

Product catalogs (Meta + Google Merchant Center)

Competitor watchlists

max_competitor_watchlists

Watchlists in Strategic Intelligence

Ad-spend visibility cap

max_ad_spend_cents

Monthly tracked spend in USD cents (see spend caps)

A NULL value on any dimension = unlimited. Demo and Enterprise plans typically have NULL across the board.

How quotas are enforced

The backend has a plan-guard middleware (apps/backend/src/plugins/external/11.plan-guard.ts) that checks before write operations:

  • requireResourceQuota(type): blocks new connections (ad account / fan page / pixel / catalog) when the quota is hit

  • requireUserQuota(): blocks new invites when seat quota is hit

  • requireActiveSubscription(): blocks writes on past_due or unpaid subscriptions

  • requireFreemiumLimit(type): limits free-tier behavior (e.g. campaign launches)

When you hit a quota, the UI shows a clear error: "Plan limit reached — upgrade or remove unused [resource]".

Where to check your current values

From the UI

  • /settings/team/billing → Usage shows a bar per dimension: used / max (or used / unlimited)

  • The bar turns yellow at 80%, red at 95%

  • Each row links to the relevant management page (e.g. ad accounts row links to /connect)

From your perspective as admin

If a teammate gets a "quota exceeded" error, they'll come to you. You can:

  1. Check /settings/team/billing → Usage to confirm which dimension is full

  2. Either upgrade (acc-103) or remove unused resources to free space

Counting rules

Ad accounts

Only connected: true accounts count. Disconnected or deleted accounts don't count.

ad_accounts_used = meta.count(connected=true)
                 + google.count(connected=true)
                 + tiktok.count(connected=true)
                 + taboola.count(connected=true)
                 + snapchat.count(connected=true, deleted_at=null)

Fan Pages

Only Meta Pages with connected: true. Pages on other platforms are not counted (they don't exist in the same way).

Pixels

Sum across platforms:

  • Meta: distinct validated pixels (pixel_ad_account_link with status = 'validated')

  • TikTok: pixels with status = 'ACTIVE'

  • Taboola: pixels with connected: true

  • Google: conversion actions with connected: true

  • Snapchat: pixels with connected: true, deleted_at: null

Catalogs

Meta catalogs (Commerce Manager) + Google Merchant Center feeds, both with connected: true.

Competitor watchlists

Created via Strategic Intelligence module. Counts active watchlists.

Seats

max_users + extra_user_slots (purchased add-ons). Counts active members + pending invitations. See add extra team member slots for raising the cap on a fixed plan.

Ad-spend cap

Special — see the dedicated article understanding spend caps. Not a hard block; a visibility cap.

When you hit a quota

Resource

Behavior at limit

Seats

Cannot send new invitations until you free a seat or add extras / upgrade

Ad accounts

Cannot connect a new ad account; existing ones keep syncing

Fan Pages

Cannot connect new Pages

Pixels

New pixels not imported until quota freed; existing pixels keep collecting events

Catalogs

Cannot import new catalogs

Competitor watchlists

Cannot create new watchlists

Ad-spend cap

Spend over-cap hidden from analytics until next month; ads continue running

How to free quota space

Resource

Free space by

Seats

Removing members from /settings/team/people

Ad accounts

Disconnect unused accounts in /connect/{platform}

Fan Pages

Disconnect unused Pages in /connect/meta/fan-pages

Pixels

Disconnect unused pixels in /pixels

Catalogs

Disconnect unused catalogs in /catalogs

Competitor watchlists

Delete unused watchlists in Strategic Intelligence

Removing a resource frees the quota immediately; no Stripe action needed.

Demo and Enterprise plans

  • Demo: internal plan for partners / POCs. is_custom: true, hidden from public pricing. Replicates Enterprise limits at $0 (typically NULL on all resource quotas). Managed by Sales.

  • Enterprise: custom contract. Often unlimited quotas (NULL across the board) plus SSO. See enterprise and custom plans.

Common questions

  • "Why does my count differ from /settings/team/billing?": the page is the authoritative count. If a dashboard widget shows different, refresh — it's a cache.

  • "Disconnected an ad account but counter didn't drop": ~60s sync delay. Refresh.

  • "I'm Enterprise but see a number, not unlimited": your contract has a fixed quota (not NULL). Contact your CSM to raise it.

  • "Can I temporarily exceed for a launch?": No — quotas are hard. Plan ahead.

Related