---
title: "Freshdesk Connector"
description: "Complete Freshdesk integration guide for syncing support tickets, contacts, and agent data with Brevo through Tajo."
url: https://tajo.io/docs/connectors/support/freshdesk/
markdown: https://tajo.io/docs/connectors/support/freshdesk.md
lang: en-US
robots: noindex
---

# Freshdesk Connector

Connector status: Planned Not built yet. Tajo does not run this connector today.

| Source field | Destination field | Sample value |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Connect Freshdesk to Brevo through Tajo to unify support and marketing data. Sync customer support tickets, contact profiles, and satisfaction scores to power targeted communications based on support interactions.

## Overview

| Property | Value |
| --- | --- |
| **Platform** | Freshdesk |
| **Category** | Support |
| **Setup Complexity** | Easy |
| **Official Integration** | No |
| **Data Synced** | Tickets, Contacts, Agents, Companies |
| **Available Skills** | 6 |

## Features

- **Contact sync** - Bidirectional sync of Freshdesk contacts to Brevo contact lists
- **Ticket event tracking** - Forward ticket creation, update, and resolution events to Brevo
- **CSAT sync** - Sync customer satisfaction scores as Brevo contact attributes
- **Company sync** - Map Freshdesk companies to Brevo contact segmentation
- **Agent data** - Track agent assignments for internal workflow automation
- **Custom fields** - Map Freshdesk custom ticket and contact fields to Brevo attributes

## Prerequisites

Before you begin, ensure you have:

1. A Freshdesk account with admin access
2. Your Freshdesk API Key (found in Profile Settings)
3. Your Freshdesk domain (e.g., `yourcompany.freshdesk.com`)
4. A Brevo account with API access
5. A Tajo account with API credentials

## Authentication

### API Key Authentication

Freshdesk uses API key authentication via HTTP Basic Auth. The API key is used as the username with any string (typically `X`) as the password.

```bash
curl -u "YOUR_API_KEY:X" \
  https://yourcompany.freshdesk.com/api/v2/tickets
```

Or using Base64 encoding in the Authorization header:

```bash
curl https://yourcompany.freshdesk.com/api/v2/tickets \
  -H "Authorization: Basic BASE64_ENCODED_API_KEY:X" \
  -H "Content-Type: application/json"
```

### Finding Your API Key

1. Log in to your Freshdesk account
2. Click your profile picture in the top-right corner
3. Go to **Profile Settings**
4. Your API Key is displayed on the right side

## Configuration

### Basic Setup

```yaml
connectors:
  freshdesk:
    enabled: true
    domain: "yourcompany.freshdesk.com"
    api_key: "your-freshdesk-api-key"

    # Data sync options
    sync:
      contacts: true
      tickets: true
      companies: true
      satisfaction_ratings: true

    # Brevo list assignment
    lists:
      all_support_contacts: 30
      open_tickets: 31
      resolved_tickets: 32
```

### Contact Field Mapping

Map Freshdesk contact fields to Brevo attributes:

```yaml
contact_mapping:
  email: email
  name: FULLNAME
  phone: SMS
  company_id: COMPANY
  job_title: JOB_TITLE
  twitter_id: TWITTER
  language: LANGUAGE
  time_zone: TIMEZONE

  # Support metrics
  total_tickets: TICKET_COUNT
  open_tickets: OPEN_TICKETS
  avg_csat: CSAT_SCORE
  last_ticket_date: LAST_SUPPORT_DATE

  # Custom fields
  custom_fields.account_type: ACCOUNT_TYPE
  custom_fields.subscription_tier: PLAN
```

### Ticket Event Mapping

Map Freshdesk ticket events to Brevo automation triggers:

```yaml
ticket_events:
  ticket_created: "support_ticket_created"
  ticket_updated: "support_ticket_updated"
  ticket_resolved: "support_ticket_resolved"
  ticket_closed: "support_ticket_closed"
  ticket_reopened: "support_ticket_reopened"
  satisfaction_rated: "csat_submitted"
  note_added: "support_note_added"
```

## API Endpoints

| Method | Endpoint | Description |
| --- | --- | --- |
| `GET` | `/api/v2/tickets` | List all tickets |
| `POST` | `/api/v2/tickets` | Create a ticket |
| `GET` | `/api/v2/tickets/{id}` | Get a specific ticket |
| `PUT` | `/api/v2/tickets/{id}` | Update a ticket |
| `DELETE` | `/api/v2/tickets/{id}` | Delete a ticket |
| `GET` | `/api/v2/contacts` | List all contacts |
| `POST` | `/api/v2/contacts` | Create a contact |
| `PUT` | `/api/v2/contacts/{id}` | Update a contact |
| `GET` | `/api/v2/companies` | List all companies |
| `GET` | `/api/v2/agents` | List all agents |
| `GET` | `/api/v2/surveys/satisfaction_ratings` | List CSAT ratings |
| `GET` | `/api/v2/search/tickets?query=` | Search tickets |

## Code Examples

### Initialize Freshdesk Connector

```javascript
import { TajoClient } from '@tajo/sdk';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
  brevoApiKey: process.env.BREVO_API_KEY
});

// Connect Freshdesk account
await tajo.connectors.connect('freshdesk', {
  domain: 'yourcompany.freshdesk.com',
  apiKey: process.env.FRESHDESK_API_KEY
});
```

