How to Route Customer Feedback Emails to Slack and Monday with AI Sentiment

Forward feedback emails to a Spojit Mailhook, score sentiment and theme with AI, post the negative ones to Slack, and log every message as a Monday.com item.

What This Integration Does

Customer feedback arrives as email from all directions: replies to a survey, messages forwarded by your support inbox, alerts from a review platform. Reading every one by hand is slow, and the angry ones are exactly the ones you cannot afford to miss. This workflow gives feedback a single front door. You point an email address at Spojit, and each message is scored by an Agent-mode Connector node for sentiment and theme. Anything negative is pushed to a Slack channel so your team can react in minutes, while every message, positive or negative, lands as a row on a Monday.com board so nothing is lost and trends stay visible.

The workflow runs on a Mailhook trigger, so it fires within seconds of an email arriving, with no mailbox or polling to manage. Each email becomes one independent run. An Connector node in Agent mode reads the email body and returns a small structured object (sentiment, score, theme, summary). A Condition node routes negative feedback to a Slack post, and a reusable Subworkflow logs the result to Monday.com on every run. Runs are deduplicated per message, so the same email forwarded twice will not double-post. Because each run is isolated, a malformed email fails only its own run and never blocks the next.

Prerequisites

  • A Slack connection (OAuth) in Connections, with access to the channel you want negative feedback posted to. Have the target channel ID ready (for example C0123456789).
  • A Monday.com connection (OAuth or API token) in Connections, plus the boardId of the board where feedback rows should land and the column IDs you want to populate (sentiment, theme, summary, email address).
  • A place that can forward or send feedback email: a survey tool, a support inbox forwarding rule, or a review platform notification address.
  • Permission to create workflows in your workspace. Building the Monday.com logging step as a Subworkflow is optional but recommended if you log to the same board from more than one workflow.

Step 1: Add the Mailhook trigger and generate an address

Create a new workflow and open the Trigger node. Set Trigger Type to Mailhook. Optionally set an Address prefix (1 to 24 characters, default mh) such as feedback so the generated address is recognisable, then click Generate email address. Spojit returns a unique address like feedback-a1b2c3d4e5f6g7h8@mailhook.spojit.com. Copy it and point your feedback source at it (a survey "send results to" address, a forwarding rule on your support inbox, or a review-platform notification recipient).

To cut noise, add an optional Subject regex (for example feedback|review|survey) and a From allowlist if only certain senders should trigger runs. The trigger output is available as {{ input }} with fields including {{ input.from }}, {{ input.subject }}, {{ input.text }}, {{ input.replyTo }}, and {{ input.receivedAt }}.

Step 2: Score sentiment and theme with a Connector node in Agent mode

Add a Connector node and switch it to Agent mode. Agent mode lets the agent read the raw email and return a clean, structured result rather than you parsing free text by hand. Give it a prompt that points at the email body, for example:

Read this customer feedback email and classify it.
Subject: {{ input.subject }}
Body: {{ input.text }}

Return the overall sentiment, a confidence score from 0 to 1, the
single main theme, and a one-sentence summary.

Define a Response Schema so the output is reliable JSON you can branch on:

{
  "type": "object",
  "properties": {
    "sentiment": { "type": "string", "enum": ["positive", "neutral", "negative"] },
    "score":     { "type": "number" },
    "theme":     { "type": "string" },
    "summary":   { "type": "string" }
  },
  "required": ["sentiment", "theme", "summary"]
}

Set the node's output variable to analysis. Downstream steps then read {{ analysis.sentiment }}, {{ analysis.theme }}, and {{ analysis.summary }}.

Step 3: Branch on sentiment with a Condition node

Add a Condition node after the analysis step. Configure the test to check whether {{ analysis.sentiment }} equals negative. The true branch handles the urgent path (post to Slack); the false branch skips straight to logging. Both branches still reach the Monday.com logging step in Step 5, so positive and neutral feedback is recorded even though it does not alert the team. If you would rather alert on confidence as well, you can add a second test that the {{ analysis.score }} is above a threshold such as 0.6.

