For two weeks we have been rendering short vertical data videos entirely from code (HTML canvas, Playwright, ffmpeg, some Blender) and posting them to TikTok, YouTube Shorts and Instagram from a brand-new account. The account had zero followers on day one. Here is what the platform analytics showed, without the success-story filter.
Disclosure: I build data tools for AI agents as Fast Data on Apify. The videos use public Eurostat data and none of our paid tools; the plotting snippet below is plain matplotlib.
Finding 1: the 25-second wall
We started with 22 to 49 second explainer videos with an AI voice, then switched to 11 to 17 second loops without narration. Same account, same topics (AI, energy, work, money), same week.
| Format | Videos | Typical TikTok views | Typical Instagram views |
|---|---|---|---|
| 22–49 s explainer, AI voice | 16 | 0–2 for most; 192 and 1,100 for the two exceptions | 6–129 |
| 11–17 s loop, no or short voice | 7 with data | 830–1,200 (older ones) | 127–1,678 (four of five above 600) |
Seven of the long TikToks had 0 views a day after posting and were deleted. The one long video that did get distributed (1,100 views) had a completion rate of 1.4 %. On Instagram, every reel of 25 seconds or more stayed at or below 129 views, and every reel that reached more than 450 accounts was 11 to 17 seconds long.
That is not a controlled experiment: the short videos were also better made. But the gap is an order of magnitude, not a few percent.
Finding 2: half the viewers are gone by second 3
TikTok Studio shows how many viewers are still watching at each second. For five short videos:
| Video | Length | Views | 1 s | 3 s | 5 s | 8 s | End | Watched fully |
|---|---|---|---|---|---|---|---|---|
| 3D tower race, no voice | 16 s | 1,152 | 75 % | 46 % | 36 % | 28 % | 8 % | 11.1 % |
| 3D tower race v2 | 14.4 s | 848 | 78 % | 42 % | 29 % | 22 % | 7 % | 9.9 % |
| 3D tower race v2, other topic | 14 s | 271* | 88 % | 56 % | – | – | 15 % | 18 % |
| Quiz with AI voice | 17 s | ~1,060 | 68 % | 43 % | 37.5 % | 28 % (10 s) | 14 % | 20.4 % |
| Flat 2D bar race | 11.1 s | 831 | 57 % | 38 % | 32 % | 24 % | 17 % | 18.9 % |
*measured after 12.5 hours; the other rows after 24 to 36 hours.
What we read from it:
- The first three seconds decide almost everything. Between 44 % and 62 % of viewers were gone by second 3. After that the curves flatten.
- Frame 0 matters. The flat 2D race lost 43 % in the very first second. Its opening showed six identical bars growing together; nothing differed, nothing happened. The 3D versions with camera movement from frame 0 kept 75 to 88 % through second 1.
- Something has to happen before second 3. In TikTok Studio, the most common exit point for the v2 tower video was second 2. In the v2 design, the question on screen disappeared after about 1.5 s, so anyone who looked up at second 2 saw a number without context. Our current rule: the question stays visible for at least 3 seconds, and the first elimination happens before second 3.
- Shorter ends better. The 11-second race was watched to the end almost twice as often as the 16-second tower (18.9 % vs 11.1 %), despite its weak start.
Finding 3: TikTok gives you one day
Every short video followed the same distribution curve on TikTok: a peak in the first hour (about 250 to 320 views), then 100 to 140 views per hour, and almost nothing after hour 7 to 10. Nearly all views (99 %+) came from the For You feed. At 24 hours the electricity video had 1,147 views; at 36 hours, 1,151.
YouTube Shorts behaved differently: the first video was still growing two days later (1,485 views, 61.8 % watched to the end, the best value of all), and views kept coming from the Shorts feed.
Followers: about 10,000 views across the three platforms brought +2 followers on TikTok and +1 subscriber on YouTube. One-off data videos do not give anyone a reason to follow. A visible series ("Country race #4") is the next thing we test.
Plot your own curves
TikTok Studio does not export the curve, but you can read off the values at a few seconds and plot them:
import matplotlib.pyplot as plt videos = { # seconds -> % still watching, read from TikTok Studio "16 s tower": ([1, 3, 5, 8, 16], [75, 46, 36, 28, 8]), "11 s race": ([1, 3, 5, 8, 11.1], [57, 38, 32, 24, 17]), } for name, (sec, pct) in videos.items(): plt.plot([0] + sec, [100] + pct, marker="o", label=name) plt.axvspan(0, 3, alpha=0.2) plt.xlabel("seconds"); plt.ylabel("% still watching") plt.legend(); plt.savefig("retention.png", dpi=150) Reading values at 1, 3, 5 and 8 seconds plus the end is enough to compare designs; the shape matters more than the exact percentage.
What this does not show
- Small numbers. One account, about 20 videos, a few hundred to about 1,700 views each. Treat it as field notes, not statistics.
- Topic and design are mixed. The tower v2 performed worse than v1, but it also had a different topic. We only learned to change one variable at a time halfway through.
- No sound analysis. Most videos had synthesised sound effects; we have not measured music vs no music.
- Instagram retention is missing. The Meta Business Suite web view does not show the retention curve for this account, only average watch time (9 to 11 seconds for the best reels).
Try it
If you render videos from data yourself, the building blocks we use are in our public data-recipes repo: a Eurostat JSON-stat parser, a headless Blender render script and a script that posts a video to X via the API.
Question: if you post data visualisations as short videos, what did you put in the first second that actually held people? We are out of ideas that are honest and not clickbait.


