Skip to main content
A daily renewal watch flags every account approaching renewal at 90, 60, and 30 days so no contract slips past its owner. Each day, the people who manage customer accounts get a task on the right day and one digest of what is at risk. They no longer find out about a lapsed contract after it is too late. The build chains a few free blocks together. A Recurring schedule fires once a day. Find records pulls the accounts that have a renewal date. A Loop walks each one. Adjust time works out the three window dates. An If condition keeps only the accounts that match. Then Create task, Update record, and a Broadcast message digest do the work.

Prerequisites

  • An Attio plan on the Plus tier or higher.
  • An Accounts object, or your equivalent customer object. It needs a renewal_date date attribute that is filled in on active contracts.
  • An owner attribute on the account. It must point to a workspace member who can receive tasks, such as Priya Sharma.
  • A renewal_notified_window attribute on the account. This records which window has already fired. Use a single-select or text attribute that stores a value like 90, 60, or 30. Create this attribute before you build, because the workflow reads and writes it on every match.
  • The Slack integration connected, if you want the digest posted to a channel. Without it, the built-in Broadcast message block notifies in-app instead.
  • No API keys or scopes are needed, because every block in this workflow runs inside Attio.

How it works

The workflow runs once a day. It loads every account that has a renewal date, then checks each account against three fixed windows: 90, 60, and 30 days out. A window is a single target date, today plus that many days. An account matches when its renewal lands in a window it has not been told about yet. When that happens, three things follow. The owner gets a task. The record gets a stamp so the same window never fires twice. The account also gets a line in the daily digest. The flow runs in this order:
  1. Recurring schedule fires daily at a fixed time.
  2. Find records loads accounts where renewal_date is not empty.
  3. Loop iterates each matched account.
  4. Adjust time computes the 90-, 60-, and 30-day boundary dates from today.
  5. If checks that the renewal falls inside a window and that the window has not been notified yet.
  6. Create task assigns a renewal task to the account owner.
  7. Update record sets renewal_notified_window so the window fires once.
  8. Broadcast message posts the daily digest of flagged accounts.

Build steps

1

Add the recurring schedule trigger

Add a Recurring schedule trigger and set it to run once per day. Pick a time early enough that owners see their tasks before the morning standup. Set the team’s primary timezone so the windows line up with how people read dates.
2

Find accounts with a renewal date

Add a Find records block on the Accounts object. Filter to accounts that actually have a renewal date. That way the loop never walks the whole book of accounts.
3

Loop the matched accounts

Add a Loop block over the output of the Find records block. Every step inside the loop runs once per account.
4

Compute the window boundaries

Add an Adjust time block inside the loop. It computes the 90-, 60-, and 30-day boundary dates from today. Add the block once per window, or compute all three and compare them in the next step. Each window is today plus N days. An account matches when its renewal_date equals that boundary date.
5

Gate on the window and the notified flag

Add an If block so the run continues only for the right accounts. An account passes when its renewal lands in a window it has not been notified about. This gate stops duplicate tasks across days. It is free, and it does the real hygiene work.
6

Create the renewal task

Add a Create task block. It assigns the work to the account owner when the If block passes. Name the window in the task text so the owner reads the urgency at a glance.
7

Stamp the notified window

Add an Update record block right after the task. It stamps the matched window so the window cannot fire again tomorrow. This single write guarantees that each window fires once.
8

Post the daily digest

Add a Broadcast message block after the loop to summarize the accounts flagged on this run. A Slack block works too, as shown in Variations. Reference the loop’s collected matches so the digest lists every account, not just the last one.

Variable mapping

Credit cost worked example

The schedule, Find records, Loop, Adjust time, and the If condition are all free. They are logic and lookup blocks, so they consume no credits, even across hundreds of loop iterations. A condition that stops a run is also free. Accounts that do not match cost nothing. You only pay on a matched window. Two writes run per account there. One is the Create task and one is the Update record, at 1 credit each, for 2 credits per matched window. The Broadcast message digest is free, so the daily post adds nothing. Suppose 25 accounts cross a window in a typical month. The writes cost 25 × 2 = 50 credits. The daily schedule, the lookups, the loop, and the digest all add nothing. So the workflow costs about 50 credits a month. Check your plan’s monthly allowance on Credits & pricing explained before you scale the volume of accounts you watch.

Test plan

  1. Set the Find records limit and the Loop max iterations to 5 so a test run stays small.
  2. Pick one account, set its renewal_date to exactly today plus 90 days, and clear its renewal_notified_window.
  3. Open the workflow and click the Run test button to fire the schedule manually.
  4. Confirm the output of each block. Find records returns your test account. Loop iterates it. Adjust time produces a 90-day boundary equal to the account’s renewal date. If passes. Create task creates one task for the owner. Update record sets renewal_notified_window to 90. Broadcast message posts a digest naming the account.
  5. Open run history to confirm the task was created and the flag was stamped. Run the test again on the same day and confirm no second task appears, because the If block now skips the account.
  6. Send a deliberately failing input. Set the account’s renewal_date to 45 days out, which falls between windows, and run the test. The If block fails, the loop skips the account with zero credits spent, and no task is created.

Failure modes

Variations

Per-window message

Branch the task text and digest copy by window so a 30-day renewal reads more urgently than a 90-day one. Add a Switch block after the If block to route to three Create task configurations, each with its own wording and due date. Everything else stays the same, and the Switch block is free.

Customer success versus account executive owner

Route the task to a customer success manager for existing-customer renewals and to an account executive for expansion-eligible accounts. Add a Filter or Switch block on an account segment attribute, then set the Create task assignee accordingly. Only the assignee mapping changes. The windows and the notified flag are untouched.

See also


Source: Attio Help Center: Workflows. Last reviewed against the Attio Help Center, June 2026.