{ "kind": "open-flow-workflow", "version": 1, "name": "Enrich Calendly Bookings in Notion", "content": { "modelVersion": 14, "document": { "bindings": {}, "graph": { "nodes": { "n_e0ede677b0c46d82": { "name": "Receive a new booking", "kind": "integration", "config": { "scope": { "kind": "value", "value": "user" }, "eventTypes": { "kind": "value", "value": [ "invitee.created" ] } }, "definition": { "configInputs": [ { "jsonSchema": { "type": "string", "enum": [ "user", "organization" ], "title": "Scope" }, "nullable": false, "handle": "scope", "value": "user" }, { "jsonSchema": { "type": "array", "items": { "type": "string", "enum": [ "invitee.created", "invitee.canceled" ] }, "minItems": 1, "uniqueItems": true, "title": "Events" }, "nullable": false, "handle": "eventTypes", "value": [ "invitee.created", "invitee.canceled" ] } ], "definitionVersion": 2, "description": "Receives bookings and cancellations, preserving reschedule links. Requires a Personal Access Token connection.", "displayName": "Booking Created or Canceled", "key": "calendly.on_booking_event", "name": "on_booking_event", "outputs": [ { "jsonSchema": { "type": "string", "enum": [ "invitee.created", "invitee.canceled" ] }, "nullable": false, "handle": "event" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "inviteeUri" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "createdAt" }, { "jsonSchema": { "type": "object" }, "nullable": false, "handle": "body" } ], "provider": "calendly", "type": "integration", "endpoint": { "body": { "allowArray": false, "allowEmpty": false, "formats": [ "json" ] }, "methods": [ "POST" ], "successStatus": 200 } } }, "n_866902adb504c424": { "inputs": { "payload": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_e0ede677b0c46d82", "output": "body" } ] }, "dataSourceId": { "kind": "value", "value": "YOUR_NOTION_DATA_SOURCE_ID" }, "personId": { "kind": "value", "value": "YOUR_NOTION_PERSON_ID" } }, "name": "Prepare booking and contact", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "payload" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "dataSourceId" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "personId" } ], "outputs": [ { "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "email": { "type": "string", "minLength": 1, "description": "The email address to verify or enrich." }, "first_name": { "type": "string", "minLength": 1, "description": "The contact's first name." }, "last_name": { "type": "string", "minLength": 1, "description": "The contact's last name." }, "full_name": { "type": "string", "minLength": 1, "description": "The contact's full name." }, "phone": { "type": "string", "minLength": 1, "description": "The contact's phone number." }, "company": { "type": "string", "minLength": 1, "description": "The contact's company name." }, "website": { "type": "string", "minLength": 1, "description": "The company website or domain." }, "num_siren": { "type": "string", "minLength": 1, "description": "The French company SIREN number." }, "linkedin": { "type": "string", "minLength": 1, "description": "The contact's LinkedIn URL or identifier." }, "siret": { "type": "string", "minLength": 1, "description": "The French company SIRET number." }, "country": { "type": "string", "minLength": 1, "description": "The country code used to guide enrichment." }, "job": { "type": "string", "minLength": 1, "description": "The contact's job title." }, "company_linkedin": { "type": "string", "minLength": 1, "description": "The company's LinkedIn URL or identifier." }, "custom_fields": { "type": "object", "additionalProperties": { "type": "string", "description": "One custom field value." }, "description": "Custom string fields that Dropcontact returns unchanged." } }, "additionalProperties": false, "description": "One contact or organization record for Dropcontact to enrich." }, "minItems": 1, "maxItems": 250, "description": "Contacts to enrich in one Dropcontact batch." }, "nullable": false, "handle": "data" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "booking" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "dataSourceId" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "personId" } ], "name": "Prepare booking and contact", "moduleId": "n_b724c3f61b0bfd7b", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_7c33856f1a921495": { "inputs": { "data": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_866902adb504c424", "output": "data" } ] }, "siren": { "kind": "value", "value": true } }, "name": "Submit contact enrichment", "kind": "task", "task": { "inputs": [ { "description": "Contacts to enrich in one Dropcontact batch.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": { "email": { "type": "string", "minLength": 1, "description": "The email address to verify or enrich." }, "first_name": { "type": "string", "minLength": 1, "description": "The contact's first name." }, "last_name": { "type": "string", "minLength": 1, "description": "The contact's last name." }, "full_name": { "type": "string", "minLength": 1, "description": "The contact's full name." }, "phone": { "type": "string", "minLength": 1, "description": "The contact's phone number." }, "company": { "type": "string", "minLength": 1, "description": "The contact's company name." }, "website": { "type": "string", "minLength": 1, "description": "The company website or domain." }, "num_siren": { "type": "string", "minLength": 1, "description": "The French company SIREN number." }, "linkedin": { "type": "string", "minLength": 1, "description": "The contact's LinkedIn URL or identifier." }, "siret": { "type": "string", "minLength": 1, "description": "The French company SIRET number." }, "country": { "type": "string", "minLength": 1, "description": "The country code used to guide enrichment." }, "job": { "type": "string", "minLength": 1, "description": "The contact's job title." }, "company_linkedin": { "type": "string", "minLength": 1, "description": "The company's LinkedIn URL or identifier." }, "custom_fields": { "type": "object", "additionalProperties": { "type": "string", "description": "One custom field value." }, "description": "Custom string fields that Dropcontact returns unchanged." } }, "additionalProperties": false, "description": "One contact or organization record for Dropcontact to enrich." }, "minItems": 1, "maxItems": 250, "description": "Contacts to enrich in one Dropcontact batch." }, "nullable": false, "handle": "data" }, { "description": "Whether to request French company identifiers, address data, and company-leader information.", "jsonSchema": { "type": "boolean", "description": "Whether to request French company identifiers, address data, and company-leader information." }, "nullable": true, "handle": "siren", "value": null }, { "description": "The language for enriched data. Dropcontact documents English.", "jsonSchema": { "type": "string", "enum": [ "en" ], "description": "The language for enriched data. Dropcontact documents English." }, "nullable": true, "handle": "language", "value": null } ], "outputs": [ { "description": "Whether Dropcontact reported an error for the submission.", "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact reported an error for the submission." }, "nullable": false, "handle": "error" }, { "description": "The text returned by Dropcontact when present.", "jsonSchema": { "type": [ "string", "null" ], "description": "The text returned by Dropcontact when present." }, "nullable": true, "handle": "request_id" }, { "description": "Whether Dropcontact accepted the enrichment batch.", "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact accepted the enrichment batch." }, "nullable": false, "handle": "success" }, { "description": "The integer value returned by Dropcontact when present.", "jsonSchema": { "type": [ "integer", "null" ], "description": "The integer value returned by Dropcontact when present." }, "nullable": true, "handle": "credits_left" }, { "description": "A raw object returned by Dropcontact.", "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A raw object returned by Dropcontact." }, "nullable": false, "handle": "raw" } ], "name": "Submit contact enrichment", "executor": { "kind": "connector", "action": "dropcontact.submit_enrichment" } } }, "n_895fb5695ed1d45c": { "inputs": { "error": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7c33856f1a921495", "output": "error" } ] }, "success": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7c33856f1a921495", "output": "success" } ] }, "requestId": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7c33856f1a921495", "output": "request_id" } ] }, "raw": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7c33856f1a921495", "output": "raw" } ] }, "count": { "kind": "value", "value": 1 } }, "name": "Confirm enrichment request", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact reported an error for the submission." }, "nullable": false, "handle": "error" }, { "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact accepted the enrichment batch." }, "nullable": false, "handle": "success" }, { "jsonSchema": { "type": [ "string", "null" ], "description": "The text returned by Dropcontact when present." }, "nullable": true, "handle": "requestId" }, { "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A raw object returned by Dropcontact." }, "nullable": false, "handle": "raw" }, { "jsonSchema": { "type": "integer", "minimum": 1, "maximum": 250 }, "nullable": false, "handle": "count" } ], "outputs": [ { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "requestId" }, { "jsonSchema": { "type": "integer", "minimum": 1, "maximum": 250 }, "nullable": false, "handle": "count" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "submission" } ], "name": "Confirm enrichment request", "moduleId": "n_4acbdddc396c5a99", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_412d4d297a5053d3": { "inputs": {}, "name": "Wait 45 seconds", "kind": "wait", "inputDefinitions": [], "prompt": "Wait 45 seconds", "autoContinue": { "kind": "after", "durationMs": 45000 } }, "n_c562e90df350b836": { "inputs": { "request_id": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_895fb5695ed1d45c", "output": "requestId" } ] }, "forceResults": { "kind": "value", "value": false } }, "name": "Fetch the enrichment result", "kind": "task", "task": { "inputs": [ { "description": "The request ID returned by submit_enrichment.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The request ID returned by submit_enrichment." }, "nullable": false, "handle": "request_id" }, { "description": "Whether to return processed records immediately while unprocessed records remain unchanged.", "jsonSchema": { "type": "boolean", "description": "Whether to return processed records immediately while unprocessed records remain unchanged." }, "nullable": true, "handle": "forceResults", "value": null } ], "outputs": [ { "description": "Whether Dropcontact reported an error for the result request.", "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact reported an error for the result request." }, "nullable": false, "handle": "error" }, { "description": "Whether Dropcontact has completed the enrichment request.", "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact has completed the enrichment request." }, "nullable": false, "handle": "success" }, { "description": "The connector lifecycle state derived from the Dropcontact response.", "jsonSchema": { "type": "string", "enum": [ "running", "succeeded", "failed" ], "description": "The connector lifecycle state derived from the Dropcontact response." }, "nullable": false, "handle": "status" }, { "description": "The text returned by Dropcontact when present.", "jsonSchema": { "type": [ "string", "null" ], "description": "The text returned by Dropcontact when present." }, "nullable": true, "handle": "reason" }, { "description": "The integer value returned by Dropcontact when present.", "jsonSchema": { "type": [ "integer", "null" ], "description": "The integer value returned by Dropcontact when present." }, "nullable": true, "handle": "credits_left" }, { "description": "Contacts returned by Dropcontact.", "jsonSchema": { "type": "array", "items": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A raw object returned by Dropcontact." }, "description": "Contacts returned by Dropcontact." }, "nullable": false, "handle": "data" }, { "description": "A raw object returned by Dropcontact.", "jsonSchema": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A raw object returned by Dropcontact." }, "nullable": false, "handle": "raw" } ], "name": "Fetch the enrichment result", "executor": { "kind": "connector", "action": "dropcontact.get_enrichment_result" } } }, "n_757e792311d50400": { "inputs": { "data": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c562e90df350b836", "output": "data" } ] }, "error": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c562e90df350b836", "output": "error" } ] }, "success": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c562e90df350b836", "output": "success" } ] }, "status": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_c562e90df350b836", "output": "status" } ] }, "booking": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_866902adb504c424", "output": "booking" } ] }, "dataSourceId": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_866902adb504c424", "output": "dataSourceId" } ] }, "personId": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_866902adb504c424", "output": "personId" } ] } }, "name": "Prepare the Notion record", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "object", "properties": {}, "additionalProperties": true, "description": "A raw object returned by Dropcontact." }, "description": "Contacts returned by Dropcontact." }, "nullable": false, "handle": "data" }, { "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact reported an error for the result request." }, "nullable": false, "handle": "error" }, { "jsonSchema": { "type": "boolean", "description": "Whether Dropcontact has completed the enrichment request." }, "nullable": false, "handle": "success" }, { "jsonSchema": { "type": "string", "enum": [ "running", "succeeded", "failed" ], "description": "The connector lifecycle state derived from the Dropcontact response." }, "nullable": false, "handle": "status" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "booking" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "dataSourceId" }, { "jsonSchema": { "type": "string", "minLength": 1 }, "nullable": false, "handle": "personId" } ], "outputs": [ { "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion parent field value." }, "description": "The official Notion parent object payload. Use { page_id: \"...\" } for a child page under an existing page, { data_source_id: \"...\" } for a data source row, or { workspace: true } to create a workspace-level private page when the credential is an OAuth public integration. When parent is provided, do not use the top-level title field; set the title through properties.title instead. Internal integration secrets usually cannot create workspace-level private pages and should use a parent page or data source." }, "nullable": true, "handle": "parent" }, { "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion page property value." }, "description": "The page properties." }, "nullable": true, "handle": "properties" } ], "name": "Prepare the Notion record", "moduleId": "n_f320d47e1cf89761", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_a08e351d4e12c38c": { "inputs": { "parent": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_757e792311d50400", "output": "parent" } ] }, "properties": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_757e792311d50400", "output": "properties" } ] } }, "name": "Create the Notion record", "kind": "task", "task": { "inputs": [ { "description": "The parent page ID.", "jsonSchema": { "type": "string", "description": "The parent page ID." }, "nullable": true, "handle": "parentId", "value": null }, { "description": "The page title.", "jsonSchema": { "type": "string", "description": "The page title." }, "nullable": true, "handle": "title", "value": null }, { "description": "The official Notion parent object payload. Use { page_id: \"...\" } for a child page under an existing page, { data_source_id: \"...\" } for a data source row, or { workspace: true } to create a workspace-level private page when the credential is an OAuth public integration. When parent is provided, do not use the top-level title field; set the title through properties.title instead. Internal integration secrets usually cannot create workspace-level private pages and should use a parent page or data source.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion parent field value." }, "description": "The official Notion parent object payload. Use { page_id: \"...\" } for a child page under an existing page, { data_source_id: \"...\" } for a data source row, or { workspace: true } to create a workspace-level private page when the credential is an OAuth public integration. When parent is provided, do not use the top-level title field; set the title through properties.title instead. Internal integration secrets usually cannot create workspace-level private pages and should use a parent page or data source." }, "nullable": true, "handle": "parent", "value": null }, { "description": "The page properties.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion page property value." }, "description": "The page properties." }, "nullable": true, "handle": "properties", "value": null }, { "description": "The child blocks to add.", "jsonSchema": { "type": "array", "items": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "A Notion block object." }, "description": "The child blocks to add." }, "nullable": true, "handle": "children", "value": null }, { "description": "Enhanced Markdown content to create page content. Mutually exclusive with children. Markdown-only private pages without parent are supported only for OAuth public connections or personal access tokens; internal integration secrets should provide a parent page or data source.", "jsonSchema": { "type": "string", "description": "Enhanced Markdown content to create page content. Mutually exclusive with children. Markdown-only private pages without parent are supported only for OAuth public connections or personal access tokens; internal integration secrets should provide a parent page or data source." }, "nullable": true, "handle": "markdown", "value": null }, { "description": "The data source template payload to apply to the created page.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion template field value." }, "description": "The data source template payload to apply to the created page." }, "nullable": true, "handle": "template", "value": null }, { "description": "The page icon object.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion icon field value." }, "description": "The page icon object." }, "nullable": true, "handle": "icon", "value": null }, { "description": "The page cover object.", "jsonSchema": { "type": "object", "additionalProperties": { "description": "A Notion cover field value." }, "description": "The page cover object." }, "nullable": true, "handle": "cover", "value": null } ], "outputs": [ { "description": "The created Notion page object returned by the API.", "jsonSchema": { "type": "object", "properties": { "object": { "const": "page", "description": "The Notion object type." }, "id": { "type": "string", "description": "The page ID." }, "created_time": { "type": "string", "format": "date-time", "description": "The time when the page was created." }, "last_edited_time": { "type": "string", "format": "date-time", "description": "The time when the page was last edited." }, "created_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "last_edited_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "cover": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page cover object, or null when the page has no cover." }, "icon": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page icon object, or null when the page has no icon." }, "parent": { "type": "object", "properties": { "type": { "type": "string", "description": "The parent type, such as workspace, page_id, data_source_id, database_id, or block_id." } }, "additionalProperties": true, "description": "The parent object that contains this Notion object." }, "is_archived": { "type": "boolean", "description": "Whether the page has been archived." }, "in_trash": { "type": "boolean", "description": "Whether the page is in the trash." }, "is_locked": { "type": "boolean", "description": "Whether the page is locked." }, "properties": { "type": "object", "additionalProperties": { "description": "A Notion property value or property schema object." }, "description": "The Notion page, database, or data source properties keyed by property name." }, "url": { "type": "string", "format": "uri", "description": "The canonical Notion URL for the page." }, "public_url": { "type": [ "string", "null" ], "format": "uri", "description": "The public Notion URL if the page is published to the web." } }, "additionalProperties": true, "description": "The created Notion page object returned by the API." }, "nullable": false, "handle": "output" } ], "name": "Create the Notion record", "executor": { "kind": "connector", "action": "notion.create_page", "outputMode": "value" } } }, "n_7e413e6e1017b984": { "inputs": { "page": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_a08e351d4e12c38c", "output": "output" } ] } }, "name": "Confirm the Notion record", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "object", "properties": { "object": { "const": "page", "description": "The Notion object type." }, "id": { "type": "string", "description": "The page ID." }, "created_time": { "type": "string", "format": "date-time", "description": "The time when the page was created." }, "last_edited_time": { "type": "string", "format": "date-time", "description": "The time when the page was last edited." }, "created_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "last_edited_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "cover": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page cover object, or null when the page has no cover." }, "icon": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page icon object, or null when the page has no icon." }, "parent": { "type": "object", "properties": { "type": { "type": "string", "description": "The parent type, such as workspace, page_id, data_source_id, database_id, or block_id." } }, "additionalProperties": true, "description": "The parent object that contains this Notion object." }, "is_archived": { "type": "boolean", "description": "Whether the page has been archived." }, "in_trash": { "type": "boolean", "description": "Whether the page is in the trash." }, "is_locked": { "type": "boolean", "description": "Whether the page is locked." }, "properties": { "type": "object", "additionalProperties": { "description": "A Notion property value or property schema object." }, "description": "The Notion page, database, or data source properties keyed by property name." }, "url": { "type": "string", "format": "uri", "description": "The canonical Notion URL for the page." }, "public_url": { "type": [ "string", "null" ], "format": "uri", "description": "The public Notion URL if the page is published to the web." } }, "additionalProperties": true, "description": "The created Notion page object returned by the API." }, "nullable": false, "handle": "page" } ], "outputs": [ { "jsonSchema": { "type": "object", "properties": { "object": { "const": "page", "description": "The Notion object type." }, "id": { "type": "string", "description": "The page ID." }, "created_time": { "type": "string", "format": "date-time", "description": "The time when the page was created." }, "last_edited_time": { "type": "string", "format": "date-time", "description": "The time when the page was last edited." }, "created_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "last_edited_by": { "type": "object", "properties": { "object": { "const": "user", "description": "The Notion object type." }, "id": { "type": "string", "description": "The Notion user ID." }, "name": { "type": [ "string", "null" ], "description": "The user's display name, or null when unavailable." }, "avatar_url": { "type": [ "string", "null" ], "description": "The user's avatar URL, or null when unavailable." }, "type": { "type": "string", "enum": [ "person", "bot" ], "description": "The user type returned by Notion." }, "person": { "type": "object", "properties": { "email": { "type": "string", "format": "email", "description": "The person's email address." } }, "additionalProperties": true, "description": "Details about a person user." }, "bot": { "type": "object", "additionalProperties": { "description": "A Notion API field value." }, "description": "Details about a bot user." } }, "additionalProperties": true, "description": "A Notion user reference." }, "cover": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page cover object, or null when the page has no cover." }, "icon": { "type": [ "object", "null" ], "additionalProperties": { "description": "A Notion API field value." }, "description": "The page icon object, or null when the page has no icon." }, "parent": { "type": "object", "properties": { "type": { "type": "string", "description": "The parent type, such as workspace, page_id, data_source_id, database_id, or block_id." } }, "additionalProperties": true, "description": "The parent object that contains this Notion object." }, "is_archived": { "type": "boolean", "description": "Whether the page has been archived." }, "in_trash": { "type": "boolean", "description": "Whether the page is in the trash." }, "is_locked": { "type": "boolean", "description": "Whether the page is locked." }, "properties": { "type": "object", "additionalProperties": { "description": "A Notion property value or property schema object." }, "description": "The Notion page, database, or data source properties keyed by property name." }, "url": { "type": "string", "format": "uri", "description": "The canonical Notion URL for the page." }, "public_url": { "type": [ "string", "null" ], "format": "uri", "description": "The public Notion URL if the page is published to the web." } }, "additionalProperties": true, "description": "The created Notion page object returned by the API." }, "nullable": false, "handle": "page" } ], "name": "Confirm the Notion record", "moduleId": "n_c1a67276793541e9", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } } }, "edges": [ { "source": "n_e0ede677b0c46d82", "target": "n_866902adb504c424" }, { "source": "n_866902adb504c424", "target": "n_7c33856f1a921495" }, { "source": "n_7c33856f1a921495", "target": "n_895fb5695ed1d45c" }, { "source": "n_895fb5695ed1d45c", "target": "n_412d4d297a5053d3" }, { "source": "n_412d4d297a5053d3", "target": "n_c562e90df350b836", "sourceHandle": "continue" }, { "source": "n_c562e90df350b836", "target": "n_757e792311d50400" }, { "source": "n_757e792311d50400", "target": "n_a08e351d4e12c38c" }, { "source": "n_a08e351d4e12c38c", "target": "n_7e413e6e1017b984" } ] } }, "modules": { "n_b724c3f61b0bfd7b": { "name": "Prepare booking and contact", "imports": [], "source": "export default function prepare({payload,dataSourceId,personId}){if(typeof dataSourceId!=='string'||!dataSourceId.trim()||dataSourceId.startsWith('YOUR_')||typeof personId!=='string'||!personId.trim()||personId.startsWith('YOUR_'))throw Error('Configure the Notion data source and person');if(!payload||typeof payload.email!=='string'||!payload.email.trim()||typeof payload.name!=='string'||!payload.name.trim())throw Error('Booking is missing the invitee name or email');const e=payload.scheduled_event,start=e?.start_time,end=e?.end_time;if(typeof start!=='string'||typeof end!=='string'||!Number.isFinite(Date.parse(start))||!Number.isFinite(Date.parse(end))||Date.parse(end)<=Date.parse(start))throw Error('Booking has invalid scheduled event times');const contact={email:payload.email,full_name:payload.name};for(const k of['first_name','last_name'])if(typeof payload[k]==='string'&&payload[k].trim())contact[k]=payload[k];return{data:[contact],booking:{start,end},dataSourceId,personId}}\n" }, "n_4acbdddc396c5a99": { "name": "Confirm enrichment request", "imports": [], "source": "export default function dropcontactSubmission({ error, success, requestId, raw, count }) {\n if (error !== false || success !== true || typeof requestId !== 'string' || !requestId.trim() || !raw || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('Dropcontact did not confirm the enrichment request; submission may already have occurred');\n if (!Number.isInteger(count) || count < 1 || count > 250) throw new Error('Invalid enrichment contact count');\n return { requestId, count, submission: raw };\n}\n" }, "n_f320d47e1cf89761": { "name": "Prepare the Notion record", "imports": [], "source": "export default function page({data,error,success,status,booking,dataSourceId,personId}){if(error!==false||success!==true||status!=='succeeded'||!Array.isArray(data)||data.length!==1)throw Error('Dropcontact enrichment is not complete; inspect the request before retrying');if(typeof dataSourceId!=='string'||!dataSourceId.trim()||dataSourceId.startsWith('YOUR_')||typeof personId!=='string'||!personId.trim()||personId.startsWith('YOUR_'))throw Error('Configure the Notion data source and person');const r=data[0],email=r?.email?.[0]?.email;if(typeof r?.full_name!=='string'||!r.full_name.trim()||typeof email!=='string'||!email.trim())throw Error('Enriched contact is missing full name or first email');const properties={Date:{date:{start:booking.start,end:booking.end}},email:{email},Leads:{title:[{text:{content:r.full_name}}]},Person:{people:[{id:personId}]}};for(const [source,target]of[['linkedin','LinkedIn Profile'],['website','Website'],['company_linkedin','LinkedIn Company']]){const v=r[source];if(v===undefined||v===null||v==='')continue;if(typeof v!=='string')throw Error('Invalid enriched URL');properties[target]={url:v}}if(r.civility!==undefined&&r.civility!==null&&r.civility!==''){if(typeof r.civility!=='string')throw Error('Invalid civility');properties.Civility={rich_text:[{text:{content:r.civility}}]}}return{parent:{data_source_id:dataSourceId},properties}}\n" }, "n_c1a67276793541e9": { "name": "Confirm the Notion record", "imports": [], "source": "export default function notionBookingCreated({ page }) {\n if (!page || typeof page !== 'object' || Array.isArray(page) || page.object !== 'page' || typeof page.id !== 'string' || !page.id.trim()) {\n throw new Error('Notion did not return a created page ID');\n }\n return { page };\n}\n" } } }, "presentation": { "designer": { "version": 1, "flow": { "direction": "vertical" } } } }