Documentation
Everything you need to install, set up, use, and remove PublishFlow.
1. Installing the app
You can install PublishFlow from two places:
- Zoom App Marketplace: visit the PublishFlow listing on marketplace.zoom.us and click Add. You will be redirected to authorize PublishFlow with your Zoom account.
- Direct sign-up: visit publishflow.intersomos.com.br and click Go to Dashboard. You will be redirected to Zoom to sign in.
Both flows start with the same Zoom OAuth consent screen. After you approve the requested permissions (see Scopes and permissions), you will be redirected to your PublishFlow dashboard.
2. Connecting your Zoom account
- From the home page, click Go to Dashboard.
- You are redirected to Zoom's OAuth consent screen.
- Review the requested scopes (see section 11) and click Allow.
- You are redirected back to PublishFlow and signed in. Your Zoom card on the dashboard shows Active with your email.
Requirement
Your Zoom account must have Cloud Recording enabled. This is available on Pro, Business, Business Plus, and Enterprise paid plans. Local recording is not supported because the webhook is fired only for cloud recordings.
3. Connecting your YouTube channel
- From the dashboard, find the YouTube card (red banner) and click Connect.
- You are redirected to Google's OAuth consent screen.
- Choose the Google account that owns the YouTube channel you want to publish to.
- Review the requested scopes (YouTube upload and read access) and click Continue.
- You are redirected back to PublishFlow. The YouTube card now shows Active and your playlists are loaded.
PublishFlow uses Google's standard offline access flow, which means we receive a refresh token to upload videos on your behalf without you being present. You can revoke this access at any time from your Google account's Security settings.
4. Linking meetings to playlists
Once both Zoom and YouTube are connected, the Meeting → Playlist Links section appears on the dashboard. Here you can pair each recurring Zoom meeting with a specific YouTube playlist.
- Find the meeting in the unlinked list.
- Click + Link to playlist on the right side.
- Pick the destination playlist from the dropdown.
- Click the ✓ button to save the link.
From that moment on, any cloud recording for that meeting is automatically published to the paired playlist. If a meeting is not linked, the recording will be uploaded to your default playlist (set under Settings) or to your channel without a playlist if no default is set.
To remove a link, click the trash icon next to it. The link is removed immediately; future recordings will follow your default settings.
5. How recordings are published
The workflow is fully event-driven. Here is the exact sequence when you finish a Zoom meeting:
- You end a Zoom meeting that was recording to the cloud.
- Zoom processes the recording (usually 5 to 15 minutes depending on duration).
- Zoom fires a
recording.completedwebhook to PublishFlow. - PublishFlow verifies the webhook signature using HMAC-SHA256.
- If you have Auto-publish enabled (default), a background job is queued.
- The worker downloads the MP4 from Zoom using the temporary access token Zoom provides.
- PublishFlow generates structured metadata: title (e.g.
#1 Q4 Sales Review), description with host name and duration. - The video is uploaded to YouTube using the resumable upload protocol.
- The video is added to the linked playlist (or default playlist).
- The MP4 file is deleted from PublishFlow servers (it was only used to transfer the file).
- You receive an email notification with the YouTube link.
The default privacy of the published video is whatever you set under Settings → Default Privacy (private, unlisted, or public).
6. Managing recordings
All your processed recordings appear in two places:
- Dashboard → Recent Recordings: grouped by YouTube playlist, expandable accordion.
- Recordings page: full table with filters (All, Queued, Processing, Published, Failed).
For each recording you can:
- Click the external link icon to open the video on YouTube.
- Click + Add to playlist or Change playlist to move it to a different YouTube playlist (calls the YouTube Data API).
- Click Retry on a failed recording to re-queue it for processing.
7. Settings and preferences
Under Settings in the navigation, you can configure:
- Default privacy: private, unlisted, or public. Applied to every new upload.
- Default playlist: fallback playlist used when a recording's meeting is not explicitly linked.
- Title prefix: short string prepended to every title (e.g.
#,PF). - Auto-publish: if disabled, recordings are saved to the dashboard but not uploaded automatically. You must trigger the upload manually.
- Notify on publish: email when a recording goes live.
- Notify on failure: email when a recording fails.
8. Email notifications
PublishFlow sends transactional emails for two events:
- Recording published: includes the meeting title, the YouTube link, and the playlist it was added to.
- Recording failed: includes the error summary and a link to retry from the dashboard.
Both notifications can be turned off individually under Settings. Emails are sent via Resend (SMTP, TLS 465).
9. Removing the integration
Disconnect Zoom or YouTube individually
From the dashboard, click Disconnect on either the Zoom or YouTube card. This removes that integration's OAuth tokens from our database. The other integration and your recording history remain intact.
Deauthorize the entire app from Zoom Marketplace
- Sign in to Zoom App Marketplace.
- Go to Manage → Installed Apps.
- Find PublishFlow and click Remove.
- Zoom sends an
app_deauthorizedwebhook to PublishFlow. - PublishFlow deletes all your data (OAuth tokens, recordings, settings, account) from PostgreSQL.
- PublishFlow notifies the Zoom Data Compliance API that the deletion is complete.
Revoke YouTube access
Visit myaccount.google.com/permissions, find PublishFlow, and click Remove access. This invalidates the YouTube refresh token immediately.
10. Deleting your account
- Go to Settings.
- Scroll to the Account section.
- Click Delete account and confirm.
- All your data (OAuth tokens, recordings, settings, account row) is permanently deleted from PostgreSQL within seconds.
- You are signed out and redirected to the home page.
Before deleting, you can Export your data from the same Settings page. You will receive a JSON file containing your account info, recording history, and connection details.
11. Scopes and permissions
PublishFlow requests these Zoom scopes during sign-in:
| Scope | Why we need it |
|---|---|
| user:read:user | Read your name and email to identify the account and personalize emails. |
| meeting:read:list_meetings | List your scheduled and recurring meetings so you can link them to playlists. |
| cloud_recording:read:list_user_recordings | Show your past recordings on the dashboard. |
| cloud_recording:read:list_recording_files | Fetch the MP4 download URL after a recording is completed, so we can stream it to YouTube. |
PublishFlow also subscribes to two webhook events: recording.completed and recording.deleted, plus the standard deauthorization webhook required by Zoom.
12. Security and privacy
- OAuth-only authentication. We never see or store your Zoom or Google passwords.
- AES-256-GCM encryption. All OAuth tokens are encrypted at rest in PostgreSQL using a master key stored only in the production environment.
- HMAC-SHA256 verification. Every Zoom webhook is cryptographically verified against the per-app secret token. Requests with invalid signatures are rejected with HTTP 401.
- TLS 1.2+. Enforced at the Caddy reverse proxy. HSTS preload, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy and Permissions-Policy headers are set on every response.
- No video storage. Recordings are streamed to ephemeral container storage, uploaded to YouTube, and immediately deleted. They are never persisted to disk, object storage, or any database.
- Full data compliance. When you deauthorize the app, all your data is deleted and Zoom is notified via the Data Compliance API.
13. Troubleshooting
A recording did not appear after the meeting
Confirm cloud recording was enabled for the meeting (not local recording). Zoom may take 5 to 15 minutes to process a recording before firing the webhook. Refresh the dashboard after that time.
A recording is stuck in "Failed" status
Click Retry on the Recordings page. Check that your YouTube quota for the day is not exceeded. Failures are usually transient (network, YouTube quota) and resolve on retry.
Email notifications are not arriving
Check your spam folder. Confirm Notify on publish and Notify on failure are enabled under Settings.
14. Frequently asked questions
What Zoom plans are supported?
PublishFlow works with Pro, Business, Business Plus, and Enterprise plans, since Cloud Recording is required.
Can I publish recordings to a different YouTube account?
Yes. From the dashboard, click Disconnect on the YouTube card, then Connect again and sign in with the other Google account.
What happens to past recordings if I disconnect YouTube?
Past recordings already on YouTube remain there. PublishFlow only loses its ability to upload new ones until you reconnect.
Can I retroactively publish recordings that were processed before I installed the app?
Not currently. PublishFlow only processes recordings that fire a webhook after the app is connected. Manual import of past recordings is on the roadmap.
Where is my data stored?
PostgreSQL 16 on a Contabo VPS in Frankfurt, Germany. OAuth tokens are encrypted at rest with AES-256-GCM. Video files are never persisted.
15. Support
Email publishflow@intersomos.com.br or visit our Support page. We respond within 2 business days.