{
  "id": "bykTzOP0Dm5EaNzW",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Schedule interviews using Calendly, Zoom, and Asana",
  "tags": [],
  "nodes": [
    {
      "id": "65947232-8a6c-4730-a1c9-63a3e0ebd4b3",
      "name": "Create HR Interview Task",
      "type": "n8n-nodes-base.asana",
      "position": [
        1440,
        1088
      ],
      "parameters": {
        "name": "=HR Interview \u2013  {{ $('Route by interview type').item.json.candidate_name }}",
        "workspace": "1205967598025927",
        "authentication": "oAuth2",
        "otherProperties": {
          "notes": "=Zoom link: {{ $json.join_url }}",
          "due_on": "={{ $json.start_time }}",
          "assignee": "1212557659831213",
          "projects": [
            "1212555032005130"
          ]
        }
      },
      "credentials": {
        "asanaOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b653bb88-198a-4123-b938-8ffe70f10640",
      "name": "Create Technical Interview Task",
      "type": "n8n-nodes-base.asana",
      "position": [
        1440,
        1328
      ],
      "parameters": {
        "name": "=Technical Interview \u2013 {{ $('Route by interview type').item.json.candidate_name }}",
        "workspace": "1205967598025927",
        "authentication": "oAuth2",
        "otherProperties": {
          "notes": "=Zoom link: {{ $json.join_url }}",
          "due_on": "={{ $json.start_time }}",
          "assignee": "1212557659831213",
          "projects": [
            "1212555032005130"
          ]
        }
      },
      "credentials": {
        "asanaOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7a1cd51b-024e-4aec-b83c-86afc995e60a",
      "name": "Workflow overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        400
      ],
      "parameters": {
        "width": 492,
        "height": 596,
        "content": "## Workflow Overview\n\n### How it works\n\nThis workflow coordinates the scheduling of interviews using Asana, Zoom, and Calendly. The workflow records the event when a candidate schedules an interview, normalizes the interview data, and uses the event details to determine the type of interview.\n\nThe workflow uses conditional routing to assign the interview to the right interviewer, set up a Zoom meeting, and produce an Asana task with all necessary context. The appropriate stakeholders are then notified at the appropriate moment using role-based notifications.\n\nThe automation is intended to minimize human coordination, avoid scheduling mistakes, and offer a dependable, production-ready interview flow appropriate for expanding teams.\n\n### Setup steps\n\n1. Connect Calendly, Zoom, Asana, and Gmail credentials.\n2. Set up keywords for the interview type (e.g., HR or Technical).\n3. Update interviewer email addresses and Asana project IDs.\n4. If necessary, modify the task name or notification message.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d36f5d54-6c14-49d6-a8f5-93366b2b9d7e",
      "name": "Error Handler Trigger",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        -64,
        1728
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "1f33b36d-408a-4b48-a924-b36a43f0c780",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        1552
      ],
      "parameters": {
        "color": 3,
        "width": 672,
        "height": 336,
        "content": "## \ud83d\udea8 Error Handling \n\n \nCatches any workflow failure and posts an alert to Gmail.  \nIncludes node name, error message, and timestamp for quick debugging.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "12d06c49-c65a-4b87-9bef-b3103d82943e",
      "name": "Error Email Notification",
      "type": "n8n-nodes-base.gmail",
      "position": [
        240,
        1728
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=\u274c *Error in API Error Catalog Workflow* *Node:* {{ $json.node.name }} *Message:* {{ $json.error.message }} *Time:* {{ $json.timestamp }}",
        "options": {},
        "subject": "=The Orchestrate interview scheduling with Calendly, Zoom, and Asana workflow encountered an error.",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "49f78969-a94c-4bc3-8ad9-6ddda927ba3f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        1024
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 352,
        "content": "### Trigger and data preparation\n\nReceives interview booking events from Calendly and prepares the interview details for further steps.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6a89e2d0-14aa-46ae-8022-a3e5edb086ed",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        1024
      ],
      "parameters": {
        "color": 7,
        "height": 368,
        "content": "### Interview Type Routing\n\nChecks the interview type (HR or Technical) and routes the workflow to the correct path."
      },
      "typeVersion": 1
    },
    {
      "id": "84101d16-d2d8-4afd-a771-6b42d31b8114",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 624,
        "content": "### Meeting and Task Creation\n\nCreates a Zoom meeting for the interview and an Asana task with the meeting link and interview details."
      },
      "typeVersion": 1
    },
    {
      "id": "3bbbb552-b219-4689-9b30-66a30b97c556",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1632,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 608,
        "content": "### Notifications\n\nSends interview notifications to the right people.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "eb96c237-b124-4641-b459-12ec7b424167",
      "name": "Receive interview booking",
      "type": "n8n-nodes-base.calendlyTrigger",
      "position": [
        368,
        1216
      ],
      "parameters": {
        "scope": "organization",
        "events": [
          "invitee.created"
        ],
        "authentication": "oAuth2"
      },
      "credentials": {
        "calendlyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "73f72639-c995-47e6-bfcf-f3ef3f330ece",
      "name": "Prepare interview data",
      "type": "n8n-nodes-base.code",
      "position": [
        624,
        1216
      ],
      "parameters": {
        "jsCode": "const event = $json.payload;\n\nreturn [{ json: {\n  event_id: event.uuid,\n  interview_type: event.scheduled_event.name,\n  candidate_name: event.name,\n  start_time: event.scheduled_event.start_time,\n  end_time: event.scheduled_event.end_time,\n  timezone: event.timezone\n}}];"
      },
      "typeVersion": 2
    },
    {
      "id": "d5a599f3-cd22-4479-9ef3-473f94bdbd84",
      "name": "Route by interview type",
      "type": "n8n-nodes-base.if",
      "position": [
        896,
        1216
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "84ef7ecb-dc0a-434e-a291-e85e945db34d",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.interview_type }}",
              "rightValue": "HR"
            },
            {
              "id": "49915033-73c8-4208-8a69-e9033e8564b8",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.interview_type }}",
              "rightValue": "People"
            },
            {
              "id": "dc38397d-ce22-4773-a186-49036bed4ce3",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.interview_type }}",
              "rightValue": "Recruiter"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "934375e9-73c1-47ed-b90d-43cb0b0c8b01",
      "name": "Create Zoom meeting",
      "type": "n8n-nodes-base.zoom",
      "position": [
        1168,
        1088
      ],
      "parameters": {
        "topic": "={{ $json.interview_type }} \u2013 {{ $json.candidate_name }}",
        "authentication": "oAuth2",
        "additionalFields": {
          "type": 2,
          "agenda": "=Interview with {{ $json.candidate_name }}",
          "duration": 60,
          "timeZone": "={{ $json.timezone }}",
          "startTime": "={{ $json.start_time }}"
        }
      },
      "credentials": {
        "zoomOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4775e579-1afe-4879-a909-7d5c05160de7",
      "name": "Create Zoom meeting1",
      "type": "n8n-nodes-base.zoom",
      "position": [
        1168,
        1328
      ],
      "parameters": {
        "topic": "={{ $json.interview_type }} \u2013 {{ $json.candidate_name }}",
        "authentication": "oAuth2",
        "additionalFields": {
          "type": 2,
          "agenda": "=Interview with {{ $json.candidate_name }}",
          "duration": 60,
          "timeZone": "={{ $json.timezone }}",
          "startTime": "={{ $json.start_time }}"
        }
      },
      "credentials": {
        "zoomOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d2e75e42-5751-4e00-80c3-4403b87d8592",
      "name": "Notify HR team",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1728,
        1088
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=An HR interview has been scheduled.\n\nCandidate: {{ $('Route by interview type').item.json.candidate_name }}\nTime: {{ $('Create Zoom meeting').item.json.start_time }}\nZoom: {{ $('Create Zoom meeting').item.json.join_url }}",
        "options": {},
        "subject": "=HR Interview Scheduled \u2013  {{ $('Route by interview type').item.json.candidate_name }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a3d8f429-77c2-4983-b30a-25b8c71551f4",
      "name": "Notify interviewer",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1728,
        1328
      ],
      "parameters": {
        "sendTo": "=youremail@email.com",
        "message": "=A technical interview has been scheduled.\n\nCandidate: {{ $('Route by interview type').item.json.candidate_name }}\nTime: {{ $('Create Zoom meeting1').item.json.start_time }}\nZoom: {{ $('Create Zoom meeting1').item.json.join_url }}",
        "options": {},
        "subject": "=Technical Interview Scheduled \u2013 {{ $('Route by interview type').item.json.candidate_name }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e42075b5-1ff4-44f4-8cde-3c5c283c7216",
  "connections": {
    "Create Zoom meeting": {
      "main": [
        [
          {
            "node": "Create HR Interview Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Zoom meeting1": {
      "main": [
        [
          {
            "node": "Create Technical Interview Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error Handler Trigger": {
      "main": [
        [
          {
            "node": "Error Email Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare interview data": {
      "main": [
        [
          {
            "node": "Route by interview type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by interview type": {
      "main": [
        [
          {
            "node": "Create Zoom meeting",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create Zoom meeting1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create HR Interview Task": {
      "main": [
        [
          {
            "node": "Notify HR team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive interview booking": {
      "main": [
        [
          {
            "node": "Prepare interview data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Technical Interview Task": {
      "main": [
        [
          {
            "node": "Notify interviewer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}