Tying client updates to case milestones reads like a two-day build. Watch the matter, notice the stage change, send a text. We run this in production for a Social Security disability firm and the sending was the easy part.

Four things bit us. One of them is in the docs if you read closely enough. The other three you only find by shipping it.

1. Nothing will tell you what a field changed from

This is the one that reshapes the whole design.

Read a matter through Clio's REST API and you get its current location, the scalar holding the case stage. You do not get when that value last changed, because there is no per-field modification timestamp. So "message the client 24 hours after the case moves to post-hearing" is not a question the read API can answer.

Webhooks get you closer than most people expect. Clio's matter.updated webhook takes a fields parameter, and once you name a field there, it only fires when that particular field changes. That is a real change event, and it is the first thing to reach for.

It still does not finish the job, for two reasons.

The event tells you the field changed. It does not tell you what it changed from, and a stage moving backward is a different message than a stage moving forward, if it deserves a message at all. Knowing the previous value means you were storing it anyway.

The other reason is that the first event for any given record is a false positive by design. Clio documents this: if it has never sent you a webhook for a record before, the next update to that record fires no matter which field moved, including fields you never subscribed to. So your first notification for every matter in the firm is untrustworthy, which drops you straight into the problem in the next section.

Either way you end up keeping each matter's last-known stage and diffing it, which is what we do. If you diff on a poll instead of an event, one more thing follows: your polling interval becomes part of the product. Check daily and "24 hours after the move" really means somewhere between 24 and 48 hours. That is fine for a case update. It would not be fine for a deadline.

2. Turning it on messages everybody at once

The first live run is the dangerous one. A firm with hundreds of open matters already has cases sitting at every stage. A system that sends on "matter is at post-hearing" will, on day one, send to every matter that has been sitting at post-hearing for months.

We had about 29 matters already parked at post-hearing. All of them would have been texted within a minute of go-live, most about a stage they reached long ago.

The fix depends on the trigger type. For status-driven stages, the first run seeds: it records where every matter currently is and sends nothing at all, so only movement witnessed afterwards counts. For date-driven stages, a cutoff date does the same job, and anything filed before it is held back deliberately.

Neither is clever, and skipping either one turns a launch into an apology.

3. Send immediately and you will publish someone's mistake

Staff update a case as they work it, which means the moment a field changes is also the moment it is most likely to be wrong. Someone selects the wrong stage, notices, and fixes it a few minutes later.

If your automation fires instantly, the client already has a text saying their case reached a hearing level it has not reached, and the correction is now the firm contradicting itself in writing.

Every stage we send carries a hold. Most are 24 hours, the request-for-hearing one is 72. Almost every genuine mis-click gets corrected well inside that window, so the message simply never goes out. That hold is doing the work of a proofreader you do not have to staff.

4. Date fields and status fields need different clocks

Worth separating explicitly, because treating them alike produces bugs that only appear at the edges.

A date field, like "Request for Hearing Filed", carries its own meaning. Staff can fill it in a week late and the date is still the date, so the hold counts from the value in the field.

A status change carries no date at all. The only clock available is when your system learned about it, which on a webhook is close to the real thing and on a poll is off by up to one interval. Two stages that look identical in a spec behave differently in production, and the second one inherits the accuracy of however you are watching.

What it actually buys

The point of all this is not the texts. It is that the "what is happening with my case" calls drop, because the client already heard, and nobody on staff is maintaining a list of who is due for an update.

That only holds if the messages are trustworthy. One update about a stage the case did not reach undoes months of the client believing what the firm tells them, which is why the unglamorous parts above got more attention than the sending.

The overview of how this fits with the rest of a firm's operations is in how to automate client status updates, and the disability-specific version, where these stages come from, is in AI automation for Social Security Disability firms.