# Plans and limits

> How trackagoat enforces per-organization and per-user limits based on plan tier, and how limits surface in the UI and API.

trackagoat enforces per-organization limits based on your plan tier. This page explains what each limit does, how they're enforced, and what happens when you hit one.

> **Note:**
>
> Tracking limits count **accounts**: the platform presences that actually get scraped: not creators. You can add as many creators as you like; you're limited by how many accounts (across TikTok and Instagram) you track. See [Creators and accounts](https://www.trackagoat.com/docs/guides/accounts.md).

## Plan tiers

| Tier | Accounts | Tracked videos | Projects | Members | API requests/day | Manual updates/day | Comment videos/day | Stats retention |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Free | 5 | 10 | 1 | 2 | 200 | 0 | 0 | 90 days |
| Starter | 50 | 100 | 3 | 5 | 1,000 | 1 | 40 | 365 days |
| Ultra | 300 | 3,000 | 10 | 50 | 50,000 | 3 | 40 | Unlimited |

> **Note:**
>
> These values are read live from the current plan configuration, so they always reflect the limits in force today. Tier upgrades are handled manually: email **support@trackagoat.com** with your org name and the tier you'd like.

## Limit keys

| Limit | What it caps |
|-------|-------------|
| `max_accounts_per_org` | Active tracked accounts (platform presences) across all projects: creators themselves are uncounted |
| `max_tracked_videos_per_org` | Videos whose stats we keep updating, across all projects. Over the limit, the oldest are paused: see [Tracked videos](#tracked-videos) |
| `max_projects_per_org` | Active (non-archived) projects in your org. Archiving one frees a slot; un-archiving takes it back, so it's blocked when you're at the limit. |
| `max_members_per_org` | Team members in your org |
| `max_campaigns_per_project` | Campaigns per project |
| `max_campaign_items_per_campaign` | Items per campaign |
| `max_api_keys_per_org` | Active API keys |
| `max_api_requests_per_day` | API requests per calendar day (org time zone) |
| `max_manual_scrape_triggers_per_day` | Manual "Update Now" triggers per day (org time zone) |
| `max_comment_videos_per_day` | Videos whose comments are collected per day (org time zone) for [Comment Insights](https://www.trackagoat.com/docs/guides/comment-insights.md). `0` means no comment collection: on Free, Comment Insights shows an upgrade prompt and the API returns `403 plan_feature_unavailable` |
| `max_payout_methods_per_org` | Payout methods (built-in + custom) per org |
| `max_payout_structures_per_project` | Payout structures per project |
| `max_conversion_events_per_project` | **Active** conversion event types per project. Deactivating one frees a slot. Conversion *volume* is never capped. |
| `min_video_stats_hours` | Minimum hours between video stats updates |
| `min_discover_videos_hours` | Minimum hours between video discovery runs |
| `min_creator_profiles_hours` | Minimum hours between creator profile updates |
| `stats_history_retention_days` | Days of stats history retained before pruning |

## Tracked videos

Your plan keeps a set number of videos up to date. A video counts while trackagoat keeps refreshing its views, likes and comments: posts found on your tracked accounts, posts you included from the Inbox, and videos you added by link. Pending, excluded and expired videos don't count, and neither do videos on deleted accounts.

**New posts are always tracked.** When your organization goes over its limit, trackagoat keeps your newest videos updated and **pauses your oldest ones** (by posting date):

- A paused video keeps its last stats and shows a **Paused: plan limit** badge. Filter Videos by **Paused (plan limit)** to see them.
- A paused video **still counts as posted**: for posting goals, compliance, the calendar and Program Health.
- It stays payout-eligible **with its last stats**. Its views stop growing, so CPM and view-milestone payouts stop counting new views on it. Anything already earned is unaffected.
- **Keep tracking** on a paused video resumes it and exempts it from the limit, and your oldest other video is paused instead. Exempt videos count toward the limit but are never paused.
- When room opens up (an upgrade, or videos you exclude or that expire), the newest paused videos resume on their own.

Organizations already over the limit when this took effect, and any organization whose plan is downgraded, get **14 days** before anything is paused. The Usage page shows how many videos are tracked and paused, and warns you at 80% of the limit.

Adding a video at the limit (by link, from the Inbox, or by resuming one) pauses your oldest video to make room. The request is only refused with `402 limit_reached` when every tracked video is set to keep tracking.

## How limits are enforced

**Count limits** (accounts, projects, members, etc.) are enforced atomically: two concurrent requests cannot both succeed past the cap. You'll see a modal in the UI explaining which limit was hit.

**Daily limits** (API requests, manual updates) reset at midnight in your org's time zone. If you hit your daily API limit, requests return HTTP 429.

**Update frequency floors** (`min_*_hours`) set a minimum interval between *scheduled* updates. The scheduler runs each update type no more often than the larger of your org's configured interval and the plan minimum, and a configured interval below the minimum is raised to it when saved. On the Free plan (24 / 24 / 24) that means profiles, new-post discovery and video stats each run once a day. These floors do **not** apply to manual "Update Now" triggers, which are governed instead by `max_manual_scrape_triggers_per_day`. See [How scraping works](https://www.trackagoat.com/docs/guides/scraping.md) for a full breakdown of manual vs. automatic data collection.

**Stats retention**: a daily background job prunes history older than your retention window. Ultra tier has unlimited retention.

## When you hit a limit

**In the dashboard:** A modal appears with the limit key, your current count, and the cap. If your org is retroactively over a limit (e.g., after a tier downgrade), a banner appears at the top of every page until the org is back within limits.

**In the API:** Count limits return HTTP `402`:

```json
{
  "data": null,
  "error": "Limit reached: max_accounts_per_org",
  "meta": {
    "code": "limit_reached",
    "limitKey": "max_accounts_per_org",
    "current": 5,
    "max": 5
  }
}
```

Daily rate limits return HTTP `429`:

```json
{
  "data": null,
  "error": "Rate limit exceeded",
  "meta": {
    "code": "rate_limit_exceeded",
    "retryAfter": 3421
  }
}
```

`retryAfter` is seconds until the counter resets at midnight in your org's time zone.

## Per-user limits

One limit applies per user rather than per org:

| Limit | Description |
|-------|-------------|
| `max_orgs_per_user` | Maximum orgs a user can belong to |

The default is 6. If you need to belong to more orgs, contact support.

## Requesting a raise

Limits are adjusted by the trackagoat team. There is no self-serve upgrade path yet.

To request a raise:

**Step 1: Email support**

Email **support@trackagoat.com** with your org name and which limit you need raised.

**Step 2: Receive your override**

We'll apply a per-org override. Overrides take effect immediately with no restart required.

---
Source: https://www.trackagoat.com/docs/guides/limits
