A minimal Zendesk: inbound email becomes a ticket, replies thread onto it, and agents work the queue from a dashboard app.
Windmill concepts demonstrated
- Email trigger — mail sent to the support address opens or updates a ticket.
- Preprocessor — normalizes messy email headers before the handler runs.
- Raw app — the agent inbox: read threads, reply, change status.
- Resource + variables — the SMTP account, and the address replies come from.
- Datatables — stores tickets and their message threads.
Layout
helpdesk_inbound.ts Email-trigger handler (preprocessor + upsert ticket)
helpdesk_inbound.email_trigger.yaml
helpdesk_list_tickets.ts Queue, optional status filter, most recent first
helpdesk_get_ticket.ts One ticket + its full message thread
helpdesk_reply.ts Agent reply over SMTP, appended to the thread
helpdesk_update_status.ts open / pending / closed
helpdesk_set_archived.ts Archive toggle (archived tickets leave the queue)
helpdesk_dashboard__raw_app/ Support inbox UI
How a ticket is born
- A customer emails
support@<workspace>.... - The email trigger fires
helpdesk_inbound; the preprocessor normalizes the message. mainfinds an existing thread (or opens a new ticket) and appends the message.- The agent replies from the dashboard →
helpdesk_replysends over SMTP and records the outbound message on the same thread.
Try it locally
wmill script preview f/helpdesk/helpdesk_list_tickets -d '{"status":"open"}'