Changelog
Everything that changed in trackagoat, newest first.
Get updates by email:
This changelog is also available as JSON from GET /api/v2/changelog (no API key needed) and to AI agents through the MCP tool get_changelog.
: README editors never overwrite a newer save, and the video caption in the API
Organization, project and campaign READMEs. These editors now work like My README and the creator and video notes: if a teammate or an agent saves the README while you have it open, your next save stops and asks you to reload instead of overwriting their change. Your unsaved draft is kept, so you can copy it back in after reloading. Over the API, PATCH /api/v2/campaigns/{id} and PATCH /api/v2/organizations/{orgId}/projects/{projectId} take an optional expected_readme_version with readme and return 409 notes_conflict if the README changed since your read. See Campaigns and Projects.
Video caption, and description is deprecated. GET /api/v2/videos and GET /api/v2/videos/{id} now return caption, the post's text from the platform, and MCP list_videos and get_video_stats show it. A video's description field was an old free-text field that nothing fills; the docs called it the caption in some places and a notes field in others. It can no longer be written: PATCH /api/v2/videos/{id} refuses it with 400 and MCP update_video no longer takes it. Put notes in the video's readme. Any text a video had in description has been added to its README under a "Description" heading. REST responses still include description for now, marked deprecated; it will be removed.
: Signing in with Google while connecting an agent
If you connected Claude, Codex or another agent while signed out and signed in with Google, trackagoat took you to your dashboard and the agent never finished connecting. You now come back to the screen where you pick the organization and click Allow access.
: Coding agent examples across the website
Every example on the home page and the product pages now has a trackagoat UI / Coding agent switch. The coding agent side shows what you'd ask and what your agent answers, and Behind the scenes lists the MCP tools it called with their arguments. The compare pages now also cover how an agent connects, whether it can send payouts and which docs it can read, for trackagoat and each other tool.
: API keys stop working when the admin who made them loses access
An admin who creates a key for a teammate has seen it, so that key now only works while they are still an org admin. If they leave or are removed, are changed to member, or their account is suspended, the keys they made for others are deactivated and refused with key_creator_removed, key_creator_not_admin or key_creator_banned. Keys a person made for themselves keep working after they're changed to member, limited to what a member can do. Suspending an account also deactivates every key that person created, in every organization. Org settings → API keys now shows why a key stopped working: revoked, the member it acts as left or was suspended, the admin who created it left, was changed to member or was suspended, or the organization was suspended. See Authentication and API keys.
Reading the comment settings (GET /api/v2/comment-settings, MCP get_comment_settings) and a creator's payout account (GET /api/v2/creators/{id}/payee-links, MCP get_payout_account) now needs an org admin, like the pages they come from in the app. Every MCP tool that needs an org admin now says so in its description ("Requires the write scope and an org admin."), and the MCP tool list and the OpenAPI spec mark them too.
: CSV exports for coding agents and the API
Every CSV you can download in the app is now available to coding agents and the REST API, with the same columns, values and filters: creators, videos, campaigns, goals, the campaign leaderboard, the payouts tracker, payments, accruals and Insights charts. Ask your agent "Export September payouts to a CSV" or "Give me all videos from the Spring Launch campaign as a spreadsheet" and it uses the new MCP tool export_csv, then saves the file in your workspace. Over REST it's GET /api/v2/exports/{dataset}, and the app's own Export buttons now download from the same endpoint. Exports are never cut off at a row limit; big ones can be fetched in pages. A creator's Accruals CSV on their Payouts tab now lists every accrual, not just unpaid ones, to match the tab.
: Personalization documents, notes for every document, and keys that act as a member
Your agent knows who it's helping. Your My README (Settings → My README) is now your personalization document: who you are, your job in the creator program and how you want AI agents to help. When you connect an agent over MCP, it gets your document at the start of every session. If you haven't written one, the agent offers to write it with you: it asks a few questions, shows you a draft and saves it once you approve. If your agent saves it while the page is open in the app, the editor asks you to reload instead of overwriting the change. See Notes and documents.
Every document, one set of tools. Agents can now find, read and write every Markdown document in an organization: the organization, projects, campaigns, creators, videos, payout methods, structures and payments, and each person's personalization document. New endpoints GET /api/v2/notes, GET and POST /api/v2/notes/{entity_type}/{id}, GET and PATCH /api/v2/me and GET /api/v2/members, and new MCP tools list_notes, get_notes, get_my_profile, update_my_readme and list_members. update_notes now works for every document. Everyone in an organization, and their agents, can read every document in it, including personalization documents; your organization's README page now lists your teammates' documents. Only you can change yours. See the Notes and documents API.
API keys act as a member. When an org admin creates an API key, they choose who it acts as: themselves, or another member. Everything the key does is attributed to that member, and it can never do more than they can in the app: actions only org admins can do there, like recording payments or removing creators, now return insufficient_role for a key that acts as a member. A key stops working when its member leaves the organization, with the error key_member_removed. The API keys list shows who each key acts as and who created it. For a teammate's own coding agent, signing in over MCP is still the simplest option, since nobody has to share a key. See Authentication and API keys.
: A real 404 page for links that don't exist
A link to a page that doesn't exist used to send signed-out visitors to the sign-in page. It now shows a "Page not found" page with links to the home page, pricing, the docs and each product page. Links to pages inside the app still go to sign-in when you're signed out.
: Compare pages
New pages compare trackagoat with MightyScout, viral.app, Shortimize, SideShift, Grade, ViewTrack and spreadsheets. Each one has a side-by-side table, the differences that matter, where the other tool is better, prices and how to move over, with every fact taken from that company's public site and dated. The home page's compare section now has a tab for each of them, and /compare lists them all, plus TikTok and Instagram's own analytics and other tools people look at.
: Blog post: introducing the trackagoat MCP server
A new blog post introduces the MCP server: what an agent like Claude, Codex or Cursor can do with its 125 tools, how to connect it with sign-in or an API key, example questions to ask, and the permissions and daily request limits on each plan. Read it on the blog.
: Blog post: what's new since trackagoat 2.0
A new blog post walks through everything that changed since 2.0 in July: more accurate tracking, Creator Goals judged on full periods, CPM paid on views gained, paying creators through Dots, Comment Insights, the full MCP server, the new look and the new prices. Read it on the blog.
: "Get started" buttons
The main sign-up button across the site now says Get started instead of Start free. The Free plan is unchanged.
: Rewritten website copy
The home page, product pages, pricing, About, the agent setup prompt and the page descriptions were rewritten to say more plainly what trackagoat does, with worked examples (like paying every creator $5 a week plus $20 when a video passes 1M views). The pricing page and home page now list the Free plan's 10 tracked videos next to its 5 accounts, and the Payouts FAQ now says you can pay creators through a connected Dots account.
: Plainer punctuation and clearer empty values
Text across the app, the website, these docs, API messages and MCP tool descriptions no longer uses long dashes. Ranges read "to" (for example "Sep 1 to Sep 30" and "1 to 100"), and page titles use "Page | trackagoat". Cells and tiles with no value now say so in words, such as No data, No date, Never, None or Not set, instead of showing a dash. Notes added through the API or MCP now end with "Added by ..." without a leading dash.
: All of Comment Insights in the API and MCP
Everything in Comment Insights is now available to API keys and AI agents. New endpoints: GET /api/v2/videos/{id}/comments (a video's Comments tab: its comments, sentiment split, signal counts and how many were collected), GET /api/v2/projects/{projectId}/comment-flags (the weekly flag digest on demand: comments asking whether a post is an ad or using words like scam, and creators whose positive comments dropped), and GET / PATCH /api/v2/comment-settings (the minimum comment count and brand and competitor terms; changing them needs a key owned by an org admin). /comment-signals can rank the creators table with creator_sort, for example by app questions. New MCP tools: list_video_comments, get_comment_flags, get_comment_settings and update_comment_settings, and get_comment_signals_summary takes bucket, creator_sort and creator_limit. On the Free plan the comment tools return plan_feature_unavailable; the settings work on every plan. See Comment Insights.
: Sentiment Radar is now Comment Insights
Sentiment Radar has been rebuilt as Comment Insights, under Insights in the sidebar (old links redirect). It shows the most-liked comments first and tags the ones you act on: people asking what the app is, people signing up, people asking whether a post is an ad, words like scam or unsafe, pay talk, links, and mentions of your brand or a competitor. A new creators table shows comments per 1,000 views, the share of positive comments and each creator's top comment, and the page says how many of the platform's comments were collected. The radar, the average-score figure and the "negative vibes" alert are gone: most negative comments were viewers talking about their own lives.
Sentiment is now scored by a model trained on social media posts, with extra rules for TikTok comments like "so real" and 😂. On hand-labeled comments it agreed with people about 3 times in 4, against about 1 in 2 before. Existing comments are rescored.
Comments are now collected once a video is 3 days old and has at least 5 comments (an org admin can change this in Org settings → Comments, along with brand and competitor terms), most-commented videos first, with one more pass for videos whose comments double. This collects far more of the comments on popular videos. Comment Insights is included in paid plans; Free plans no longer collect comments.
Org admins get a weekly notification quoting comments that ask whether a post is an ad or use words like scam, and Program Health shows them too. The API has GET /api/v2/projects/{projectId}/comments and /comment-signals, and agents have the MCP tools list_comments and get_comment_signals_summary. See Comment Insights.
: Agent setup steps at the bottom of the home page on phones
On phones, the home page now has the same bar at the bottom of the screen as on desktop: it copies the agent setup prompt, and tapping it shows the three steps to set up trackagoat with Claude Code, Codex or another coding agent. It replaces the strip at the top of the page and the Start free button at the bottom; Start free is now in the steps.
: Smoother rounded corners
Rounded corners on buttons, cards, inputs, dialogs and panels now curve smoothly into their straight edges (often called squircle corners) in Chrome, Edge and other Chromium browsers. Circles and pill shapes are unchanged, and other browsers keep the previous corners.
: Ask your agent what's new in trackagoat
The changelog is now available to AI agents and your own tools. Connected agents have a new MCP tool, get_changelog, so you can ask "what's new in trackagoat?" or "when did the payouts tracker change?" and get an answer with links to each entry. It works on any connection, whatever it is allowed to do, and doesn't count toward your daily API request limit. The same entries are available as JSON from GET /api/v2/changelog, with no API key, filtered by date (since) or search words (q). See Changelog API.
: Clearer setup, invitation and shared creator pages
Account setup now shows which step you are on, with one task per step. Invitations, the app connection screen and password reset use the new look, and the connection screen lists which app is asking, which organization it gets and what it can do. Shared creator pages are easier to read on a phone. Nothing about how these pages work has changed.
: Platform filter fixes
Picking TikTok or Instagram now filters everything it should. On Content Calendar the day counts and totals only count that platform's posts (before, only the pop-up for a day was filtered), and the list shows only creators with an account on that platform. On Campaign Insights the filter did nothing; it now applies to the totals, trend charts, campaign leaderboard and campaign comparison. The content calendar on Creator Insights follows the filter too. The API endpoints campaign-leaderboard and campaign-timeseries, and the MCP tools get_campaign_stats and get_campaign_trends, accept platform.
: Insights above Tracking, and your own sidebar order
The sidebar now lists Insights right under Dashboard, above Tracking. You can also put the sidebar sections in any order: hover a section name and drag its grip, or focus the grip and press the up and down arrow keys. Your order is saved to your account, so it is the same on every device.
: Shorter Needs attention list and a scrolling alerts panel
On Creator Insights, the Needs attention section now shows the first three flagged creators, with a Show all button to see the rest. The Active alerts and Alert history panels now scroll when they hold more alerts than fit on the screen.
: Clearer settings pages
Your account settings and organization settings now use one layout: a section menu on the left (a dropdown on phones), titled panels with a short description for each setting, and the save button at the bottom of each panel. The Usage page shows a bar for each plan limit that turns amber at 80% and red at the limit. Nothing about how the settings work has changed.
: An Adjustments column in the Payouts tracker
The Payouts tracker has a new Adjustments column and total, between Paid and Outstanding: the part of what you paid a creator that settled no accrual, such as ad-hoc payments, tips, over- and under-payments, and payment history recorded without accruals. Hover it to see each reason and amount. Every row and the totals now visibly add up: Earned − Paid + Adjustments = Outstanding. It also appears on a creator's Payouts tab, in the expanded tracker row and in the tracker CSV (Adjustments and Adjustment Reasons columns). The tracker is now available in the API as GET /api/v2/payouts/tracker and over MCP as get_payouts_tracker, with adjustment_cents and adjustment_breakdown on every row and in the totals. See Creator-grouped table.
: Pay creators through Dots from trackagoat
Org admins can connect their Dots account in Org settings → Payment providers and pay a creator's earned payouts from the Payouts tracker or the creator's Payouts tab. trackagoat sends the money through Dots and records the payment in the same step, so payouts are marked paid without typing anything in. Each creator is linked to a Dots payee, picked from the people your Dots account has paid (with suggested matches by name) or by mobile number. A payout can carry a note to the creator, a custom text message, a description and a 1099 exemption. Its status (completed, awaiting claim, failed…) shows on the payment, and failed or canceled payouts are voided automatically so they can be paid again. Agents and API keys can send Dots payouts too, but only after an org admin turns on Agent payments, with optional per-payout and 24-hour limits: new MCP tools send_payout and get_payout_account, and REST endpoints POST /api/v2/payout-payments/send and GET /api/v2/creators/{id}/payee-links. See Paying creators with Dots.
: Creator, video, campaign and account pages share one layout
Every detail page now opens with the same header (picture, name, status badges and actions), a row of headline numbers and the section menu, which becomes a dropdown above the content on phones. Video pages play the video in a pop-up from the header thumbnail. Info tabs list details as labelled rows, and empty lists explain what fills them. Nothing about how these pages work has changed.
: The new look on Insights, Program Health, Sentiment Radar and Content Calendar
These pages now match the rest of the app: a strip of headline numbers at the top, titled panels, right-aligned numbers, and illustrated empty states. The Program Health pulse and the Sentiment Radar keep their dark displays in both light and dark mode. Nothing about how the pages work has changed.
: Clearer payouts pages
The Payouts tracker now shows Earned, Paid and Outstanding as three totals above the table, with an Owed / Paid up status on each creator. Payout structure pages list each structure's terms (rates, milestones, goal rule) and version history in one place. Nothing about how payouts are calculated or paid has changed.
: Fresher, more accurate stats for photo carousels and new posts
- TikTok photo carousels now update on the same schedule as videos. Until now they were read through a slow, expensive path and many carousels went weeks without an update. They now update every 12 hours while new, then on the same age-based schedule as videos, and monthly once over 90 days old. Carousels that had fallen behind are being caught up first.
- View counts and stats history now agree. A new-posts check could raise a video's view count without adding a point to its history, so charts and view gains could trail the number shown. Counts now only change together with a history point.
- Fewer wrong numbers. We no longer save a stats read that came back for a different post, a rounded count such as "1.2M", or a missing count recorded as 0.
- Accounts whose check failed are retried within about 2 hours, instead of waiting for the next twice-daily run.
- Posts in the Tracking Inbox under 30 days old get daily stats updates, so you review them on current numbers.
: Private accounts now hold goal and CPM payouts
When one of a creator's accounts is private, we can't see what it posted, so their Goals and CPM payouts for that period are now held instead of being paid on the posts we already had. A banner on the Payouts page lists held payouts. A held payout is paid automatically once the account is public again. An organization admin can choose Pay anyway to pay on the posts already found; the decision is recorded in the payout history. Payouts calculated before this change are not affected. See Payouts.
: Freshness badges follow each post's own schedule
The Fresh / Turning stale / Stale badge on a video and the tooltip on its update-tier badge now use that post's real update schedule (TikTok or Instagram, video or photo carousel). An older carousel or Instagram post is no longer called stale on a schedule it was never on, and the tier tooltip shows the actual intervals (it still described an older, faster schedule).
: Supplemental amounts for paid periods
When a creator turns out to be owed more for a period you already paid, for example because posts from that week were found after the payment, org admins can now record the difference with Add supplemental amount on the paid accrual. The original accrual and payment are not changed. The amount shows as owed, labelled "Supplemental: <reason>", counts in the tracker's outstanding totals and CSV exports, and is paid like an accrual with Mark as Paid. In the API: GET/POST /api/v2/payout-supplementals, PATCH /api/v2/payout-supplementals/{id} to void, and supplemental_ids on POST /api/v2/payout-payments (auto_apply_outstanding includes them). Over MCP: list_payout_supplementals, create_payout_supplemental and void_payout_supplemental. See Supplemental amounts.
: Removed creators are hidden in the Payouts tracker
Creators you removed from a project no longer appear in the Payouts tracker by default, and their balances are no longer counted in its outstanding total. When any of them still has unpaid earnings, a note under the toolbar says how many and how much, with a Show link. The new Show removed creators switch lists them, labelled Removed, and adds them back into the totals. CSV exports follow the switch and have a new Is Removed column. A creator's own Payouts tab still shows their full balance. See Filtering and date ranges.
: Tidier tracking lists
Creators, Accounts, Videos, Campaigns, Conversions, Creator Goals, Auto-Disabled Creators and the Tracking Inbox now share one layout: a search and filter bar, numbers right-aligned in tables, coloured status labels, a dark bar for actions on selected rows, and illustrated empty states. The Tracking Inbox switches between To review and Excluded with one control. Nothing about how these pages work has changed.
: More reliable TikTok post discovery
TikTok post discovery now reads full post lists, with captions, post dates and photo carousels, for far more accounts on each run. Before, slow or blocked pages often fell back to a backup source that has no captions or carousels, so hashtag tracking could miss posts. Accounts with no posts are now recognised as empty instead of being retried every hour. Private accounts are marked as unverifiable instead of complete.
: The same numbers on every page
The dashboard, Insights, Program Health, campaign and creator pages, the API and the MCP server now count metrics the same way, so the same project and dates show the same views everywhere. A post counts when it is accepted, its tracking is on, and its creator and account are active: removed creators' posts and posts awaiting review no longer count anywhere (pages show "+N awaiting review" instead). The default window is the last 30 days including today in your time zone everywhere. Insights summary totals now cover every post in the period, not just the top 100 rows, Campaign Insights counts a video shared by two campaigns once, Video Insights' engagement rate is weighted by views, and follower growth is measured per account. The creator page shows Tracked posts next to the platform's own post count, Program Health's Data Freshness now measures video stats, goal summaries show Behind Pace and At Risk separately, and aggregate pages say how fresh their stats are. Definitions: How metrics are calculated. In the API, GET /api/v2/analytics/aggregate/summary and the MCP tool get_metric_totals return the headline totals; creator responses add tracked_post_count and pending_review_count (video_count is unchanged); Program Health's goal_compliance.at_risk no longer includes behind-pace goals (see the new behind_pace).
: Plan video limits now apply to every tracked video
Each plan keeps a set number of videos up to date: 10 on Free, 100 on Starter and 3,000 on Ultra. Until now the limit only applied when you added a single video by link. It now covers every tracked video, including posts found on your tracked accounts. New posts are always tracked. When an organization goes over its limit, trackagoat stops updating its oldest videos first. Paused videos still count as posted for goals, compliance and payouts, with their last stats, and show a Paused: plan limit badge. Keep tracking on a paused video resumes it and pauses your oldest other video instead. If you upgrade or free up room, the newest paused videos resume on their own. Organizations already over their limit have 14 days before anything is paused, and so does any organization after a plan downgrade. The Usage page shows how many videos are tracked and paused. See Plans and limits.
In the API and MCP tools, adding videos, including Inbox videos, and re-enabling tracking no longer fail at the limit; they pause your oldest videos instead and report paused_count. They return 402 limit_reached only when every tracked video is set to keep tracking. Video responses include plan_limit_paused_at.
: Status page shows the data provider, and a banner when updates pause
The status page has a new Data provider card that shows when we're close to, or have reached, the monthly quota of the service we read posts and stats through. If updates pause because the quota is used up, every page in the app shows a banner saying when they resume, so you know the numbers are from the last update. Account follower counts now refresh about every 24 hours, as intended, instead of every 36.
: A handle change no longer splits a creator's history
When a creator changed their TikTok or Instagram handle, the old handle stopped updating and was auto-disabled, and adding the new handle started a second account with an empty history. trackagoat now follows the account's permanent platform user ID: when an update finds the creator's posts under a new handle, the account is renamed instead, keeps its posts, history, goals and payouts, and is re-enabled if it had been auto-disabled. The creator's History shows the change as handle changed (detected automatically). If the new handle was already added as a separate account, both handles are flagged for our team to merge after review. An old handle that someone else takes over no longer copies the new owner's stats onto the account. See When a creator changes their handle.
: The MCP server can do what the REST API does
The MCP server went from 21 tools to 105. An agent connected over MCP can now do everything an organization's API key can do through the REST API, so it no longer has to switch to HTTP calls: list and edit platform accounts, update creators and videos, remove creators, review the Tracking Inbox, turn video tracking off and on, create, edit and delete campaigns, goals and content groups, manage creator share pages, add chart annotations, define conversion events and record or void conversions, run the project analytics reports (top creators and accounts, outliers, posting heatmap and consistency, view distribution, campaign progress and trends, conversion totals), and manage payouts: create and edit payout structures, assign and unassign creators, reject or void accruals, manage payout methods, and record, edit or void payments, with a receipt attached. Receipts and payout method icons can be uploaded over MCP and the REST API, either inline as base64 (receipts up to 3 MB, icons up to 1 MB) or through a signed upload URL: new endpoints POST /api/v2/payouts/payment-receipts, POST /api/v2/payout-methods/{id}/icon and POST /api/v2/payout-methods/{id}/icon/upload-url, and POST /api/v2/payout-payments now accepts payment_id and attachment_path. trigger_scrape can also refresh a creator by creator_id. Tools that delete, remove, void or archive are marked as destructive so clients can ask before running them. The sign-in consent screen now says that Make changes includes removing data, setting up payouts and recording payments. get_share_link can return a share page's PIN with include_pin: true; GET /api/v2/creators/{id}/share-link?include_pin=true now needs the write scope instead of admin (only org admins can call it, and a write key could already rotate the PIN). Not available over MCP: API keys, organization members, invitations and projects (these need the admin scope), and permanent deletes of conversions. See MCP server.
: Removing a video no longer lets it be paid twice
Deleting a video used to remove it completely. The next time the creator's account was checked, the post was found again and added back as a new video, so its views counted toward CPM payouts again and view-count bonuses could be paid a second time. Removing a video now keeps it, marked as excluded: it stops being tracked, stops counting toward totals and payouts, is hidden from video lists, and is not added back. In the app the action is now called Remove. In the API, DELETE /api/v2/videos/{id} does the same and returns the video's new tracking_status alongside deleted: true; PATCH it with "tracking_status": "included" to track it again. See Videos API.
: Tracked posts on the home and Tracking pages
The home and Tracking pages now show a slowly turning row of recent TikTok and Instagram posts, each with its view and like counts and a small chart of its stats, in place of the Program Health preview at the top of the home page.
: New plan prices
Starter is now $29 a month and Ultra $399 a month. Free stays free, and plan limits are unchanged.
: CPM payouts keep counting a video's views after its first period
CPM payouts used to pay only for the views of videos posted in the period, and stopped counting a video once that period was paid. A video that took off a week later earned nothing more. Now each period pays for the views a creator's videos gained since they were last paid, so a video keeps earning in later periods. A new Count views for setting on CPM structures sets how long after posting a video keeps earning: Forever (the default), 7, 30, 60 or 90 days, or a custom number of days. Every CPM structure moved to the new rules starting with the period in progress. Views from before the change that had not been paid were not back-paid. Views from a period below the minimum now carry into the next period. See Setting up a CPM payout.
: A warmer look for the app
The app now uses the same warm paper and night colours as the website, with clearer page titles, a sticky top bar, right-aligned numbers in tables, and illustrated empty states; nothing about how features work has changed.
In the API, criteria_params.view_lifetime_days sets the lifetime on create and on a rule edit (example). The MCP server has two new tools: list_payout_structures to read structures and their current rules, and set_cpm_view_lifetime to change a CPM structure's lifetime without touching anything else (MCP tools).
: Agent setup steps at the bottom of the home page
On desktop, the home page has a bar at the bottom of the screen that copies the agent setup prompt and lists the three steps to set up trackagoat with Claude Code, Codex or another coding agent.
: A page for each part of the product
The Product menu now links to a page for each feature set (Tracking, Campaigns and goals, Payouts, Program Health, Insights, and API and agents), each explaining what it does with animated examples, plan limits and FAQs.
: Animated product previews on the home page
The home page now shows focused, animated pieces of the product, such as a payout being marked paid and Program Health alerts arriving, in place of static screenshots.
: See which periods a goal is judged in
Goal forms, the Goals tab, the goals overview, Program Health, share pages and the Payouts tab now show which weeks or months a goal is judged in, and say "Not judged this period" or "No payout" with the reason when a goal starts or ends partway through a period.
: Goals start with the next full period
A goal that starts or ends partway through a week or month is now judged, and paid, only for the full periods inside its dates.
: Paste any profile link when adding an account
- Instagram profile links work.
https://www.instagram.com/username/(with or without?igsh=…,www.orm.) used to fail with "not a video URL". It now adds the account. - TikTok share links are followed.
tiktok.com/t/…links from the app's Copy link button work likevm.tiktok.comlinks, andm.tiktok.comis recognised. - One set of rules everywhere. The Add creator and Add account dialogs, onboarding, the REST API and MCP now accept the same inputs: a handle or a profile URL, saved without the
@and in lowercase. A 30-character handle typed with a leading@is no longer rejected. See accepted profile links. - API fixes.
POST /api/v2/creators/{id}/accountsno longer stores@Fooas typed, checks the ban list for every platform, rejects removed creators (409 creator_inactive) and records the add in the creator's change log. Renaming an account to a handle that's taken returns409 handle_takeninstead of a server error. - Account-scoped goals now have to use one of the creator's own accounts.
: More accurate goal status and view velocity
- Goal periods on daylight-saving days. A daily or weekly goal period that includes a clock change now starts and ends at the right local midnight. It was off by an hour.
- No more "At Risk" minutes after a period starts. Pace isn't judged for the first 15% of a period, and posts goals compare whole posts: a creator is behind only once a whole post is due.
- Followers goals measure growth per account. Adding an account partway through a period no longer counts its existing followers as growth. The same fix applies to goal-based payouts.
- Goals for different platforms or accounts are all shown. A TikTok posting goal and an Instagram posting goal with the same period used to hide one another.
- View Velocity spreads gains between checks. Older videos are checked about once a week, so a week of views used to show up as a single-day spike. It's now spread across the days it covers, and days follow your organization's time zone. The creator and org averages still count each check's views on the day of the check, and the chart says so.
: Every API error has a code
meta.codeon every error. A plain error such as404 Not foundused to come back withmeta: null. It now carries a code based on the status, such asnot_foundorconflict. Specific codes likealready_trackedare unchanged. See Errors and limits.- YouTube isn't offered yet. Sign-in, onboarding and the add-account and add-video forms now say TikTok and Instagram. Pasting a YouTube link into Add video says YouTube isn't available yet, and the payout structure platform picker shows YouTube as coming soon.
: Safer Idempotency-Key retries
- Concurrent retries no longer both run. A second request with the same
Idempotency-Keythat arrives while the first is still running now gets409 idempotency_in_progresswith aRetry-Afterheader, instead of running the write a second time. - A key is bound to one request body. Reusing a key with a different body returns
422 idempotency_key_reusedinstead of quietly replaying the earlier response. - Server errors aren't replayed. A
5xx(or429) is no longer stored, so retrying with the same key runs the request again. Rejections (4xx) are replayed, including ones raised partway through a batch. - Replays are stored reliably. The response is saved before it is returned, and a key used again after it expires gets a fresh 24 hours.
The same rules apply to the idempotency_key argument on MCP write tools. See Idempotency.
: Clearer API and MCP errors
- Unknown parameters are rejected. MCP tools used to ignore a parameter they don't have, so
get_analyticswithrange: "14d"quietly returned the default 30 days. Now the call fails withunknown_parameter, names the parameter, and lists the valid ones (fromandto, in that case). - Adding a creator who's already tracked now says who: "@examplecreator (TikTok) is already tracked in this project as creator …", with
code: already_trackedand the creator's id, over both MCP and the REST API. It used to return a bare "Already active". - Every MCP error has a code, such as
not_foundorconflict, so agents can act on it without parsing the message. - Unknown API paths return a JSON 404. A call to an endpoint that doesn't exist, like
DELETE /api/v2/goals/{id}, used to get the website's HTML page with status 200, so it could look like it worked. It now gets404withcode: route_not_foundand a link to the OpenAPI spec. get_campaign_statstakes just acampaign_id. The project comes from the campaign, soproject_idis optional. The REST endpointGET /api/v2/analytics/aggregate/campaign-leaderboardworks the same way.- The MCP server no longer describes YouTube as supported. YouTube tracking isn't live yet.
: API and MCP access on the Free plan
Free plan now includes API and MCP access (200 requests a day, 1 API key). New organizations can connect a coding agent or create an API key without upgrading. Each MCP tool call counts as one request, and the count resets at midnight in your org's time zone. Starter and Ultra limits are unchanged. See Plans and limits.
: Set up trackagoat with a coding agent
- Copy-paste setup prompt. The home page, Quickstart, MCP server and API overview pages have a prompt you can paste into Claude Code, Codex, Cursor or another coding agent. Show prompt displays the full text before you copy it.
- What the agent does. It sends you to sign-up, connects the MCP server for the client it runs in, and calls
list_projectsto check the connection. You do the clicking and signing in. The agent never handles your password or sees your API key. - New page: Set up with a coding agent has the steps, install commands for Claude Code, Codex CLI, Cursor, VS Code and Claude, plan limits, and fixes for common errors.
- Sign-in for more clients. The MCP page now shows sign-in (OAuth) setup for Claude Code, Codex CLI, Cursor and VS Code, with an API key as the fallback.
: New public site, published pricing
- New home page covering TikTok and Instagram tracking, payouts, Program Health and the API, with an interactive demo of the app.
- Published plans. Pricing now lists Free, Starter and Ultra with their limits, read live from the same plan settings the app enforces. Paid plans are switched on by email for now.
- New pages: About and a public changelog. The blog, status, privacy and terms pages share the new layout.
- Status: the public status endpoint now includes
last_scrape_at, the time of the most recent completed scrape.
: Plan scrape-frequency minimums are now enforced
Plan scrape-frequency minimums are now enforced; the Free plan checks once a day. The scheduler used to run every org at the default 4-hour stats and 12-hour discovery and profile intervals, whatever its plan. It now never runs an update type more often than your plan's minimum. For video stats / new-post discovery / profiles, that is Free 24h / 24h / 24h, Starter 4h / 12h / 12h and Ultra 1h / 4h / 6h. Starter and Ultra orgs on the default intervals see no change. See How scraping works.
: Docs redesign, Markdown for agents
The docs have a new layout and are easier for both people and agents to use.
- New navigation. Four tabs (Guides, API reference, AI agents, Changelog), each with its own sidebar, section pages, breadcrumbs, and previous/next links that stay within the tab.
- Search covers page text, not only titles and headings. Results are grouped by tab and show the matching sentence.
- Markdown for every page. Append
.mdto any docs URL, or fetch/llms.txtand/llms-full.txt. See llms.txt and raw docs. Each page also has a Copy page menu. - Fixes: code is syntax-highlighted in light and dark mode, the copy button copies the code, and every heading has a visible link anchor.
- Merged pages. Creators is now part of Creators and accounts, and API keys is part of Authentication and API keys. Old links redirect.
- Accuracy. The overview and scraping pages now describe the real update schedule, and YouTube is marked as coming soon.
: Program health and safe notes for agents
Two new MCP tools and matching REST endpoints:
get_program_healthanswers "how is this program doing?" in one call: the same healthy / at-risk / degraded verdict as the Program Health page, with the KPIs, creators who stopped posting, goal compliance, alerts (sudden view drops, tracking gaps, private accounts, disabled creators, over-posting) and top and under-performers. Scope it to a campaign and a 7, 14, 30 or 90-day window. REST:GET /api/v2/projects/{projectId}/program-health.update_noteslets an agent write creator and video notes without overwriting what your team wrote. By default it appends a section signed with the API key's name and the date. Replacing the notes requires the version the agent last read, and fails if anyone changed them since. REST:POST /api/v2/creators/{id}/notesandPOST /api/v2/videos/{id}/notes.
GET /api/v2/creators/{id} and GET /api/v2/videos/{id} now return
readme_version for this. The notes editor on creator and video pages uses the
same check: if the notes changed after you opened them (say an agent appended a
section), saving stops and asks you to reload instead of overwriting, and your
draft is kept so you can copy it back in. Also fixed: the Program Health page's list of
system-disabled creators now shows why each one was disabled (deleted, private
or unreachable) instead of a generic reason.
: Connect Claude to trackagoat with one click
Add trackagoat to Claude.ai or Claude Desktop as a custom connector: in Claude,
go to Settings → Connectors → Add custom connector, enter
https://www.trackagoat.com/api/mcp and click Connect. You sign in with your
trackagoat account, pick the organization, and choose whether Claude can only
view data or also make changes. No API key or mcp-remote setup needed. See
MCP server.
Manage connected apps under Settings → Connected Apps; org admins also see every member's connections under Org settings → API keys. Connected apps don't count toward your API key limit, and each tool call counts as one API request, like a key.
: Hosted MCP server
trackagoat now runs its own MCP server at
https://www.trackagoat.com/api/mcp. Connect Claude Code, Claude Desktop, Cursor
or any Streamable HTTP MCP client with an org API key, and your agent gets
tools to browse projects, creators, videos, campaigns, goal compliance and payout
accruals, pull analytics time series, and, with a write-scoped key, add
creators, videos, goals and campaign items or trigger a scrape. Each tool call
counts as one API request, and permissions match the REST API exactly.
Also new in the REST API: GET /api/v2/videos/{id} returns a single video with
its latest stats.
: Video refresh works, and scraping recovers more cleanly
- Refreshing a single video's stats now works. The refresh button on a video
and
POST /api/v2/videos/{id}/scrapeused to fail without saying why. The API endpoint now refreshes that one video rather than every video in the org. - A newly added video gets its stats right away, rather than waiting for the next scheduled stats run. This doesn't use up your daily Update Now quota.
- Hitting the scraping provider's usage limit no longer loses data. Stats and profiles fetched before the limit was reached are saved, and the videos and accounts that weren't reached are left as they were, rather than marked as failing.
- Refreshing one account always scrapes it, even if it was refreshed in the last 24 hours, and no longer delays the rest of the org's scheduled refresh.
- A scraping-provider outage no longer flags TikTok accounts as unreachable. Before, an outage could count against every account and, after a few hours, disable them all.
- A failed run that is retried does its work properly. Before, a retried run could end up marked complete without scraping anything, which held back the org's next run.
: Baseline markers, creator follower history and newsletter signups fixed
Video charts show their baseline markers again. Since late April, a video's first snapshot taken more than 25 hours after it was posted was still treated as a baseline (its views weren't counted as new), but the chart marker explaining why was missing.
A creator's follower, following, likes and video-count history now only sums the creator's active accounts, the same accounts as the current totals on the creator page. Before, a removed account's last numbers stayed in the creator's history after it was removed.
Newsletter signups from the website footer are now saved. Until now they failed silently while the form reported success.
: Payout calculation fixes
Several fixes to how payouts are calculated. Payouts already earned or paid are not changed.
- Unreviewed videos no longer earn CPM or view-milestone payouts. Only auto-tracked, included and directly added videos count, the same as goals. A video waiting in the Tracking Inbox counts once you approve it.
- Unassigning stops earnings at the unassignment. CPM and conversion payouts now count only what happened while the creator was assigned, as view milestones already did.
- "Apply to existing videos: off" is enforced for creators with long histories. Milestones a video passed before the creator was assigned could still fire for creators with a lot of view history. They no longer do.
- A private or unreachable account no longer holds up a creator's payout. Goal and CPM payouts are no longer withheld for up to two weeks waiting on an account that can't be checked.
- Goals that start next week no longer count toward the week that just ended. Goal start and end dates now follow your organization's timezone.
- A temporary error no longer skips a creator. If calculating one creator's payout fails, the period is retried until it succeeds instead of being closed without them.
: Posts on an account's tracking end date are now tracked
An account's tracking end date is now inclusive: posts made at any time on that day, in your organization's analytics timezone, are tracked. Previously the window closed at midnight UTC at the start of the end date, so posts made that day were skipped, and an account whose start and end dates were the same day tracked almost nothing.
The tracking window now covers each date both in UTC and in your analytics timezone, so nothing that was already tracked falls outside it. New accounts default their start date to today in your analytics timezone.
: Correct totals on Program Health, the dashboard and goals
On larger programs, several numbers were computed from only part of your data and read too low. They now count everything, so expect some of them to jump:
- Dashboard: the views card (now labelled Views on posts from this period: lifetime views of the videos posted in the selected range), Top Creators, Avg Views / Post, the "No posts in selected period" list and the pending-review breakdown by creator. On a ~100-creator program the views card had been showing well under half the real total.
- Program Health: Total Views and its sparkline, Daily Posts Volume, Posts This Week, Stale Creators (could show none when some were stale), Posting Consistency and Underperformers. "Last 30 days" is now exactly 30 days and includes posts made late in the evening in your timezone.
- Follower Growth no longer jumps up and down from day to day. Each account now carries its latest follower count forward instead of dropping out on days it wasn't updated.
- Goal compliance on the dashboard, Program Health, the Goals nav badge and
GET /analytics/aggregate/goal-compliancenow covers every creator. It was capped at the first 50. - Posting calendar and
GET /analytics/aggregate/posting-consistencyno longer drop posts in busy months. - Engagement rate on Program Health now includes saves, matching Insights. Videos whose tracking has expired or been disabled no longer count toward Program Health's engagement figures, matching the dashboard and goals.
- Sudden view drops only compares videos at least 72 hours old, and the
engagement rate drop alert compares complete weeks, so new posts no
longer trigger false alarms. Both widgets also showed
@undefinedinstead of the creator's handle, which is fixed too (as is the Tracking Gaps list). - Filtering Program Health or the posting calendar by campaign now includes nested campaigns and videos added to the campaign directly, the same as Insights.
- The Creators CSV export no longer stops at 1,000 creators.
: Analytics charts count the right gains on the right days
Creator, video and campaign charts now show noticeably different (correct) numbers:
- Views Gained and other "New" charts no longer count a video's lifetime on the first day of the range. Each video's first day is now measured against its last snapshot from before the range. For one creator, a 30-day range had been reporting about 6.5 million views gained; the real figure was about 5,100. Engagement rate and average views per post had the same first-day problem and are fixed too, as are the compare-to-prior-period summary cards.
- Days line up with your organization's timezone. In timezones behind UTC (all of the Americas) charts were shifted one day early and left out today. Every day, week and month bucket is now your org's calendar day, and today appears as the in-progress bucket.
- Videos Added no longer counts every earlier video on the first day of the range.
- Campaign Analytics loads on large campaigns. The top videos and top creators tables no longer time out.
- API keys:
GET /api/v2/analyticsresolves the timezone, plan retention and ownership from the requested entity's own project, so entities in any of your organization's projects work, not only the first one.
: Failed loads now say so
When a page or widget can't load its data, it now shows an error with a Retry button instead of an empty state. Previously a failed request could read as a real answer: "No goals set", "$0.00" in payouts, empty leaderboards, or a Healthy pulse on Program Health.
Organization and project READMEs are now read-only for members who aren't org admins. Only admins could ever save them; the editor used to accept the text and then silently discard it. A README save that fails now shows an error and keeps you in the editor.
: Daily limits reset at your org's midnight
Daily quotas (API requests and manual Update Now scrapes) now reset at
midnight in your org's time zone, which is when the counters actually roll over,
instead of the UTC midnight shown before. The Usage tab, the Update Now dialog
and the Retry-After header on a daily-quota 429 all use that time.
The daily API request quota is enforced again: once your org reaches
max_api_requests_per_day, further API calls return 429 rate_limit_exceeded
until the reset. See Plan limits.
: Insights filters and Creators export fixes
- Platform filter now applies to every Insights widget. On Creator Insights, the summary strip, Needs Attention and Creator Tiers showed all-platform totals even with a platform selected; on Video Insights the summary strip and Engagement Breakdown did the same. They now follow the platform (and, on Video Insights, the campaign) filter like the leaderboards beside them.
- Creators CSV export matches the page. The export now honors the goal status and Auto-Disabled filters across the whole project, not just the rows loaded so far. The Handle and Platforms columns, which had been exporting blank, are filled in again, and Compliance is filled in when you export with a goal-status filter.
- The Creators footer now shows how many creators match the active filters.
: API keys follow their owner's org role
API keys act as the user who created them, and now stay in step with that user's membership:
- Removed or departed members' keys stop working. Removing someone from an
org, or leaving one, revokes every API key they created for it. Any key whose
owner is no longer a member is rejected with
401 invalid_api_key. adminscope needs a current org admin. If a key's owner is demoted to member, the key keepsreadandwritebut losesadmin.- Org management over the API now needs
admin. Creating or revoking API keys, adding, changing or removing members, sending or revoking invitations, creating or updating projects, and creating organizations (POST /api/v2/user/organizations) previously accepted awritekey; they now require theadminscope, matching the in-app rule that only org admins can do these things. - A key can't mint a broader key.
POST /api/v2/organizations/{id}/api-keysonly grants scopes the calling key holds. POST /api/v2/organizations/{id}/membersworks again. It was failing with a 500 on every call.- Secrets aren't kept for idempotent replays. Replaying an API-key creation
with the same
Idempotency-Keyreturnskey: null, and replaying a share-link creation returnspin: null. - Invitations respect the member limit. Accepting an invitation into an org
that is at its plan's member limit now returns the standard
limit_reachedresponse instead of going over the limit.
See Authentication.
: Save counts no longer drop to zero
A TikTok video's save count could reset to 0 after a refresh that didn't return it, which also showed as a dip in the video's history. A refresh that doesn't return a save count now keeps the last known value.
: Deleting and voiding are now org-admin only
A few destructive actions were open to every org member even though similar actions already needed an org admin. They now need an org admin too:
- Deleting a creator (one at a time; bulk remove already required an admin).
- Deleting a video. This is permanent and removes its stats history.
- Deleting a campaign.
- Voiding a conversion. Voiding lowers unpaid payouts earned from it, and voiding a payout accrual directly already needed an admin.
- Uploading a payment receipt (part of recording a payment, which was already admin-only).
Members no longer see these controls. Everything else they could do is unchanged. API keys are unaffected, since only org admins can create them.
: Safer payment recording
Several fixes to how payments and payout structures are recorded:
- Mark as Paid only settles the selected creator. Choosing a creator in the global Mark as Paid sheet now pre-checks that creator's outstanding accruals, and switching creators clears the previous selection. Payments can no longer settle another creator's accruals.
- A structure's period and criteria type are fixed once it's in use. To change them, create a new structure and move creators to it. Amounts and criteria settings can still be edited.
- Payout dates follow your org's timezone in the tracker, charts, accrual lists and CSV exports, matching the API.
- CSV exports include every row. Large projects were cut off at 1,000 rows (200 for the tracker summary). The tracker export also gains a Currency column.
- Structure filter on the tracker: Paid now counts only payments applied to that structure.
- API:
POST /api/v2/payout-paymentsrequires anIdempotency-Keyheader. A retry with the same key returns the original payment instead of recording a second one.creator_idis required withaccrual_idsorauto_apply_outstanding, andauto_apply_outstandingreturns409 nothing_outstandinginstead of recording a payment that settles nothing. - API: assignment
effective_atcan no longer be earlier than the start of the period in progress, and the goalspartial_multiplieris capped at 1. - API:
DELETE /api/v2/payout-structures/{id}/assignmentsworks again (it returned 500).
: Removing a creator now frees its accounts
Removing a creator used to leave its accounts behind. They kept counting toward your account limit, kept being scraped, showed up as standalone accounts, and blocked you from adding the same handle again ("already tracked"). Removing a creator now removes its accounts too, however you remove it: from the creator's page, from the Creators list (one or several), or through the API. Accounts left behind by creators removed earlier have been cleaned up, so you may see your account usage drop.
Also in this release:
- Adding a creator is all-or-nothing. If one of its handles is already tracked, or you're at your account limit, nothing is created. Before, you were left with an empty creator that had no accounts.
- Moving an account to another creator moves its existing posts too, not just the ones discovered afterwards.
- Un-archiving a project counts toward your project limit, the same as creating one.
- Campaigns only accept creators, posts and sub-campaigns from their own project. Campaign totals count a post only if it's tracked (not excluded or pending review). Removing an account later doesn't take its posts out of a campaign's totals.
- Bulk remove reports the real count.
removed_countfrom the API is the number of creators actually removed, not the number of IDs you sent.
: Instagram accounts now update
Instagram accounts could be added but never filled in: no followers, no profile photo, no posts, and Refresh failed without saying why. Instagram tracking was not running. It is now, and every Instagram account already in your projects has been picked up without you needing to re-add it.
What to expect on an Instagram account:
- Followers, post count and profile photo refresh daily.
- New posts are discovered twice a day, from the account's tracking start date onward, and follow its tracking mode. In Hashtag mode, posts with your hashtag in the caption are tracked and the rest wait in the Tracking Inbox.
- Views are plays on Reels. Photo posts and carousels are tracked with likes and comments, but Instagram doesn't publish a view count for them, so they show 0 views.
- Comments and sentiment are collected for tracked posts.
- An account that is private gets the Private badge; one whose handle doesn't exist on Instagram is flagged unreachable after a few attempts. Both send a notification to org admins.
Instagram content counts toward any goal or payout structure whose scope includes Instagram, so check the scope on structures you set to All platforms. See Instagram tracking.
: Private accounts are flagged everywhere
A tracked account that switches to private used to be invisible: its profile kept updating, so nothing failed and nothing was auto-disabled, while no new post was ever discovered. The creator just looked like someone who stopped posting, and their goals quietly read as missed while payout periods held.
Private accounts now carry a Private badge on the creator page, the creators list, the accounts list and the account page, with a hover explaining when it went private and what stops working. Program Health raises an alert listing every private account in the project, and the Account went private notification to org admins now opens the creator it refers to. Detection was already running in both directions: when an account reopens, the badge clears on its own and you get an Account is public again notification.
: Mark as Paid is one screen, and a payout gap is fixed
Mark as Paid no longer walks through six steps. It is a single form: the creator's earned accruals arrive already checked, the running total sits in the footer, and everything optional (amount override, payout method, date paid, tracking URL, receipt, note) is behind a collapsed Payment details section that shows its current values on the header line. The section opens on its own when it holds something required, such as an adjustment reason.
Payout accruals no longer go missing for a closed period. Goals and CPM periods wait for a deep account reconciliation before they settle, and that wait was being charged against the retry budget the engine uses for real errors. On larger programs the budget ran out before the reconciliation finished, and the affected creators were never accrued for that period, with no error surfaced. A period now waits up to 14 days for its data, and raises a warning instead of going quiet if the data never arrives. Periods previously dropped this way have been recomputed, so any payout that was missed is now showing as earned.
: Campaign filter on Insights, and program trend charts
Video Insights, Account Insights, and Campaign Insights now have a Campaign toggle in the toolbar. Pick a campaign to scope every widget on the page to that campaign's videos (direct videos, member creators' videos, nested campaigns), or leave it on All campaigns. The choice is kept in the URL so a scoped view can be shared.
Campaign Insights also opens with five new trend charts built for recurring program reviews: impressions over time (counted on the day the views happened, not the posting day), posts over time, creators posting, impressions per post, and new creators posting. They follow the toolbar's date range and granularity.
For API and agent callers, the same scope is an optional campaign_id on the
video, account, and campaign aggregate endpoints, and the trend series is
available at GET /api/v2/analytics/aggregate/campaign-timeseries.
: Payouts tracker lists assigned creators before their first earning
With All selected, the Payouts tracker now includes creators who are assigned to a payout structure but have not earned anything yet, showing $0 and their structure count, so a newly added creator is visible before their first period closes. Marking accruals as paid now refreshes every open payouts view (tracker rows, expanded accrual lists, creator Payouts tab) immediately, and recording several payments in a row from the same page no longer fails after the first one.
: Payout periods now reconcile late posts automatically
Goals and CPM payouts now wait for a deep, post-period account reconciliation before they are calculated. If an eligible post is discovered after an unpaid accrual was created, trackagoat reopens the period and recalculates the earning automatically. Recorded payments remain immutable; any late data that could affect one is flagged for finance review instead of silently rewriting history.
: Choose when a payout structure starts earning
Assigning a payout structure now asks two questions instead of silently starting at the moment you click. Start on period picks which period earning begins on (the one in progress, or any of the next three), so moving a creator between structures no longer has to overlap. First period decides how a period already underway is treated: prorate from today, or take it whole.
For CPM the second choice is the one that matters. CPM counts the views on videos posted inside the period, so it now offers counting only videos posted from the assignment onward, rather than always counting the whole period including videos posted before the creator was on the structure.
Existing assignments are untouched and keep behaving exactly as they did. The
v2 API accepts effective_at and first_period_mode on
POST /payout-structures/{id}/assignments.
: CPM payout structures drop the unused amount field
Creating a CPM structure no longer asks for an "Amount per period" or a proration mode. Neither was ever used to calculate CPM earnings (the tiers carry the money), so the fields only invited a number that did nothing. The payment period remains, since it is the window impressions are summed over. Existing CPM structures are unaffected, and the stale flat amount they carried is no longer shown in the structures list, the structure header, or a creator's shared payouts page.
The CPM rate and cap inputs also accept decimals properly. They previously
reformatted on every keystroke, so 1.50 could not be typed and any rate under
$1 was unreachable.
: Filter Payouts by campaign
The Payouts tracker now has a Campaign filter. Selecting one updates the outstanding balance, creator table, spend charts, and CSV exports to the creators represented by that campaign, including individually added videos and nested campaigns. The selected campaign stays in the URL for bookmarkable and shareable views.
: View-incentive accruals resume automatically
View-threshold payout structures stopped creating new accruals after a shared scraper-freshness check was changed for conversion payouts. Video stats continued updating normally, but newly crossed milestones did not appear in Payouts. The threshold-specific freshness check has been restored; eligible missed milestones are picked up automatically by the next payout calculation.
: Scrollable pickers no longer overlap their buttons in Safari
In Safari, any dialog with a scrolling list (Add Creators to a payout structure, Assign Payout Structure, the add-to-campaign pickers, the calendar day view, and chart annotations) rendered the full list instead of confining it to its box once the list was long enough to scroll. The overflowing rows spilled over the buttons beneath them, so clicking Assign selected a creator instead. Chrome and Firefox were unaffected, which is why the problem looked account-specific. The list now stays inside its box and scrolls in every browser.
: Payouts tells you when a creator has no structure assigned
Creators who had been added, put in a campaign, and given goals were silently absent from Payouts, with nothing on the page explaining why. Earnings only accrue against an assigned payout structure, and the tracker lists creators who have earnings or payments, so an unassigned creator never appeared at all.
The Payouts page now shows a banner naming any active creators with no payout structure, with a button to assign one to all of them at once. Also fixed: analytics time-series reads were capped at 1,000 rows, which understated longer-window creator and campaign charts by as much as 11%.
: Shareable creator pages
Give a creator a private link where they can check their own numbers: no account, no login, no invitation.
- A page per creator, protected by a 4-digit PIN. Create one from a creator's Info tab, choosing whether it shows Analytics, Payout accruals, or both. Analytics covers headline totals, a views-over-time chart, goal progress, and their video list; payouts covers what they've earned, what's outstanding, what you've paid, and the terms they're on.
- Bulk creation. Select creators on the Creators list and click Shareable Pages to set up a whole cohort at once (each with their own PIN, or one PIN for the batch), then copy the results or download them as CSV.
- Predictable links. Every page lives at
/share/creator/<creator_id>, so anything holding a creator id can build the link without a lookup. The URL isn't a secret; the PIN is what gates the data. Nothing renders before the PIN is verified, wrong guesses are locked out after ten attempts, and the pages are excluded from search engines. - Full API support. Every creator response now carries a
share_linkobject, and links can be created, updated, rotated, disabled, and deleted through the v2 API, including a bulk endpoint. Entrance PINs are hidden by default and only returned to anadmin-scope key that asks for them explicitly. See Shareable creator pages and the Share Links API reference.
: Conversion payout structures are editable again
- "Invalid request body" when editing a conversion payout structure. The structure detail page showed a Period & Amount card for conversion structures, but a conversion structure pays per event: the rates live in Criteria, and the period is set by the roll-up cadence. Nothing typed into that card could ever save. It no longer appears for conversion structures, matching how view-threshold structures already behaved. Edit the cadence and per-event rates under Criteria.
- Deactivated conversion events no longer look like missing ones. Deleting a conversion event deactivates it rather than removing it, and deactivated events are hidden from the event picker when building a payout structure, so a project could appear to have no events while re-creating them failed with "already exists". The picker now says how many are deactivated and links to Manage events, and the API's 409 names the existing event, says whether it is deactivated, and tells you how to reactivate it.
- A mismatched roll-up cadence returns a clear error. Sending a conversion structure whose
perioddisagreed with its cadence through the API failed with a server error instead of a validation message.
: Sandbox testing, and two fixes around it
- How to get a sandbox for API testing is now documented. API keys are scoped to an organization, not a project, so a key can reach every project in its org. To test an integration safely, create a separate org and use a key from there. See Authentication.
- Pausing scraping now actually pauses it. Turning scraping off for an org stopped the scheduled runs, but adding a creator still triggered an immediate scrape. Adding a creator to a paused org no longer starts one.
- Deleting a conversion that has been paid out no longer fails silently. Hard-deleting a conversion that had already produced a payout accrual returned a server error every time. It now returns a clear
409explaining that the conversion should be voided instead: voiding reverses an unpaid accrual, and flags an already-paid one for review. The same fault also blocked deleting a project or organization containing such a conversion; that works now too.
: Deleting a creator works again
Removing a creator silently failed to save since the 2.0 upgrade: the button reported success but the creator reappeared on refresh. The delete referenced a field that moved during the upgrade, so it errored before saving. Fixed; deleting a creator now removes them and stops tracking their accounts as of that day.
: Payouts page fixes
- Date-filtered payouts no longer hide threshold and per-conversion earnings. Narrowing the payouts tracker to a date range dropped accruals from view-threshold and every-conversion structures (which aren't tied to a calendar period), so a week could show "no outstanding payments" while money was actually owed. These now appear, filtered by the date each was earned.
- Edit conversion events. Conversion events can now be edited from Conversions → Manage events: update an event's name, description, or default value. Changing the value doesn't alter conversions already recorded.
: Get notified when a tracked account goes private
When a creator sets their TikTok or Instagram account to private, we can still read their profile but can no longer track new posts or view counts. Previously this was silent: the account just appeared to stop posting.
- Org admins now get a notification the moment a tracked account goes private, and again when it becomes public and tracking resumes.
- Accounts carry a private state and a changelog entry records each transition.
- Under the hood this also closed a scraping-cost leak: a private account's now-unreachable videos were being retried every cycle at real expense.
: API v2 now matches its documentation
Three fixes where the v2 API behaved differently from what the docs described. If you built an integration against the documented behaviour, it now works as written.
- Creator
metadatais writable again. The docs described it as writable and the field was returned in responses, butPOST/PATCH /api/v2/creatorssilently discarded it (unknown fields are stripped), so you got a201and no stored value. Use it to map your own record ids onto a creator.PATCHreplaces the whole object rather than merging. - A leading
@in a handle is now stripped. The docs said it was; v2 stored the handle verbatim, so@rachelwas scraped as the literal handle@racheland counted as a different account fromrachel. - The daily-quota
429now carriesRetry-After. Only the per-minute limiter sent it before, so clients had to special-case which limiter fired.
: Pay creators for conversions
Payout structures can now pay on conversions, alongside recurring, goals, CPM and view-threshold rules.
- Pick the events that count. Select which conversion events a structure pays for, and give each its own rate: a flat amount per conversion, or a percentage of that conversion's value.
- Choose how often it rolls up. Pay on every conversion as it arrives, or sum a creator's conversions daily, weekly or monthly. Weekly can start on any day, so "every Tuesday" works.
- Refunds are handled. Roll-ups wait 24 hours after a period closes, so a conversion voided in that window never becomes a payout. A conversion voided later voids its unpaid accrual; anything already paid is left alone and flagged for review rather than silently rewritten.
: Hashtag matching fixes & org member removal
- Hashtags in non-Latin scripts now work. Hashtag mode could never match a tag written in Devanagari, Arabic or Hebrew: the stored tag and the caption were being cleaned by two different rules, so they never lined up. Both sides now use the same rule.
- Punctuation in hashtags is handled predictably. A tag typed as
#Black-Fridayis stored asblackfriday: the form people actually post, and matches captions written either way. It no longer becomes two separate tags. - Removing someone from an organization works again. This had been failing since 2026-07-15 for every org, which also prevented deleting a user account.
- Conversion event limits are enforced on reactivation. Re-enabling a deactivated conversion event while already at your plan's limit is now correctly blocked.
: Conversions
Trackagoat now tracks outcomes, not just output and cost. Define conversion event types per project (Signup, Purchase) and POST conversions to the v2 API attributed to a creator, an account, or a video.
- Conversion events. Project-scoped definitions carrying a stable
key, a default value, and a currency. Currency lives on the definition, so every total is well-defined. Plan limits: 3 event types per project on Free, 25 on Starter, unlimited on Ultra. Conversion volume is never capped. - Attribution with rollup. A conversion on a video also counts for that video's account and creator, so you can attribute at whatever precision your data supports and still report at any level. Attribute by
creator_id,account_id,video_id, orplatform+handle. - Frozen attribution. The rollup is computed at receipt time, so moving a video between accounts does not rewrite its past conversions and historical reports stay reproducible.
- Two idempotency layers. The
Idempotency-Keyheader replays a response for 24 hours; theexternal_idfield dedupes permanently per project, returning the original conversion withdeduped: truerather than a duplicate or an error. - Void, don't delete.
DELETEvoids by default (auditable, excluded from totals, still visible behind?status=all), which is the right answer for a refund or chargeback. Irreversible hard deletes require anadmin-scoped key. - Batch ingest. Up to 500 conversions per request.
See the Conversions guide and the API reference.
: Hashtag import mode
- New Hashtag tracking mode. Alongside Auto and Selective, an account can now track by hashtag: define a list of hashtags, and any newly discovered video whose caption contains one of them is tracked automatically. Ideal when a creator posts both sponsored and personal content and only tagged posts should count.
- You choose what happens to the rest. A Send non-matching videos to the Tracking Inbox option routes everything else to the Inbox for review (the default), or excludes it outright.
- Works the same on every platform. Matching runs on the video caption for TikTok and Instagram alike. Note that Instagram creators who put hashtags in the first comment rather than the caption won't match. Use Selective mode for those accounts.
- Safe on missing data. Videos that arrive without a caption always go to the Inbox rather than being silently excluded.
: Accounts tab, durable avatars & docs refresh
- Accounts tab on creators. Every creator now has a dedicated Accounts tab listing each platform account: platform, handle, tracking mode, followers, videos, scrape freshness, and status: with links to the account and its live profile. (This replaces the Accounts block that used to live on the Info tab.)
- Profile pictures no longer disappear. Avatars are now stored permanently instead of relying on platform image links that expire after a few days, so creator and account profile pictures stay put. Where an image is temporarily unavailable, a clean placeholder shows instead of a blank circle.
- Docs refresh. Guides and API reference now consistently describe how accounts sit between creators and videos across TikTok and Instagram.
: Flexible accounts & creators + Content Calendar platform filter
Building on Trackagoat 2.0, accounts and creators are now fully flexible.
- Add accounts on their own. From the Accounts page, use Add Account to start tracking a platform account by pasting its profile URL (we detect the platform) or a handle. Attach it to an existing creator, or leave it standalone and attach it later.
- Create a creator with no account. The Add-Creator dialog has a Name only mode to create a creator up front and add their accounts whenever you like.
- Editable creator name. A creator's display name is now an optional override on their Info screen: leave it blank and the creator automatically shows their primary account's name and avatar. Set it to give the creator a custom name.
- Richer Accounts block. A creator's Info → Accounts section now lists each account with its platform, handle, followers, video count, and scrape freshness, linking straight to the account.
- Handle editing moved to the account. You now rename a handle on the Account detail page (where it belongs), not on the creator.
- Content Calendar platform filter. Filter the calendar's posts by platform (TikTok or Instagram).
: Trackagoat 2.0: Instagram tracking and multiple accounts per creator
Update (Oct 2026): this entry was edited to describe what shipped. YouTube was never switched on.
Trackagoat is now multi-platform. Alongside TikTok, you can track Instagram Reels and posts with the same views, engagement, posting-consistency, campaign, goal, and payout tracking you already use. YouTube isn't supported. Read the full announcement →
Creators now have accounts. A creator is the person; an account is one of their platform presences. A single creator can have a TikTok and an Instagram account, or even multiple accounts on the same platform. Your existing TikTok creators were migrated automatically: each became a creator with one TikTok account, and all of your history, videos, campaigns, goals, and payouts carried over unchanged.
- Multi-platform tracking. Add Instagram accounts to any creator. Views (plays on Reels), likes, comments, followers, and posting cadence are tracked per account.
- Aggregate + per-platform views: creator stats sum across all their accounts by default, with a platform/account switcher on every creator page to drill into one account. Analytics gains a platform filter and per-platform breakdowns.
- Mixed campaigns. A campaign can contain videos and creators from any platform, with a per-platform breakdown.
- Platform-scoped goals & payouts: goals and payout structures can target all platforms, one platform, or one specific account. Your existing goals and payout structures were scoped to TikTok, so their behavior is unchanged.
- New account-based limits: plans now count accounts (which incur tracking cost), not creators. Creators are free; add as many as you like.
API v2. The new data shape ships as /api/v2, with accounts nested under creators, platform filters on analytics, and new accounts and content-groups resources. /api/v1 has been retired. See the API reference to migrate.
: Clearer permissions, organization admins can manage payouts
Permissions are now driven entirely by your organization role, and blocked actions explain themselves.
- Organization admins can record and void payouts, and perform every admin action: across all projects in the org. Previously an internal, invisible project-level role could drift out of sync with your org role and block you even as an org admin. This is what caused the payout Mark as Paid flow to fail on its final step (in some cases silently) for admins.
- Blocked actions now tell you why. When you don't have permission for something, you'll see a clear message about what's required (e.g. "You need to be an organization admin to do this: ask an org admin to update your role") shown as a notification, instead of a vague "Forbidden" or nothing at all.
Recording or voiding a payment requires an organization admin; viewing payouts is available to any organization member.
: Refreshed interface
We refreshed the app's interface with updated component styling, cleaner buttons, form fields, cards, dialogs, and focus states for a more modern, consistent look. This is a visual update only: no workflows, data, or behavior changed.
: Dates and counts now use your organization's timezone everywhere
Every surface that shows or counts activity by day now uses your organization's analytics timezone consistently, matching how the content calendar, Program Health, and goal tracking already worked. Previously a few places still bucketed or displayed timestamps in UTC, so an evening post (in a negative-UTC-offset timezone) could appear on the next calendar day, and per-period video counts could differ from one screen to the next.
What changed:
- Video and campaign lists/details, the "Posted", "Created", estimated-scrape, and operational timestamps on the Videos tab, Creator details, Campaign pages, and payout screens now render in your org timezone.
- Analytics counts: the project dashboard's period totals and daily trend, plus the aggregate API endpoints (view distribution, outliers, leaderboards, creator scatter, posting heatmap/consistency), now bucket and range posts by your org's calendar day.
- Payout and sentiment APIs:
from/todate filters onGET /api/v1/payout-payments,GET /api/v1/payout-accruals, and the sentiment endpoints now interpret bareYYYY-MM-DDdates as your org's calendar days (pass a full ISO timestamp for an exact instant).
No data changed: only how existing timestamps are grouped and displayed. If a video looked like it was posted "a day off," it will now match the day it was actually posted in your timezone.
: Weekly payout periods now follow calendar weeks (Mon to Sun)
Weekly payout periods are moving to true calendar weeks, Monday 00:00 → Sunday 23:59 in your organization's timezone, so they line up with Program Health, analytics, and goal tracking everywhere else in the app. Previously, some weekly structures were anchored to the weekday the structure was first created (e.g. Tuesday→Tuesday), which was internally consistent but didn't match the rest of the app.
The switch is forward-only and does not change or re-cut any historical or already-paid weeks. To keep coverage continuous through the change, the final legacy week is paid normally and a one-time short "bridge" week covers the gap up to the first calendar Monday, after which every week is Mon to Sun. Amounts for past weeks are unaffected.
: View incentives now show when the threshold was passed
View-incentive ("milestone") accruals have no weekly/monthly period, so they previously showed no meaningful date. They now carry a threshold-passed date: the earliest point we observed the video's views cross the payout threshold (derived from view history; falls back to when the milestone was credited if history doesn't cover the crossing). This date appears on the accrual rows in a creator's payouts dropdown and in the Mark as Paid list, as a new Threshold Passed At column in the Accruals CSV export, and on the GET /api/v1/payout-accruals response.
: Accruals export now includes view incentives
The Accruals CSV export was dropping view-incentive ("milestone") accruals whenever a date range was applied, so exports could show only goal-compliance accruals. View-incentive accruals are earned when a video crosses a view threshold and have no weekly/monthly period, which caused them to be filtered out by the date range. They are now included correctly. Additionally, individual accrual rows for view incentives now show the date the accrual was earned, matching goal-compliance rows.
: Backdate a payment when recording it
When you mark accruals as paid, the Receipt step now has a Date paid field. It defaults to today, but you can set an earlier date to record a payment that was already sent, making it easy to backfill historical payout data. The date can't be in the future. The same paid_at field is available on the POST /api/v1/payout-payments endpoint.
: Payout recording fix and tracking-reliability improvements
A follow-up pass to the platform audit fixed several issues:
- Recording a payment now works reliably. A recent change had introduced a fault that caused recording a payment to fail whenever a payout method was selected. Payment recording is fully restored. (Payout amounts and history were never affected: only the act of recording a payment.)
- Auto-disable is less trigger-happy. A temporary hiccup with our data provider during the discovery of brand-new creators could wrongly count against them and, after repeated hiccups, auto-pause a perfectly healthy creator. Those transient provider outages are now recognized as such and no longer penalize creators.
- Paused creators keep their view counts current. Videos belonging to a creator who has been auto-paused (but not removed) now continue to update their view and like counts, so view-milestone payout progress no longer stalls while a creator is paused.
- The public newsletter signup now always enforces a submission rate limit, even when our rate-limiting cache is unavailable.
: Always-accurate plan limits
The Limits & plan tiers page now reads tier values straight from the live plan configuration instead of a hand-maintained table, so it can never drift from the limits actually in force. When the team adjusts a tier, the docs update immediately. This pass also surfaced and corrected several stale values the old static table had been showing.
: Clearer labels across the app
A pass over the whole interface to make labels and wording clearer and more consistent. Notable renames you'll see:
- The Tracking section (was "Primitives") groups Campaigns, Creators, and Videos.
- Payouts (was "Payment Management") in the sidebar.
- Tracking Gaps (was "Video Parity") in Program Health, with plain-language explanations.
- Auto-Disabled (was "System Disabled") for creators we automatically pause after repeated failed updates.
- Update Now / Data Freshness / Update Failures (was "Scrape …") and Find New Videos (was "Discover New Videos").
- The creators list now shows Tracked Posts (posts in your program), and the dashboard shows Total Followers.
No functionality changed: only wording.
: Security & access-control hardening
Several access-control fixes following a full security review:
- Closed a permission gap that could have let a signed-in user grant themselves access to an organization or project they weren't a member of.
- API keys now strictly honor their scope: a read-only key can no longer create, edit, or delete payout configuration (it receives a clear "write scope required" error).
- Locked down internal database functions and tightened tenant scoping on analytics so data can never be read across organizations.
- Account impersonation (used only by platform support) is now verified on every request and cannot be spoofed.
: Photo carousels tracked correctly
Fixed a class of bugs affecting TikTok photo (carousel) posts. A regression had caused photo posts discovered since early June to be stored as regular videos, which put them on the wrong (too-frequent) scrape schedule and mislabeled them throughout the app. 411 affected posts were corrected, and the underlying causes were fixed: photo posts are now reliably classified, always get a valid /photo/ link, are no longer dropped during fallback discovery, and can't record a corrupted zero-view reading from a partial page load. Photo posts now also scrape on their intended (cost-efficient) cadence.
: Complete post capture, no more permanently-missed videos
Discovery now guarantees every reachable post is eventually captured, closing a class of permanent gaps.
Previously, routine discovery stopped scanning a creator's history as soon as it reached a video it already knew about. That meant if a post was ever missed: during a posting burst, a TikTok block, or before a creator's tracking start date was backdated. It became a permanent hole that no amount of waiting would fill.
Now a cost-bounded reconcile runs continuously in the background: each creator periodically gets a deep, full-history re-scan that fills any gap it finds, prioritizing creators whose captured post count is furthest below their TikTok profile count. The existing backlog of missed posts drains automatically over the first cycle. This adds only a small, capped amount of scraping work: each creator is deep-reconciled at most once per ~30 days, and creators with detected gaps jump the queue.
: Platform-wide reliability and data-accuracy audit
A holistic audit pass across the entire platform, focused on data completeness, accuracy, and security:
- Scrape accuracy, failed video scrapes are no longer recorded as zero stats (previously a TikTok timeout could zero out comment/share/save counts and write a false dip into stats history). Stats history is now fully idempotent under retries.
- Metadata no longer disappears: captions, posting dates, and thumbnails are no longer wiped when a creator's scrape falls back to the secondary data source; posting dates are also derived from the video ID when TikTok omits them.
- Photo carousels can be added directly:
/photo/URLs now work in add-video (previously rejected). - Creator protection: large scrape batches are chunked so healthy creators at the tail of a batch can no longer be miscounted as failing (and eventually auto-disabled); videos of disabled creators stop consuming scrape budget.
- Fixed dead UI: campaign Top Videos / Top Creators widgets, the Disabled Creators page, and the dashboard refresh countdown were silently showing empty states for all users.
- Payout exports: CSV exports no longer drop the final day of the selected range.
- Security hardening: tightened database-level access controls across more than 100 internal functions, partition tables, and event feeds, plus several authorization fixes in the API layer.
: Health alerts are now logged and triageable
Warning alerts from the daily and hourly health checks are now persisted to the health_alerts database table instead of existing only in email. Each alert type gets one open row that re-fires bump (with an occurrence count), and alerts auto-resolve when the underlying issue clears. A new Claude Code skill (/health-alerts) provides end-to-end triage: list open warnings, investigate root causes by type, and resolve with a note once fixed.
: v1 API, full write coverage
The trackagoat API now supports writes across every resource, not just payouts and annotations.
New write endpoints (all require Authorization: Bearer tga_<key> with the write scope):
- Creators. Add (single or bulk up to 50), update, soft-delete, trigger scrape, bulk re-enable/remove
- Videos. Add (single or bulk up to 50), update, hard-delete, trigger scrape, toggle tracking, bulk tracking operations
- Campaigns: create, update, delete, add/remove items
- Projects: create, update, inbox approve/exclude
- Goals: create, update, delete
- Organizations: create org, manage members and invitations, issue/revoke API keys
- Payouts: receipt upload URL (structure/method/payment/accrual CRUD was already available)
- Admin: platform-admin endpoints for creator management, limit overrides, plan tiers, user bans, scrape jobs (require
adminscope)
New safeguards on all write calls:
- Scopes, keys now have explicit
read,write, andadminscopes (existing keys grandfathered toread + write) - Idempotency. Send
Idempotency-Keyon POSTs; replays return the cached response for 24 h - Audit log: every write is recorded in
api_audit_log. There is no in-app view of the log.
OpenAPI spec: GET /api/v1/openapi.json: import into Postman, Insomnia, or any OpenAPI-compatible tool. (v1 was retired on 2026-07-16; see API v2.)
: System status page
trackagoat now has a public status page at trackagoat.com/status. It shows live operational status for four core subsystems (Database, Scraping Pipeline, Background Queue, and Scraper Worker) and links out to the status pages of external dependencies (Supabase, Vercel, Apify, Google Cloud). The page auto-refreshes every 60 seconds. A live status pill also appears in the site footer.
: Goal data advisories
Goals now show a small amber caution icon when the displayed progress may not be final. Hover it to see an explanation. Four situations trigger the advisory:
- Period in progress: the week or month hasn't ended yet; actual counts will likely grow.
- Period recently closed: the period ended within the last 48 hours; late-period posts may still be processing.
- Stats may be stale: the creator hasn't been scraped recently; views, engagement, or follower counts may undercount.
- Goal not yet started: the goal's start date is still in the future.
The advisory is also available in the API: the advisory object is included on every goal compliance result, and a with_advisories count is added to the aggregate goal-compliance endpoint. A new GET /api/v1/projects/:id/goal-compliance endpoint returns per-goal results with full advisory data for each creator.
: Goals payouts now evaluate 48 hours after period close
Goal-based payout accruals are now computed roughly 48 hours after the period ends, rather than as soon as scrapers finish. This gives TikTok's index time to surface posts made in the final hours of a period so they're counted correctly.
If you previously saw goal payouts appear on Monday morning for a Sunday-night period close, expect them to appear Tuesday morning instead. The timing is automatic: no action needed on your end.
: Re-add a deleted creator by handle
Deleting a creator and then re-adding the same TikTok handle now reactivates the existing record (preserving history) instead of requiring manual intervention. A "Creator reactivated" confirmation appears so you know prior data was kept. Any prior auto-disable state is also cleared so scraping resumes immediately.
: Video tracking expiry rules
Org admins can now set an age-based rule that automatically stops tracking videos once they reach a certain age, freeing up tracked-video limit slots for newer content.
- Org Admin → Video Expiry: new settings tab to enable the rule, set the threshold (days/weeks/months), and preview exactly how many existing videos would be expired before saving.
- "Apply to existing videos now" toggle: expire matching videos immediately on save, or only apply the rule going forward.
- Tracking Disabled badge (red): appears on every expired video in the project list, video detail page, and creator videos tab. Hover for a full explanation of why tracking stopped (age rule or manual action) plus admin actions.
- Expires in Xd badge (amber): videos within 7 days of their expiry threshold show a pre-warning badge so admins can exempt important videos before they go.
- Exempt badge (green): admins can manually re-enable any expired video and permanently exempt it from rules. The exemption can be removed at any time.
- Bulk actions: select multiple videos in the project list to disable tracking or re-enable & exempt in one step.
- Limit count fix: tracked-video limits now correctly exclude expired videos and non-tracked statuses (excluded, pending review). This may free up capacity you didn't know you had.
: System-disabled creators visible to org admins
When trackagoat auto-pauses scraping for a creator (after 5 consecutive failures), org admins can now see, understand, and act on it: without waiting for platform admin intervention.
- "Auto-Disabled" badge appears on the creator list, creator detail header, and in Program Health: hoverable with a full explanation of why updates stopped.
- Three reason buckets distinguish Account Deleted, Account Private, and Unreachable with tailored copy and guidance.
- Re-enable action is available to org admins from the badge tooltip, the row actions menu, and the new Tools → Auto-Disabled dedicated page. A 24-hour per-creator cooldown prevents spam.
- Program Health shows a new dismissible alert and a Auto-Disabled watchlist widget.
- In-app notification goes to all org admins the moment a creator is auto-disabled.
- Creator changelog records both the auto-disable event and every re-enable (org admin or platform admin).
- Bulk actions: select multiple disabled creators to re-enable or remove them in one step.
: Edit creator TikTok handle
You can now rename a creator's TikTok handle when they re-brand or change accounts. Open any creator → Info tab → TikTok Handle card, enter the new handle, and confirm.
- Profile data (display name, avatar, follower count, bio) is cleared and a fresh scrape is queued automatically.
- Tracked videos, past payouts, campaign memberships, notes, and README remain attached to the same creator.
- The rename is logged in the creator's History tab.
- Also available via the public API:
PATCH /api/v1/creators/{id}now acceptstiktok_handle.
: Operator email alerts
Two new automated email notifications are now active for platform operators:
- Signup notifications: an email fires whenever a new user creates an account, including their name, email, auth provider, and running total user count.
- Daily scrape anomaly check: runs at 08:15 UTC and emails when longer-window issues are detected: per-creator stats gaps (>3 days), freshness drift (>25% of creators stale), comment-scraping silence (>48h), stuck payout accruals, or orphaned campaign memberships. Distinct from the existing hourly alert which covers immediate job failures.
- Daily digest: runs at 14:30 UTC (07:30 PT) and always sends a summary of the past 24h scraping activity, platform totals, and top failing creators: a green-state heartbeat for days when everything is healthy.
: Sentiment Radar
A new Sentiment Radar tool gives you a program-level view of comment sentiment across all your tracked videos.
- KPI strip: total comments, % positive, % negative, and average sentiment score for the selected date range.
- Sentiment over time chart: stacked bar chart of positive / neutral / negative volume, bucketed by day (≤14 day range) or week.
- Top creators leaderboard: creators ranked by average sentiment score (requires ≥20 analyzed comments in range).
- Negative-vibes alert: dismissible warning when any video has ≥40% negative comments with ≥10 analyzed.
- Comment stream: infinite-scroll feed of all comments, filterable by sentiment tab (All / Positive / Neutral / Negative) and keyword search.
- Campaign filter + date range: scope everything to a specific campaign and custom date window. Defaults to the last 30 days.
Find it under Tools → Sentiment Radar in the sidebar.
: Video Comments tab
Each video detail page now has a Comments tab showing the sampled comments for that video (up to 100 per video).
- Sentiment analysis: every comment is scored using sentiment analysis and labelled positive, neutral, or negative. A summary breakdown appears at the top of the tab.
- Sort options: sort by top likes, newest, or oldest.
- Auto-collection: comments are scraped automatically on a 6-hour cycle. New videos will have comments within 6 hours of being discovered.
- Image and emoji-only comments are excluded from sentiment scoring.
: Analytics section
Added a new project-level Analytics section (available in the sidebar between Tracking and Tools) with three sub-tabs:
- Video Analytics: top-video leaderboard, posting-time heatmap (DOW × hour), view distribution histogram with percentile markers, and breakout video gallery.
- Creator Analytics: creator leaderboard (followers, posts/week, engagement, growth), posting consistency punch card, goal compliance roll-up, and follower growth × engagement scatter chart.
- Campaign Analytics: campaign leaderboard with prior-period delta, multi-campaign comparison overlay (up to 5), and campaign membership overlap matrix.
Nine new aggregate API endpoints at /api/v1/analytics/aggregate/* support these dashboards and are available to API key holders.
: Internal & public docs
Overhauled both the public docs site (/docs) and the internal admin docs (/internal-docs). New three-pane layout, syntax-highlighted code, table of contents, sectioned sidebar navigation, full API reference, feature guides, and agent documentation.
: Admin Control Plane
Launched the platform admin control plane at /admin. Includes Plans tab (live tier limit editing), per-org limit overrides, per-user limit overrides, audit log, creator bans, soft-delete management, and user impersonation.
: Multi-org support
Users can now belong to multiple organizations. Added max_orgs_per_user limit key and the org picker for users with multiple org memberships.
: API keys v2
Added API key visibility rules, SHA-256 hashed key storage, and one-time key reveal flow. Keys now use the tga_ prefix format.
: Limits & plan tiers
Introduced the three-tier plan system (Free, Starter, Ultra) with atomic enforcement via Postgres RPCs, daily usage metering for API requests and manual scrapes, OverLimitBanner, and LimitReachedModal.
: Initial launch
Core platform: organizations, projects, creators, videos, campaigns, goals, inbox, content calendar, BullMQ scraper on Railway, v1 API.