How to Triage Inbound HR Inbox Requests into Monday Tickets
Build a Spojit workflow that polls your HR mailbox, classifies each incoming request with AI, files it as a ticket on the right Monday board, and notifies the team in Slack.
What This Integration Does
HR teams receive a constant stream of mixed requests in one shared inbox: leave questions, onboarding paperwork, payroll corrections, benefits enquiries, and policy queries. Sorting them by hand is slow and easy to drop. This Spojit workflow reads each new message as it arrives, asks the intelligent layer to decide what kind of request it is and how urgent it is, then creates a tracked item on the matching Monday board so nothing falls through the cracks. A short Slack message tells the responsible group that a new ticket is waiting.
The workflow runs on an Email trigger that polls a connected Gmail or Outlook HR mailbox on an interval (default every 2 minutes). Each new message produces one execution. The trigger output carries the message subject, from, textBody, and related fields, which flow through an AI classification step into a Monday create-item call and a Slack send-message call. The mailbox is read-only by default, so the original email is left untouched unless you opt into after-processing. Re-runs are safe per message: each new email triggers exactly one run, and Spojit does not re-process mail it has already seen.
Prerequisites
- A connected HR mailbox: add it under Connections → Add connection → Gmail (trigger) or Outlook (trigger) (OAuth, read-only is enough for this build).
- A Monday connection (API token) with access to the boards you will file tickets on.
- A Slack connection with permission to post to the HR notification channel.
- The Monday
boardIdvalues for each request category, plus thegroupIdand the column IDs you want to populate (for example a status column and a priority column). Use the Mondaylist-boardsandget-boardtools once to read these IDs. - The Slack channel ID (or name) for HR notifications.
Step 1: Add the Email trigger
Start a new workflow in the Spojit designer and set the Trigger node type to Email. Choose your connected HR mailbox, pick the folder to watch (for example the Inbox), and set the poll interval (1 to 60 minutes, default 2). Optionally add a From allowlist or a Subject regex if you only want to triage mail from certain senders or matching subjects. Leave after-processing off so the mailbox stays read-only. Each polled message exposes its data downstream as fields such as {{ input.subject }}, {{ input.from }}, {{ input.textBody }}, and {{ input.receivedAt }}.
Step 2: Classify the request with a Connector node in Agent mode
Add a Connector node set to Agent mode so the intelligent layer reads the message and returns a structured decision. Give it a prompt that names the categories and urgency levels you use, and pass in the email content. Define a Response Schema so the output is reliable JSON you can branch on:
{
"type": "object",
"properties": {
"category": { "type": "string",
"enum": ["leave", "onboarding", "payroll", "benefits", "policy", "other"] },
"priority": { "type": "string", "enum": ["low", "normal", "high"] },
"summary": { "type": "string" }
},
"required": ["category", "priority", "summary"]
}
In the prompt, reference the email directly, for example: Classify this HR request. Subject: {{ input.subject }}. From: {{ input.from }}. Body: {{ input.textBody }}. Save the result to an output variable such as triage so later steps can read {{ triage.category }}, {{ triage.priority }}, and {{ triage.summary }}.
Step 3: Route to the correct board with a Condition node
Add a Condition node that branches on {{ triage.category }}. Each branch leads to its own Monday step pointed at the matching board (leave goes to the leave board, payroll to the payroll board, and so on). If you would rather keep one Monday step, you can instead map the board ID with a small lookup in a Transform node and feed a single boardId variable into Step 4; the Condition approach is clearer when each category needs different columns or groups.
Step 4: Create the Monday ticket in Direct mode
On each branch add a Connector node for Monday in Direct mode and pick the create-item tool. Map the inputs: set boardId to that branch's board, set name to a readable ticket title, and optionally set groupId to place the item in the right group. Use columnValues to populate your status and priority columns, keyed by their column IDs:
boardId: "1234567890"
name: "{{ triage.category }} - {{ input.subject }}"
groupId: "topics"
columnValues: {
"status": { "label": "New" },
"priority": { "label": "{{ triage.priority }}" },
"text": "From {{ input.from }} - {{ triage.summary }}"
}
Direct mode keeps this step deterministic and free of AI cost. Save the result to a variable such as ticket so the next step can reference the created item's ID. If you also want to attach the full email body to the item, add a second Monday step using create-update against {{ ticket.id }}.
Step 5: Notify the HR team in Slack
Add a Connector node for Slack in Direct mode and pick the send-message tool. Post to your HR channel with a short, scannable summary:
channel: "C0HRREQUESTS"
text: ":memo: New {{ triage.category }} request ({{ triage.priority }})
From: {{ input.from }}
{{ triage.summary }}
Filed on Monday as item {{ ticket.id }}"
If you want to ping a specific person rather than a whole channel, you can first run the Slack lookup-user-by-email tool to resolve an address into a user, then send to that user.
Step 6: Acknowledge the requester (optional)
Add a Send Email node to reply from Spojit's built-in mail service so the employee knows their request was received. Set Recipients to {{ input.from }}, give it a subject like We received your HR request, and write a short body that echoes {{ triage.summary }}. External recipients must be on your org allowlist (Settings → General → Email recipients). To reply from your own HR domain instead, use the Resend or SMTP connector.
Step 7: Save and enable
Save the workflow and enable it so the Email trigger begins polling. From here, the intelligent layer (Miraxa) can help you refine it in place. Open the chat on the designer page and try a prompt like: Add a Condition node that routes {{ triage.priority }} equal to high to a Slack send-message step that posts to the on-call channel. Miraxa, the intelligent layer across your automation, will scaffold the node and connect it, then you fine-tune the fields in the properties panel.
Tips
- Keep the classifier categories short and mutually exclusive; an
otherbucket that routes to a triage board prevents misfiled tickets from disappearing. - Use Direct mode for the Monday and Slack calls so only the classification step spends AI credits. This keeps cost low and the writes predictable.
- Set a lower poll interval (1 to 2 minutes) only if HR needs near-real-time tickets; a longer interval reduces noise and runs.
- Add a high-priority Slack message for urgent requests by branching on
{{ triage.priority }}so the right people see them immediately.
Common Pitfalls
- Wrong column IDs. Monday
columnValuesare keyed by column ID, not by the column's display label. Runget-boardonce to read the real IDs before mapping. - Status label mismatches. A status column only accepts labels that already exist on the board. Make sure your
columnValueslabels (for exampleNew) match the board's configured options. - Read-modify scope. Marking emails read or moving them after processing needs Read+modify access on the mailbox connection; the default read-only scope cannot do it.
- Unstructured AI output. Without a Response Schema, the Agent mode step can return prose that your Condition node cannot branch on. Always force the JSON shape shown in Step 2.
Testing
Before turning the workflow loose on the live HR inbox, test on a small scope. Add a temporary Subject regex on the Email trigger (for example matching [TEST]) so only your own test messages run, then send yourself a few sample requests covering each category. Watch the run in the execution history: confirm the classifier returns the expected category and priority, that the Monday item lands on the correct board with the right columns, and that the Slack message posts. Once the routing looks right across all categories, remove the test regex and enable full polling.