Freshdesk meets Linear for synced tickets and issues
Your support queue moves fast. Dev work moves in sprints. The messy part is everything in between: copying ticket details into an issue, pasting links back into Freshdesk, then answering “any update?” all day. That’s how work falls through cracks.
Support leads feel Freshdesk Linear sync pain first, because they’re stuck translating customer urgency into engineering language. Product managers deal with it when priorities drift and nobody agrees on the “real” status. And if you run an agency or small ops team, you’re probably doing the same two-tool shuffle with fewer people.
This workflow turns Freshdesk tickets into linked Linear issues (and back again) so both teams stay aligned. You’ll see how it works, what you need, and what results to expect once it’s running.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Freshdesk meets Linear for synced tickets and issues
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0@{ icon: "mdi:code-braces", form: "rounded", label: "🗺️ Map Freshdesk Fields to L..", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>🎯 Create Linear Issue"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "✅ Check Linear Creation Succ..", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>🔗 Link Freshdesk with Linear.."]
n4@{ icon: "mdi:code-braces", form: "rounded", label: "❌ Log Linear Creation Error", pos: "b", h: 48 }
n5@{ icon: "mdi:code-braces", form: "rounded", label: "🎉 Log Linear Creation Success", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>🆕 New Ticket Webhook"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>📄 Update Ticket Webhook"]
n6 --> n0
n1 --> n2
n7 --> n0
n2 --> n3
n2 --> n4
n3 --> n5
n0 --> n1
end
subgraph sg1["Flow 2"]
direction LR
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>🎣 Linear Issue Updated Webhook"]
n9@{ icon: "mdi:code-braces", form: "rounded", label: "📄 Map Linear to Freshdesk Fi..", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "🔍 Check if Freshdesk Ticket ..", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>🎫 Update Freshdesk Ticket"]
n12@{ icon: "mdi:code-braces", form: "rounded", label: "⚠️ Log Missing Ticket ID Error", pos: "b", h: 48 }
n13@{ icon: "mdi:code-braces", form: "rounded", label: "✅ Log Freshdesk Update Success", pos: "b", h: 48 }
n11 --> n13
n8 --> n9
n9 --> n10
n10 --> n11
n10 --> n12
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n10 decision
class n1,n3,n6,n7,n8,n11 api
class n0,n4,n5,n9,n12,n13 code
classDef customIcon fill:none,stroke:none
class n1,n3,n6,n7,n8,n11 customIcon
Why This Matters: Ticket-to-Issue Handoffs Break Momentum
Most teams don’t lose time because Freshdesk is “bad” or Linear is “complicated.” They lose time in the handoff. A new customer report lands, someone rewrites it as an issue, someone else asks for missing reproduction steps, and now you’ve got two threads happening in two tools. Then the worst part: status chasing. Support needs an ETA, devs are mid-task, and customers feel the lag even if you’re working hard. It’s exhausting, and honestly, it’s avoidable.
The friction compounds. Here’s where it breaks down in real teams.
- High-priority tickets get retyped into Linear, which invites mistakes and missing context.
- Links between the ticket and the issue are inconsistent, so nobody trusts the “source of truth.”
- Updates in Linear don’t reach Freshdesk quickly, so support spends about an hour a day just asking for status.
- When something fails, there’s no audit trail, so you waste more time figuring out what happened than fixing it.
What You’ll Build: Two-Way Ticket and Issue Synchronization
This automation listens for new Freshdesk tickets and important ticket updates, then automatically creates a matching issue in Linear through the Linear API. Before it creates anything, it cleans and maps the fields so the issue looks like it was written by your team, not dumped by an integration. Once Linear confirms the issue was created successfully, the workflow writes the Linear issue ID back into the Freshdesk ticket, so the relationship is permanent and easy to find later. Then it runs the other direction too: when someone updates the Linear issue, those changes can update the corresponding Freshdesk ticket. Every success and failure is logged, so you can trust the sync and diagnose problems quickly.
The workflow starts with webhooks from Freshdesk and Linear. In the middle, function steps translate priorities, statuses, and text so each tool gets what it expects. Finally, HTTP requests push updates to the right system and record what happened for visibility.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say your team handles about 15 Freshdesk tickets a day that need engineering eyes. Manually turning each one into a Linear issue (copy details, set priority, paste links, notify people) is easily 10 minutes per ticket, or about 2.5 hours daily. With this workflow, the ticket triggers the issue creation automatically and writes the Linear ID back to Freshdesk; you’re mostly just sanity-checking the issue text, maybe 1 minute each. That’s roughly 2 hours back most days, plus fewer follow-up messages.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Freshdesk for ticket webhooks and ticket updates.
- Linear to create and update issues via API.
- Linear API key (get it from Linear Settings → API).
Skill level: Intermediate. You’ll be comfortable pasting API keys, testing webhooks, and adjusting a couple field mappings.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A ticket event kicks things off. Freshdesk calls your n8n webhook when a new ticket is created or an existing ticket changes. That means you’re not polling, waiting, or running this on a timer.
The ticket is translated into an issue-ready format. A transformation step maps Freshdesk fields like status and priority into Linear’s equivalents, and it shapes the title and description so engineers get the full context without digging.
Linear gets a create or update request. n8n sends an HTTP request to Linear’s API (GraphQL) to create the issue. If creation succeeds, the workflow immediately attaches the Linear issue ID back onto the Freshdesk ticket so the link is permanent.
Updates flow back to support. When a Linear issue changes, Linear triggers a webhook, n8n translates the updated fields, verifies the Freshdesk ticket reference exists, then pushes an update into Freshdesk. Success and error logs are recorded so you can see what synced and what didn’t.
You can easily modify which ticket statuses create issues, or which Linear updates should write back to Freshdesk, based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhooks that start the Freshdesk → Linear creation path and the Linear → Freshdesk update path.
- Add the 🆕 New Ticket Webhook Trigger node and set HTTP Method to
POSTand Path tocreate-ticket. - Add the 📄 Ticket Update Webhook node and set HTTP Method to
POSTand Path toupdate-ticket. - Add the 🎣 Linear Issue Update Hook node and set Path to
linear-issue-updated. - Connect 🆕 New Ticket Webhook Trigger → 🗺️ Transform Freshdesk Fields and 📄 Ticket Update Webhook → 🗺️ Transform Freshdesk Fields to reuse the same mapping path.
- Connect 🎣 Linear Issue Update Hook → 📄 Translate Linear Fields to start the Linear-to-Freshdesk update flow.
Step 2: Connect Linear and Freshdesk
Configure HTTP authentication and endpoints used to create Linear issues and update Freshdesk tickets.
- Open 🎯 Create Linear Task and set URL to
https://api.linear.app/graphql. - In 🎯 Create Linear Task, enable Send Body and Send Headers, then add header Content-Type with value
application/json. - In 🎯 Create Linear Task, set header Authorization to
={{ $vars.LINEAR_API_KEY }}and set Authentication togenericCredentialTypewith Generic Auth TypehttpHeaderAuth. - Credential Required: Connect your HTTP Header Auth credentials in 🎯 Create Linear Task.
- Open 🔗 Attach Linear ID to Ticket and set URL to
=https://{{ $vars.FRESHDESK_DOMAIN }}.freshdesk.com/api/v2/tickets/{{ $('🗺️ Transform Freshdesk Fields').item.json.id }}. - Open 🎫 Modify Freshdesk Ticket and set URL to
=https://{{ $vars.FRESHDESK_DOMAIN }}.freshdesk.com/api/v2/tickets/{{ $json.freshdeskTicketId }}. - In both 🔗 Attach Linear ID to Ticket and 🎫 Modify Freshdesk Ticket, set Authentication to
genericCredentialTypewith Generic Auth TypehttpBasicAuth. - Credential Required: Connect your HTTP Basic Auth credentials in 🔗 Attach Linear ID to Ticket and 🎫 Modify Freshdesk Ticket.
$vars.FRESHDESK_DOMAIN or $vars.LINEAR_API_KEY is missing in your environment variables, these requests will fail. Add them in n8n credentials or environment settings before testing.Step 3: Set Up Data Transformations
Map Freshdesk fields to Linear fields and translate Linear updates back into Freshdesk-compatible values.
- Open 🗺️ Transform Freshdesk Fields and keep the provided mapping logic that sets linearPriority, linearStateId, linearTitle, and linearDescription based on Freshdesk input.
- Confirm that 🗺️ Transform Freshdesk Fields is connected to 🎯 Create Linear Task.
- Open 📄 Translate Linear Fields and keep the mapping logic that sets freshdeskStatus, freshdeskPriority, and freshdeskTicketId based on Linear updates.
- Verify that 📄 Translate Linear Fields routes to 🔍 Verify Freshdesk Ticket ID.
Step 4: Configure Conditional Routing and Actions
Apply success checks before updating tickets and route to the correct action nodes.
- In ✅ Validate Linear Creation, set the condition to check Boolean equals
truefor={{ $json.data.issueCreate.success }}. - Connect the true output of ✅ Validate Linear Creation to 🔗 Attach Linear ID to Ticket and the false output to ❌ Record Linear Creation Error.
- In 🔍 Verify Freshdesk Ticket ID, set the condition to String notEmpty for
={{ $json.freshdeskTicketId }}. - Connect the true output of 🔍 Verify Freshdesk Ticket ID to 🎫 Modify Freshdesk Ticket and the false output to ⚠️ Record Missing Ticket Error.
- Connect 🎫 Modify Freshdesk Ticket → ✅ Record Freshdesk Update to log successful syncs.
Step 5: Add Error Handling and Logging
Use the built-in function nodes to log error conditions and successful operations.
- Ensure ❌ Record Linear Creation Error is connected to the false branch of ✅ Validate Linear Creation to capture Linear creation failures.
- Ensure ⚠️ Record Missing Ticket Error is connected to the false branch of 🔍 Verify Freshdesk Ticket ID to log missing IDs.
- Keep 🎉 Record Linear Creation Success connected after 🔗 Attach Linear ID to Ticket to log successful Freshdesk linkage.
- Keep ✅ Record Freshdesk Update connected after 🎫 Modify Freshdesk Ticket to log successful Linear-to-Freshdesk updates.
Step 6: Test and Activate Your Workflow
Run end-to-end tests for both directions before enabling the workflow in production.
- Click Execute Workflow and send a sample payload to 🆕 New Ticket Webhook Trigger using its test URL.
- Confirm the execution path flows 🗺️ Transform Freshdesk Fields → 🎯 Create Linear Task → ✅ Validate Linear Creation → 🔗 Attach Linear ID to Ticket → 🎉 Record Linear Creation Success.
- Send a sample Linear webhook payload to 🎣 Linear Issue Update Hook and verify 📄 Translate Linear Fields → 🔍 Verify Freshdesk Ticket ID → 🎫 Modify Freshdesk Ticket → ✅ Record Freshdesk Update.
- Check that error paths populate via ❌ Record Linear Creation Error or ⚠️ Record Missing Ticket Error when conditions are not met.
- Turn on the workflow using the Active toggle once tests are successful.
Troubleshooting Tips
- Linear API credentials can expire or lack the right scopes. If issue creation fails, check your Linear API token in n8n credentials first, then confirm the workspace permissions in Linear.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 45 minutes if your Freshdesk and Linear accounts are ready.
No coding required. You will mostly paste credentials, test webhooks, and tweak field mappings.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Linear API access (usually included with your Linear plan).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Most teams adjust the “Transform Freshdesk Fields” step to match their priority labels, then tweak the “Translate Linear Fields” step to decide which Linear changes should update Freshdesk (status only, or status plus priority). You can also change the “Validate Linear Creation” and “Verify Freshdesk Ticket ID” checks to be stricter, which is helpful if you have multiple support inboxes. Common customizations include routing certain tags to different Linear teams, skipping spammy ticket updates, and adding extra context into the issue description.
Usually it’s an auth problem or a webhook mismatch. Confirm the Freshdesk webhook is pointing to the correct n8n production URL, then re-check the API key used in the HTTP request that updates the ticket. If you’re updating custom fields, make sure that field exists in your Freshdesk instance and your API user has permission to edit it. Also watch for rate limits if a lot of ticket updates happen at once, because bursts can cause sporadic failures.
A typical small support team can run hundreds of synced events per day without trouble.
Often, yes, because this is bidirectional sync with validation and logging. n8n makes it easier to branch on conditions (like “only create a Linear issue if priority is high”) and to store/attach the Linear ID back into Freshdesk reliably. You also get the option to self-host, which matters once you have lots of ticket updates triggering executions. Zapier or Make can be simpler for lightweight one-way flows, but they tend to get pricey or awkward when you add reverse updates and error handling. Talk to an automation expert if you want a quick recommendation for your setup.
Once this Freshdesk Linear sync is running, the handoff stops being a daily project. The workflow tracks the links, pushes the updates, and leaves you with fewer interruptions and a cleaner queue.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.