A Zendesk App that starts a live countdown timer the moment a ticket is solved, showing agents exactly how long remains in the CSAT survey window. The timer syncs in real-time across all agents viewing the same ticket and persists across page refreshes. Supports channel-specific timer rules for social messaging integrations (WhatsApp, Instagram, Messenger, Telegram, and more).
Built as a freelance project for OmniWise.
CSAT surveys are only sent within a limited window after a ticket is solved. Agents and managers often have no visibility into how much time is left — they just hope the customer responds in time. This app surfaces that countdown directly in the Zendesk interface:
- Live countdown timer in the ticket sidebar — displays HH:MM:SS remaining with a progress bar
- Persisted state — timer resumes correctly after page refresh, pulled from DynamoDB
- Real-time sync — timer start/stop events are broadcast instantly to all agents viewing the same ticket via ZAF API notifications
- Channel-specific rules — define different timer durations for each messaging channel (WhatsApp, Instagram, Messenger, Telegram, WeChat, Viber, and more), or one master rule that applies to all channels
- Follow-up ticket creation — optionally auto-create a follow-up ticket when the CSAT window closes, with a custom ticket field for opt-in per ticket
- Agent notification center — top bar panel shows timer events and follow-up ticket alerts with read/unread state
| Layer | Technology |
|---|---|
| App Platform | Zendesk App Framework (ZAF SDK v2) |
| Social Channels | Sunshine Conversations (Sunco) API |
| Auth | Zendesk OAuth 2.0 |
| Frontend | Vanilla JavaScript, HTML, CSS |
| Backend | AWS API Gateway + Lambda + DynamoDB |
Accessible from the nav bar, the admin panel has three tabs:
Timers tab
- Create, edit, and delete timer definitions per channel
- Select master channel (e.g. WhatsApp) and sub-channel (e.g. a specific WhatsApp integration)
- Or set one "Master Rule" that applies across all channels
- Validates against duplicate channel rules before saving
- Automatically creates and manages the required Zendesk webhooks and triggers
Sunco API tab
- Connect Sunshine Conversations credentials (App ID, Key ID, Secret Key)
- Lists all active social messaging channel integrations for selection
- Toggle between master rule mode and per-channel mode
Settings tab
- Enable/disable automatic follow-up ticket creation on CSAT window close
- Select which ticket forms should include the follow-up opt-in field
- Grant or revoke app admin access to non-Zendesk-admin agents (with search)
- When a ticket is solved, a Zendesk trigger fires a webhook to the backend
- The backend stores the timer start time, duration, and status in DynamoDB
- The sidebar app loads the timer state and starts a
setIntervalcountdown - A ZAF
api_notificationevent broadcasts the start to all agents on the same ticket simultaneously - If the ticket is reopened, a stop trigger fires, clears the interval, and resets the UI across all open instances
- On page reload, the sidebar fetches the stored start/due dates and resumes the countdown from the correct position
├── manifest.json # Zendesk app config
├── assets/
│ ├── SideBar.html/sideBar.js # Live countdown timer (per ticket)
│ ├── NavBar.html/navBar.js # Admin panel (timers, Sunco, settings)
│ ├── top_bar.html/topBar.js # Agent notification center
│ ├── back.html # Background event listener
│ └── css/ # Styles
└── translations/en.json # i18n strings
Private — built for a client.