How to Send New-Hire Welcome Emails from a Monday Onboarding Board
Build a Spojit workflow that checks a Monday.com onboarding board on a schedule, finds new hires whose status is ready, and sends each one a personalized welcome email written by Miraxa.
What This Integration Does
HR teams often track new hires on a Monday.com board: one item per person, with columns for start date, status, manager, and a work email. This tutorial turns that board into an automation. On a recurring schedule, Spojit reads the board, picks out the people who are flagged as ready to be welcomed, and sends each of them a tailored welcome email. Instead of someone copy-pasting a template and filling in names by hand, every new hire gets a warm, specific message the moment their row is ready, and the board is updated so nobody is emailed twice.
The workflow runs on a Schedule trigger (for example every weekday morning), so there is no inbound event to wait for: each run reads the current board state, processes only the rows that match your filter, sends one email per person through Spojit's built-in mail service, and writes a status back to Monday.com so the next run skips anyone already handled. Re-runs are safe because the status write is what makes each item idempotent: a hire that has already been welcomed no longer matches the filter, so a second run that morning sends nothing extra.
Prerequisites
- A Monday.com connection added under Connections -> Add connection, with access to the onboarding board you want to read.
- The board ID of your onboarding board, plus the column IDs for the fields you care about (status, work email, manager, start date). You can read these from the board itself in Step 2.
- A status column (or similar) on the board that marks which rows are ready to welcome, for example a
Welcome statuscolumn with values likeReadyandSent. - Each new-hire item must carry a valid work email address in one of its columns; Spojit sends to that address.
- If you send to external (non-org) addresses, add the relevant domains to your Settings -> General -> Email recipients allowlist so the Send Email node can deliver.
Step 1: Add a Schedule trigger
Create a new workflow in the Spojit designer and add a Trigger node, then set its type to Schedule. A schedule uses a 5-field Unix cron expression plus an IANA timezone. To run on weekday mornings at 9am in Sydney, set the cron to 0 9 * * 1-5 and the timezone to Australia/Sydney. A single trigger can hold more than one schedule if you want, for example, both a morning and an afternoon sweep. The trigger output is simply { scheduledAt }, which you do not need downstream; the real data comes from Monday.com in the next step.
Step 2: Read the onboarding board
Add a Connector node in Direct mode, choose your Monday.com connection, and select the list-items tool. Set boardId to your onboarding board's ID and limit to a comfortable page size such as 25. The tool returns each row as { id, name, column_values, group }, where every entry in column_values is { id, text, value } (the text field is the rendered cell value, which is what you usually want).
If you do not yet know your column IDs, run a Connector node with the get-board tool once (set id to the board ID). Its output lists the board's columns as { id, title, type } so you can match each human-readable column title to the column ID you will reference later. Note the IDs for your status, work email, manager, and start-date columns.
Step 3: Keep only the new hires that are ready
The board returns every row, so narrow it to the people who should be welcomed on this run. Add a Transform node that walks {{ list_items_result.items }} and keeps only rows whose status column reads Ready, pulling each person's name and email into a clean shape. A simple output per person looks like this:
{
"itemId": "{{ item.id }}",
"name": "{{ item.name }}",
"email": "<work email column text>",
"manager": "<manager column text>",
"startDate": "<start date column text>"
}
Because column_values is a list keyed by column ID, match each value by its id (the IDs you noted in Step 2) and read its text. The result is an array of ready-to-welcome hires; if it is empty, the run finishes with nothing to do, which is exactly what you want on a quiet morning.
Step 4: Loop over each ready hire
Add a Loop node in ForEach mode and point it at the filtered array from Step 3 (for example {{ ready_hires }}). Everything inside the loop body runs once per new hire, with the current person available as the loop's current item. This keeps one new hire's email completely independent of the next, so a single bad address does not stop the others.
Step 5: Write a personalized welcome with Miraxa
Inside the loop, add a Connector node in Agent mode so Miraxa, the intelligent layer across your automation, drafts a unique message for each hire rather than reusing one static template. Give it the person's details and a clear instruction. A strong prompt is specific:
Write a warm, concise welcome email for a new hire.
Name: {{ hire.name }}
Manager: {{ hire.manager }}
Start date: {{ hire.startDate }}
Tone: friendly and professional. 120-160 words.
Mention their start date, who their manager is, and that
they can reply to this email with any questions.
Return JSON only.
Turn on the node's Response Schema so the output is reliable structured JSON with two fields, for example subject and body. Forcing the shape means the next step can read {{ welcome.subject }} and {{ welcome.body }} directly without parsing free text. Agent mode uses AI credits, so keep the prompt focused on a single short email.
Step 6: Send the email
Still inside the loop, add a Send Email node, which sends through Spojit's built-in mail service with no extra connection required. Set Recipients to the hire's address ({{ hire.email }}), Subject to {{ welcome.subject }}, and Body to {{ welcome.body }}. Leave Reply-To as the workflow owner, or set it to your HR inbox so replies land somewhere a person reads. For If sending fails, choose Continue anyway so one undeliverable address does not abort the whole batch. Remember that external recipients must be on your org's email allowlist, and these emails count toward your monthly email allowance. If you need messages to come from your own HR domain instead, swap this node for a Connector node using the Resend or SMTP connector's send-email tool.
Step 7: Mark the hire as welcomed
As the last step inside the loop, add a Connector node in Direct mode using the Monday.com update-item tool to flip the status so this person is not emailed again. Set boardId to your board ID, itemId to {{ hire.itemId }}, and pass columnValues as an object keyed by column ID. For a status column, the value is an object such as:
{
"<status_column_id>": { "label": "Sent" }
}
This write is what makes re-runs safe: once an item reads Sent, your Step 3 filter no longer keeps it, so the next scheduled run skips it. Optionally, also add a Connector node with the create-update tool to post a timestamped note on the item (set itemId to {{ hire.itemId }} and body to something like Welcome email sent by Spojit) for an audit trail on the board.
Tips
- If your board can hold more new hires than one page returns, raise
limitonlist-itemsor follow thecursorin the result to page through additional rows before filtering. - Use a distinct status value (for example
Sentrather than reusingDone) so the welcome workflow's filter never collides with other onboarding steps your team tracks on the same board. - Keep the Agent-mode prompt short and capped at a word count; a tighter prompt with a Response Schema costs fewer credits and produces a more consistent email subject and body.
- Ask Miraxa to scaffold the canvas for you, for example: "Add a Loop node over {{ ready_hires }}, then inside it a Send Email node to {{ hire.email }}," then fine-tune the fields in the properties panel.
Common Pitfalls
- Reading the wrong column: Monday.com returns
column_valueskeyed by column ID, not by the title you see in the UI. Confirm IDs withget-boardfirst, or you may map an empty cell and email a hire with a blank name. - Skipping the status write-back: if Step 7 is missing or fails silently, every scheduled run re-sends to the same people. Always update the status, and set If sending fails to continue so a failed email does not block the status update logic for the rest of the batch.
- Timezone surprises: a schedule cron is evaluated in the IANA timezone you set, not the viewer's local time. Double-check
Australia/Sydneyversus UTC so the "morning" run actually fires in the morning. - Allowlist blocks: external recipients that are not on your Settings -> General -> Email recipients allowlist will not receive mail. Add the domains before going live.
Testing
Validate on a tiny scope first. Create one or two test items on the board with your own email in the work-email column and the status set to Ready, then temporarily lower limit on list-items and run the workflow with the trigger's Run button rather than waiting for the schedule. Confirm you receive the personalized email, then open the item on the board and check that the status flipped to Sent. Run it a second time and verify nothing new arrives, proving the re-run guard works. Once the small test passes, point the workflow at the real board and enable the schedule.