How to Post a Daily Customer Communication Digest to Slack

Each morning, gather the prior day's Front conversations, have an agent summarize the recurring themes and still-open issues, and post a clean digest into a Slack channel so your team starts the day aligned.

What This Integration Does

Support and customer teams often live inside their helpdesk and never get a bird's eye view of what happened yesterday. This Spojit workflow runs on a schedule, pulls the previous day's conversations from your Front connector, and asks an Agent-mode Connector node to read every thread and produce a short digest: the dominant themes, the volume of conversations, and the issues that are still open and need attention. It then posts that digest to a Slack channel so the whole team can scan it in seconds during standup instead of clicking through dozens of threads.

The workflow is started by a Schedule trigger (for example every weekday at 8am in your timezone), so no human has to remember to run it. Each run reads conversations from Front, summarizes them with an Agent mode Connector node, and writes a single message to Slack. It leaves no state behind in Spojit: every run is independent and reads a fresh time window, so re-running it simply produces another digest for the same window. Because it only reads from Front and writes to Slack, a re-run is safe and never modifies your customer conversations.

Prerequisites

  • A Front connection added under Connections with an API token that can read conversations. See the Front connector article for setup.
  • A Slack connection added under Connections, with the bot invited to the channel you want to post into. See the Slack connector article.
  • The Slack channel name or channel ID where the digest should land (for example #customer-pulse).
  • Familiarity with the Schedule trigger and Agent mode.

Step 1: Start with a Schedule trigger

On a new workflow canvas, set the Trigger node type to Schedule. Add a schedule using a 5-field Unix cron expression plus an IANA timezone. To run every weekday at 8am Sydney time, use:

0 8 * * 1-5
Australia/Sydney

A single Schedule trigger can hold multiple schedules if you want a second run later in the day. The trigger output is {{ scheduledAt }}, which is the timestamp the run fired. You will use this in the next step to compute yesterday's date window.

Step 2: Compute yesterday's date window

Add a Connector node in Direct mode using the built-in date connector. First call subtract to step back one day from {{ scheduledAt }}, then call format to produce a plain YYYY-MM-DD string. Front's search accepts date keywords, so a single formatted day boundary is enough. Map the input roughly like this:

{
  "date": "{{ scheduledAt }}",
  "amount": 1,
  "unit": "day"
}

Save the formatted result to a variable such as {{ yesterday }}. If you prefer, ask Miraxa: "Add a Connector node using the date connector that subtracts one day from {{ scheduledAt }} and formats it as YYYY-MM-DD." It will scaffold the node on the canvas for you.

Step 3: Pull the prior day's Front conversations

Add a Connector node in Direct mode for the Front connector and pick the list-conversations tool. Use the q search field to scope the results to yesterday's activity. Front's search syntax supports an after: date filter, so build the query from your {{ yesterday }} variable:

{
  "q": "after:{{ yesterday }}"
}

Save the output to a variable such as {{ conversations }}. The response is a list of conversation records (subject, status, recipients, and timestamps). If your inbox is busy and the first page does not cover everything, list-conversations returns a pagination token; pass it back as page_token on a follow-up call inside a Loop node to gather additional pages. For most teams a single page is enough for a morning digest.

Step 4: Summarize themes and open issues with an agent

Add a second Connector node, this time in Agent mode, also pointing at the Front connector so the agent can fetch full thread detail with get-conversation when a summary line needs more context. In the prompt, hand the agent the list from the previous step and tell it exactly what you want. For example:

You are preparing a morning customer-communication digest for our team.
Here are yesterday's Front conversations: {{ conversations }}.
Summarize the 3 to 5 recurring themes, give the total conversation count,
and list any conversations that are still open and need a reply today.
Keep it under 200 words and use short bullet points.

To keep the output predictable for Slack, turn on the Response Schema and force a JSON shape such as { "summary": string, "openIssues": string[], "totalCount": number }. Save the result to a variable such as {{ digest }}. Agent mode consumes AI credits, so a tight prompt and a result limit keep cost down.

Step 5: Format the Slack message

Add a Transform node to assemble the final message text from the structured digest. Combine the summary, the count, and the open issues into a readable block. For example, build a value like:

:wave: *Customer pulse for {{ yesterday }}*
{{ digest.summary }}

*Conversations:* {{ digest.totalCount }}
*Still open:*
{{ digest.openIssues }}

This keeps your Slack call simple: the message body is already shaped before it reaches the connector. If you would rather skip the Transform step, you can template these variables directly into the Slack node in the next step.

Step 6: Post the digest to Slack

Add a final Connector node in Direct mode for the Slack connector and choose the send-message tool. Map the channel and the formatted text:

{
  "channel": "#customer-pulse",
  "text": "{{ formattedMessage }}"
}

Make sure your Slack bot has been invited to the target channel, otherwise send-message cannot post there. If you want to reach a private channel, use the channel ID rather than the name. Save and enable the workflow, and the digest will land in Slack every morning the schedule fires.

Tips

  • Keep the Agent mode prompt focused on yesterday's window only; passing too many conversations inflates AI credit usage with little added value for a quick standup digest.
  • Use a Send Email node in parallel with the Slack node if you also want the digest emailed to managers who do not watch the channel. It sends from Spojit's built-in mail service with no extra connection.
  • If your team works across regions, add a second schedule to the same trigger with a different timezone so each office gets the digest at its own 8am.
  • Ask Miraxa "Why did my last run fail?" on the workflow page if a run errors; it can read the execution and point you at the offending node.

Common Pitfalls

  • Timezone drift: the cron expression and the date connector both depend on the IANA timezone you set. If the digest covers the wrong day, confirm the timezone on the Schedule trigger matches the timezone used to format {{ yesterday }}.
  • Bot not in channel: the most common Slack failure is posting to a channel the bot has not joined. Invite it first, then re-run.
  • Empty windows: on quiet days list-conversations may return very few records. Add a Condition node before the Agent step to skip the summary (and the Slack post) when the count is zero, so you do not spend credits on an empty digest.
  • Search scope: the Front q filter searches across your account. If you only want one inbox, narrow the query with Front's inbox search keywords or filter the list in a Transform node before summarizing.

Testing

Before enabling the schedule, validate the flow end to end on a small scope. Temporarily switch the trigger to Manual (or use the Schedule trigger's run option) and run the workflow once by hand. Hard-code {{ yesterday }} to a known busy date so list-conversations returns several threads, then check the execution log to confirm the Front list looks right, the Agent summary reads well, and the Slack message lands formatted in a test channel. Once the digest looks good, point the Slack node at your real channel, restore the Schedule trigger, and enable the workflow.

Learn More

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