{
  "workflow": {
    "id": 6227,
    "name": "Real-time flight tracking with Aviation API, Slack & SendGrid/Twilio alerts",
    "views": 491,
    "recentViews": 0,
    "totalViews": 491,
    "createdAt": "2025-07-21T12:49:54.794Z",
    "description": "This automated n8n workflow continuously monitors airline schedule changes by fetching real-time flight data, comparing it with stored schedules, and instantly notifying both internal teams and affected passengers through multiple communication channels. The system ensures stakeholders are immediately informed of any flight delays, cancellations, gate changes, or other critical updates.\n\n## **Good to Know**\n\n* Flight data accuracy depends on the aviation API provider's update frequency and reliability\n* Critical notifications (cancellations, major delays) trigger immediate passenger alerts via SMS and email\n* Internal Slack notifications keep operations teams informed in real-time\n* Database logging maintains a complete audit trail of all schedule changes\n* The system processes only confirmed schedule changes to avoid false notifications\n* Passenger notifications are sent only to those with confirmed tickets for affected flights\n\n## **How It Works**\n\n1. **Schedule Trigger** - Automatically runs every 30 minutes to check for flight schedule updates\n2. **Fetch Airline Data** - Retrieves current flight information from aviation APIs\n3. **Get Current Schedules** - Pulls existing schedule data from the internal database\n4. **Process Changes** - Compares API data with database records to identify schedule changes\n5. **Check for Changes** - Determines if any updates require processing and notifications\n6. **Update Database** - Saves schedule changes to the internal flight database\n7. **Notify Slack Channel** - Sends operational updates to the flight operations team\n8. **Check Urgent Notifications** - Identifies critical changes requiring immediate passenger alerts\n9. **Get Affected Passengers** - Retrieves contact information for passengers on changed flights\n10. **Send Email Notifications** - Dispatches detailed schedule change emails via SendGrid\n11. **Send SMS (Critical Only)** - Sends urgent text alerts for cancellations and major delays\n12. **Update Internal Systems** - Syncs changes with other airline systems via webhooks\n13. **Log Sync Activity** - Records all synchronization activities for audit and monitoring\n\n## **Data Sources**\n\nThe workflow integrates with multiple data sources and systems:\n\n1. **Aviation API (Primary Data Source)**\n   * Real-time flight status and schedule data\n   * Departure/arrival times, gates, terminals\n   * Flight status (on-time, delayed, cancelled, diverted)\n   * Aircraft and route information\n\n2. **Internal Flight Database**\n   * **flight_schedules table** - Current schedule data with columns:\n     * flight_number (text) - Flight identifier (e.g., \"AA123\")\n     * departure_time (timestamp) - Scheduled departure time\n     * arrival_time (timestamp) - Scheduled arrival time\n     * status (text) - Flight status (active, delayed, cancelled, diverted)\n     * gate (text) - Departure gate number\n     * terminal (text) - Terminal identifier\n     * airline_code (text) - Airline IATA code\n     * origin_airport (text) - Departure airport code\n     * destination_airport (text) - Arrival airport code\n     * aircraft_type (text) - Aircraft model\n     * updated_at (timestamp) - Last update timestamp\n     * created_at (timestamp) - Record creation timestamp\n   \n   * **passengers table** - Passenger contact information with columns:\n     * passenger_id (integer) - Unique passenger identifier\n     * name (text) - Full passenger name\n     * email (text) - Email address for notifications\n     * phone (text) - Mobile phone number for SMS alerts\n     * notification_preferences (json) - Communication preferences\n     * created_at (timestamp) - Registration timestamp\n     * updated_at (timestamp) - Last profile update\n   \n   * **tickets table** - Booking and ticket status with columns:\n     * ticket_id (integer) - Unique ticket identifier\n     * passenger_id (integer) - Foreign key to passengers table\n     * flight_number (text) - Flight identifier\n     * flight_date (date) - Travel date\n     * seat_number (text) - Assigned seat\n     * ticket_status (text) - Status (confirmed, cancelled, checked-in)\n     * booking_reference (text) - Booking confirmation code\n     * fare_class (text) - Ticket class (economy, business, first)\n     * created_at (timestamp) - Booking timestamp\n     * updated_at (timestamp) - Last modification timestamp\n   \n   * **sync_logs table** - Audit trail and system logs with columns:\n     * log_id (integer) - Unique log identifier\n     * workflow_name (text) - Name of the workflow that created the log\n     * total_changes (integer) - Number of schedule changes processed\n     * sync_status (text) - Status (completed, failed, partial)\n     * sync_timestamp (timestamp) - When the sync occurred\n     * details (json) - Detailed log information and changes\n     * error_message (text) - Error details if sync failed\n     * execution_time_ms (integer) - Processing time in milliseconds\n\n3. **Communication Channels**\n   * Slack - Internal team notifications\n   * SendGrid - Passenger email notifications\n   * Twilio - Critical SMS alerts\n   * Internal webhooks - System integrations\n\n## **How to Use**\n\n* Import the workflow into your n8n instance\n* Configure aviation API credentials (AviationStack, FlightAware, or airline-specific APIs)\n* Set up PostgreSQL database connection with required tables\n* Configure Slack bot token for operations team notifications\n* Set up SendGrid API key and email templates for passenger notifications\n* Configure Twilio credentials for SMS alerts (critical notifications only)\n* Test with sample flight data to verify all notification channels\n* Adjust monitoring frequency and severity thresholds based on operational needs\n* Monitor sync logs to ensure reliable data synchronization\n\n ## **Requirements**\n\n1. **API Access**\n   * Aviation data provider (AviationStack, FlightAware, etc.)\n   * SendGrid account for email delivery\n   * Twilio account for SMS notifications\n   * Slack workspace and bot token\n\n2. **Database Setup**\n   * PostgreSQL database with flight schedule tables\n   * Passenger and ticket management tables\n   * Audit logging tables for tracking changes\n\n3. **Infrastructure**\n   * n8n instance with appropriate node modules\n   * Reliable internet connection for API calls\n   * Proper credential management and security\n\n## **Customizing This Workflow**\n\nModify the **Process Changes** node to adjust change detection sensitivity, add custom business rules, or integrate additional data sources like weather or airport operational data. Customize notification templates in the email and SMS nodes to match your airline's branding and communication style. Adjust the **Schedule Trigger** frequency based on your operational requirements and API rate limits.",
    "workflow": {
      "id": "OBiYfJPbWSpeTYaU",
      "meta": {
        "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
        "templateCredsSetupCompleted": true
      },
      "name": "Real-Time Airline Schedule Monitor & Passenger Alert System",
      "tags": [],
      "nodes": [
        {
          "id": "6f8a4ef8-4e58-4500-b546-693430ee840e",
          "name": "Schedule Trigger",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            -1100,
            100
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "field": "minutes",
                  "minutesInterval": 30
                }
              ]
            }
          },
          "typeVersion": 1.1
        },
        {
          "id": "fdc28d13-a8bc-47bc-a66b-c666272e37cb",
          "name": "Fetch Airline Data",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -880,
            100
          ],
          "parameters": {
            "url": "https://api.aviationstack.com/v1/flights",
            "options": {},
            "authentication": "genericCredentialType",
            "genericAuthType": "httpQueryAuth"
          },
          "credentials": {
            "httpQueryAuth": {
              "id": "credential-id",
              "name": "httpQueryAuth Credential"
            }
          },
          "typeVersion": 4.1
        },
        {
          "id": "f170d7aa-3158-48e0-8229-f9f8126ddc95",
          "name": "Get Current Schedules",
          "type": "n8n-nodes-base.postgres",
          "position": [
            -660,
            100
          ],
          "parameters": {
            "query": "SELECT flight_number, departure_time, arrival_time, status, gate, terminal FROM flight_schedules WHERE updated_at > NOW() - INTERVAL 1 HOUR",
            "options": {},
            "operation": "executeQuery"
          },
          "credentials": {
            "postgres": {
              "id": "credential-id",
              "name": "postgres Credential"
            }
          },
          "typeVersion": 2.4
        },
        {
          "id": "b6763438-4675-4127-afaa-8382872251fe",
          "name": "Process Changes",
          "type": "n8n-nodes-base.code",
          "position": [
            -440,
            100
          ],
          "parameters": {
            "jsCode": "// Compare current API data with database records\nconst apiData = $input.first().json.data;\nconst dbData = $input.last().json;\n\nconst changes = [];\nconst notifications = [];\n\n// Create a map of current DB flights for quick lookup\nconst dbFlights = new Map();\ndbData.forEach(flight => {\n  dbFlights.set(flight.flight_number, flight);\n});\n\n// Process each flight from API\napiData.forEach(apiFlight => {\n  const flightNumber = apiFlight.flight.iata;\n  const dbFlight = dbFlights.get(flightNumber);\n  \n  if (dbFlight) {\n    // Check for changes\n    const apiDeparture = new Date(apiFlight.departure.scheduled).toISOString();\n    const apiArrival = new Date(apiFlight.arrival.scheduled).toISOString();\n    const dbDeparture = new Date(dbFlight.departure_time).toISOString();\n    const dbArrival = new Date(dbFlight.arrival_time).toISOString();\n    \n    let hasChanges = false;\n    const changeDetails = {\n      flight_number: flightNumber,\n      changes: [],\n      severity: 'low'\n    };\n    \n    // Check departure time\n    if (apiDeparture !== dbDeparture) {\n      hasChanges = true;\n      const timeDiff = Math.abs(new Date(apiDeparture) - new Date(dbDeparture)) / (1000 * 60);\n      changeDetails.changes.push({\n        type: 'departure_time',\n        old_value: dbDeparture,\n        new_value: apiDeparture,\n        time_difference_minutes: Math.round(timeDiff)\n      });\n      if (timeDiff > 60) changeDetails.severity = 'high';\n      else if (timeDiff > 30) changeDetails.severity = 'medium';\n    }\n    \n    // Check arrival time\n    if (apiArrival !== dbArrival) {\n      hasChanges = true;\n      const timeDiff = Math.abs(new Date(apiArrival) - new Date(dbArrival)) / (1000 * 60);\n      changeDetails.changes.push({\n        type: 'arrival_time',\n        old_value: dbArrival,\n        new_value: apiArrival,\n        time_difference_minutes: Math.round(timeDiff)\n      });\n      if (timeDiff > 60) changeDetails.severity = 'high';\n      else if (timeDiff > 30) changeDetails.severity = 'medium';\n    }\n    \n    // Check status\n    if (apiFlight.flight_status !== dbFlight.status) {\n      hasChanges = true;\n      changeDetails.changes.push({\n        type: 'status',\n        old_value: dbFlight.status,\n        new_value: apiFlight.flight_status\n      });\n      if (['cancelled', 'diverted'].includes(apiFlight.flight_status)) {\n        changeDetails.severity = 'critical';\n      }\n    }\n    \n    // Check gate\n    if (apiFlight.departure.gate !== dbFlight.gate) {\n      hasChanges = true;\n      changeDetails.changes.push({\n        type: 'gate',\n        old_value: dbFlight.gate,\n        new_value: apiFlight.departure.gate\n      });\n    }\n    \n    if (hasChanges) {\n      changes.push({\n        ...changeDetails,\n        airline: apiFlight.airline.name,\n        route: `${apiFlight.departure.airport} → ${apiFlight.arrival.airport}`,\n        updated_at: new Date().toISOString()\n      });\n    }\n  }\n});\n\n// Generate notifications based on severity\nchanges.forEach(change => {\n  if (['high', 'critical'].includes(change.severity)) {\n    notifications.push({\n      type: 'urgent',\n      flight_number: change.flight_number,\n      message: `Flight ${change.flight_number} has ${change.severity} changes: ${change.changes.map(c => c.type).join(', ')}`,\n      severity: change.severity,\n      changes: change.changes,\n      timestamp: new Date().toISOString()\n    });\n  }\n});\n\nreturn [{\n  json: {\n    total_changes: changes.length,\n    changes: changes,\n    notifications: notifications,\n    processed_at: new Date().toISOString()\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "1383587e-cff6-4048-aaf4-e892e48ffcf8",
          "name": "Check for Changes",
          "type": "n8n-nodes-base.if",
          "position": [
            -220,
            100
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "has-changes",
                  "operator": {
                    "type": "number",
                    "operation": "gt"
                  },
                  "leftValue": "={{ $json.total_changes }}",
                  "rightValue": 0
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "862d4239-2029-49e3-8772-ab6bce4a905f",
          "name": "Update Database",
          "type": "n8n-nodes-base.postgres",
          "position": [
            0,
            0
          ],
          "parameters": {
            "query": "UPDATE flight_schedules SET \n  departure_time = $1,\n  arrival_time = $2,\n  status = $3,\n  gate = $4,\n  terminal = $5,\n  updated_at = NOW()\nWHERE flight_number = $6",
            "options": {
              "queryBatching": "independently"
            },
            "operation": "executeQuery"
          },
          "credentials": {
            "postgres": {
              "id": "credential-id",
              "name": "postgres Credential"
            }
          },
          "typeVersion": 2.4
        },
        {
          "id": "e9946c82-6cb0-4ac8-b201-8698e853d828",
          "name": "Notify Slack Channel",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            220,
            0
          ],
          "parameters": {
            "url": "https://api.slack.com/api/chat.postMessage",
            "options": {},
            "sendBody": true,
            "sendHeaders": true,
            "authentication": "genericCredentialType",
            "bodyParameters": {
              "parameters": [
                {
                  "name": "channel",
                  "value": "#flight-operations"
                },
                {
                  "name": "text",
                  "value": "🔄 *Flight Schedule Updates*\\n\\n{{ $json.total_changes }} flight(s) updated:\\n\\n{{ $json.changes.map(c => `✈️ *${c.flight_number}* (${c.airline})\\n   Route: ${c.route}\\n   Severity: ${c.severity.toUpperCase()}\\n   Changes: ${c.changes.map(ch => ch.type).join(', ')}\\n`).join('\\n') }}"
                }
              ]
            },
            "genericAuthType": "httpHeaderAuth",
            "headerParameters": {
              "parameters": [
                {
                  "name": "Authorization",
                  "value": "Bearer {{ $credentials.slack.token }}"
                }
              ]
            }
          },
          "credentials": {
            "httpHeaderAuth": {
              "id": "credential-id",
              "name": "httpHeaderAuth Credential"
            }
          },
          "typeVersion": 4.1
        },
        {
          "id": "2d4e1f9f-3b92-4ef4-b45d-93b06e4e759a",
          "name": "Check Urgent Notifications",
          "type": "n8n-nodes-base.if",
          "position": [
            0,
            200
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "has-notifications",
                  "operator": {
                    "type": "number",
                    "operation": "gt"
                  },
                  "leftValue": "={{ $json.notifications.length }}",
                  "rightValue": 0
                }
              ]
            }
          },
          "typeVersion": 2
        },
        {
          "id": "87962dd7-526b-4dc4-8f2e-b41e1fb607b7",
          "name": "Get Affected Passengers",
          "type": "n8n-nodes-base.postgres",
          "position": [
            220,
            300
          ],
          "parameters": {
            "query": "SELECT DISTINCT p.email, p.phone, p.name, t.flight_number \nFROM passengers p \nJOIN tickets t ON p.passenger_id = t.passenger_id \nWHERE t.flight_number = ANY($1) \nAND t.flight_date >= CURRENT_DATE \nAND t.status = 'confirmed'",
            "options": {},
            "operation": "executeQuery"
          },
          "credentials": {
            "postgres": {
              "id": "credential-id",
              "name": "postgres Credential"
            }
          },
          "typeVersion": 2.4
        },
        {
          "id": "0a4ed5f3-7456-46b6-b54e-9b8afdc8d436",
          "name": "Send Email Notifications",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            440,
            300
          ],
          "parameters": {
            "url": "https://api.sendgrid.com/v3/mail/send",
            "options": {
              "batching": {
                "batch": {
                  "batchSize": 10
                }
              }
            },
            "sendBody": true,
            "sendHeaders": true,
            "authentication": "genericCredentialType",
            "bodyParameters": {
              "parameters": [
                {
                  "name": "personalizations",
                  "value": "={{ [{ \"to\": [{ \"email\": $json.email, \"name\": $json.name }], \"dynamic_template_data\": { \"passenger_name\": $json.name, \"flight_number\": $json.flight_number, \"changes\": $('process-changes').item.json.notifications.find(n => n.flight_number === $json.flight_number).changes } }] }}"
                },
                {
                  "name": "from",
                  "value": "{ \"email\": \"user@example.com\", \"name\": \"Airline Notifications\" }"
                },
                {
                  "name": "template_id",
                  "value": "d-flight-schedule-change"
                }
              ]
            },
            "genericAuthType": "httpHeaderAuth",
            "headerParameters": {
              "parameters": [
                {
                  "name": "Authorization",
                  "value": "Bearer {{ $credentials.sendgrid.api_key }}"
                }
              ]
            }
          },
          "credentials": {
            "httpHeaderAuth": {
              "id": "credential-id",
              "name": "httpHeaderAuth Credential"
            }
          },
          "typeVersion": 4.1
        },
        {
          "id": "d91cfbf5-0281-4566-b8bd-3f97ee7e7036",
          "name": "Send SMS (Critical Only)",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            660,
            300
          ],
          "parameters": {
            "url": "https://api.twilio.com/2010-04-01/Accounts/{{ $credentials.twilio.account_sid }}/Messages.json",
            "options": {
              "batching": {
                "batch": {
                  "batchSize": 5,
                  "batchInterval": 2000
                }
              }
            },
            "sendBody": true,
            "authentication": "genericCredentialType",
            "bodyParameters": {
              "parameters": [
                {
                  "name": "To",
                  "value": "={{ $json.phone }}"
                },
                {
                  "name": "From",
                  "value": "{{ $credentials.twilio.phone_number }}"
                },
                {
                  "name": "Body",
                  "value": "🚨 URGENT: Flight {{ $json.flight_number }} schedule change. Check your email for details or visit our app. Changes: {{ $('process-changes').item.json.notifications.find(n => n.flight_number === $json.flight_number).changes.map(c => c.type).join(', ') }}"
                }
              ]
            },
            "genericAuthType": "httpBasicAuth"
          },
          "credentials": {
            "httpBasicAuth": {
              "id": "credential-id",
              "name": "httpBasicAuth Credential"
            }
          },
          "typeVersion": 4.1
        },
        {
          "id": "caf2c18a-4ae5-4cba-8b09-2ffce1fe0d98",
          "name": "Update Internal Systems",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            440,
            0
          ],
          "parameters": {
            "url": "https://hooks.zapier.com/hooks/catch/internal-system-webhook/",
            "options": {},
            "sendBody": true,
            "bodyParameters": {
              "parameters": [
                {
                  "name": "event_type",
                  "value": "flight_schedule_sync"
                },
                {
                  "name": "total_changes",
                  "value": "={{ $json.total_changes }}"
                },
                {
                  "name": "changes",
                  "value": "={{ $json.changes }}"
                },
                {
                  "name": "sync_timestamp",
                  "value": "={{ $json.processed_at }}"
                },
                {
                  "name": "workflow_id",
                  "value": "airline-schedule-sync"
                }
              ]
            }
          },
          "typeVersion": 4.1
        },
        {
          "id": "b81033e9-6098-49d3-8bf9-921d9a934ee3",
          "name": "Log Sync Activity",
          "type": "n8n-nodes-base.postgres",
          "position": [
            660,
            0
          ],
          "parameters": {
            "query": "INSERT INTO sync_logs (workflow_name, total_changes, sync_status, sync_timestamp, details) VALUES ('airline-schedule-sync', $1, 'completed', NOW(), $2)",
            "options": {},
            "operation": "executeQuery"
          },
          "credentials": {
            "postgres": {
              "id": "credential-id",
              "name": "postgres Credential"
            }
          },
          "typeVersion": 2.4
        },
        {
          "id": "e70dfc0b-2c01-4ef0-80d1-5374d21f1670",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1060,
            -480
          ],
          "parameters": {
            "width": 760,
            "height": 400,
            "content": "## **How It Works**\n\n1. **Schedule Trigger** - Automatically runs every 30 minutes to check for flight schedule updates\n2. **Fetch Airline Data** - Retrieves current flight information from aviation APIs\n3. **Get Current Schedules** - Pulls existing schedule data from the internal database\n4. **Process Changes** - Compares API data with database records to identify schedule changes\n5. **Check for Changes** - Determines if any updates require processing and notifications\n6. **Update Database** - Saves schedule changes to the internal flight database\n7. **Notify Slack Channel** - Sends operational updates to the flight operations team\n8. **Check Urgent Notifications** - Identifies critical changes requiring immediate passenger alerts\n9. **Get Affected Passengers** - Retrieves contact information for passengers on changed flights\n10. **Send Email Notifications** - Dispatches detailed schedule change emails via SendGrid\n11. **Send SMS (Critical Only)** - Sends urgent text alerts for cancellations and major delays\n12. **Update Internal Systems** - Syncs changes with other airline systems via webhooks\n13. **Log Sync Activity** - Records all synchronization activities for audit and monitoring\n"
          },
          "typeVersion": 1
        },
        {
          "id": "2a9a267e-44f4-4a44-889f-63d544d38b8f",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -80,
            -560
          ],
          "parameters": {
            "color": 3,
            "width": 520,
            "height": 180,
            "content": "**Introduction:**\n\nThis automated n8n workflow continuously monitors airline schedule changes by fetching real-time flight data, comparing it with stored schedules, and instantly notifying both internal teams and affected passengers through multiple communication channels. The system ensures stakeholders are immediately informed of any flight delays, cancellations, gate changes, or other critical updates."
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "4c5fabca-33be-4659-9e71-582e03d38143",
      "connections": {
        "Process Changes": {
          "main": [
            [
              {
                "node": "Check for Changes",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Update Database": {
          "main": [
            [
              {
                "node": "Notify Slack Channel",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Schedule Trigger": {
          "main": [
            [
              {
                "node": "Fetch Airline Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check for Changes": {
          "main": [
            [
              {
                "node": "Update Database",
                "type": "main",
                "index": 0
              },
              {
                "node": "Check Urgent Notifications",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Get Current Schedules",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Airline Data": {
          "main": [
            [
              {
                "node": "Get Current Schedules",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Notify Slack Channel": {
          "main": [
            [
              {
                "node": "Update Internal Systems",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Get Current Schedules": {
          "main": [
            [
              {
                "node": "Process Changes",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Get Affected Passengers": {
          "main": [
            [
              {
                "node": "Send Email Notifications",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Update Internal Systems": {
          "main": [
            [
              {
                "node": "Log Sync Activity",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Send Email Notifications": {
          "main": [
            [
              {
                "node": "Send SMS (Critical Only)",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Check Urgent Notifications": {
          "main": [
            [
              {
                "node": "Get Affected Passengers",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Get Current Schedules",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 29,
    "workflowInfo": {
      "nodeCount": 15,
      "nodeTypes": {
        "n8n-nodes-base.if": {
          "count": 2
        },
        "n8n-nodes-base.code": {
          "count": 1
        },
        "n8n-nodes-base.postgres": {
          "count": 4
        },
        "n8n-nodes-base.stickyNote": {
          "count": 2
        },
        "n8n-nodes-base.httpRequest": {
          "count": 5
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Oneclick AI Squad",
      "username": "oneclick-ai",
      "bio": "The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations  from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.",
      "verified": true,
      "links": [
        "https://www.oneclickitsolution.com/"
      ],
      "avatar": "https://gravatar.com/avatar/848fca91367142f65f9e5c55d64e5c9952b160d7b060d103b52aa343c6bc7b3d?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 19,
        "icon": "file:httprequest.svg",
        "name": "n8n-nodes-base.httpRequest",
        "codex": {
          "data": {
            "alias": [
              "API",
              "Request",
              "URL",
              "Build",
              "cURL"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/",
                  "icon": "🧰",
                  "label": "How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "HTTP Request",
          "color": "#0004F5"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "HTTP Request",
        "typeVersion": 4,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 20,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.if",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "Filter",
              "Condition",
              "Logic",
              "Boolean",
              "Branch"
            ],
            "details": "The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.",
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/",
                  "icon": "🤬",
                  "label": "Create a toxic language detector for Telegram in 4 step"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "If",
          "color": "#408000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "If",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 30,
        "icon": "file:postgres.svg",
        "name": "n8n-nodes-base.postgres",
        "codex": {
          "data": {
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-i-chose-n8n-over-zapier-in-2020/",
                  "icon": "😍",
                  "label": "Why I chose n8n over Zapier in 2020"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.postgres/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/postgres/"
                }
              ]
            },
            "categories": [
              "Development",
              "Data & Storage"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Postgres"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNzkgODEiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTc3LjM5MSA0Ny45MjJjLS40NjYtMS40MTItMS42ODgtMi4zOTYtMy4yNjgtMi42MzItLjc0NS0uMTExLTEuNTk4LS4wNjQtMi42MDguMTQ0LTEuNzYuMzYzLTMuMDY1LjUwMS00LjAxOC41MjggMy41OTYtNi4wNzIgNi41MjEtMTIuOTk3IDguMjA0LTE5LjUxNSAyLjcyMi0xMC41NCAxLjI2OC0xNS4zNDEtLjQzMi0xNy41MTNDNzAuNzcgMy4xODUgNjQuMjA2LjA5NyA1Ni4yODcuMDAyYy00LjIyNC0uMDUyLTcuOTMzLjc4Mi05Ljg2NyAxLjM4MmEzNyAzNyAwIDAgMC01Ljc3LS41MjhjLTMuODA5LS4wNjEtNy4xNzQuNzctMTAuMDUgMi40NzZhNDYgNDYgMCAwIDAtNy4wOTgtMS43ODJDMTYuNTYxLjQxMSAxMC45NjggMS4yOTkgNi44NzYgNC4xOSAxLjkyMiA3LjY4OS0uMzc1IDEzLjc3LjA1IDIyLjI2MmMuMTM1IDIuNjk2IDEuNjQzIDEwLjkgNC4wMTggMTguNjggMS4zNjUgNC40NzIgMi44MiA4LjE4NSA0LjMyNiAxMS4wMzggMi4xMzUgNC4wNDYgNC40MTkgNi40MjggNi45ODQgNy4yODQgMS40MzguNDc5IDQuMDQ5LjgxNCA2Ljc5Ny0xLjQ3M2E2IDYgMCAwIDAgMS40MjkgMS4yM2MuNzgzLjQ5NCAxLjc0Ljg5NyAyLjY5NiAxLjEzNiAzLjQ0Ni44NjIgNi42NzQuNjQ2IDkuNDI3LS41NjFsLjA0MSAxLjM2Mi4wNiAxLjg5OWMuMTYzIDQuMDY0LjQ0IDcuMjIzIDEuMjU5IDkuNDM0LjA0NS4xMjIuMTA1LjMwNy4xNjkuNTAzLjQwOSAxLjI1MSAxLjA5MiAzLjM0NiAyLjgzIDQuOTg3IDEuOCAxLjY5OSAzLjk3OCAyLjIyIDUuOTcyIDIuMjIgMSAwIDEuOTU1LS4xMzEgMi43OTItLjMxMSAyLjk4NC0uNjM5IDYuMzczLTEuNjE0IDguODI0LTUuMTA0IDIuMzE4LTMuMyAzLjQ0NC04LjI3IDMuNjQ4LTE2LjEwMWwuMDc0LS42MzQuMDQ4LS40MTQuNTQ2LjA0OC4xNDEuMDFjMy4wMzkuMTM4IDYuNzU1LS41MDYgOS4wMzctMS41NjYgMS44MDMtLjgzNyA3LjU4Mi0zLjg4OCA2LjIyMS04LjAwNyIvPjxwYXRoIGZpbGw9IiMzMzY3OTEiIGQ9Ik03Mi4xOTUgNDguNzIzYy05LjAzNiAxLjg2NC05LjY1Ny0xLjE5NS05LjY1Ny0xLjE5NSA5LjU0MS0xNC4xNTcgMTMuNTI5LTMyLjEyNyAxMC4wODctMzYuNTI1QzYzLjIzNS0uOTk0IDQ2Ljk4MSA0LjY4IDQ2LjcxIDQuODI3bC0uMDg3LjAxNmMtMS43ODUtLjM3MS0zLjc4My0uNTkxLTYuMDI5LS42MjgtNC4wODktLjA2Ny03LjE5IDEuMDcyLTkuNTQ0IDIuODU3IDAgMC0yOC45OTUtMTEuOTQ1LTI3LjY0NyAxNS4wMjMuMjg3IDUuNzM3IDguMjIzIDQzLjQxIDE3LjY4OSAzMi4wMzEgMy40Ni00LjE2MSA2LjgwMy03LjY3OSA2LjgwMy03LjY3OSAxLjY2IDEuMTAzIDMuNjQ4IDEuNjY2IDUuNzMyIDEuNDYzbC4xNjItLjEzN2E2LjMgNi4zIDAgMCAwIC4wNjUgMS42MmMtMi40MzkgMi43MjUtMS43MjIgMy4yMDMtNi41OTcgNC4yMDYtNC45MzMgMS4wMTctMi4wMzUgMi44MjYtLjE0MyAzLjI5OSAyLjI5NC41NzQgNy42IDEuMzg2IDExLjE4NS0zLjYzM2wtLjE0My41NzNjLjk1Ni43NjUgMS42MjYgNC45NzggMS41MTQgOC43OTdzLS4xODggNi40NDEuNTY1IDguNDg5IDEuNTAzIDYuNjU2IDcuOTEyIDUuMjgyYzUuMzU1LTEuMTQ4IDguMTMtNC4xMjEgOC41MTYtOS4wODEuMjc0LTMuNTI2Ljg5NC0zLjAwNS45MzMtNi4xNThsLjQ5Ny0xLjQ5M2MuNTczLTQuNzguMDkxLTYuMzIyIDMuMzktNS42MDVsLjgwMi4wN2MyLjQyOC4xMSA1LjYwNi0uMzkxIDcuNDcxLTEuMjU3IDQuMDE2LTEuODY0IDYuMzk4LTQuOTc2IDIuNDM4LTQuMTU4Ii8+PHBhdGggZD0iTTMyLjc0NyAyNC42NmMtLjgxNC0uMTEzLTEuNTUyLS4wMDgtMS45MjUuMjc0YS43LjcgMCAwIDAtLjI5Mi40N2MtLjA0Ny4zMzYuMTg4LjcwNy4zMzMuODk4LjQwOS41NDIgMS4wMDYuOTE1IDEuNTk4Ljk5N2EyIDIgMCAwIDAgLjI1Ni4wMThjLjk4NiAwIDEuODgzLS43NjggMS45NjItMS4zMzUuMDk5LS43MS0uOTMyLTEuMTgzLTEuOTMxLTEuMzIybTI2Ljk3NS4wMjJjLS4wNzgtLjU1Ni0xLjA2OC0uNzE1LTIuMDA3LS41ODRzLTEuODQ4LjU1NC0xLjc3MiAxLjExMmMuMDYxLjQzNC44NDQgMS4xNzQgMS43NzEgMS4xNzRxLjExNyAwIC4yMzctLjAxNmMuNjE5LS4wODYgMS4wNzMtLjQ3OSAxLjI4OC0uNzA1LjMyOS0uMzQ1LjUxOC0uNzMuNDg0LS45OG0xNS40NzcgMjMuODI4Yy0uMzQ1LTEuMDQyLTEuNDUzLTEuMzc3LTMuMjk2LS45OTctNS40NzEgMS4xMjktNy40My4zNDctOC4wNzMtLjEyNyA0LjI1Mi02LjQ3OCA3Ljc1LTE0LjMwOCA5LjYzNy0yMS42MTQuODk0LTMuNDYxIDEuMzg4LTYuNjc1IDEuNDI4LTkuMjk0LjA0NS0yLjg3Ni0uNDQ1LTQuOTg4LTEuNDU1LTYuMjc5LTQuMDcyLTUuMjAzLTEwLjA0OC03Ljk5NC0xNy4yODMtOC4wNy00Ljk3My0uMDU2LTkuMTc1IDEuMjE3LTkuOTkgMS41NzVhMjUgMjUgMCAwIDAtNS42MjItLjcyMmMtMy43MzQtLjA2LTYuOTYxLjgzNC05LjYzMyAyLjY1NWE0MyA0MyAwIDAgMC03LjgyOC0yLjA1MmMtNi4zNDItMS4wMjEtMTEuMzgxLS4yNDgtMTQuOTc4IDIuMy00LjI5MSAzLjA0LTYuMjcyIDguNDc1LTUuODg4IDE2LjE1Mi4xMjkgMi41ODMgMS42MDEgMTAuNTI5IDMuOTIzIDE4LjEzOSAzLjA1NyAxMC4wMTYgNi4zOCAxNS42ODYgOS44NzcgMTYuODUyYTQuNCA0LjQgMCAwIDAgMS40MDIuMjMyYzEuMjc2IDAgMi44MzktLjU3NSA0LjQ2Ni0yLjUzMWExNjEgMTYxIDAgMCAxIDYuMTU2LTYuOTY2IDkuOSA5LjkgMCAwIDAgNC40MjkgMS4xOTFsLjAxLjEyMWMtLjMxLjM2OC0uNTY0LjY5LS43ODEuOTY1LTEuMDcgMS4zNTgtMS4yOTMgMS42NDEtNC43MzggMi4zNTEtLjk4LjIwMi0zLjU4Mi43MzgtMy42MiAyLjU2My0uMDQxIDEuOTkzIDMuMDc2IDIuODMgMy40MzEgMi45MTkgMS4yMzguMzEgMi40My40NjMgMy41NjguNDYzIDIuNzY2IDAgNS4yLS45MDkgNy4xNDUtMi42NjgtLjA2IDcuMTA2LjIzNiAxNC4xMDcgMS4wODkgMTYuMjQxLjY5OSAxLjc0NiAyLjQwNiA2LjAxNCA3Ljc5OCA2LjAxNC43OTEgMCAxLjY2Mi0uMDkyIDIuNjItLjI5NyA1LjYyNy0xLjIwNyA4LjA3MS0zLjY5NCA5LjAxNi05LjE3Ny41MDYtMi45MyAxLjM3NC05LjkyOCAxLjc4Mi0xMy42ODIuODYyLjI2OSAxLjk3MS4zOTIgMy4xNy4zOTIgMi41MDEgMCA1LjM4Ny0uNTMxIDcuMTk3LTEuMzcyIDIuMDMzLS45NDQgNS43MDItMy4yNjEgNS4wMzctNS4yNzR6TTYxLjggMjMuMTQ3Yy0uMDE5IDEuMTA4LS4xNzEgMi4xMTQtLjMzMyAzLjE2NC0uMTc0IDEuMTI5LS4zNTQgMi4yOTctLjM5OSAzLjcxNS0uMDQ1IDEuMzc5LjEyOCAyLjgxNC4yOTQgNC4yLjMzNyAyLjgwMS42ODIgNS42ODUtLjY1NSA4LjUzMWExMSAxMSAwIDAgMS0uNTkyLTEuMjE4Yy0uMTY2LS40MDMtLjUyNy0xLjA1LTEuMDI3LTEuOTQ2LTEuOTQ0LTMuNDg3LTYuNDk3LTExLjY1Mi00LjE2Ny0xNC45ODQuNjk0LS45OTIgMi40NTYtMi4wMTEgNi44NzktMS40NjN6TTU2LjQzOSA0LjM3NGM2LjQ4Mi4xNDMgMTEuNjA5IDIuNTY4IDE1LjI0IDcuMjA3IDIuNzg0IDMuNTU4LS4yODIgMTkuNzQ5LTkuMTU4IDMzLjcxNmwtLjI2OS0uMzM5LS4xMTItLjE0YzIuMjk0LTMuNzg4IDEuODQ1LTcuNTM2IDEuNDQ2LTEwLjg1OS0uMTY0LTEuMzY0LS4zMTktMi42NTItLjI4LTMuODYxLjA0MS0xLjI4My4yMS0yLjM4Mi4zNzQtMy40NDYuMjAyLTEuMzExLjQwNy0yLjY2Ny4zNS00LjI2NWExLjggMS44IDAgMCAwIC4wMzctLjYwMWMtLjE0NC0xLjUzMy0xLjg5NC02LjEyLTUuNDYyLTEwLjI3My0xLjk1MS0yLjI3MS00Ljc5Ny00LjgxMy04LjY4Mi02LjUyN2EyOS4zIDI5LjMgMCAwIDEgNi41MTUtLjYxMnpNMjAuMTY3IDUzLjI5OGMtMS43OTMgMi4xNTUtMy4wMzEgMS43NDItMy40MzggMS42MDctMi42NTMtLjg4NS01LjczLTYuNDkxLTguNDQ0LTE1LjM4Mi0yLjM0OC03LjY5My0zLjcyLTE1LjQyOC0zLjgyOS0xNy41OTctLjM0My02Ljg2IDEuMzItMTEuNjQxIDQuOTQzLTE0LjIxIDUuODk2LTQuMTgxIDE1LjU4OS0xLjY3OSAxOS40ODQtLjQwOWwtLjE3LjE2M2MtNi4zOTEgNi40NTUtNi4yNCAxNy40ODMtNi4yMjQgMTguMTU3YTIyIDIyIDAgMCAwIC4wNTEgMS4xMzVjLjExIDEuODU1LjMxNSA1LjMwNy0uMjMyIDkuMjE3LS41MDggMy42MzMuNjEyIDcuMTg5IDMuMDcyIDkuNzU2cS4zODMuMzk4Ljc5NS43NWExNjQgMTY0IDAgMCAwLTYuMDA4IDYuODE0em02LjgzLTkuMTEzYy0xLjk4My0yLjA2OS0yLjg4NC00Ljk0Ny0yLjQ3MS03Ljg5Ni41NzctNC4xMy4zNjQtNy43MjcuMjUtOS42NTlsLS4wMzktLjY5NGMuOTM0LS44MjggNS4yNjEtMy4xNDYgOC4zNDYtMi40MzkgMS40MDguMzIzIDIuMjY2IDEuMjgxIDIuNjIzIDIuOTMxIDEuODQ2IDguNTM5LjI0NCAxMi4wOTgtMS4wNDMgMTQuOTU3LS4yNjUuNTg5LS41MTYgMS4xNDYtLjczIDEuNzIybC0uMTY2LjQ0NWMtLjQyIDEuMTI2LS44MTEgMi4xNzMtMS4wNTMgMy4xNjctMi4xMDgtLjAwNi00LjE1OS0uOTA3LTUuNzE4LTIuNTM0em0uMzI0IDExLjUxNmE1IDUgMCAwIDEtMS40OTQtLjY0MmMuMjcxLS4xMjguNzU0LS4zMDEgMS41OTEtLjQ3NCA0LjA1Mi0uODM0IDQuNjc4LTEuNDIzIDYuMDQ1LTMuMTU4LjMxMy0uMzk4LjY2OS0uODQ5IDEuMTYtMS4zOTguNzMzLS44MjEgMS4wNjgtLjY4MiAxLjY3Ni0uNDMuNDkzLjIwNC45NzIuODIxIDEuMTY3IDEuNTAxLjA5Mi4zMjEuMTk1LjkzLS4xNDMgMS40MDQtMi44NTUgMy45OTctNy4wMTUgMy45NDYtMTAuMDAzIDMuMTk4em0yMS4yMDcgMTkuNzM1Yy00Ljk1NyAxLjA2Mi02LjcxMy0xLjQ2Ny03Ljg2OS00LjM1OS0uNzQ3LTEuODY3LTEuMTEzLTEwLjI4NS0uODUzLTE5LjU4MmExLjEgMS4xIDAgMCAwLS4wNDgtLjM1NiA1IDUgMCAwIDAtLjEzOS0uNjU3Yy0uMzg3LTEuMzUzLTEuMzMxLTIuNDg0LTIuNDYyLTIuOTUzLS40NS0uMTg2LTEuMjc1LS41MjgtMi4yNjctLjI3NC4yMTItLjg3MS41NzgtMS44NTUuOTc2LTIuOTIxbC4xNjctLjQ0OGMuMTg4LS41MDUuNDIzLTEuMDI5LjY3My0xLjU4MyAxLjM0Ny0yLjk5MiAzLjE5Mi03LjA5MSAxLjE5LTE2LjM1LS43NS0zLjQ2OC0zLjI1NC01LjE2MS03LjA1LTQuNzY4LTIuMjc2LjIzNS00LjM1OCAxLjE1NC01LjM5NiAxLjY4cS0uMzM0LjE2OS0uNjE4LjMyOWMuMjktMy40OTQgMS4zODUtMTAuMDI0IDUuNDgxLTE0LjE1NiAyLjU3OS0yLjYwMSA2LjAxNC0zLjg4NiAxMC4xOTktMy44MTcgOC4yNDYuMTM1IDEzLjUzNCA0LjM2NyAxNi41MTggNy44OTMgMi41NzEgMy4wMzkgMy45NjQgNi4xIDQuNTIgNy43NTEtNC4xNzktLjQyNS03LjAyMi40LTguNDYzIDIuNDYtMy4xMzUgNC40ODEgMS43MTUgMTMuMTc4IDQuMDQ2IDE3LjM1OC40MjcuNzY2Ljc5NiAxLjQyOC45MTIgMS43MDkuNzU5IDEuODM5IDEuNzQyIDMuMDY3IDIuNDU5IDMuOTY0LjIyLjI3NS40MzMuNTQxLjU5Ni43NzQtMS4yNjYuMzY1LTMuNTM5IDEuMjA4LTMuMzMyIDUuNDIyLS4xNjcgMi4xMTUtMS4zNTYgMTIuMDE2LTEuOTU5IDE1LjUxNC0uNzk3IDQuNjIxLTIuNDk3IDYuMzQzLTcuMjc5IDcuMzY4em0yMC42OTMtMjMuNjhjLTEuMjk0LjYwMS0zLjQ2IDEuMDUyLTUuNTE4IDEuMTQ4LTIuMjczLjEwNy0zLjQzLS4yNTUtMy43MDItLjQ3Ny0uMTI4LTIuNjI2Ljg1LTIuOTAxIDEuODg0LTMuMTkxLjE2My0uMDQ2LjMyMS0uMDkuNDc0LS4xNDRhNCA0IDAgMCAwIC4zMTMuMjNjMS44MjcgMS4yMDYgNS4wODUgMS4zMzYgOS42ODUuMzg2bC4wNS0uMDFjLS42Mi41OC0xLjY4MiAxLjM1OS0zLjE4NyAyLjA1OHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Postgres",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 5,
            "name": "Development"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 45,
        "name": "Miscellaneous"
      }
    ],
    "image": []
  }
}