How to
·
Support data is fragmented across tools like Zendesk, Intercom, Freshdesk, and ServiceNow. Each system exposes tickets, customers, and conversations differently.
This use case shows how to:
- sync tickets in real time
- retrieve full customer context
- track conversations
- triage and update tickets
- respond with notes
All through a single normalized API.
Step 1: Listen for ticket events (real-time entry point)
Use webhooks where available to receive:
- ticket created
- ticket updated
This becomes your primary ingestion path.
Fallback:
- poll
/ticketusingupdated_gtefor integrations without webhook support
Step 2: List tickets (backfill + recovery)
const results = await sdk.ticketing.listTicketingTickets({
connectionId,
limit: 50,
offset: 0,
updated_gte: '2026-04-10T12:20:40.004Z',
sort: 'updated_at',
order: 'asc'
});
Use this for:
- initial sync
- missed webhook recovery
- periodic reconciliation
Step 3: Retrieve a ticket
const ticket = await sdk.ticketing.getTicketingTicket({
connectionId,
id: '1234'
});
Key fields:
customer_idsubjectdescriptionstatusprioritycategory_idtagsuser_id
This is your core support object.
Step 4: Retrieve customer context
const customer = await sdk.ticketing.getTicketingCustomer({
connectionId,
id: ticket.customer_id
});
Customer includes:
nameemails[]telephones[]tags[]
This allows:
- identifying the user
- grouping tickets by customer
- enriching support workflows
Step 5: Retrieve conversation history (notes)
const notes = await sdk.ticketing.listTicketingNotes({
connectionId,
ticket_id: ticket.id,
limit: 50,
sort: 'updated_at',
order: 'asc'
});
Each note includes:
descriptioncustomer_idticket_iduser_id
Use this to:
- reconstruct conversation threads
- display agent replies
- power AI summarization or drafting
Step 6: Classify and route the ticket
First, retrieve available categories:
const categories = await sdk.ticketing.listTicketingCategories({
connectionId,
limit: 50
});
Then assign during triage:
await sdk.ticketing.updateTicketingTicket({
connectionId,
id: ticket.id,
ticketingTicket: {
priority: 'high',
category_id: 'billing_issues',
user_id: 'agent_123',
tags: ['vip', 'refund']
}
});
This step standardizes:
- routing
- ownership
- classification
Step 7: Respond to the ticket (create a note)
await sdk.ticketing.createTicketingNote({
connectionId,
ticketingNote: {
ticket_id: ticket.id,
customer_id: ticket.customer_id,
description: 'We've identified the issue and are processing your refund.',
user_id: 'agent_123'
}
});
This works across all integrated platforms without adapting to:
- Zendesk comments
- Intercom replies
- Freshdesk notes
Step 8: Update ticket status
await sdk.ticketing.updateTicketingTicket({
connectionId,
id: ticket.id,
ticketingTicket: {
status: 'CLOSED',
closed_at: new Date().toISOString()
}
});
Status is normalized:
ACTIVECLOSED
Step 9: Keep data in sync
Tickets
- Webhooks for real-time updates
- Poll with
updated_gteas fallback
Notes
- Webhooks where supported
- Poll
/notewithupdated_gteif needed
await sdk.ticketing.listTicketingNotes({
connectionId,
updated_gte: lastSyncTime
});
Customers
- Poll-based sync for consistency
- Webhooks when available
Categories
- Poll periodically (low change frequency)
Final Architecture
This flow gives you:
- real-time ticket ingestion (webhooks)
- unified ticket + customer model
- full conversation reconstruction
- consistent triage and routing
- cross-platform response handling
- reliable fallback via polling
All without writing:
- per-platform ticket logic
- per-platform comment handling
- per-platform customer retrieval
What this enables
- unified support dashboards
- AI support agents operating across tools
- automated ticket routing systems
- cross-platform analytics and reporting
- shared inbox experiences across multiple support systems