AutomationFlowsEmail & Gmail › Schedule and Track Interviews Using Calendly, Zoom, Asana, and Gmail

Schedule and Track Interviews Using Calendly, Zoom, Asana, and Gmail

ByRahul Joshi @rahul08 on n8n.io

This workflow automates interview scheduling by orchestrating Calendly, Zoom, Asana, and Gmail into a single, reliable hiring pipeline. When a candidate books an interview, the automation ensures the interview is properly scheduled, tracked, assigned, and communicated — without…

Event trigger★★★★☆ complexity17 nodesAsanaError TriggerGmailCalendly TriggerZoom
Email & Gmail Trigger: Event Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #12271 — we link there as the canonical source.

This workflow follows the Error Trigger → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "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
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates interview scheduling by orchestrating Calendly, Zoom, Asana, and Gmail into a single, reliable hiring pipeline. When a candidate books an interview, the automation ensures the interview is properly scheduled, tracked, assigned, and communicated — without…

Source: https://n8n.io/workflows/12271/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

Sync your Google Calendar events with Google Sheets and get daily Slack summaries with meeting statistics. FEATURES:

Google Calendar Trigger, Google Sheets, Slack +3
Email & Gmail

This workflow is an end-to-end AI video generation, review, and delivery pipeline. It takes a plain-text creative prompt via webhook, generates a video using an AI model, continuously checks job statu

Slack, Error Trigger, HTTP Request +2
Email & Gmail

Streamline Your Zoom Meetings With Secure Automated Stripe Payments. Uses zoom, httpRequest, gmail, googleSheets. Event-driven trigger; 20 nodes.

Zoom, HTTP Request, Gmail +3
Email & Gmail

Streamline Your Zoom Meetings with Secure, Automated Stripe Payments. Uses zoom, httpRequest, gmail, googleSheets. Event-driven trigger; 20 nodes.

Zoom, HTTP Request, Gmail +3
Email & Gmail

🎉 Do you want to master AI automation, so you can save time and build cool stuff?

Zoom, HTTP Request, Gmail +3