Create and update sermon episodes in Planning Center Publishing within a series. TRIGGERS: "create episode", "add episode", "upload sermon", "upload episode", "batch upload sermons", "Planning Center episode", "sermon upload", "audio upload to Planning Center", "Subsplash import", "migrate from Subsplash", "set episode date", "set publish date", "assign speaker", "update episode", "pending uploads", "finish episodes", "episode date and speaker". Use when user wants to create episodes with: title, description, artwork, audio file, video URL, publish date/time, and speaker assignment. Also handles updating existing episodes to set publish dates and assign speakers via browser automation (required because the PCO API returns 422 Forbidden for date fields and speaker assignment endpoints). Integrates with CLI progress tracking via `yarn pending-uploads` and `yarn mark-done`. Supports Subsplash JSON export format for migration.
name
planning-center-sermon-episodes
description
Create and update sermon episodes in Planning Center Publishing within a series.
TRIGGERS: "create episode", "add episode", "upload sermon", "upload episode",
"batch upload sermons", "Planning Center episode", "sermon upload", "audio upload to Planning Center",
"Subsplash import", "migrate from Subsplash", "set episode date", "set publish date",
"assign speaker", "update episode", "pending uploads", "finish episodes", "episode date and speaker".
Use when user wants to create episodes with: title, description, artwork, audio file,
video URL, publish date/time, and speaker assignment. Also handles updating existing episodes
to set publish dates and assign speakers via browser automation (required because the PCO API
returns 422 Forbidden for date fields and speaker assignment endpoints).
Integrates with CLI progress tracking via yarn pending-uploads and yarn mark-done.
Supports Subsplash JSON export format for migration.
Planning Center Episode Upload & Update
Upload artwork/audio, set date/speaker, and remove live times on existing sermon episodes using browser automation (Claude in Chrome).
Prerequisites
User logged into Planning Center Publishing in Chrome
Claude in Chrome extension active
Episode records already created via
yarn migrate
(they have PCO IDs)
CDN URLs for artwork and audio available via
yarn pending-uploads
Getting Episode Data
Run
yarn pending-uploads
to get episodes needing work:
{
"type"
:
"episode"
,
"slug"
:
"2006-06-03-philemons-problem-and-ours"
,
"episodeId"
:
"618527"
,
"title"
:
"Philemon's Problem and Ours"
,
"speakerNames"
:
[
"Rankin Wilbourne"
]
,
"speakerPeopleIds"
:
[
"1272319"
]
,
"publishDate"
:
"2006-06-03T00:00:00Z"
,
"artworkUrl"
:
""
,
"audioUrl"
:
""
,
"steps"
:
[
"artwork_uploaded"
,
"audio_uploaded"
,
"speaker_assigned"
,
"date_set"
,
"live_time_removed"
]
}
Critical: File Upload via JavaScript
Do NOT use
upload_image
with ref
— it doesn't work with CDN URLs. Use JS fetch + DataTransfer:
(
async
() => {
const
response =
await
fetch
(
'{url}'
);
const
blob =
await
response.
blob
();
const
file =
new
File
([blob],
'{filename}'
, {
type
:
'{mimeType}'
});
const
dt =
new
DataTransfer
();
dt.
items
.
add
(file);
const
input =
document
.
querySelector
(
'{inputSelector}'
);
input.
files
= dt.
files
;
input.
dispatchEvent
(
new
Event
(
'change'
, {
bubbles
:
true
}));
return
;
})()
Speed Guidelines
Do NOT screenshot after every action.
Only screenshot at milestones (after artwork+audio done, after date+speaker+live-time done).
Do NOT wait between actions
unless a modal or upload progress requires it.
Batch mark-done commands
— run all applicable ones together after verifying a milestone.
Combine date + speaker + live-time removal
in one page visit with a single Save before live-time removal.
Workflow: Process Each Episode
Uploaded ( ${(blob.size / 1024 / 1024 ).toFixed( 1 )} MB)Artwork: ${(blob.size / 1024 / 1024 ).toFixed( 1 )} MB
;
})()
Wait ~2s for preview to render, then
find: "Add image"
→
left_clickAudio: ${(blob.size / 1024 / 1024 ).toFixed( 1 )} MB
;
})()
Wait ~3s for upload indicator. Audio auto-saves (no Save button needed).
MILESTONE: Screenshot to confirm artwork thumbnail + audio attached.
Then run:
yarn mark-done --episode {slug} --step artwork_uploaded && yarn mark-done --episode {slug} --step audio_uploaded
4. Set Date + Speaker + Remove Live Time
Navigate back to General tab if on Media tab. Do all three in one pass:
Set publish date
(if
date_set
in steps):
Parse
publishDate
(e.g.,
2006-06-03T00:00:00Z
→ June 3, 2006)
find: "Episode publish date"
→
triple_click
to select →
type: "June 3, 2006"
find: "Hours"
→
triple_click
→
type: "10"
(form_input doesn't reliably set this field)
find: "Minutes"
→
triple_click
→
type: "00"
Ensure AM/PM is set to "AM"
Assign speaker
(if
speaker_assigned
in steps):
find: "Add Episode speaker"
→
form_input: "{speakerName}"
Wait ~1s for autocomplete →
find
matching name in dropdown →
left_click
The form auto-saves
— no explicit Save button is needed.
Remove live time
(if
live_time_removed
in steps):
IMPORTANT
: Override confirm dialog first to prevent Chrome extension disconnection:
window
.
confirm() => true ; find: "Remove time" → left_click The live time entry disappears automatically. MILESTONE: Screenshot to confirm date, speaker, and empty live times. Then run: yarn mark-done --episode {slug} --step date_set && yarn mark-done --episode {slug} --step speaker_assigned && yarn mark-done --episode {slug} --step live_time_removed When all 5 steps are marked done, the episode status automatically promotes to completed . Batch Processing Loop