← Files WistiaARCHIVED FILE
skills/wistia-webinar-event-creation/SKILL.md
4.46 KB · Oct 5, 2026 · 18:09 UTC
---
name: wistia-webinar-event-creation
description: Create a Wistia webinar from a brief — gather the title, description, speakers, date/time, and registration goal, then create the event and save shared state for the rest of the workflow. This is STEP 1 of a three-skill webinar workflow (create → registration updates → post-event recap). Use whenever Sam wants to create, set up, schedule, or build a new webinar or live event. After the event is created it offers to set up registration reporting (step 2).
---
# Webinar Event Creation (Step 1 of 3)
Turn a rough idea ("we're doing a webinar on X") into a real Wistia webinar, and capture the details the later skills depend on. Half interview, half API call.
This is the first of three sequential skills:
1. **webinar-event-creation** ← you are here
2. **webinar-registration-updates** — scheduled pre-event pacing reports
3. **wistia-webinar-recap** — performance page after it airs
They coordinate through a shared **`webinar-state.json`** (see *Shared state*).
## What Wistia can and can't store
`create-webinar` (Wistia MCP) accepts: `title`, `description` (basic HTML), `scheduled_for` (ISO 8601 **UTC**, `...Z`), `time_zone` (IANA, e.g. `America/New_York`), `event_duration` (**minutes**, min 15), `folder_id` (optional).
Two things Sam cares about have **no native Wistia field**, so this skill owns them:
- **Speakers** — capture into `webinar-state.json` and fold into the `description` (a "Hosted by…" line). Be honest that Wistia has no speaker field.
- **Registration goal** — not a Wistia concept; store in `webinar-state.json` for steps 2–3.
**Two confirmed quirks:**
- **Timezone label is misleading.** Send `scheduled_for` as a true UTC instant; Wistia echoes it back as the *local wall-clock* time stamped `+00:00`. (Send `2026-08-21T17:00:00Z` for 1pm EDT → it returns `13:00:00+00:00`, i.e. 1pm ET.) When reading any `scheduled_for` later, interpret its clock time in the webinar's `time_zone`, not as UTC.
- **Auto-publishes.** New webinars come back `registration_status: published` — registration opens immediately at the `audience_link`. No separate publish step.
## Collect the brief
Check the conversation first; ask only for the gaps, **in one consolidated message**:
1. Title
2. Description / topic (offer to draft from the topic)
3. Speakers (names + roles)
4. Date & time + duration + time zone
5. Registration goal
For genuinely-unknown optionals (e.g. duration), suggest a default (60 min) rather than blocking.
## Steps
1. **Gather** the brief (one consolidated ask for missing items).
2. **Normalize the date** to a UTC `scheduled_for` + IANA `time_zone`. Double-check the conversion and state the local time back for confirmation — an off-by-timezone webinar is a real failure.
3. **Compose the description**, appending the speaker line.
4. **Create** with `create-webinar`; capture the returned `id` and `audience_link`.
5. **Write `webinar-state.json`** (see schema below) with `stage: "created"`.
6. **Confirm** back: title, local date/time, duration, speakers, goal, `audience_link`. Note registration is already open.
To edit an existing event instead of duplicating, use `update-webinar` (same fields + `id`).
## Shared state
All three skills read/write **`webinar-state.json`** in the user's working folder (the connected Cowork folder). It's the baton that hands the webinar from one skill to the next:
```json
{
"webinar_hashed_id": "32fei7lgyv",
"title": "...",
"scheduled_for_utc": "2026-08-21T17:00:00Z",
"time_zone": "America/New_York",
"event_duration_minutes": 45,
"speakers": [{"name": "Sam Balter", "role": "Host"}],
"goal": 500,
"audience_link": "https://home.wistia.com/live/events/32fei7lgyv",
"stage": "created",
"reporting_scheduled": false
}
```
`stage` advances through the workflow: `created` → `promoting` → `recapped`.
## Handoff → Step 2
After confirming the event, **offer the next step** rather than ending: ask Sam whether he wants to set up **registration reporting** now (the `webinar-registration-updates` skill). It will schedule recurring pacing updates anchored to the event date.
- If **yes** → invoke `webinar-registration-updates`. It reads `webinar-state.json`, so it already knows the webinar and goal.
- If **not now** → leave `reporting_scheduled: false`; he can start step 2 anytime.
Keep the offer short, e.g.: "Event's live and taking registrations. Want me to set up the registration tracker so you get scheduled pacing updates as it ramps toward Aug 21?"
SHA-256: a1b01e187fd9a3fd39423db04cfce554616eccf4a222dbf946305b8c98a47343