> ## Documentation Index
> Fetch the complete documentation index at: https://docs.incident.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Freshservice

> Keep Freshservice tickets in step with incidents and follow-ups

## Connecting Freshservice

incident.io authenticates with a Freshservice API key. Actions in Freshservice appear as the agent who owns that key, so we'd recommend use a dedicated 'service account' agent (for example `incident.io`) rather than a personal account.

The user needs permission to read ticket fields, and to create, read, and update tickets and notes.

<Steps>
  <Step title="Copy the Freshservice API key">
    In Freshservice, open your profile picture in the top-right corner and go to **Profile Settings**. The API key is on the right, below **Delegate Approvals**. Click **Show API Key** to reveal it.

    <Frame caption="Freshservice Profile Settings, with the API key on the right">
      <img src="https://mintcdn.com/incidentio-18bb4170/wtL_2F9VWmllNpQf/images/integrations/freshservice/profile-api-key.png?fit=max&auto=format&n=wtL_2F9VWmllNpQf&q=85&s=0c2b3a43d8fa538c717b6f83f2d93983" alt="Freshservice Profile Settings page showing the Your API Key panel" width="1483" height="812" data-path="images/integrations/freshservice/profile-api-key.png" />
    </Frame>

    If the key is missing, an Account Admin needs to open **Admin → User Management → Agents**, edit the agent, and enable **API key** on the **Permissions** tab.

    <Frame caption="The API key toggle on an agent's Permissions tab">
      <img src="https://mintcdn.com/incidentio-18bb4170/wtL_2F9VWmllNpQf/images/integrations/freshservice/agent-api-key-permission.png?fit=max&auto=format&n=wtL_2F9VWmllNpQf&q=85&s=c96e575eae72658ce05ae4377b80ff7c" alt="Freshservice agent Permissions tab showing the API key toggle enabled" width="1483" height="812" data-path="images/integrations/freshservice/agent-api-key-permission.png" />
    </Frame>
  </Step>

  <Step title="Connect in incident.io">
    Go to [Settings → Integrations → Freshservice](https://app.incident.io/~/settings/integrations) and enter:

    * **Domain**: your Freshservice host, for example `acme.freshservice.com`. Only domains ending in `.freshservice.com` are accepted.
    * **API key**: the key you copied.

    Click **Connect**. We validate the credentials by reading your ticket fields, and store the key encrypted at rest.
  </Step>
</Steps>

Once connected, we sync your Freshservice agents into Catalog every hour as the **Freshservice User** type. We'll attempt to match them to your incident.io users using their email address, and use that to assign tickets to the right users.

***

## Set up a Workflow Automator rule (a webhook)

For incident.io to get updates from Freshservice in real time, you'll need to set up a Workflow Automator rule. Without this, follow-ups won't sync back into incident in real time, and comments on incident tickets may not come through for hours.

<Steps>
  <Step title="Copy the webhook details from [incident.io](http://incident.io)">
    Open the Freshservice integration settings and find **Configure webhook**. Click **Generate secret**. A secret is only created when you ask for it, so there is nothing to copy until you do. Then copy the webhook URL, the header name, and the secret.

    <img src="https://mintcdn.com/incidentio-18bb4170/KeLnYtYDLIpWnfA3/images/image.png?fit=max&auto=format&n=KeLnYtYDLIpWnfA3&q=85&s=2874f5849c7d1ea5dcbfdc66c7ec1761" alt="Image" title="Image" style={{ width:"37%" }} width="1154" height="1038" data-path="images/image.png" />
  </Step>

  <Step title="Create a ticket workflow in Freshservice">
    In Freshservice, go to **Admin → Workflow Automator**. Choose **Event Based Workflow** on **Tickets**, then **Create → Workflow**.

    In the **Event** node, add the events you care about:

    * `Ticket is` → `updated`
    * `Note added is of type` → `Any`

    Freshservice has no separate "reply added" event. A public note is the requester-visible reply, so `Any` covers both replies and internal notes.

    <Frame caption="A Workflow Automator canvas ending in a Web Request">
      <img src="https://mintcdn.com/incidentio-18bb4170/wtL_2F9VWmllNpQf/images/integrations/freshservice/workflow-canvas.png?fit=max&auto=format&n=wtL_2F9VWmllNpQf&q=85&s=3656cdc0a28a9e426fa8a81c229e2324" alt="Freshservice Workflow Automator flow from Ticket is updated to a Web Request node" width="1483" height="812" data-path="images/integrations/freshservice/workflow-canvas.png" />
    </Frame>
  </Step>

  <Step title="Configure the Web Request">
    Drag a **Web Request** node onto the canvas and connect it to the event.

    Configure it with:

    * **Request Type**: `POST`
    * **Endpoint**: the webhook URL from incident.io
    * **Credentials**: `Inline Credential`
    * **Authentication Type**: `No Auth`
    * **Body**:

    ```json theme={null}
    { "ticket_id": {{ticket.id}} }
    ```

    Use **Insert Placeholder → Ticket ID** to add `{{ticket.id}}` rather than typing it, so the placeholder binds correctly.

    <Frame caption="The Web Request node: POST, endpoint, inline credential, no auth, and a JSON body">
      <img src="https://mintcdn.com/incidentio-18bb4170/wtL_2F9VWmllNpQf/images/integrations/freshservice/web-request-action.png?fit=max&auto=format&n=wtL_2F9VWmllNpQf&q=85&s=f59129e6dabd4b6922748d9a89c78376" alt="Freshservice Web Request node configured as a POST with a JSON body" width="1483" height="812" data-path="images/integrations/freshservice/web-request-action.png" />
    </Frame>

    Then scroll down to **Headers**, click **Add Header**, and add:

    * **Key**: `X-Incident-IO-Webhook-Secret`
    * **Value**: the secret from incident.io

    <Warning>
      The **Headers** section only appears once **Request Type** is set to `POST`. If you go looking for it while the node is still on the default `GET`, it will not be there.
    </Warning>

    <Frame caption="The secret goes in a custom header, not in the authentication block">
      <img src="https://mintcdn.com/incidentio-18bb4170/wtL_2F9VWmllNpQf/images/integrations/freshservice/web-request-headers.png?fit=max&auto=format&n=wtL_2F9VWmllNpQf&q=85&s=4b741fbafe03b664d41a956fa524a398" alt="Freshservice Web Request headers section with the X-Incident-IO-Webhook-Secret header" width="1512" height="772" data-path="images/integrations/freshservice/web-request-headers.png" />
    </Frame>

    Do not use Freshservice's Basic Auth or API key authentication types here. incident.io authenticates with the custom header, which is why **Authentication Type** stays on `No Auth`.

    Give the node a **Label**. It is required, and the node will not save without one. Save, then activate the workflow.
  </Step>
</Steps>

***

## Incident tickets

An incident ticket is a single Freshservice ticket representing the incident, created when the incident starts and kept current as it progresses. Service Desk and auditors see the incident in Freshservice, with status and updates on it, while responders keep working in Slack.

Go to [Settings → Incident tickets](https://app.incident.io/~/settings/incident-tickets) and create a template so we know how to populate your ticket fields. Use conditions to pick which template applies, for example only exporting Critical incidents, or routing security incidents somewhere different

<Frame caption="An incident ticket template, with fields pulled from your Freshservice instance">
  <img src="https://mintcdn.com/incidentio-18bb4170/KeLnYtYDLIpWnfA3/images/image.png?fit=max&auto=format&n=KeLnYtYDLIpWnfA3&q=85&s=2874f5849c7d1ea5dcbfdc66c7ec1761" alt="An incident.io incident ticket template showing Freshservice fields" className="mx-auto" style={{ width:"69%" }} width="1154" height="1038" data-path="images/image.png" />
</Frame>

### 2-way sync

incident.io is the source of truth for the state of the incident, and any custom fields. Resolving or editing the Freshservice ticket does not change the incident's status, severity, or title, and we write your template values back over conflicting edits.

We sync content in both directions to help everyone stay in the loop

* Sharing an incident update posts a **private note** on the ticket, so the requester doesn't see it. The first update on an incident is skipped.
* Notes and public replies on the ticket appear on the incident timeline as ticket comments, once we sync that ticket.

***

## Follow-ups

You can also export [follow-ups](/post-incident/follow-ups) as Freshservice tickets, so the work sits in the same queue as everything else your team is tracking. When someone resolves or closes the ticket in Freshservice, the follow-up completes in incident.io.

You can export them manually from the dashboard or from Slack / Microsoft Teams, or set up an export template to send them automatically based on incident attributes.

If the incident already has a Freshservice incident ticket, we try to create the follow-up as a child of it. Some Freshservice plans and parent ticket types don't support children, so if Freshservice rejects it we create a standalone ticket instead.

You can attach an existing Freshservice ticket as a follow-up by pasting its URL into the incident channel. Agent, helpdesk, and support ticket URLs all work.

### What syncs

* Resolving or closing the ticket completes the linked follow-up in incident.io.
* Title, description, priority, and assignee changes update the follow-up.
* Comments on follow-up tickets are not synced.

Only the default **Resolved** and **Closed** statuses complete a follow-up. Custom terminal statuses don't.

***

## FAQs

<AccordionGroup>
  <Accordion title="Does this create incidents from Freshservice tickets?">
    Not on its own: this integration exports incidents and follow-ups *to* Freshservice.

    To go the other way, point Freshservice at a [custom HTTP alert source](/alerts/custom-http-sources). Create the source in incident.io, then add a Workflow Automator rule that fires a **Web Request** at it when a ticket you care about is raised, the same way you would for the [webhook above](#set-up-a-webhook). From there an [alert route](/alerts/escalations-from-alerts) decides which alerts page someone and which create an incident, so Freshservice tickets get the same filtering and grouping as any other alert source.
  </Accordion>

  <Accordion title="Why are notes from Freshservice slow to appear?">
    Freshservice cannot register webhooks via API. Without a Workflow Automator rule pointing at our webhook URL, we only pick up follow-up changes on a poll, and incident-ticket notes wait until a sync is triggered. Set up the [webhook](#set-up-a-webhook) so updates land as they happen.
  </Accordion>
</AccordionGroup>
