TikTok Studio is a decent dashboard and a terrible database. It shows you one video at a time, one metric at a time, and the moment you want to ask a question that crosses videos, "do my longer videos convert viewers to followers at a different rate than my short ones?", you're done. There's no pivot table in the For You feed.
So I stopped screenshotting graphs and exported the data instead. TikTok's desktop analytics (TikTok Studio → Analytics → download) gives you CSVs. They're messier than the UI suggests: separate files for video performance and follower activity, dates in a couple of formats, and, my favorite, a video-title column truncated at exactly the length where all my titles start identically.
66 videos, three months, one account in the how-to niche. Here's the cleaning, the joins, and the three patterns that fell out, with the caveats at the end, because N=66 deserves caveats.
Step 1: The export is three files pretending to be one dataset
You get, roughly: a content file (one row per video: publish time, views, likes, comments, shares, average watch duration, total play time, new followers), an overview file (daily aggregates), and a followers file (daily follower counts and demographics snapshots). Field names vary slightly by region and they change without notice, my March export says Video title, my May export says Video name. Write your loader defensively:
import pandas as pd, glob, re
def load_content(path):
df = pd.read_csv(path)
df.columns = [re.sub(r'\s+', '_', c.strip().lower()) for c in df.columns]
rename = {'video_name': 'title', 'video_views': 'views',
'total_time_watched': 'watch_seconds'}
df = df.rename(columns={k: v for k, v in rename.items() if k in df.columns})
df['published'] = pd.to_datetime(df['date'], errors='coerce', utc=True)
return df.dropna(subset=['published'])
Nothing glamorous. The interesting bugs were all in the join: the followers file is daily, the content file is per-video, and "followers gained" on a video keeps updating after publish day, so a video's follower total in a fresh export differs from the same video in last month's export. If you merge snapshots naively you will double-count and conclude you're a genius. I know because I did, briefly.
Pattern 1: Followers arrive a day late
For each video I lined up its view curve against the followers it eventually produced. The peak of follower gain lands on day 2 after posting for 44 of the 66 videos. Views peak on day 1. Profile visits bridge the two, they spike late on day 1, after the view wave, as if a chunk of viewers finish their scroll session and then go check who made the thing they liked.
Practical consequence: judging a video's follower performance at the 24-hour mark, which is what the app trains you to do, systematically underrates slow-burn videos. Two of my best follower-producers looked mediocre at hour 24 and finished top-decile by hour 72.
Pattern 2: Shares and completion are pulling in opposite directions
I bucketed videos by length and computed two ratios per bucket:
| Length | Avg completion rate | Shares per 1,000 followers reached |
|---|---|---|
| Under 30s | 61% | 2.1 |
| 30-45s | 54% | 3.9 |
| 45-75s | 47% | 6.4 |
| Over 75s | 39% | 5.8 |
Completion falls off with length, exactly as expected. Shares-per-follower triples into the 45-75s band before flattening. The dashboard shows you both metrics, but never side by side per length band, so most creators optimize for the one that's green (completion) and quietly starve the one that actually distributes (shares). If you make how-to content, the 45-75s zone is an awkward length to write for. It's also where my account's distribution lives.
Pattern 3: Posting time basically evaporates
Every creator community swears by a posting hour. In my data, the raw correlation between posting hour and median views looks real, until you control for content type. My evening posts were disproportionately talking-head videos (that's when I film), and talking-head outperforms for me regardless of hour. With content type held fixed, the hour effect drops to r ≈ 0.06, which is noise wearing a trench coat.
I wanted this one to be true, for what it's worth. A magic hour would be a lovely lever to have. My export says I don't have it.
What this dataset can't tell you
One account, one niche, 66 videos, three months, observational, not causal, and TikTok changes its surfaces often enough that the export schema itself is a moving target. The dataset also describes one organically grown account; it says nothing useful about accounts that buy followers on tiktok growth services or run paid promotion, whose follower timing and share patterns would presumably look completely different, that's a different dataset and a different post.
What it can do is replace three arguments I used to have with myself every Sunday with three queries I can rerun. The full notebook is a weekend project at most: export, clean defensively, join on dates with your eyes open, and bucket by the variables the app won't cross for you. Your patterns will differ from mine. That's the point of having your own data instead of renting someone else's conclusions.













