Zendesk Connector
Connect your Zendesk Support instance to Brevo via Tajo for unified customer support data, ticket-based segmentation, satisfaction scoring, and support-triggered marketing automation.
Overview
| Property | Value |
|---|---|
| Platform | Zendesk |
| Category | Support |
| Setup Complexity | Medium |
| Official Integration | Yes |
| Data Synced | Tickets, Users, Organizations, Events |
| API Base URL | https://{subdomain}.zendesk.com/api/v2 |
Features
- User sync - Sync Zendesk end-users and agents with Brevo contacts
- Ticket tracking - Sync ticket data for support-aware marketing segmentation
- Organization mapping - Associate contacts with organizations for B2B workflows
- Satisfaction scores - Sync CSAT and NPS data to Brevo attributes
- Ticket events - Track ticket creation, resolution, and escalation for automation triggers
- Help center integration - Track article views and search behavior
- Multi-channel support - Sync data from email, chat, voice, and messaging channels
- Custom fields - Map Zendesk custom ticket and user fields to Brevo
Prerequisites
Before you begin, ensure you have:
- A Zendesk Support account (Team, Professional, or Enterprise)
- Admin access to your Zendesk instance
- API token or OAuth app configured
- A Brevo account with API access
- A Tajo account
Authentication
API Token Authentication
Use email/token authentication for quick setup.
curl https://{subdomain}.zendesk.com/api/v2/users.json \ -u {email}/token:{api_token} \ -H "Content-Type: application/json"Generate an API token from Zendesk Admin > Apps and Integrations > APIs > Zendesk API.
OAuth 2.0
Use OAuth for multi-instance integrations with delegated user access.
# Authorization URLhttps://{subdomain}.zendesk.com/oauth/authorizations/new? response_type=code& client_id={client_id}& redirect_uri={redirect_uri}& scope=read%20writeRequired Scopes
read # Read access to all resourceswrite # Write access to all resourcestickets:read # Read tickets (granular)users:read # Read users (granular)organizations:read # Read organizations (granular)Configuration
Basic Setup
connectors: zendesk: enabled: true subdomain: "yourcompany" auth: api_token: "${ZENDESK_API_TOKEN}"
# Data sync options sync: users: true tickets: true organizations: true satisfaction_ratings: true
# Brevo list assignment lists: all_customers: 30 active_tickets: 31 satisfied_customers: 32Field Mapping
Map Zendesk user fields to Brevo contact attributes:
Default Mappings
| Parameter | Type | Description |
|---|---|---|
email required | string | User email address (unique identifier) |
name optional | string | Full name, split into FIRSTNAME/LASTNAME |
phone optional | string | Maps to SMS attribute for WhatsApp/SMS |
organization_id optional | integer | Associated organization for B2B mapping |
role optional | string | User role (end-user, agent, admin) |
tags optional | array | User tags from Zendesk |
ticket_restriction optional | string | Ticket access level |
custom_fields optional | object | Custom user field values |
Custom Field Mapping
field_mapping: # Standard fields email: email name: FULLNAME phone: SMS
# Support metrics open_tickets: OPEN_TICKETS total_tickets: TOTAL_TICKETS avg_satisfaction: CSAT_SCORE last_ticket_date: LAST_SUPPORT_DATE
# Organization fields organization.name: COMPANY_NAME organization.tags: COMPANY_TAGS
# Custom fields user_fields.customer_type: CUSTOMER_TYPE user_fields.account_tier: ACCOUNT_TIERAPI Endpoints
Ticketing API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/tickets | List tickets |
POST | /api/v2/tickets | Create a ticket |
PUT | /api/v2/tickets/{id} | Update a ticket |
GET | /api/v2/tickets/{id} | Show a ticket |
GET | /api/v2/search.json?query={query} | Search tickets |
Users API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/users | List users |
POST | /api/v2/users | Create a user |
PUT | /api/v2/users/{id} | Update a user |
GET | /api/v2/users/{id} | Show a user |
GET | /api/v2/users/search.json?query={query} | Search users |
Organizations API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/organizations | List organizations |
POST | /api/v2/organizations | Create an organization |
GET | /api/v2/organizations/{id}/users | List organization members |
Satisfaction Ratings API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v2/satisfaction_ratings | List satisfaction ratings |
GET | /api/v2/satisfaction_ratings/{id} | Show a rating |
Events
Ticket Events
| Event | Trigger | Use Case |
|---|---|---|
ticket.created | New ticket submitted | Support acknowledgment |
ticket.updated | Ticket status changed | Status notification |
ticket.solved | Ticket marked solved | CSAT survey trigger |
ticket.reopened | Solved ticket reopened | Escalation alert |
User Events
| Event | Trigger | Use Case |
|---|---|---|
user.created | New user registered | Welcome to support |
user.updated | User profile changed | Attribute sync |
user.merged | Users merged | Deduplication |
Satisfaction Events
| Event | Trigger | Use Case |
|---|---|---|
satisfaction_rating.created | CSAT submitted | Feedback processing |
satisfaction_rating.bad | Negative rating | Recovery outreach |
satisfaction_rating.good | Positive rating | Advocacy campaigns |
Code Examples
Initialize Connector
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Zendeskawait tajo.connectors.connect('zendesk', { subdomain: 'yourcompany', apiToken: process.env.ZENDESK_API_TOKEN});Sync Users and Tickets
// Full sync of users and ticket dataawait tajo.connectors.sync('zendesk', { type: 'full', resources: ['users', 'tickets', 'organizations'], since: '2023-01-01'});
// Check sync statusconst status = await tajo.connectors.status('zendesk');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// usersSynced: 8400,// ticketsSynced: 34200,// organizationsSynced: 1200// }Handle Zendesk Webhooks
app.post('/webhooks/zendesk', async (req, res) => { const signature = req.get('X-Zendesk-Webhook-Signature');
// Verify webhook signature if (!verifyZendeskSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('zendesk', { type: req.body.type, ticketId: req.body.ticket_id, userId: req.body.user_id, payload: req.body });
res.status(200).send('OK');});Rate Limits
Zendesk rate limits vary by plan:
| Plan | Rate Limit | Details |
|---|---|---|
| Team | 200 requests/minute | Per API token |
| Professional | 400 requests/minute | Per API token |
| Enterprise | 700 requests/minute | Per API token |
| High Volume Add-on | 2,500 requests/minute | Per API token |
Additional limits:
- Search API: 6 requests/minute for anonymous, 100/minute for authenticated
- Incremental exports: 10 requests/minute
- Batch API: 100 records per batch request
- Webhook delivery: Automatic retry with exponential backoff
Rate Limit Headers
Monitor the X-Rate-Limit-Remaining and Retry-After headers to manage your API usage.
Troubleshooting
Common Issues
| Issue | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Invalid API token | Regenerate token in Zendesk Admin |
| 403 Forbidden | Insufficient permissions | Check agent or admin role requirements |
| User not synced | User is an agent, not end-user | Filter by role in sync configuration |
| Webhook not received | Trigger/target not configured | Set up webhook target in Zendesk Admin |
| Search returns empty | Indexing delay | Wait 1-2 minutes for search index update |
Debug Mode
Enable verbose logging:
connectors: zendesk: debug: true log_level: verbose log_webhooks: trueTest Connection
tajo connectors test zendesk# ✓ API connection successful# ✓ Users readable# ✓ Tickets readable# ✓ Organizations readable# ✓ Webhooks configuredBest Practices
- Use incremental exports - Use the Incremental API for large-scale data sync
- Filter end-users only - Exclude agents and admins from Brevo contact sync
- Sync CSAT data - Use satisfaction scores for customer health segmentation
- Map organizations - Leverage organization data for B2B marketing campaigns
- Implement webhook retries - Handle temporary failures gracefully
- Use side-loading - Include related records in API responses to reduce request count
Security
- API Token Authentication - Token-based access tied to admin email
- OAuth 2.0 - Token-based delegated access with scope controls
- Webhook signing - HMAC signature verification for webhook payloads
- TLS encryption - All API communication encrypted via HTTPS
- IP whitelisting - Restrict API access by IP range
Related Resources
- Zendesk API Documentation
- Zendesk Webhooks Guide
- Intercom Connector
- Customer Sync Skill
- Brevo Contacts API
Open-Source Implementation Map
No official open-source repository was found in the current Tajo connector catalog for Zendesk. 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.