I've been a part of a few questions on Trailhead related to performing some action in Flow when a field or record hasn't received changes in 30/60/90/+ days. While there are some great ways to tackle this ask, one way to go about this that is pretty neat is querying the records created by Field Tracking History to use in your Flow to determine if changes were made. With this strategy, we can avoid adding extra fields to the object we want to track. Let's take the following ask:

If the status of my Case has not changed in 30 days, I want to automatically assign the Case to a new owner and move the status to a custom value called 'Follow up'.

To do this with the help of field tracking history records, we can aim to accomplish this in 2 different strategies:

Record Triggered Flow with a 30 day path:

To start, let's set field tracking history on the Case status field.

Once complete, we now have the CaseHistory object to work with.

🎩
Your history object name will vary based on the object you are tracking. This does also work for custom objects!

Then, let's look at our Flow.

For entry criteria, I want to take a look at any net new Cases, as well as any cases where the status has changed. These are the values we want to consider in our logic.

From there, we can then consider some logic. We want to

  1. Create a scheduled path that runs 30 days from the date/time of the update
  2. Use a Get Records element to determine if Status has changed in the last 30 days
  3. If yes, run logic to reparent the Case and change the status

We want the scheduled path to run 30 days after the net new case is created or the existing case status was updated.

To get our Field Tracking History (CaseHistory) records, we'd use a Get Records element like the following:

ThirtyDayCheck is simply a formula field which uses TODAY()-30 to find the last 30 days of CaseHistory records. We also only need to query for a single record as if we get even a single returned CaseHistory record with this criteria, we know the field in question was changed.

Finally, we simply need to check if the Get Records element from the earlier step is null or not. If it is null, we are good to run our logic to reparent and re-status the case. If we found CaseHistory records, we will abort the Flow and wait for this to run again!

The other strategy to consider here would be a Scheduled Flow that runs daily. In the same way, we could check nightly for the presence of CaseHistory records going back 30 days. If we found CaseHistory records within the last 30 days, we would do nothing. However, if we did not find any records, we would make our updates to the Case record.

✔️
With this approach, it would be optimal to include a checkbox field on your object to have the scheduled Flow skip the records it updated in the following times it runs. It might be best then to write a small record-triggered flow that would uncheck the checkbox you created whenever the Case status was updated after the fact so the scheduled flow would evaluate it once again!

While I think both of these approaches are great, I tend to like the scheduled Flow option a bit more. Since the checks happen daily, you are less likely to miss a record due to a calculated timezone difference between TODAY() and the CreateDate stamped on the CaseHistory record.

Running Flow automation on unchanged Records