Step 4: Post negative feedback to Slack

On the true branch, add a Connector node in Direct mode using the Slack connector and the send-message tool. Direct mode is the right choice here: it is deterministic, costs no AI credits, and you are calling exactly one tool. Map the fields:

  • channel: your target channel ID, for example C0123456789.
  • text: a templated summary line, for example :warning: Negative feedback from {{ input.from }} - theme: {{ analysis.theme }}. {{ analysis.summary }}.

The text field doubles as the notification fallback, so always fill it. If you want richer formatting, the send-message tool also accepts an optional blocks array for Block Kit layout, but the plain text field is enough to get the team moving.

Step 5: Log every message to Monday.com via a Subworkflow

So the same logging logic can be reused and stays in one place, build a small child workflow that writes a Monday.com row, then call it from this workflow with a Subworkflow node. In the child workflow, start with a Manual trigger and add a Connector node in Direct mode using the Monday.com connector and the create-item tool. Map its fields:

  • boardId: the feedback board ID.
  • name: the item title, for example the email subject passed in from the parent.
  • columnValues: a structured object keyed by your column IDs, for example:
{
  "text_sentiment": "{{ input.sentiment }}",
  "text_theme":     "{{ input.theme }}",
  "long_text_summary": "{{ input.summary }}",
  "email_from":     "{{ input.from }}"
}

Back in the main workflow, place a Subworkflow node so that both Condition branches reach it (negative feedback after the Slack post, positive and neutral feedback directly). Set Workflow to your logging child, and pass the analysis result and email metadata in the Input:

{
  "subject":   "{{ input.subject }}",
  "from":      "{{ input.from }}",
  "sentiment": "{{ analysis.sentiment }}",
  "theme":     "{{ analysis.theme }}",
  "summary":   "{{ analysis.summary }}"
}

The parent pauses while the child runs and resumes with the child's output. Each child run appears as its own execution-history entry, which makes the Monday.com write easy to inspect on its own.

Step 6: Acknowledge the sender (optional)

Because the Mailhook trigger is always asynchronous and sends nothing back to the sender automatically, you can add a Send Email node if you want to thank the customer. Set Recipients to {{ input.replyTo }}, write a short templated Subject and Body, and choose Continue anyway under If sending fails so a delivery problem never blocks the Monday.com log. Note that external recipients must be on your org allowlist under Settings > General > Email recipients.

Tips

  • Keep the Agent-mode prompt short and lean on the Response Schema to force clean output. A tight schema is what makes the Condition branch reliable.
  • Use lookup-user-by-email on the Slack connector first if you want to @-mention the account owner in the alert; feed the result into the text field.
  • Channel and board IDs are stable; copy them once and store them as workflow notes so you are not hunting for them later.
  • If you log to the same Monday.com board from other workflows too, the Subworkflow approach means you update the column mapping in one place rather than in every workflow.

Common Pitfalls

  • Monday.com expects columnValues keyed by the board's internal column IDs, not the visible column titles. Open the column settings to confirm each ID, or the values will not land.
  • The Slack channel field needs the channel ID (for example C0123456789), not the #name. Make sure the connection has been added to that channel or the post will fail.
  • Forwarded feedback often carries quoted history and signatures. If the AI score looks off, trim the prompt to {{ input.text }} only, or instruct it to ignore quoted replies.
  • Mailhook runs are deduplicated per message, but a sender forwarding the same thread as a new email is a new message and will create a new run. Use the Subject regex filter to keep stray mail out.

Testing

Before pointing live traffic at the address, send a few test emails to the generated Mailhook address yourself: one clearly negative, one clearly positive, and one neutral. Open Executions and inspect each run. Confirm the Agent-mode node returned the expected {{ analysis.sentiment }}, that only the negative email reached the Slack post, and that all three produced a Monday.com item with the right column values. Once the small scope behaves, hand the address to your real feedback source and watch the first day of runs in the execution history before relying on it.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.