Automate Customer Support Triage
Build an n8n workflow that routes support requests and sends acknowledgements.
Introduction
30 Second Summary
Support requests can arrive with missing details or no clear owner. An urgent outage can sit beside a routine question unless every request follows the same intake process.
In this project, you will build a customer support triage workflow in n8n. It classifies each request as P1 or P2, assigns a support team, and sends a Gmail acknowledgement.
What You'll Build
Submit a request through your support form to watch it receive a priority, an assigned team, and an acknowledgement email.
By the end of this project, you'll have:
- Collect each request through a support form with the details needed for triage.
- Route urgent or high-impact requests to P1 while standard requests follow the P2 path.
- Send a requester acknowledgement that includes the ticket ID, assigned team, and response target.
- Secret Mission: Build a separate error-handler workflow that emails you after a production failure.
Want a complete demo of how to do this project, from start to finish? Check out our walkthrough with Nikko.
Are there any prerequisites?
Choose either an existing n8n Cloud workspace or the free local n8n Community Edition path in Step 1. You also need a Gmail account with 2-Step Verification and App Passwords available.
Before We Start
Before you build, lock in how the workflow turns one support request into a routed ticket and an acknowledgement.
Prepare the Workflow Canvas
A support workflow needs a saved home before you add its moving parts. This step keeps that setup short so you can reach a working form quickly.
You will open an n8n Cloud workspace or install the free Community Edition locally with Docker. The blank canvas becomes the base for every node you add next.
In this step, get ready to:
- Open your n8n workspace.
- Create and save the project workflow.
Open your n8n workspace
n8n Cloud
Do you already have an n8n Cloud workspace? Choose the option that matches your setup.
Why does this choice matter?
Your workflows and credentials stay inside the workspace where you create them. Choosing the right workspace now keeps this project with the account you plan to use.
Use an existing workspace if you can access it. Create a new workspace only if you do not already have one.
✔️ I already have a workspace
- Open the official n8n Cloud sign-in page.
- Sign in with the account linked to your workspace.
You should see your workflow list and the control for creating a workflow.
ⓧ I need to create a workspace
The 14-day n8n Cloud trial does not require a credit card, so you can create a workspace without starting a paid subscription.
If you do not upgrade, the trial expires automatically without charges. n8n then deletes the workspace.
- Open the official n8n Cloud registration page.
- Enter the account details requested on the signup screen.
- Create a password with at least eight characters, one number, and one capital letter.
- Select Next to create your owner account.
n8n logs you in with your new owner account. You should see the workflow list and the control for creating a workflow.
Local n8n with Docker
A local n8n Community Edition instance runs on your computer without an n8n Cloud subscription. Docker keeps the installation isolated and stores your workflow in a persistent volume.
macOS
- Open Docker's official macOS installation guide.
- Download Docker Desktop for your Mac's Apple silicon or Intel chip.
- Double-click Docker.dmg in your Downloads folder.
- Drag the Docker icon into the Applications folder.
- Double-click Docker.app in the Applications folder.
- Select Accept after reviewing the Docker Subscription Service Agreement.
- Choose Use recommended settings.
- Select Finish.
Windows
- Open Docker's official Windows installation guide.
- Download Docker Desktop for Windows.
- Double-click Docker Desktop Installer.exe in your Downloads folder.
- Choose the recommended per-user installation mode.
- Keep the default WSL 2 backend selected.
- Complete the installation wizard.
- Select Close when the installation succeeds.
- Press the Windows key to open the Windows search bar.
- Type Docker Desktop and press Enter to open it.
- Select Accept after reviewing the Docker Subscription Service Agreement.
Linux
Docker marks its Docker Desktop package for Arch-based distributions as experimental and unverified. This path uses Docker Engine from the Arch Linux repositories.
- Open the official ArchWiki Docker guide.
- Install Docker Engine by running this command:
sudo pacman -S docker
- Enable Docker at boot and start it now by running this command:
sudo systemctl enable --now docker.service
Docker group permissions
The docker group grants root-equivalent access. Use this step only on a computer you control.
- Add your account to the docker group by running this command:
sudo usermod -aG docker $USER
- Sign out of Linux so the new group membership can load.
- Sign back in to Linux.
- Open your desktop environment's application launcher.
- Search for Terminal and open it.
- Confirm that Docker responds without elevated permissions by running this command:
docker info
You should see details about the Docker server without a permission error.
Seeing a permission error?
Sign out of Arch Linux and sign back in so your new group membership loads. Confirm that docker.service is running before you try again. Help me connect to Docker on Arch Linux.
- Check that Docker is installed by running this command:
docker --version
✔️ I see a Docker version
Docker is installed and ready. Keep Docker Desktop open on macOS or Windows, or leave docker.service running on Linux while you use local n8n.
ⓧ Command not found
Docker command not found?
- Finish the Docker Desktop installation on macOS or Windows.
- Close and reopen Terminal or PowerShell.
- Repeat the package and service commands in the Linux tab if you are using Arch Linux.
- Help me get Docker running.
- Create persistent storage for your workflows and credentials by running:
docker volume create n8n_data
Download and start the local n8n container by running:
docker run -it --rm --name n8n -p 5678:5678 -e GENERIC_TIMEZONE="Etc/UTC" -e TZ="Etc/UTC" -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true -v n8n_data:/home/node/.n8n n8nio/n8n
- Open http://localhost:5678 in your browser.
- Create the local owner account if n8n shows the first-run account form.
- Store the owner password in your password manager.
- Confirm that you can see the workflow list and the control for creating a workflow.
Your local form is available only on this computer while the n8n container is running. This path supports every project test without creating a public internet address.
Local n8n not loading?
- Confirm that Docker Desktop is running on macOS or Windows.
- Confirm that docker.service is running on Linux.
- Keep the terminal showing the n8n logs open.
- Help me open my local n8n instance.
You should see your workflow list and the control for creating a workflow.
Create the workflow shell
- Select the new-workflow control above the workflow list.
- Select the workflow title at the top of the blank canvas.
- Enter Customer Support Triage and Acknowledgement as the workflow name.
- Click Save in the upper-right corner.
You should see the workflow name at the top of a saved, empty canvas.
Can't find the blank canvas?
Confirm that you are editing a workflow rather than viewing the workflow list. Help me find and save the workflow.
Your workflow now has a saved identity. Next, you will turn the blank canvas into a working support form.
Build and Test the Support Intake Form
Your saved n8n canvas is ready. Now you will add the Form Trigger that turns it into a usable intake page.
Support teams need consistent details before they can route a request. Five required fields capture the requester, the issue, and the two signals that determine priority.
In this step, get ready to:
- Add and configure the support form.
- Collect five required request details.
- Run the first test submission.
Add the Form Trigger
- Use the add control on the blank canvas to open the node picker.
- Search for Form Trigger.
- Select Form Trigger from the results.
- Select On new n8n Form event
- Rename the node to Support Request Intake.
- Set Authentication to None.
- Set Form Title to Customer Support Request.
- Set Form Description to Please use this form to submit your support request, and our team will review it shortly.
- Set Respond When to Workflow Finishes.
You should see the named trigger on the canvas and its Test URL in the panel. On local n8n, this address works on the same computer while the Docker container is running.
- Select Add Form Element
Why use a Form Trigger?
Form Trigger creates and hosts the intake page inside n8n. A separate webhook would require another form, so the native trigger keeps this build inside one tool.
Add the five request fields
For each field, click Add Attributes to reveal Field Name and Required Field.
First Field
- Enter Customer name in Field Label.
- Enter Customer name in Field Name.
- Select Text as the Element Type.
- Enable Required Field.
Second Field
- Enter Requester email in Field Label.
- Enter Requester_email in Field Name.
- Select Email as the Element Type.
- Enable Required Field.
Third Field
- Enter Issue summary in Field Label.
- Enter Issue_summary in Field Name.
- Select Textarea as the Element Type.
- Enable Required Field.
Fourth Field
- Enter Impact in Field Label.
- Enter Impact in Field Name.
- Select Dropdown as the Element Type.
- Enter One user as the first dropdown option.
- Enter Multiple users as the second dropdown option.
- Enter Service Unavailable as the third dropdown option.
- Enable Required Field.
Fifth Field
- Enter Urgency in Field Label.
- Enter Urgency in Field Name.
- Select Dropdown as the Element Type.
- Enter Low as the first dropdown option.
- Enter Medium as the second dropdown option.
- Enter High as the third dropdown option.
- Enable Required Field.
Your form should now show five required fields. Those fixed dropdown values make the next routing rule predictable.
Test one submission
Select Execute Workflow in the editor.
- Enter Nyx Cajayon in Customer name.
- Enter your Gmail address in Requester email.
- Enter Billing portal access in Issue summary.
- Select One user for Impact.
- Select Low for Urgency.
Before you submit, do you expect the output to include a priority yet?
- Submit the completed form.
- Return to the n8n editor.
- Inspect the output from Support Request Intake.
You should see all five submitted values without a priority or assigned team. That gap is the routing work you tackle next.
Form test not working?
- Confirm that you selected Execute Workflow before opening the test form.
- Check that every field has Required Field enabled.
Help me check my Form Trigger configuration.
Your form now produces consistent support data. Next, you will turn those five values into a P1 or P2 ticket.
Add Ticket Rules and Priority Routing
Your n8n form now captures the same five values on every submission. The workflow can finally make decisions from consistent data.
This step uses data mapping to create a ticket ID. It then uses conditional branching to send urgent work to P1 and everything else to P2.
In this step, get ready to:
- Add a ticket ID and status.
- Route urgent requests to P1.
- Assign a team and response deadline to each branch.
Create the ticket record
- click the + next to Support request intake.
- Add an Edit Fields (Set) node
- Rename the node to Create Ticket.
- Set Mode to Manual Mapping.
- Set Include in Output to keep every input field.
- Click Add Field
- Select String as the field type.
- Enter ticket_id in Name.
- Switch Value from Fixed to Expression.
- Enter {{ $execution.id }} in Value.
- Click Add Field.
- Select String as the field type.
- Enter status in Name.
- Enter New as the fixed Value.
- Select Execute Step.
You should see the five form values beside a unique ticket_id and a New status.
Build the P1 and P2 branches
- Click the + control on the right side of Create Ticket.
- Search for If in the node picker.
- Select If from the results.
- Rename the node to Urgent?.
- Click Add condition under Conditions.
- Switch the first left value from Fixed to Expression.
- Drag Impact from INPUT into the first left value.
- Select is equal to as the first comparison operator.
Match the property names exactly
n8n treats JSON property names as case-sensitive. Dragging Impact from INPUT creates {{ $json["Impact"] }}.
Dragging Urgency creates {{ $json["Urgency"] }}. Lowercase property names stay red because they do not match this input.
- Keep the first right value set to Fixed.
- Enter Service Unavailable in the first right value.
Click Add condition again.
- Switch the second left value from Fixed to Expression.
- Drag Urgency from INPUT into the second left value expression.
- Select is equal to as the second comparison operator.
- Keep the second right value set to Fixed.
- Enter High in the second right value.
Use OR for either urgent signal
The P1 route should run when the service is unavailable or the requester selects high urgency. The OR combination lets either condition send the ticket through the true output.
- Select OR from the condition-combination menu above the conditions.
- Click the + control on the true output of Urgent?.
- Search for Edit Fields in the node picker.
- Select Edit Fields (Set) from the results.
- Rename the node to Assign P1.
- Set Mode to Manual Mapping.
- Enable Include Other Input Fields.
- Set Input Fields to Include to All.
Keep the original ticket data
Including every input field preserves the form values and the ticket ID. The assignment node adds routing details without discarding the original request.
- Add a String field named priority with the fixed value P1.
- Add a String field named assigned_team with the fixed value Incident Response.
- Add a String field named response_deadline with the expression {{ $now.plus(2, 'hours').toISO() }}.
Return to the workflow canvas.
- Click the + control on the false output of Urgent?.
- Search for Edit Fields in the node picker.
- Select Edit Fields (Set) from the results.
- Rename the node to Assign P2.
The false output handles standard requests
A ticket reaches the false output only when neither urgent condition matches. This branch assigns the longer P2 response window.
- Set Mode to Manual Mapping.
- Enable Include Other Input Fields.
- Set Input Fields to Include to All.
- Add a String field named priority with the fixed value P2.
- Add a String field named assigned_team with the fixed value Customer Support.
- Add a String field named response_deadline with the expression {{ $now.plus(8, 'hours').toISO() }}.
- Return to the workflow canvas.
- Confirm that Assign P1 connects to the true output and Assign P2 connects to the false output.
Why use visible routing nodes?
The OR rule sends a request to P1 when either emergency signal matches. The separate assignment nodes keep each team and deadline visible on the canvas.
Verify both routes
Before the first run, which output should a service outage use?
- Select Execute Workflow.
- Enter Alex Morgan as the customer name.
- Enter your Gmail address as the requester email.
- Enter Service outage as the issue summary.
- Select Service unavailable for impact.
- Select Low for urgency.
- Submit the form.
You should see the true branch reach Assign P1 with a two-hour response deadline.
- Select Execute Workflow again.
- Enter Alex Morgan as the customer name.
- Enter your Gmail address as the requester email.
- Enter Routine billing question as the issue summary.
- Select One user for impact.
- Select Low for urgency.
- Submit the form.
You should see the false branch reach Assign P2 with an eight-hour response deadline. Both paths now produce a complete ticket assignment.
Expression red or request taking the wrong route?
- Confirm that the left values use {{ $json["Impact"] }} and {{ $json["Urgency"] }} with the same capitalization shown in INPUT.
- Check that the two conditions use OR instead of AND.
- Confirm that both assignment nodes keep all input fields.
Help me check the P1 and P2 routing expressions.
Your workflow now creates and routes complete tickets. Next, you will send those details back to the requester.
Send Gmail Acknowledgements
Your two routing branches now produce complete P1 and P2 tickets. The next gap is customer confirmation.
This step connects Gmail to n8n through SMTP. One shared email node sends the matching ticket details from either branch.
In this step, get ready to:
- Create a private Gmail app password.
- Store it in an SMTP credential.
- Send one requester acknowledgement.
Create the Gmail credential
You are about to handle a live credential. Keep the app password inside the credential editor and out of screenshots, workflow fields, and expressions.
- Open Google Account App Passwords in a new browser tab.
- Sign in to the Google Account for your Gmail address if prompted.
- Enter n8n credential in the App name field.
- Select Create.
- Copy the generated app password once.
Can't find App Passwords?
App Passwords may be unavailable on organization accounts, Advanced Protection accounts, or accounts that use only security keys for 2-Step Verification.
Help me check why App Passwords is unavailable.
- Return to Customer Support Triage and Acknowledgement.
- Add a Send Email node after Assign P1.
- choose Send an Email.
- Create an SMTP account credential inside the node.
- Enter your Gmail address as the User.
- Paste the generated app password into Password.
- Set Host to smtp.gmail.com.
- Set Port to 465.
- Turn on SSL/TLS.
- Client Host Name: Empty
- Save the SMTP credential.
- Close the App Passwords tab.
The sensitive setup is complete. n8n now holds the password without exposing it on the canvas.
Configure the acknowledgement
- Rename the Send Email node to Acknowledge Requester.
- Set Operation to Send.
- Set From Email to your Gmail address.
- Map To Email to {{ $json.Requester_email }}.
- Set Subject to Ticket {{ $json.ticket_id }} received.
- Set the text body HTML to We received ticket {{ $json.ticket_id }}. Priority: {{ $json.priority }}. Team: {{ $json.assigned_team }}. Response target: {{ $json.response_deadline }}.
- Exit node configuration.
- Connect Assign P2 to Acknowledge Requester.
You should see both assignment branches feeding the same acknowledgement node.
Send a test acknowledgement
Before you run the test, which priority and team should a service outage receive?
- Select Execute Workflow.
- Enter your Gmail address in the requester email field.
- Enter Checkout service outage in the issue summary field.
- Select Service unavailable for impact.
- Select Low for urgency.
- Submit the form.
- Open the newest message in your Gmail inbox.
You should receive an acknowledgement containing a ticket ID, P1, Incident Response, and a response deadline.
No acknowledgement email?
- Confirm that the SMTP credential is selected in Acknowledge Requester.
- Check that To Email maps to requester_email.
- Trace both assignment branches into the acknowledgement node.
Help me troubleshoot the missing acknowledgement.
Your workflow now routes a request and confirms it by email. Next, you will publish the form and verify one production execution.
Deliver the Management CSV and Go Live
Go Live and Monitor Executions
Your n8n workflow now routes each request and sends a Gmail acknowledgement. The final step moves that tested workflow onto its live form address.
Production runs happen outside the editor, so you also need a reliable place to inspect them. The execution history shows which branch ran and where a failure stopped.
In this step, get ready to:
- Save failed production executions.
- Publish the support workflow.
- Verify one live request and acknowledgement.
Keep failed runs visible
- Open the three-dots menu on the workflow editor.
- Select Settings.
- Make sure Save failed production executions is saved by default .
- Save the workflow settings.
Failed production runs now remain available for investigation in the execution history.
Publish the support form
Publishing registers the Form Trigger's Production URL and lets submissions run outside the editor. Whether other people can reach that address depends on where your n8n instance runs.
- Wait a few seconds for n8n to finish auto-saving the workflow draft.
- Click Publish in the upper-right corner of the workflow editor.
- If the publishing window shows an editable Version name field, enter Support triage v1.
- Click Publish in the publishing window.
- Open the Support Request Intake node on the canvas.
- Select Production URL at the top of the node settings panel.
- Click the copy icon beside the Production URL.
- Paste the copied URL into this project field: your Support Request Intake Production URL.
n8n Cloud
Your n8n Cloud Production URL is reachable on the internet while the workflow is published. Anyone with the link can submit the form.
- Make sure you click Execute Workflow.
Local n8n
Your local Production URL works only while the n8n Docker container is running. It is available on this computer, not as a public customer-facing address.
- Keep the terminal running your n8n container open.
- Confirm that the workflow remains published.
Open the published Production URL without clicking Execute Workflow. That control starts a Test URL session.
Keep the local form private
A development tunnel could expose the form temporarily, but n8n warns that its tunnel is not safe for production. Complete this project through the local URL instead.
You now have the live address for the published support form.
Run the production check
- Open your Support Request Intake Production URL in a new browser tab.
- Enter Alex Morgan as the customer name.
- Enter your Gmail address as the requester email.
- Enter Production login issue as the issue summary.
- Select One user for impact.
- Select Low for urgency.
Before you submit, which branch and support team should handle this request?
- Submit the completed production form.
- Return to the workflow editor.
- Open the Executions tab.
- Open the latest production execution.
- Open the newest acknowledgement in your Gmail inbox.
You should see a successful production execution travel through Assign P2 and Acknowledge Requester. The email should contain the same ticket ID and P2 assignment.
Live request not completing?
Production form data does not appear directly on the editing canvas. Open Executions to inspect the last completed node.
- Confirm that the workflow is published.
- Check that you used the Production URL instead of the Test URL.
- Open the failed execution to identify the last completed node.
Help me inspect the failed production run.
Secret mission
Add Failure Alerts
Build a separate error-handler workflow for Customer Support Triage and Acknowledgement. Prove it with a controlled production failure, then restore the live P2 path.
Clean Up Your Resources
Clean Up Your Resources
n8n Cloud may continue using your existing plan, while local Community Edition has no n8n subscription cost. Decide whether to keep the workflow available, pause it, or delete its Docker data and connected credentials.
Resources you used:
- The published Customer Support Triage and Acknowledgement workflow, including its optional failure-alert branch.
- The secured SMTP credential stored in n8n.
- The Google Account app password named n8n credential.
- The acknowledgement and failure-alert emails created during testing.
- If you chose local n8n, the n8n_data Docker volume that stores your workflows and credentials.
Keep everything running
No action is needed. Choose this option if you are still using the support form.
- Keep the main workflow published with its failure-alert branch.
- Retain the SMTP credential and Google app password.
- If you chose local n8n, retain the n8n_data Docker volume.
Pause - I'll come back to this later
Pause public submissions while preserving the workflow and its credential for later.
- Open Customer Support Triage and Acknowledgement.
- Select the editor's unpublish control.
- Open your Support Request Intake Production URL to confirm that it no longer accepts requests.
Your saved nodes and credential remain ready for the next time you publish the workflow.
- If you chose local n8n, return to the terminal running the container.
- Press Ctrl+C to stop the local instance.
Docker removes the temporary container, but the n8n_data volume keeps your workflows and credentials for your next session.
Delete - I don't want to use this again
Remove the workflow, its mail credential, and the test messages if you do not plan to use this project again.
Deletion removes live access
Deleting these resources closes the public form and revokes the Gmail access created for this workflow. Your Google Account remains intact.
- Open Customer Support Triage and Acknowledgement in n8n.
- Open the workflow actions menu in the editor header.
- Select Delete.
- Confirm the workflow deletion.
You should no longer see the main workflow in the workflow list.
- Open Credentials from the n8n navigation.
- Select the SMTP credential created for this project.
- Open the credential actions menu.
- Select Delete.
- Confirm the credential deletion.
The SMTP credential should no longer appear in the credential list.
- Open Google Account App Passwords.
- Find the app password named n8n credential.
- Remove that app password.
- Open the Gmail inbox used for testing.
- Select the acknowledgement and failure-alert messages from this project.
- Delete the selected messages.
- Permanently remove those messages from Trash.
Removing the local Docker volume permanently erases every workflow and credential in that n8n instance. Only continue if you do not need anything stored there.
- If you chose local n8n, return to the terminal running the container.
- Press Ctrl+C to stop the local instance.
- Delete the local n8n data by running this command:
docker volume rm n8n_data
You should see n8n_data in the terminal output. That confirms Docker removed the stored workflows and credentials.
Volume still in use?
The volume is still attached to a running container. Stop the local n8n terminal with Ctrl+C, then run the removal command again. Help me remove the local n8n data.
Nice Work!
Nice Work!
You did it! Your published n8n workflow now classifies support requests and sends the requester a matching acknowledgement.
You've learned how to:
- Built a public support form that captures five consistent request details.
- Created P1 and P2 routing with visible ownership and response deadlines.
- Sent a dynamic Gmail acknowledgement and verified the production run in n8n.
- Secret Mission: Added a failure-alert branch to the main workflow and tested it with an automatic production error.
Ready to quiz yourself?