Freshdesk Connector
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:
- A Freshdesk account with admin access
- Your Freshdesk API Key (found in Profile Settings)
- Your Freshdesk domain (e.g.,
yourcompany.freshdesk.com) - A Brevo account with API access
- 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.
curl -u "YOUR_API_KEY:X" \ https://yourcompany.freshdesk.com/api/v2/ticketsOr using Base64 encoding in the Authorization header:
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
- Log in to your Freshdesk account
- Click your profile picture in the top-right corner
- Go to Profile Settings
- Your API Key is displayed on the right side
Configuration
Basic Setup
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: 32Contact Field Mapping
Map Freshdesk contact fields to Brevo attributes:
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: PLANTicket Event Mapping
Map Freshdesk ticket events to Brevo automation triggers:
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
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Freshdesk accountawait tajo.connectors.connect('freshdesk', { domain: 'yourcompany.freshdesk.com', apiKey: process.env.FRESHDESK_API_KEY});Sync Contacts to Brevo
// Fetch Freshdesk contacts and sync to Brevoconst 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": "[email protected]",// "phone": "+15551234567",// "company_id": 678,// "job_title": "Product Manager",// "created_at": "2024-01-15T10:30:00Z"// }Track Ticket Events
// Set up Freshdesk webhook to forward ticket events// Configure in Freshdesk Admin > Automations > Webhook
// Webhook handlerapp.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
// Search for all tickets from a specific customerconst 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
- Use webhooks for real-time sync - Configure Freshdesk Automations to trigger webhooks on ticket events
- Sync CSAT scores - Track customer satisfaction ratings as Brevo attributes for segmentation
- Map ticket status to lists - Automatically move contacts between Brevo lists based on ticket status
- Track support metrics - Sync ticket count, average response time, and resolution rate per contact
- Use search API sparingly - The search API has stricter rate limits; cache results when possible
- Paginate large exports - Use pagination with
pageandper_pageparameters 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
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.