{ "meta": { "instanceId": "workflow-bdafe179", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:42.646134", "updatedAt": "2025-09-29T07:07:42.646150", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "nodes": [ { "id": "8a4ba8b8-b76e-4572-becd-e7f8fbea2651", "name": "EXTRACT CAMPAIGN DATA", "type": "n8n-nodes-base.httpRequest", "position": [ 500, 960 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": { "batching": { "batch": { "batchSize": 0 } } }, "sendQuery": true, "queryParameters": { "parameters": [ { "name": "api_key", "value": "={{ $json['API KEY'] }}" } ] } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "90011ed6-180d-4170-8932-ac3aa7d0e5df", "name": "FETCH ALL CAMPAIGNS", "type": "n8n-nodes-base.httpRequest", "position": [ -20, 940 ], "parameters": { "url": "{{ $env.API_BASE_URL }}", "options": { "batching": { "batch": { "batchSize": 0 } } }, "sendQuery": true, "queryParameters": { "parameters": [ { "name": "api_key", "value": "={{ $json['API KEY'] }}" } ] } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "c41afcf1-9256-47fa-ad99-3e1af880e53d", "name": "Loop Over Items", "type": "n8n-nodes-base.splitInBatches", "position": [ 200, 940 ], "parameters": { "options": { "reset": "={{ $node['Loop Over Items'].context[\"done\"] }}" } }, "typeVersion": 3, "notes": "This splitInBatches node performs automated tasks as part of the workflow." }, { "id": "606bfc18-1d70-4d64-ac70-ae6f42bf0dbb", "name": "UPDATE CAMPAIGN", "type": "n8n-nodes-base.postgres", "position": [ 720, 1220 ], "parameters": { "table": { "__rl": true, "mode": "list", "value": "ce_campaign", "cachedResultName": "ce_campaign" }, "schema": { "__rl": true, "mode": "list", "value": "outbound_activities", "cachedResultName": "outbound_activities" }, "columns": { "value": { "name": "={{ $json.name }}", "status": "={{ $json.status }}", "user_id": "={{ $json.user_id }}", "client_id": "={{ $json.client_id }}", "created_at": "={{ $json.created_at }}", "updated_at": "={{ $json.updated_at }}", "campaign_id": "={{ $json.id }}", "track_settings": "={{ $json.track_settings }}", "unsubscribe_text": "={{ $json.unsubscribe_text }}", "max_leads_per_day": "={{ $json.max_leads_per_day }}", "parent_campaign_id": "={{ $json.parent_campaign_id }}", "send_as_plain_text": "={{ $json.send_as_plain_text }}", "stop_lead_settings": "={{ $json.stop_lead_settings }}", "follow_up_percentage": "={{ $json.follow_up_percentage }}", "min_time_btwn_emails": "={{ $json.min_time_btwn_emails }}", "scheduler_cron_value": "={{ $json.scheduler_cron_value }}", "enable_ai_esp_matching": "={{ $json.enable_ai_esp_matching }}", "psg_last_update_timestamp": "={{ $now }}" }, "schema": [ { "id": "campaign_id", "type": "number", "display": true, "removed": false, "required": true, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "user_id", "type": "number", "display": true, "required": false, "displayName": "user_id", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "created_at", "type": "dateTime", "display": true, "required": true, "displayName": "created_at", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "updated_at", "type": "dateTime", "display": true, "required": true, "displayName": "updated_at", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "status", "type": "string", "display": true, "required": true, "displayName": "status", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "name", "type": "string", "display": true, "required": false, "displayName": "name", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "track_settings", "type": "array", "display": true, "required": false, "displayName": "track_settings", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "scheduler_cron_value", "type": "object", "display": true, "required": false, "displayName": "scheduler_cron_value", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "min_time_btwn_emails", "type": "number", "display": true, "required": false, "displayName": "min_time_btwn_emails", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "max_leads_per_day", "type": "number", "display": true, "required": false, "displayName": "max_leads_per_day", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "stop_lead_settings", "type": "string", "display": true, "required": false, "displayName": "stop_lead_settings", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "enable_ai_esp_matching", "type": "boolean", "display": true, "required": false, "displayName": "enable_ai_esp_matching", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "send_as_plain_text", "type": "boolean", "display": true, "required": false, "displayName": "send_as_plain_text", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "follow_up_percentage", "type": "number", "display": true, "required": false, "displayName": "follow_up_percentage", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "unsubscribe_text", "type": "string", "display": true, "required": false, "displayName": "unsubscribe_text", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "parent_campaign_id", "type": "number", "display": true, "required": false, "displayName": "parent_campaign_id", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "client_id", "type": "number", "display": true, "required": false, "displayName": "client_id", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "psg_last_update_timestamp", "type": "dateTime", "display": true, "required": false, "displayName": "psg_last_update_timestamp", "defaultMatch": false, "canBeUsedToMatch": false } ], "mappingMode": "defineBelow", "matchingColumns": [ "campaign_id" ] }, "options": { "queryBatching": "independently" }, "operation": "upsert" }, "credentials": { "postgres": { "id": "z7VPpa7mFIGKNewM", "name": "Postgres Aikido" } }, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "b9f61fd6-9327-428e-9e78-4ca0779476ea", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [ 1220, 980 ], "parameters": { "mode": "combine", "options": {}, "combineBy": "combineByPosition" }, "typeVersion": 3, "notes": "This merge node performs automated tasks as part of the workflow." }, { "id": "b8c1082d-a12f-4e56-af8c-73641b45da67", "name": "Code", "type": "n8n-nodes-base.code", "notes": "// Retrieve the CSV-like data from the 'data' field in the input\nconst csvData = $json['data']; // Ensure that 'data' is the correct field name\n\n// Check if csvData exists and is not empty\nif (!csvData) {\n console.log(\"Input data structure:\", $json); // Debugging output to inspect input structure\n throw new Error('No CSV data provided. Ensure the correct field reference is being used.');\n}\n\n// Split the CSV into rows\nconst rows = csvData.split('\\n');\n\n// Extract the headers\nconst headers = rows[0].replace(/\"/g, '').split(',');\n\n// Iterate over each data row and map it to an object\nconst output = rows.slice(1).map(row => {\n const values = row.match(/(\".*?\"|[^\",]+)(?=\\s*,|\\s*$)/g).map(value => {\n // Remove surrounding quotes from each value if present\n return value.startsWith('\"') && value.endsWith('\"') ? value.slice(1, -1) : value;\n });\n\n const item = {};\n headers.forEach((header, index) => {\n item[header] = values[index] || null;\n });\n\n return { json: item };\n});\n\nreturn output;", "position": [ 720, 960 ], "parameters": { "jsCode": "// Retrieve the CSV-like data from the 'data' field in the input\nconst csvData = items[0].json.data; // Ensure that 'data' is the correct field name\n\n// Check if csvData exists and is not empty\nif (!csvData) {\n console.log(\"Input data structure:\", ); // Debugging output to inspect input structure\n throw new Error('No CSV data provided. Ensure the correct field reference is being used.');\n}\n\nif (typeof csvData !== 'string') {\n throw new Error('CSV data is not a string. Please check the input data format.');\n}\n\n// Preprocess the CSV data to handle missing values\nconst preprocessedCsvData = csvData.replace(/,,/g, ',\"\",');\n\n// Split the CSV into rows\nconst rows = preprocessedCsvData.split(/\\r?\\n/); // Adjust to handle different line endings\n\n// Define the expected number of columns based on CSV structure\nconst expectedNumberOfColumns = 22;\n\n// Iterate over each data row starting from the second row (index 1) and map it to an object\nconst output = rows.slice(1).map((row, index) => {\n // Split the row into values, accounting for empty columns using regex\n const values = row.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/).map(value => {\n // Remove surrounding quotes from each value if present and trim whitespace\n return value.startsWith('\"') && value.endsWith('\"') ? value.slice(1, -1).trim() : value.trim();\n });\n\n // Ensure that the number of values matches the expected number of columns\n while (values.length < expectedNumberOfColumns) {\n values.push(\"\"); // Add empty strings for missing values\n }\n\n // Check if the number of values matches expected columns\n if (values.length !== expectedNumberOfColumns) {\n console.warn(`Row ${index + 1} doesn't have the expected number of columns. Skipping this entry.`);\n return null; // Skip this row if it doesn't match the expected columns\n }\n\n // Create an item object with a fixed structure\n const item = {\n id: values[0] || null,\n campaign_lead_map_id: values[1] || null,\n status: values[2] || null,\n category: values[3] || null,\n is_interested: values[4] === 'true', // Convert to boolean\n created_at: values[5] || null,\n first_name: values[6] || null,\n last_name: values[7] || null,\n email: values[8] || null,\n phone_number: values[9] || null,\n company_name: values[10] || null,\n website: values[11] || null,\n location: values[12] || null,\n custom_fields: values[13] || null,\n linkedin_profile: values[14] || null,\n company_url: values[15] || null,\n is_unsubscribed: values[16] === 'true', // Convert to boolean\n unsubscribed_client_id_map: values[17] || null,\n last_email_sequence_sent: values[18] || null,\n open_count: parseInt(values[19], 10) || 0, // Convert to number\n click_count: parseInt(values[20], 10) || 0, // Convert to number\n reply_count: parseInt(values[21], 10) || 0 // Convert to number\n };\n\n return { json: item };\n}).filter(item => item !== null); // Remove null entries from output\n\n// Return the structured output\nreturn output;\n" }, "typeVersion": 2, "alwaysOutputData": true }, { "id": "f6550deb-0479-475e-b3ba-9507a4ac8911", "name": "Loop Over Items1", "type": "n8n-nodes-base.splitInBatches", "position": [ 180, 160 ], "parameters": { "options": { "reset": "={{ $node['Loop Over Items1'].context[\"done\"] }}" } }, "typeVersion": 3, "notes": "This splitInBatches node performs automated tasks as part of the workflow." }, { "id": "a183df85-17a2-4886-adc9-68b5ab5fa8b0", "name": "HubSpot", "type": "n8n-nodes-base.hubspot", "position": [ 420, 180 ], "parameters": { "operation": "getAll", "authentication": "{{ $credentials.oAuth2 }}", "additionalFields": {} }, "credentials": { "hubspotOAuth2Api": { "id": "JOrebC0LtzWrkgzz", "name": "Robaws" } }, "executeOnce": false, "typeVersion": 2.1, "alwaysOutputData": true, "notes": "This hubspot node performs automated tasks as part of the workflow." }, { "id": "da7e2980-6f82-4867-a460-306095234f5f", "name": "If Node", "type": "n8n-nodes-base.if", "position": [ 640, 180 ], "parameters": { "options": {}, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "e77d0ee2-bb31-483b-98ee-b0acb0b54bb4", "operator": { "type": "boolean", "operation": "false", "singleValue": true }, "leftValue": "={{ $json.companyId.isEmpty() }}", "rightValue": "" } ] } }, "typeVersion": 2.2, "notes": "This if node performs automated tasks as part of the workflow." }, { "id": "9247f4c5-05dd-48a4-8bf9-c67a8936570c", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [ -1340, 980 ], "parameters": { "rule": { "interval": [ {} ] } }, "typeVersion": 1.2, "notes": "This scheduleTrigger node performs automated tasks as part of the workflow." }, { "id": "16623c02-5fb6-40cd-835b-2557eddbbf85", "name": "UPSERT CAMPAIGN ACTIVITY", "type": "n8n-nodes-base.postgres", "onError": "continueErrorOutput", "position": [ 980, 960 ], "parameters": { "table": { "__rl": true, "mode": "list", "value": "ce_campaign_activity", "cachedResultName": "ce_campaign_activity" }, "schema": { "__rl": true, "mode": "list", "value": "outbound_activities", "cachedResultName": "outbound_activities" }, "columns": { "value": { "id": "={{ $json.id }}", "email": "={{ $json.email }}", "status": "={{ $json.status }}", "website": "={{ $json.email.extractDomain() }}", "category": "={{ $json.category }}", "location": "={{ $json.location }}", "last_name": "={{ $json.last_name }}", "created_at": "={{ $json.created_at }}", "first_name": "={{ $json.first_name }}", "open_count": "={{ $json.open_count }}", "campaign_id": "={{ $('Loop Over Items').item.json.id }}", "click_count": "={{ $json.click_count }}", "company_url": "{{ $env.BASE_URL }}", "reply_count": "={{ $json.reply_count }}", "company_name": "={{ $json.company_name }}", "phone_number": "={{ $json.phone_number }}", "custom_fields": "={{ JSON.stringify(JSON.parse($json.custom_fields.replace(/\"\"/g, '\"'))) }}", "is_interested": "={{ $json.is_interested }}", "is_unsubscribed": "={{ $json.is_unsubscribed }}", "linkedin_profile": "={{ $json.linkedin_profile }}", "campaign_lead_map_id": "={{ $json.campaign_lead_map_id }}", "last_email_sequence_sent": "={{ $json.last_email_sequence_sent }}", "psg_last_update_timestmap": "={{ $now }}", "unsubscribed_client_id_map": "={{ $json.unsubscribed_client_id_map }}" }, "schema": [ { "id": "id", "type": "number", "display": true, "removed": false, "required": true, "displayName": "id", "defaultMatch": true, "canBeUsedToMatch": true }, { "id": "campaign_lead_map_id", "type": "number", "display": true, "required": false, "displayName": "campaign_lead_map_id", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "status", "type": "string", "display": true, "required": false, "displayName": "status", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "category", "type": "string", "display": true, "required": false, "displayName": "category", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "is_interested", "type": "boolean", "display": true, "required": false, "displayName": "is_interested", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "created_at", "type": "dateTime", "display": true, "required": true, "displayName": "created_at", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "first_name", "type": "string", "display": true, "required": false, "displayName": "first_name", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "last_name", "type": "string", "display": true, "required": false, "displayName": "last_name", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "email", "type": "string", "display": true, "required": false, "displayName": "email", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "phone_number", "type": "string", "display": true, "required": false, "displayName": "phone_number", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "company_name", "type": "string", "display": true, "required": false, "displayName": "company_name", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "website", "type": "string", "display": true, "required": false, "displayName": "website", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "location", "type": "string", "display": true, "required": false, "displayName": "location", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "custom_fields", "type": "object", "display": true, "required": false, "displayName": "custom_fields", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "linkedin_profile", "type": "string", "display": true, "required": false, "displayName": "linkedin_profile", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "company_url", "type": "string", "display": true, "required": false, "displayName": "company_url", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "is_unsubscribed", "type": "boolean", "display": true, "required": false, "displayName": "is_unsubscribed", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "unsubscribed_client_id_map", "type": "object", "display": true, "required": false, "displayName": "unsubscribed_client_id_map", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "last_email_sequence_sent", "type": "number", "display": true, "required": false, "displayName": "last_email_sequence_sent", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "open_count", "type": "number", "display": true, "required": false, "displayName": "open_count", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "click_count", "type": "number", "display": true, "required": false, "displayName": "click_count", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "reply_count", "type": "number", "display": true, "required": false, "displayName": "reply_count", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "psg_last_update_timestmap", "type": "dateTime", "display": true, "required": false, "displayName": "psg_last_update_timestmap", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "campaign_id", "type": "number", "display": true, "removed": false, "required": false, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": false } ], "mappingMode": "defineBelow", "matchingColumns": [ "id" ] }, "options": { "queryBatching": "independently" }, "operation": "upsert" }, "credentials": {}, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "be550807-7ec6-45bc-b522-ae958200e90e", "name": "HUBSPOT TABLE", "type": "n8n-nodes-base.postgres", "position": [ 900, 160 ], "parameters": { "table": { "__rl": true, "mode": "list", "value": "hubspot", "cachedResultName": "hubspot" }, "schema": { "__rl": true, "mode": "list", "value": "outbound_activities", "cachedResultName": "outbound_activities" }, "columns": { "value": { "campaign_id": "={{ $node['Loop Over Items1'].data.campaign_id}}", "lifecyclestage": "={{ $json.properties.lifecyclestage.value }}", "hs_num_open_deals": "={{ $json.properties.hs_num_open_deals.value }}", "hubspot_company_id": "={{ $json.companyId }}" }, "schema": [ { "id": "hubspot_company_id", "type": "number", "display": true, "removed": false, "required": true, "displayName": "hubspot_company_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "campaign_id", "type": "number", "display": true, "required": false, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "lifecyclestage", "type": "string", "display": true, "required": false, "displayName": "lifecyclestage", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "hs_num_open_deals", "type": "number", "display": true, "required": false, "displayName": "hs_num_open_deals", "defaultMatch": false, "canBeUsedToMatch": false }, { "id": "last_engagement_date", "type": "dateTime", "display": true, "removed": true, "required": false, "displayName": "last_engagement_date", "defaultMatch": false, "canBeUsedToMatch": false } ], "mappingMode": "defineBelow", "matchingColumns": [ "hubspot_company_id" ] }, "options": { "queryBatching": "independently" }, "operation": "upsert" }, "credentials": { "postgres": { "id": "VtxZTfSI4m2NFeN5", "name": "Postgres Personal Personal Folder" } }, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "328b900e-8c21-4578-b6a4-8c17fbccca26", "name": "SEARCH", "type": "n8n-nodes-base.postgres", "position": [ -40, 160 ], "parameters": { "query": "SELECT\n ca.id,\n ca.campaign_id,\n ca.email,\n MIN(ca.first_name) AS first_name,\n MIN(ca.last_name) AS last_name,\n SUM(ca.reply_count) AS reply_count,\n max(hb_lifecyclestage_check_timestamp) as hb_lifecyclestage_check_timestamp,\n CASE\n -- Check if there is a comma and handle the extraction first\n WHEN MIN(ca.linkedin_profile) LIKE '%,%' \n THEN \n -- Replace /sales/people/ with /in/ on the extracted part before the comma\n REPLACE(LEFT(MIN(ca.linkedin_profile), POSITION(',' IN MIN(ca.linkedin_profile)) - 1), '/sales/people/', '/in/')\n ELSE \n -- For profiles without a comma, check for the replacement directly\n REPLACE(MIN(ca.linkedin_profile), '/sales/people/', '/in/')\n END AS linkedin_profile,\n MAX(ca.company_url) AS company_profile,\n -- Extracting domain from email to create the website column\n SUBSTRING(ca.email FROM POSITION('@' IN ca.email) + 1) AS website,\n c.created_at,\n c.updated_at,\n c.status,\n c.name\nFROM\n outbound_activities.ce_campaign_activity ca\nJOIN\n outbound_activities.ce_campaign c ON ca.campaign_id = c.campaign_id\n--left join outbound_activities.hubspot hb on \n\nWHERE \n hb_lifecyclestage_check_timestamp IS NULL \n OR hb_lifecyclestage_check_timestamp < NOW() - INTERVAL '24 hours'\n\n \nGROUP BY\n ca.id,\n ca.campaign_id,\n ca.email,\n c.created_at,\n c.updated_at,\n c.status,\n c.name\n\n\nlimit 5000", "options": {}, "operation": "executeQuery" }, "credentials": { "postgres": { "id": "VtxZTfSI4m2NFeN5", "name": "Postgres Personal Personal Folder" } }, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "c403ef52-894d-476a-aaba-6527c7cb2184", "name": "Postgres1", "type": "n8n-nodes-base.postgres", "position": [ 640, 380 ], "parameters": { "table": { "__rl": true, "mode": "list", "value": "ce_campaign_activity", "cachedResultName": "ce_campaign_activity" }, "schema": { "__rl": true, "mode": "list", "value": "outbound_activities", "cachedResultName": "outbound_activities" }, "columns": { "value": { "id": "={{ $('Loop Over Items1').item.json.id }}", "hb_lifecyclestage_check_timestamp": "={{ $now }}" }, "schema": [ { "id": "id", "type": "number", "display": true, "removed": false, "required": true, "displayName": "id", "defaultMatch": true, "canBeUsedToMatch": true }, { "id": "campaign_lead_map_id", "type": "number", "display": true, "removed": true, "required": false, "displayName": "campaign_lead_map_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "status", "type": "string", "display": true, "removed": true, "required": false, "displayName": "status", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "category", "type": "string", "display": true, "removed": true, "required": false, "displayName": "category", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "is_interested", "type": "boolean", "display": true, "removed": true, "required": false, "displayName": "is_interested", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "created_at", "type": "dateTime", "display": true, "removed": true, "required": true, "displayName": "created_at", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "first_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "first_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "last_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "last_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "email", "type": "string", "display": true, "removed": true, "required": false, "displayName": "email", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "phone_number", "type": "string", "display": true, "removed": true, "required": false, "displayName": "phone_number", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "company_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "company_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "website", "type": "string", "display": true, "removed": true, "required": false, "displayName": "website", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "location", "type": "string", "display": true, "removed": true, "required": false, "displayName": "location", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "custom_fields", "type": "object", "display": true, "removed": true, "required": false, "displayName": "custom_fields", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "linkedin_profile", "type": "string", "display": true, "removed": true, "required": false, "displayName": "linkedin_profile", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "company_url", "type": "string", "display": true, "removed": true, "required": false, "displayName": "company_url", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "is_unsubscribed", "type": "boolean", "display": true, "removed": true, "required": false, "displayName": "is_unsubscribed", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "unsubscribed_client_id_map", "type": "object", "display": true, "removed": true, "required": false, "displayName": "unsubscribed_client_id_map", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "last_email_sequence_sent", "type": "number", "display": true, "removed": true, "required": false, "displayName": "last_email_sequence_sent", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "open_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "open_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "click_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "click_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "reply_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "reply_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "psg_last_update_timestmap", "type": "dateTime", "display": true, "removed": true, "required": false, "displayName": "psg_last_update_timestmap", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "campaign_id", "type": "number", "display": true, "removed": true, "required": false, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "hb_lifecyclestage_check_timestamp", "type": "dateTime", "display": true, "required": false, "displayName": "hb_lifecyclestage_check_timestamp", "defaultMatch": false, "canBeUsedToMatch": true } ], "mappingMode": "defineBelow", "matchingColumns": [ "id" ] }, "options": {}, "operation": "update" }, "credentials": { "postgres": { "id": "VtxZTfSI4m2NFeN5", "name": "Postgres Personal Personal Folder" } }, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "671f168b-a720-42e6-964d-a7f2871d2d6e", "name": "UPDATE HUBSPOT ACTIVITY TABLE", "type": "n8n-nodes-base.postgres", "position": [ 1120, 160 ], "parameters": { "table": { "__rl": true, "mode": "list", "value": "ce_campaign_activity", "cachedResultName": "ce_campaign_activity" }, "schema": { "__rl": true, "mode": "list", "value": "outbound_activities", "cachedResultName": "outbound_activities" }, "columns": { "value": { "id": "={{ $('Loop Over Items1').item.json.id }}", "hb_lifecyclestage_check_timestamp": "={{ $now }}" }, "schema": [ { "id": "id", "type": "number", "display": true, "removed": false, "required": true, "displayName": "id", "defaultMatch": true, "canBeUsedToMatch": true }, { "id": "campaign_lead_map_id", "type": "number", "display": true, "removed": true, "required": false, "displayName": "campaign_lead_map_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "status", "type": "string", "display": true, "removed": true, "required": false, "displayName": "status", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "category", "type": "string", "display": true, "removed": true, "required": false, "displayName": "category", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "is_interested", "type": "boolean", "display": true, "removed": true, "required": false, "displayName": "is_interested", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "created_at", "type": "dateTime", "display": true, "removed": true, "required": true, "displayName": "created_at", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "first_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "first_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "last_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "last_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "email", "type": "string", "display": true, "removed": true, "required": false, "displayName": "email", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "phone_number", "type": "string", "display": true, "removed": true, "required": false, "displayName": "phone_number", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "company_name", "type": "string", "display": true, "removed": true, "required": false, "displayName": "company_name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "website", "type": "string", "display": true, "removed": true, "required": false, "displayName": "website", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "location", "type": "string", "display": true, "removed": true, "required": false, "displayName": "location", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "custom_fields", "type": "object", "display": true, "removed": true, "required": false, "displayName": "custom_fields", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "linkedin_profile", "type": "string", "display": true, "removed": true, "required": false, "displayName": "linkedin_profile", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "company_url", "type": "string", "display": true, "removed": true, "required": false, "displayName": "company_url", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "is_unsubscribed", "type": "boolean", "display": true, "removed": true, "required": false, "displayName": "is_unsubscribed", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "unsubscribed_client_id_map", "type": "object", "display": true, "removed": true, "required": false, "displayName": "unsubscribed_client_id_map", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "last_email_sequence_sent", "type": "number", "display": true, "removed": true, "required": false, "displayName": "last_email_sequence_sent", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "open_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "open_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "click_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "click_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "reply_count", "type": "number", "display": true, "removed": true, "required": false, "displayName": "reply_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "psg_last_update_timestmap", "type": "dateTime", "display": true, "removed": true, "required": false, "displayName": "psg_last_update_timestmap", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "campaign_id", "type": "number", "display": true, "removed": true, "required": false, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "hb_lifecyclestage_check_timestamp", "type": "dateTime", "display": true, "required": false, "displayName": "hb_lifecyclestage_check_timestamp", "defaultMatch": false, "canBeUsedToMatch": true } ], "mappingMode": "defineBelow", "matchingColumns": [ "id" ] }, "options": {}, "operation": "update" }, "credentials": { "postgres": { "id": "VtxZTfSI4m2NFeN5", "name": "Postgres Personal Personal Folder" } }, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "6ebe6482-0f31-465a-8532-abaf3822ad72", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ -140, -60 ], "parameters": { "color": 3, "width": 1531.405758029468, "height": 669.051063941859, "content": "## HUBSPOT LIFECYCLESTAGE (LEAD STATUS)" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "31ea75c2-a228-4390-b125-8f2ac0b96a07", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ -140, 760 ], "parameters": { "color": 3, "width": 1831, "height": 669, "content": "## SMARTLEAD CAMPAIGN DATA" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "8d7e4883-74e2-4758-b2d9-504eb7301cbd", "name": "SET SMARTLEAD API KEY", "type": "n8n-nodes-base.set", "position": [ -1040, 980 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "7f81531d-f76f-42c7-b536-2b7b70563e12", "name": "API KEY", "type": "string", "value": "<< ADD YOUR API KEY HERE >>" } ] } }, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "1742845b-2ce5-4184-a7b0-6f5606714fcb", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ -1100, 780 ], "parameters": { "height": 400, "content": "## Search for your smartlead API key [here]({{ $env.WEBHOOK_URL }}" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "e10205a7-3859-4a31-85ba-59c5cc0b69f7", "name": "Postgres", "type": "n8n-nodes-base.postgres", "position": [ -40, 1700 ], "parameters": { "query": "SELECT \n h.campaign_id,\n c.status,\n c.name,\n COUNT(DISTINCT h.hubspot_company_id) AS total_companies,\n SUM(CASE WHEN h.lifecyclestage = 'lead' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS lead_count,\n SUM(CASE WHEN h.lifecyclestage = 'marketingqualifiedlead' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS marketingqualifiedlead_count,\n SUM(CASE WHEN h.lifecyclestage = 'salesqualifiedlead' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS salesqualifiedlead_count,\n SUM(CASE WHEN h.lifecyclestage = 'opportunity' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS opportunity_count,\n SUM(CASE WHEN h.lifecyclestage = 'customer' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS customer_count,\n SUM(CASE WHEN h.lifecyclestage = '140669943' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS lifecyclestage_140669943_count,\n SUM(CASE WHEN h.lifecyclestage = '140669942' AND h.hs_num_open_deals != 0 THEN 1 ELSE 0 END) AS lifecyclestage_140669942_count\nFROM \n outbound_activities.hubspot h\nJOIN \n outbound_activities.ce_campaign c ON h.campaign_id = c.campaign_id\nGROUP BY \n h.campaign_id, c.status, c.name", "options": { "queryBatching": "independently" }, "operation": "executeQuery" }, "credentials": { "postgres": { "id": "VtxZTfSI4m2NFeN5", "name": "Postgres Personal Personal Folder" } }, "retryOnFail": true, "typeVersion": 2.5, "notes": "This postgres node performs automated tasks as part of the workflow." }, { "id": "19a80be4-f81f-44f7-8108-a20f6af8e315", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ -1300, 1340 ], "parameters": { "width": 740, "height": 400, "content": "## POSTGRES INSTALATION [Guide]({{ $env.WEBHOOK_URL }}\n\n## Follow this step by step guide, focus on the next 3 table creations for this flow:\n## - ce_campaign_activity\n## - ce_campaign\n## - hubspot" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "7bc235d2-65c8-41fd-b429-26b2422cbfa8", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ -120, 1580 ], "parameters": { "color": 3, "width": 1060, "height": 1313.3157639300548, "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Campaign Analytics Report Documentation\n\nOverview\n\nThis report provides a high-level summary of campaign performance, designed to help stakeholders quickly assess the outcomes of marketing or sales campaigns. It includes data on campaign activity, targeted audiences, and progression metrics, allowing for a holistic view of campaign effectiveness.\n\n## Key Metrics\n\n\t1\t**Campaign Identification and Status**\n\n •\tCampaign ID: A unique identifier assigned to each campaign for tracking purposes.\n\t•\tStatus: Indicates the current state of the campaign:\n\t•\tActive: Campaign is ongoing.\n\t•\tPaused: Campaign is temporarily on hold.\n\t•\tArchived: Campaign has concluded.\n\n2 **Targeting and Reach**\n\n\t•\tTotal Companies: Number of companies targeted within the campaign scope.\n\n\n3\t**Pipeline Metrics**\n\n\t•\tLead Count: Total number of leads generated by the campaign.\n\t•\tMarketing Qualified Leads (MQLs): Leads that meet predefined marketing qualification criteria.\n\t•\tSales Qualified Leads (SQLs): Leads that are validated as sales-ready by the team.\n\t•\tOpportunities: Potential deals created from campaign engagement.\n\t•\tCustomers: Number of deals successfully closed, converting leads into customers.\n\n\n4\t**Lifecycle Stages**\n\n\t•\tLifecycle Stage Metrics: Counts of entities (e.g., leads, opportunities, or customers) at specific lifecycle stages. These stages represent the journey from lead generation to conversion.\n\n\n\n## How to Use This Report\n\n\t•\t**Evaluate Campaign Success**: Compare metrics like total companies, leads, and customers to understand campaign impact.\n\t•\t**Understand Pipeline Health**: Analyze how many entities progress through the funnel (e.g., from MQL to SQL to Opportunity).\n\t•\t**Monitor Campaign Status**: Use the status column to focus on active campaigns or review the outcomes of archived ones.\n\t•\t**Assess Engagement**: Check opportunity and customer counts to gauge how effective the campaign is in driving conversions." }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "0af663c4-faa9-49ae-a5d3-3bcb6ea7888a", "name": "Google Sheets", "type": "n8n-nodes-base.googleSheets", "position": [ 180, 1700 ], "parameters": { "columns": { "value": { "name": "={{ $json.name }}", "status": "={{ $json.status }}", "lead_count": "={{ $json.lead_count }}", "campaign_id": "={{ $json.company_id }}", "customer_count": "={{ $json.customer_count\n}}\n", "total_companies": "={{ $json.total_companies }}", "opportunity_count": "={{ $json.opportunity_count\n }}", "salesqualifiedlead_count": "={{ $json.salesqualifiedlead_count }}", "marketingqualifiedlead_count": "={{ $json.marketingqualifiedlead_count }}", "lifecyclestage_140669942_count": "={{ $json.lifecyclestage_140669942_count\n}}\n", "lifecyclestage_140669943_count": "={{ $json.lifecyclestage_140669943_count\n}}\n" }, "schema": [ { "id": "campaign_id", "type": "string", "display": true, "removed": false, "required": false, "displayName": "campaign_id", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "status", "type": "string", "display": true, "required": false, "displayName": "status", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "name", "type": "string", "display": true, "required": false, "displayName": "name", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "total_companies", "type": "string", "display": true, "required": false, "displayName": "total_companies", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "lead_count", "type": "string", "display": true, "required": false, "displayName": "lead_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "marketingqualifiedlead_count", "type": "string", "display": true, "required": false, "displayName": "marketingqualifiedlead_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "salesqualifiedlead_count", "type": "string", "display": true, "required": false, "displayName": "salesqualifiedlead_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "opportunity_count", "type": "string", "display": true, "required": false, "displayName": "opportunity_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "customer_count", "type": "string", "display": true, "required": false, "displayName": "customer_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "lifecyclestage_140669943_count", "type": "string", "display": true, "required": false, "displayName": "lifecyclestage_140669943_count", "defaultMatch": false, "canBeUsedToMatch": true }, { "id": "lifecyclestage_140669942_count", "type": "string", "display": true, "required": false, "displayName": "lifecyclestage_140669942_count", "defaultMatch": false, "canBeUsedToMatch": true } ], "mappingMode": "defineBelow", "matchingColumns": [ "campaign_id" ] }, "options": {}, "operation": "appendOrUpdate", "sheetName": { "__rl": true, "mode": "list", "value": "gid=0", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Sheet1" }, "documentId": { "__rl": true, "mode": "list", "value": "1kG5uXCzOJdUTapA6p-IbH3D8sjpGZ5MQm_IhhvPvIGE", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Smartlead Reporting - TEMPLATE" } }, "credentials": { "googleSheetsOAuth2Api": { "id": "qx3ux5eQ43R4Hmbq", "name": "Google Sheets account 2" } }, "typeVersion": 4.5, "notes": "This googleSheets node performs automated tasks as part of the workflow." } ], "pinData": {}, "connections": { "8a4ba8b8-b76e-4572-becd-e7f8fbea2651": { "main": [ [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-7d0b0969", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-c3d962c9", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-0e7cf764", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-2fc9e100", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-3ca5f4f0", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-5c2a1793", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-74b06c71", "type": "main", "index": 0 } ], [ { "node": "error-handler-8a4ba8b8-b76e-4572-becd-e7f8fbea2651-ab1215b5", "type": "main", "index": 0 } ] ] }, "90011ed6-180d-4170-8932-ac3aa7d0e5df": { "main": [ [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-f83b86dc", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-4322c4a8", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-4cef288c", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-4c583e14", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-8f33d21d", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-62c11161", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-17c20920", "type": "main", "index": 0 } ], [ { "node": "error-handler-90011ed6-180d-4170-8932-ac3aa7d0e5df-35a0a5a4", "type": "main", "index": 0 } ] ] }, "0af663c4-faa9-49ae-a5d3-3bcb6ea7888a": { "main": [ [ { "node": "error-handler-0af663c4-faa9-49ae-a5d3-3bcb6ea7888a-aeb027b5", "type": "main", "index": 0 } ] ] } }, "name": "Httprequest Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "description": "Automated workflow: Httprequest Workflow. This workflow integrates 12 different services: stickyNote, httpRequest, hubspot, code, scheduleTrigger. It contains 28 nodes and follows best practices for error handling and security.", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "notes": "Excellent quality workflow: Httprequest Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }