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

PropertyValue
PlatformFreshdesk
CategorySupport
Setup ComplexityEasy
Official IntegrationNo
Data SyncedTickets, Contacts, Agents, Companies
Available Skills6

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.

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

Or using Base64 encoding in the Authorization header:

Terminal window
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

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:

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:

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

MethodEndpointDescription
GET/api/v2/ticketsList all tickets
POST/api/v2/ticketsCreate 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/contactsList all contacts
POST/api/v2/contactsCreate a contact
PUT/api/v2/contacts/{id}Update a contact
GET/api/v2/companiesList all companies
GET/api/v2/agentsList all agents
GET/api/v2/surveys/satisfaction_ratingsList 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 account
await tajo.connectors.connect('freshdesk', {
domain: 'yourcompany.freshdesk.com',
apiKey: process.env.FRESHDESK_API_KEY
});

Sync Contacts to Brevo

// 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": "[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 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

// Search for all tickets from a specific customer
const query = encodeURIComponent('"email:[email protected]"');
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

PlanLimitDetails
Sprout50 requests/minFree plan
Blossom200 requests/minStarter plan
Garden400 requests/minGrowth plan
Estate700 requests/minPro plan
Forest1,000 requests/minEnterprise plan

Additional limits:

ResourceLimit
List endpoints30 pages per query
Per page100 records max
Search API2 requests/sec
Bulk operations10 records/request

Rate Limit Headers

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

Troubleshooting

IssueCauseSolution
401 UnauthorizedInvalid API keyVerify API key in Freshdesk Profile Settings
403 ForbiddenInsufficient permissionsEnsure API key belongs to an admin account
Contacts not syncingMissing email fieldFreshdesk contacts require an email address
Tickets not appearingWrong domainVerify your Freshdesk domain URL is correct
Search returning emptyQuery syntax errorUse Freshdesk search query syntax with double quotes
429 Too Many RequestsRate limit exceededImplement rate limiting based on plan tier
Custom fields missingField not enabledEnsure 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

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.

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI Assistant

Hi! Ask me anything about the docs.