← WistiaCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Wistia
Snapshot Sep 30, 2026 · 22:53 UTC · version 3.0.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "wistia-video-performance-report",
"description": "Builds a video performance report for a set of Wistia videos — a single video, a channel, a folder, or every video embedded at a shared location — comparing actual performance against both this account's own internal average and Wistia's State of Video report benchmarks, then produces a chart and a stylized downloadable report with insights and recommendations. Use whenever the user asks for a \"performance report,\" \"performance review,\" \"performance dashboard,\" wants to know \"how are my videos performing,\" \"how's this video doing,\" \"how does this compare to benchmark,\" asks to \"audit performance across a channel/folder,\" or references comparing videos to the State of Video report. Also trigger for \"compare these videos\" or \"which of my videos is underperforming\" type requests. Do NOT trigger for single-video engagement/CTA placement questions with no reporting angle — use wistia-engagement-tools for those instead (this skill can hand off to it for flagged videos in Step 7).",
"included_files": [],
"skill_md_contents": "---\nname: wistia-video-performance-report\ndescription: >\n Builds a video performance report for a set of Wistia videos — a single video, a\n channel, a folder, or every video embedded at a shared location — comparing actual\n performance against both this account's own internal average and Wistia's State of\n Video report benchmarks, then produces a chart and a stylized downloadable report with\n insights and recommendations. Use whenever the user asks for a \"performance report,\"\n \"performance review,\" \"performance dashboard,\" wants to know \"how are my videos\n performing,\" \"how's this video doing,\" \"how does this compare to benchmark,\" asks to\n \"audit performance across a channel/folder,\" or references comparing videos to the\n State of Video report. Also trigger for \"compare these videos\" or \"which of my videos\n is underperforming\" type requests. Do NOT trigger for single-video engagement/CTA\n placement questions with no reporting angle — use wistia-engagement-tools for those\n instead (this skill can hand off to it for flagged videos in Step 7).\n---\n\n# Wistia Video Performance Report\n\nProduces an account-aware performance report: pulls real stats for the requested videos,\nbenchmarks them against both the account's own historical average (internal) and\nWistia's State of Video report (external), then renders a comparison chart and a\npolished, savable report.\n\nAll Wistia actions use the Wistia MCP tools — call `tool_search` for the relevant tool\nfamily before using it, since these are deferred tools and their exact parameters aren't\nin context by default.\n\nThis skill reuses the benchmark data already bundled with the `wistia-engagement-tools`\nskill rather than duplicating it — read\n`/mnt/skills/user/wistia-engagement-tools/references/state-of-video-benchmarks.md` in\nStep 4. **If that file is present, never ask the user to re-upload the State of Video\nreport** — it's already available. Only ask them to provide it if that file is genuinely\nmissing.\n\n---\n\n## Step 0: Welcome message\n\nOpen with a short welcome line in Wistia's voice before asking anything — warm, direct,\nconversational, encouraging. Not hype-y, not dry, no corporate throat-clearing (\"We're\nexcited to...\"). Plain verbs, no filler. One or two sentences, then move straight into\nthe scope question in Step 1 — don't make the welcome its own separate turn.\n\nExamples of the tone (write your own, don't reuse verbatim):\n- \"Let's see how your videos are doing. First, tell me what you'd like to look at.\"\n- \"Happy to pull a performance report together. Which videos should I look at?\"\n\nAvoid: \"I'd be delighted to assist you with a comprehensive analysis...\" (too stiff) and\n\"🎉 Let's dive into your amazing video stats!\" (too hype-y — also no emoji per house\nstyle elsewhere in these skills).\n\n---\n\n## Step 1: Scope — which videos\n\nAsk using `ask_user_input_v0`:\n\n**Question:** \"What would you like to analyze?\"\n**Options:** \"A single video\", \"A channel\", \"A folder\", \"Videos at a shared embed\nlocation\"\n\nResolve into a concrete list of `hashed_id`s before moving on:\n\n- **Single video** — ask which one (name, URL, or hashed_id) if not already given.\n Resolve via `get-medias` or `Wistia:search`.\n- **Channel** — ask which channel if there's more than one (`get-channels`), then list\n its videos with `get-channel-episodes`.\n- **Folder** — ask which folder if there's more than one (`get-folders`), then list its\n videos with `get-medias` filtered to that folder.\n- **Shared embed location** — ask the user for the domain or page URL. Check\n `show-account-embed-locations` for a matching location and its top content. If the\n tool's response doesn't break the location down to individual media (granularity\n varies), say so plainly and ask the user to confirm the specific video titles instead\n of guessing — don't silently narrow to \"whatever look right.\"\n\nIf a scope resolves to an unusually large number of videos (30+), tell the user the\ncount and confirm they want the full set before pulling stats for all of them — offer to\nnarrow to top-N by plays instead, since a 30-video report is unwieldy to read.\n\n---\n\n## Step 2: Timeframe\n\nAsk using `ask_user_input_v0`:\n\n**Question:** \"What time period should the report cover?\"\n**Options:** \"Last 7 days\", \"Last 30 days\", \"Last 90 days\", \"Custom range\"\n\nIf \"Custom range,\" ask directly in chat for start and end dates (free text — the\nelicitation tool only supports fixed options). Convert the choice to `start_date`/\n`end_date` values for the analytics calls in Step 3.\n\n---\n\n## Step 3: Pull performance data\n\nFor each video (`mediaId` = hashed ID):\n\n- **Actual stats** — `show-media-aggregated-stats` and/or `show-media-analytics` for the\n chosen date range: plays, play rate, engagement rate (% watched), average view time,\n and any conversions if a lead capture form or CTA is active.\n- **Length and type** — pull duration and metadata via `get-medias`. Classify the video's\n type using the same fixed 11-type taxonomy as `wistia-engagement-tools` (see the\n benchmarks reference file for the list) — best-guess from title/description/folder\n name, no need to stop and confirm with the user for a report (unlike the engagement\n skill, this isn't modifying anything live). Note the guess plainly in the report rather\n than presenting it as certain if it's a stretch.\n- **Length bucket** — map duration to one of: `<1 min`, `1-3 mins`, `3-5 mins`,\n `5-30 mins`, `30-60 mins`, `60+ mins`.\n\nThen compute the two benchmarks:\n\n- **Internal benchmark** — this account's own average over the same date range, across\n videos *outside* the requested scope where possible (so a video isn't partly\n benchmarked against itself). Use `show-account-top-content` (or\n `show-current-account-stats` / `show-account-analytics` if it exposes the same\n figures) for the date range to compute an average play rate and engagement rate. If\n the account has too few other videos to form a meaningful average (e.g. fewer than 5),\n say so and lean more heavily on the external benchmark in the narrative.\n- **External benchmark** — read\n `/mnt/skills/user/wistia-engagement-tools/references/state-of-video-benchmarks.md` and\n look up table 1 (engagement rate by type × length) and table 2 (play rate by length)\n for each video's own (type, length) cell.\n\nReport all three figures (actual / internal / external) per video plainly before moving\nto the chart — this is what Step 5's chart and Step 6's report are built from.\n\n---\n\n## Step 4: Read the benchmarks reference\n\nIf you haven't already this session, read\n`/mnt/skills/user/wistia-engagement-tools/references/state-of-video-benchmarks.md` now.\nDon't try to recall the benchmark numbers from memory — they're specific and the whole\npoint is comparing against the real published figures.\n\n---\n\n## Step 5: Chart\n\nCall `visualize:read_me` with `modules: [\"chart\"]` if you haven't loaded it this session,\nthen use `assets/performance-comparison-chart-template.html` as the base for\n`visualize:show_widget`. Fill in the video labels and the actual/internal/external arrays\nfor both engagement rate and play rate from Step 3 — the template ships a toggle between\nthe two metrics so both need real data, even if your prose below leads with one.\n\nDon't repeat the chart's numbers in your prose afterward — narrate the story (who's\nahead of benchmark, who's behind, and roughly by how much), not a recitation of every\nfigure already visible on screen.\n\n---\n\n## Step 6: Stylized report\n\nBuild the downloadable report as a real `.html` file (not a `visualize` widget — this is\na saved deliverable). Use `assets/report-template.html` as the base:\n\n1. Copy its structure, fill every `{{PLACEHOLDER}}`.\n2. Duplicate the video-card block once per video in scope, filling it fresh each time.\n3. Write the \"Insights & recommendations\" section fresh — 3-6 bullets, each naming a\n specific video, its benchmark gap (internal and/or external, whichever is more\n striking), and one concrete next step. Ground every claim in a number that also\n appears elsewhere on the page. No generic advice that could apply to any account (see\n the template's own comments for what \"specific\" looks like).\n4. Pick badge classes (`up`/`down`/`flat`) per the template's own guidance — don't assume\n higher is always better for every metric.\n5. Save to `/mnt/user-data/outputs/` and share it with `present_files`.\n\nFor a **single video**, this report is still worth generating (it's a nicely formatted\none-card version) — but ask first whether the user wants the saved file or just the chat\nsummary, since a single-video report is optional overhead. For **multiple videos**,\ndefault to producing the file without asking, since that's the point of a report.\n\n---\n\n## Step 7: Wrap-up and handoff\n\nAfter sharing the report:\n\n- If any video is meaningfully behind both benchmarks (say, more than ~10 points below\n on engagement rate), mention that `wistia-engagement-tools` can do a deeper dive on\n that specific video — where to place a CTA or lead capture form based on its own\n drop-off data — rather than duplicating that analysis here.\n- Don't proactively offer to re-run the report on a different timeframe or scope unless\n the user seems like they want to iterate; a simple \"let me know if you'd like this for\n a different set of videos or time period\" is enough.\n\n---\n\n## Handling gaps and edge cases\n\n- **Video has too few plays to be meaningful** (rule of thumb: under 10) — still include\n it in the report, but flag the low sample size prominently next to its numbers rather\n than silently reporting a noisy percentage as if it were solid.\n- **Video doesn't fit any of the 11 fixed types well** — pick the closest and say so in\n the report rather than forcing a bad fit silently.\n- **Folder/channel/embed location resolves to zero videos** — say so plainly, don't\n fabricate a report from nothing, and ask the user to double check the name or try a\n different scope.\n- **Account has no other videos to build an internal benchmark from** (new account, or\n the requested scope *is* the whole account) — say so, drop the internal-benchmark\n column/badge for that report, and rely on the external State of Video benchmark alone.\n- **State of Video benchmarks reference file is missing** — this would only happen if\n `wistia-engagement-tools` isn't installed or its reference file moved. In that case,\n tell the user you don't have the benchmark data bundled and ask them to provide the\n State of Video report (don't guess numbers from memory — these are specific published\n figures).\n- **Custom date range longer than the account's data history** — clamp to whatever data\n actually exists and say so, rather than silently returning a partial-period average\n labeled as the full requested range.\n"
}SHA-256: abe76101658231bc540fc70770690d4453d003c72432f29ea9845eb56a94e9cd