### Sync Contacts to Brevo

```javascript
// Fetch Freshdesk contacts and sync to Brevo
const response = await fetch(
  'https://yourcompany.freshdesk.com/api/v2/contacts?page=1&per_page=100',
  {
    headers: {
      'Authorization': 'Basic ' + btoa(`${API_KEY}:X`),
      'Content-Type': 'application/json'
    }
  }
);

const contacts = await response.json();
// Each contact:
// {
//   "id": 12345,
//   "name": "Jane Kim",
//   "email": "jane@example.com",
//   "phone": "+15551234567",
//   "company_id": 678,
//   "job_title": "Product Manager",
//   "created_at": "2024-01-15T10:30:00Z"
// }
```

### Track Ticket Events

```javascript
// Set up Freshdesk webhook to forward ticket events
// Configure in Freshdesk Admin > Automations > Webhook

// Webhook handler
app.post('/webhooks/freshdesk', async (req, res) => {
  const { ticket, event_type } = req.body;

  await tajo.connectors.handleWebhook('freshdesk', {
    topic: event_type,
    payload: {
      ticketId: ticket.id,
      subject: ticket.subject,
      status: ticket.status,
      priority: ticket.priority,
      requesterEmail: ticket.requester.email,
      createdAt: ticket.created_at
    }
  });

  res.status(200).send('OK');
});
```

### Search Tickets by Customer

```javascript
// Search for all tickets from a specific customer
const query = encodeURIComponent('"email:jane@example.com"');
const response = await fetch(
  `https://yourcompany.freshdesk.com/api/v2/search/tickets?query=${query}`,
  {
    headers: {
      'Authorization': 'Basic ' + btoa(`${API_KEY}:X`)
    }
  }
);

const { results, total } = await response.json();
```

## Rate Limits

| Plan | Limit | Details |
| --- | --- | --- |
| **Sprout** | 50 requests/min | Free plan |
| **Blossom** | 200 requests/min | Starter plan |
| **Garden** | 400 requests/min | Growth plan |
| **Estate** | 700 requests/min | Pro plan |
| **Forest** | 1,000 requests/min | Enterprise plan |

Additional limits:

| Resource | Limit |
| --- | --- |
| **List endpoints** | 30 pages per query |
| **Per page** | 100 records max |
| **Search API** | 2 requests/sec |
| **Bulk operations** | 10 records/request |

Rate Limit Headers

Freshdesk returns rate limit information in response headers. Monitor `X-RateLimit-Remaining` and implement backoff when approaching limits.

## Troubleshooting

| Issue | Cause | Solution |
| --- | --- | --- |
| `401 Unauthorized` | Invalid API key | Verify API key in Freshdesk Profile Settings |
| `403 Forbidden` | Insufficient permissions | Ensure API key belongs to an admin account |
| Contacts not syncing | Missing email field | Freshdesk contacts require an email address |
| Tickets not appearing | Wrong domain | Verify your Freshdesk domain URL is correct |
| Search returning empty | Query syntax error | Use Freshdesk search query syntax with double quotes |
| `429 Too Many Requests` | Rate limit exceeded | Implement rate limiting based on plan tier |
| Custom fields missing | Field not enabled | Ensure custom fields are enabled in Freshdesk admin |

## Best Practices

1. **Use webhooks for real-time sync** - Configure Freshdesk Automations to trigger webhooks on ticket events
2. **Sync CSAT scores** - Track customer satisfaction ratings as Brevo attributes for segmentation
3. **Map ticket status to lists** - Automatically move contacts between Brevo lists based on ticket status
4. **Track support metrics** - Sync ticket count, average response time, and resolution rate per contact
5. **Use search API sparingly** - The search API has stricter rate limits; cache results when possible
6. **Paginate large exports** - Use pagination with `page` and `per_page` parameters for initial sync

## Security

- **API key authentication** - Simple HTTP Basic Auth with API key
- **HTTPS only** - All API communication requires TLS encryption
- **IP whitelisting** - Available on Estate and Forest plans
- **Role-based access** - API key permissions tied to agent role
- **SOC 2 Type II** - Freshdesk is SOC 2 Type II certified
- **GDPR compliance** - Supports data export and deletion requests

## Related Resources

- [Brevo Connector](https://tajo.io/docs/connectors/marketing/brevo)
- [Customer Sync Skill](https://tajo.io/docs/skills/data-sync/customer-sync)
- [Shopify Connector](https://tajo.io/docs/connectors/ecommerce/shopify)
- [Brevo Contacts API](https://tajo.io/docs/contact-management)

## Open-Source Implementation Map

No official open-source repository was found in the current Tajo connector catalog for Freshdesk. Keep this page focused on the verified public API contract and vendor documentation until an official schema, SDK, MCP server, or public integration repository is available.

### Tajo Revamp Checklist

- Verify authentication and scope requirements against the vendor documentation before each connector release.
- Document primary sync objects, external IDs, pagination strategy, and rate limits explicitly.
- Add smoke tests from public API examples rather than undocumented behavior.
- Capture webhook signature verification and replay protection when the vendor supports webhooks.
- Record gaps where no official public repository or schema exists so future maintainers know what still needs source-backed validation.
