{ "kind": "open-flow-workflow", "version": 1, "name": "Refresh a Zoom Meeting Redirect Page", "content": { "modelVersion": 14, "document": { "bindings": {}, "graph": { "nodes": { "n_c5e7a0c3a68745bd": { "name": "Check daily at 03:00 UTC", "kind": "cron", "cronTimes": [ { "type": "cron", "expression": "0 3 * * *", "timezone": "UTC" } ] }, "n_715e82213d864517": { "inputs": { "anchorDate": { "kind": "value", "value": "YYYY-MM-DD" }, "instant": { "kind": "value", "value": null } }, "name": "Check the 360-day schedule", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "anchorDate" }, { "jsonSchema": { "type": "string" }, "nullable": true, "handle": "instant" } ], "outputs": [ { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "run" } ], "name": "Check the 360-day schedule", "moduleId": "n_004fdc6ef6dfb637", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_619d79aecd3f5287": { "inputs": {}, "name": "Is a refresh due?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "refresh", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_715e82213d864517", "output": "run" } }, "operator": "isTrue" } ] } ] } ] }, "n_3b7b386c63ec798f": { "inputs": { "userId": { "kind": "value", "value": "me" }, "topic": { "kind": "value", "value": "New Meeting" }, "type": { "kind": "value", "value": 3 }, "timezone": { "kind": "value", "value": "America/New_York" }, "settings": { "kind": "value", "value": { "muteUponEntry": true, "joinBeforeHost": true, "participantVideo": true } } }, "name": "Create a Zoom meeting", "kind": "task", "task": { "inputs": [ { "description": "The Zoom user ID or email address. Use me when the credential can act on the current app user.", "jsonSchema": { "type": "string", "pattern": "\\S", "minLength": 1, "description": "The Zoom user ID or email address. Use me when the credential can act on the current app user." }, "nullable": true, "handle": "userId", "value": null }, { "description": "The meeting topic.", "jsonSchema": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The meeting topic." }, "nullable": true, "handle": "topic", "value": null }, { "description": "The Zoom meeting type: 1 instant, 2 scheduled, 3 recurring with no fixed time, 4 PMI, 8 recurring with fixed time, or 10 screen share only.", "jsonSchema": { "anyOf": [ { "const": 1, "description": "Instant meeting type." }, { "const": 2, "description": "Scheduled meeting type." }, { "const": 3, "description": "Recurring meeting with no fixed time type." }, { "const": 4, "description": "Personal Meeting ID meeting type." }, { "const": 8, "description": "Recurring meeting with fixed time type." }, { "const": 10, "description": "Screen share only meeting type." } ], "description": "The Zoom meeting type: 1 instant, 2 scheduled, 3 recurring with no fixed time, 4 PMI, 8 recurring with fixed time, or 10 screen share only." }, "nullable": true, "handle": "type", "value": null }, { "description": "A Zoom date-time value. Use UTC format such as 2026-05-18T09:00:00Z, or a local date-time with timezone.", "jsonSchema": { "type": "string", "minLength": 1, "description": "A Zoom date-time value. Use UTC format such as 2026-05-18T09:00:00Z, or a local date-time with timezone." }, "nullable": true, "handle": "startTime", "value": null }, { "description": "The scheduled meeting duration in minutes.", "jsonSchema": { "type": "integer", "minimum": 1, "maximum": 1440, "description": "The scheduled meeting duration in minutes." }, "nullable": true, "handle": "duration", "value": null }, { "description": "The meeting timezone, such as America/Los_Angeles, Asia/Tokyo, or UTC.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The meeting timezone, such as America/Los_Angeles, Asia/Tokyo, or UTC." }, "nullable": true, "handle": "timezone", "value": null }, { "description": "The meeting agenda. Zoom allows up to 2,000 characters.", "jsonSchema": { "type": "string", "maxLength": 2000, "description": "The meeting agenda. Zoom allows up to 2,000 characters." }, "nullable": true, "handle": "agenda", "value": null }, { "description": "The passcode required to join the meeting.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The passcode required to join the meeting." }, "nullable": true, "handle": "password", "value": null }, { "description": "The email address or user ID of the user to schedule for.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The email address or user ID of the user to schedule for." }, "nullable": true, "handle": "scheduleFor", "value": null }, { "description": "Meeting settings supported by the first Zoom provider pass.", "jsonSchema": { "type": "object", "properties": { "hostVideo": { "type": "boolean", "description": "Whether to start the meeting with host video enabled." }, "participantVideo": { "type": "boolean", "description": "Whether to start the meeting with participant video enabled." }, "joinBeforeHost": { "type": "boolean", "description": "Whether participants can join before the host." }, "waitingRoom": { "type": "boolean", "description": "Whether Zoom Waiting Room is enabled." }, "muteUponEntry": { "type": "boolean", "description": "Whether participants are muted when they enter." }, "autoRecording": { "type": "string", "enum": [ "local", "cloud", "none" ], "description": "The automatic recording mode for the meeting." }, "audio": { "type": "string", "enum": [ "both", "telephony", "voip", "thirdParty" ], "description": "How participants join audio." }, "approvalType": { "type": "integer", "description": "The meeting registration approval type documented by Zoom." }, "registrationType": { "type": "integer", "description": "The registration type documented by Zoom." }, "enforceLogin": { "type": "boolean", "description": "Whether participants must authenticate before joining." } }, "additionalProperties": false, "description": "Meeting settings supported by the first Zoom provider pass." }, "nullable": true, "handle": "settings", "value": null }, { "description": "Recurrence settings for Zoom recurring meetings.", "jsonSchema": { "type": "object", "properties": { "type": { "type": "integer", "minimum": 1, "maximum": 3, "description": "The recurrence type: 1 daily, 2 weekly, or 3 monthly." }, "repeatInterval": { "type": "integer", "minimum": 1, "description": "The interval at which the meeting recurs." }, "weeklyDays": { "type": "string", "minLength": 1, "description": "The weekly days string documented by Zoom, such as 1 for Sunday or comma-separated values." }, "monthlyDay": { "type": "integer", "minimum": 1, "maximum": 31, "description": "The day of the month for monthly recurrence." }, "endTimes": { "type": "integer", "minimum": 1, "description": "The number of recurrences before the meeting stops." }, "endDateTime": { "type": "string", "minLength": 1, "description": "A Zoom date-time value. Use UTC format such as 2026-05-18T09:00:00Z, or a local date-time with timezone." } }, "required": [ "type" ], "additionalProperties": false, "description": "Recurrence settings for Zoom recurring meetings." }, "nullable": true, "handle": "recurrence", "value": null } ], "outputs": [ { "description": "A normalized Zoom meeting record.", "jsonSchema": { "type": "object", "properties": { "uuid": { "type": [ "string", "null" ], "description": "The unique meeting UUID returned by Zoom." }, "id": { "anyOf": [ { "anyOf": [ { "type": "integer", "description": "The numeric Zoom meeting ID." }, { "type": "string", "description": "The string Zoom meeting ID." } ], "description": "The Zoom meeting ID. Zoom may return large numeric IDs as numbers or strings." }, { "type": "null" } ], "description": "The Zoom meeting ID. Zoom may return large numeric IDs as numbers or strings." }, "hostId": { "type": [ "string", "null" ], "description": "The Zoom user ID of the host." }, "hostEmail": { "type": [ "string", "null" ], "description": "The host email address." }, "topic": { "type": [ "string", "null" ], "description": "The meeting topic." }, "type": { "type": [ "integer", "null" ], "description": "The Zoom meeting type numeric code." }, "status": { "type": [ "string", "null" ], "description": "The meeting status returned by Zoom." }, "startTime": { "type": [ "string", "null" ], "description": "The meeting start time returned by Zoom." }, "duration": { "type": [ "integer", "null" ], "description": "The scheduled meeting duration in minutes." }, "timezone": { "type": [ "string", "null" ], "description": "The meeting timezone." }, "agenda": { "type": [ "string", "null" ], "description": "The meeting agenda." }, "joinUrl": { "type": [ "string", "null" ], "description": "The participant join URL." }, "startUrl": { "type": [ "string", "null" ], "description": "The host start URL, when Zoom returns it." }, "password": { "type": [ "string", "null" ], "description": "The meeting passcode, when Zoom returns it." }, "createdAt": { "type": [ "string", "null" ], "description": "The timestamp when the meeting was created." }, "raw": { "type": "object", "properties": {}, "additionalProperties": true, "description": "The raw Zoom meeting object returned by the API." } }, "required": [ "uuid", "id", "hostId", "hostEmail", "topic", "type", "status", "startTime", "duration", "timezone", "agenda", "joinUrl", "startUrl", "password", "createdAt", "raw" ], "additionalProperties": false, "description": "A normalized Zoom meeting record." }, "nullable": false, "handle": "meeting" } ], "name": "Create a Zoom meeting", "executor": { "kind": "connector", "action": "zoom.create_meeting" } } }, "n_c827bb8bdba964ee": { "inputs": { "meeting": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_3b7b386c63ec798f", "output": "meeting" } ] } }, "name": "Prepare the redirect", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "properties": { "uuid": { "type": [ "string", "null" ], "description": "The unique meeting UUID returned by Zoom." }, "id": { "anyOf": [ { "anyOf": [ { "type": "integer", "description": "The numeric Zoom meeting ID." }, { "type": "string", "description": "The string Zoom meeting ID." } ], "description": "The Zoom meeting ID. Zoom may return large numeric IDs as numbers or strings." }, { "type": "null" } ], "description": "The Zoom meeting ID. Zoom may return large numeric IDs as numbers or strings." }, "hostId": { "type": [ "string", "null" ], "description": "The Zoom user ID of the host." }, "hostEmail": { "type": [ "string", "null" ], "description": "The host email address." }, "topic": { "type": [ "string", "null" ], "description": "The meeting topic." }, "type": { "type": [ "integer", "null" ], "description": "The Zoom meeting type numeric code." }, "status": { "type": [ "string", "null" ], "description": "The meeting status returned by Zoom." }, "startTime": { "type": [ "string", "null" ], "description": "The meeting start time returned by Zoom." }, "duration": { "type": [ "integer", "null" ], "description": "The scheduled meeting duration in minutes." }, "timezone": { "type": [ "string", "null" ], "description": "The meeting timezone." }, "agenda": { "type": [ "string", "null" ], "description": "The meeting agenda." }, "joinUrl": { "type": [ "string", "null" ], "description": "The participant join URL." }, "startUrl": { "type": [ "string", "null" ], "description": "The host start URL, when Zoom returns it." }, "password": { "type": [ "string", "null" ], "description": "The meeting passcode, when Zoom returns it." }, "createdAt": { "type": [ "string", "null" ], "description": "The timestamp when the meeting was created." }, "raw": { "type": "object", "properties": {}, "additionalProperties": true, "description": "The raw Zoom meeting object returned by the API." } }, "required": [ "uuid", "id", "hostId", "hostEmail", "topic", "type", "status", "startTime", "duration", "timezone", "agenda", "joinUrl", "startUrl", "password", "createdAt", "raw" ], "additionalProperties": false, "description": "A normalized Zoom meeting record." }, "nullable": false, "handle": "meeting" } ], "outputs": [ { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "url" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "content" } ], "name": "Prepare the redirect", "moduleId": "n_89deaa7963ae2572", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_ffe4c52963dbc272": { "inputs": { "id": { "kind": "value", "value": 1 }, "content": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c827bb8bdba964ee", "output": "content" } ] } }, "name": "Update the WordPress page", "kind": "task", "task": { "inputs": [ { "description": "The page title.", "jsonSchema": { "type": "string", "description": "The page title." }, "nullable": true, "handle": "title", "value": null }, { "description": "The page content.", "jsonSchema": { "type": "string", "description": "The page content." }, "nullable": true, "handle": "content", "value": null }, { "description": "The page excerpt.", "jsonSchema": { "type": "string", "description": "The page excerpt." }, "nullable": true, "handle": "excerpt", "value": null }, { "description": "The WordPress URL slug.", "jsonSchema": { "type": "string", "pattern": "\\S", "minLength": 1, "description": "The WordPress URL slug." }, "nullable": true, "handle": "slug", "value": null }, { "description": "The WordPress publication status.", "jsonSchema": { "type": "string", "enum": [ "publish", "future", "draft", "pending", "private" ], "description": "The WordPress publication status." }, "nullable": true, "handle": "status", "value": null }, { "description": "The parent page ID; zero moves the page to the root level.", "jsonSchema": { "type": "integer", "minimum": 0, "description": "The parent page ID; zero moves the page to the root level." }, "nullable": true, "handle": "parent", "value": null }, { "description": "The featured media attachment ID; zero removes the featured image.", "jsonSchema": { "type": "integer", "minimum": 0, "description": "The featured media attachment ID; zero removes the featured image." }, "nullable": true, "handle": "featuredMedia", "value": null }, { "description": "The page menu order.", "jsonSchema": { "type": "integer", "description": "The page menu order." }, "nullable": true, "handle": "menuOrder", "value": null }, { "description": "Meta fields to send to WordPress.", "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "Meta fields to send to WordPress." }, "nullable": true, "handle": "meta", "value": null }, { "description": "The numeric WordPress resource ID.", "jsonSchema": { "type": "integer", "exclusiveMinimum": 0, "description": "The numeric WordPress resource ID." }, "nullable": false, "handle": "id" } ], "outputs": [ { "description": "A WordPress page object.", "jsonSchema": { "type": "object", "properties": { "id": { "type": "integer", "exclusiveMinimum": 0, "description": "The numeric WordPress page ID." }, "slug": { "type": "string", "description": "The WordPress page slug." }, "status": { "type": "string", "description": "The WordPress page status." }, "title": { "type": "object", "properties": { "rendered": { "type": "string", "description": "The rendered HTML value returned by WordPress." } }, "additionalProperties": true, "description": "A WordPress rendered object." } }, "required": [ "id", "slug", "status", "title" ], "additionalProperties": true, "description": "A WordPress page object." }, "nullable": false, "handle": "page" } ], "name": "Update the WordPress page", "executor": { "kind": "connector", "action": "wordpress.update_page" } } }, "n_6f6e67451b424970": { "inputs": { "page": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_ffe4c52963dbc272", "output": "page" } ] }, "url": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c827bb8bdba964ee", "output": "url" } ] } }, "name": "Confirm the redirect", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "properties": { "id": { "type": "integer", "exclusiveMinimum": 0, "description": "The numeric WordPress page ID." }, "slug": { "type": "string", "description": "The WordPress page slug." }, "status": { "type": "string", "description": "The WordPress page status." }, "title": { "type": "object", "properties": { "rendered": { "type": "string", "description": "The rendered HTML value returned by WordPress." } }, "additionalProperties": true, "description": "A WordPress rendered object." } }, "required": [ "id", "slug", "status", "title" ], "additionalProperties": true, "description": "A WordPress page object." }, "nullable": false, "handle": "page" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "url" } ], "outputs": [ { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "message" } ], "name": "Confirm the redirect", "moduleId": "n_49db88e1ad77f321", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_b8ebdfa495f9dac3": { "inputs": { "channelId": { "kind": "value", "value": "YOUR_SLACK_CHANNEL_ID" }, "text": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_6f6e67451b424970", "output": "message" } ] } }, "name": "Notify Slack", "kind": "task", "task": { "inputs": [ { "description": "The Slack conversation or channel ID.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The Slack conversation or channel ID." }, "nullable": false, "handle": "channelId" }, { "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text.", "jsonSchema": { "type": "string", "description": "Plain text message content. When blocks are provided, Slack uses this as notification and accessibility fallback text." }, "nullable": true, "handle": "text", "value": null }, { "description": "Slack Block Kit blocks to render in the message.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A Slack Block Kit block object. Pass the block exactly as Slack documents it." }, "minItems": 1, "description": "Slack Block Kit blocks to render in the message." }, "nullable": true, "handle": "blocks", "value": null }, { "description": "Slack legacy attachments to include in the message.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A Slack legacy attachment object. Prefer blocks for new messages when possible." }, "minItems": 1, "description": "Slack legacy attachments to include in the message." }, "nullable": true, "handle": "attachments", "value": null }, { "description": "Whether Slack should unfurl links in the message.", "jsonSchema": { "type": "boolean", "description": "Whether Slack should unfurl links in the message." }, "nullable": true, "handle": "unfurlLinks", "value": null }, { "description": "Whether Slack should unfurl media in the message.", "jsonSchema": { "type": "boolean", "description": "Whether Slack should unfurl media in the message." }, "nullable": true, "handle": "unfurlMedia", "value": null }, { "description": "Slack message metadata to attach to the message.", "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "Slack message metadata to attach to the message." }, "nullable": true, "handle": "metadata", "value": null } ], "outputs": [ { "description": "The timestamp identifier of the posted message.", "jsonSchema": { "type": "string", "description": "The timestamp identifier of the posted message." }, "nullable": false, "handle": "ts" }, { "description": "The channel ID where the message was posted.", "jsonSchema": { "type": "string", "description": "The channel ID where the message was posted." }, "nullable": false, "handle": "channelId" } ], "name": "Notify Slack", "executor": { "kind": "connector", "action": "slack.post_message" } } } }, "edges": [ { "source": "n_c5e7a0c3a68745bd", "target": "n_715e82213d864517" }, { "source": "n_715e82213d864517", "target": "n_619d79aecd3f5287" }, { "source": "n_619d79aecd3f5287", "target": "n_3b7b386c63ec798f", "sourceHandle": "refresh" }, { "source": "n_3b7b386c63ec798f", "target": "n_c827bb8bdba964ee" }, { "source": "n_c827bb8bdba964ee", "target": "n_ffe4c52963dbc272" }, { "source": "n_ffe4c52963dbc272", "target": "n_6f6e67451b424970" }, { "source": "n_6f6e67451b424970", "target": "n_b8ebdfa495f9dac3" } ] } }, "modules": { "n_004fdc6ef6dfb637": { "name": "Check the 360-day schedule", "imports": [], "source": "export default function scheduled({anchorDate,instant}){if(typeof anchorDate!=='string'||!/^\\d{4}-\\d{2}-\\d{2}$/.test(anchorDate))throw Error('Set the UTC start date as YYYY-MM-DD');const start=Date.parse(anchorDate+'T00:00:00Z');if(!Number.isFinite(start)||new Date(start).toISOString().slice(0,10)!==anchorDate)throw Error('Invalid UTC start date');const now=instant==null?Date.now():Date.parse(instant);if(!Number.isFinite(now))throw Error('Invalid current time');const today=Date.parse(new Date(now).toISOString().slice(0,10)+'T00:00:00Z'),days=(today-start)/86400000;return {run:days>=0&&days%360===0};}\n" }, "n_89deaa7963ae2572": { "name": "Prepare the redirect", "imports": [], "source": "export default function redirect({meeting}){const url=meeting?.joinUrl;if(typeof url!=='string'||!/^https:\\/\\/(?:[a-z0-9-]+\\.)*zoom\\.us\\//i.test(url)||/[\\s\"'<>]/.test(url))throw Error('Zoom returned an invalid join URL');const safe=url.replaceAll('&','&');return {url,content:'\\n
Redirecting, please wait a moment. Meeting will begin shortly…
'};}\n" }, "n_49db88e1ad77f321": { "name": "Confirm the redirect", "imports": [], "source": "export default function confirmPage({page,url}){\n const content=page?.content?.rendered;if(typeof content!=='string'||typeof url!=='string')throw Error('WordPress returned no redirect content');\n const tags=content.match(/]*>/gi)??[];\n const found=tags.some(tag=>{if(!/\\bhttp-equiv\\s*=\\s*[\"']refresh[\"']/i.test(tag))return false;const value=tag.match(/\\bcontent\\s*=\\s*([\"'])(.*?)\\1/i)?.[2];if(typeof value!=='string')return false;const decoded=value.replace(/&|*38;|*26;/gi,'&');return decoded==='0;'+url;});\n if(!found)throw Error('WordPress did not return the expected redirect; check its HTML policy and page');return {message:'Zoom recurring meeting updated!\\n'+url};\n}\n" } } }, "presentation": { "designer": { "version": 1, "flow": { "direction": "vertical" } } } }