Find client cases that have stopped moving in Trello

Bring Trello client cases with no recent activity into a Slack review list, with direct card links for the team to check what is holding them up.

Automate.ax team6 min read

Integrations used in this example

Spot quiet cases before the client asks again

Teams use Trello to track client cases that move through several lists over a few days. When the board holds hundreds of cards, a case with no recent action is hard to spot just by scanning the columns.

This example checks open cards across one board on weekdays, filters to the lists that represent active work, and posts a Slack list of cards with no Trello activity for your chosen number of days. A teammate checks the case before contacting the client.

A team described tracking around 300 insurance applicants in Trello through a two-to-five-day process with frequent status changes.Source: a Trello board tracking hundreds of client applications

What you'll tell the agent

  • The Trello board and the list IDs that mean a case is actively being worked. The agent can identify these after authorization.
  • A quiet-days threshold and a Slack channel for the internal case team.
  • Account authorization for Trello and Slack. Slack requires a paid workspace for the current Automate.ax connection.

The agent will create the project and ask you for these details. When Automate.ax asks you to connect an account, authorize the integrations you want this workflow to use.

The automation

The board-wide read covers up to 1,000 open cards. Filtering by active list avoids alerts for cards intentionally parked or already complete.

trello-client-case-stalls.automation.ts
import { automation, onSchedule, t, transform } from "automate.ax"
import { slack } from "automate.ax/slack"
import { trello } from "automate.ax/trello"
import { z } from "zod"

export default automation(
  "Flag client cases that stopped moving",
  {
    parameters: [
      { label: "Trello board ID", name: "boardId", type: "text" },
      {
        label: "Active list IDs JSON",
        name: "activeListIdsJson",
        type: "text",
      },
      { label: "Quiet days before alert", name: "quietDays", type: "text" },
      { label: "Slack case channel ID", name: "slackChannelId", type: "text" },
    ],
  },
  ({ parameters }) => {
    const activeLists = z
      .array(z.string())
      .parse(JSON.parse(parameters.activeListIdsJson))
    const quietDays = z.coerce
      .number()
      .int()
      .positive()
      .parse(parameters.quietDays)
    const tick = onSchedule({ schedule: "0 9 * * 1-5", timeZone: "UTC" })
    const cards = trello.listBoardCards({
      board: parameters.boardId,
      filter: "open",
      limit: 1000,
    })

    const stalled = transform([cards, tick], (boardCards, { scheduledAt }) =>
      boardCards
        .filter(
          (card) =>
            activeLists.includes(card.listId) &&
            card.lastActivityAt != null &&
            scheduledAt.getTime() - card.lastActivityAt.getTime() >=
              quietDays * 86_400_000,
        )
        .map((card) => `• ${card.name}: ${card.shortUrl}`),
    ).filter((lines) => lines.length > 0)

    slack.sendMessage({
      conversation: parameters.slackChannelId,
      text: t`Open client cases with no Trello activity for ${quietDays} days:\n${stalled.transform((lines) => lines.join("\n"))}\nCheck the case before contacting the client.`.transform(
        escapeSlackText,
      ),
      unfurlLinks: false,
    })
  },
)

/** Keeps provider text from becoming Slack mentions or control markup. */
function escapeSlackText(text: string) {
  return text
    .replaceAll("&", "&")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
}

What a run looks like

Example input

A card in the Processing list has had no Trello activity for three days; the threshold is two days.

Expected result

The weekday Slack alert includes the card title and link so the case owner can investigate.

Set it up

  1. Copy the setup prompt at the top into your coding agent.
  2. Choose the board and active lists with the agent; do not include completed or waiting-on-client lists unless you want them monitored.
  3. Authorize Trello and a paid Slack workspace, then compare the first alert with cards in each relevant list.

Check the result

Place disposable cards in an active and a completed list, give them different activity ages, and confirm that only the old active card is listed.

Where this workflow stops

  • Trello last activity is any card activity, not proof a case advanced. The alert asks for a human check.
  • The board read is capped at 1,000 open cards. Increase the design to use cursors if the board exceeds that limit.
  • The code posts links to cases in a Slack channel. Use an internal channel appropriate for client information.

Common questions

Does the automation move cards?

No. It only flags cards that may need attention.

Will it cover a board with 300 cards?

Yes. It reads open cards across every board list with a 1,000-card limit, then filters to the active lists you choose.

More automation examples