There are a few ways to do this:
Events
As @Nulik said in the comments above, you can set up a worker to read all the events that come out of a contract and perform your action on these events. This does not work if there is no event emitted from the contract to check what you are trying to do.
Calling the Contract
You can set up a worker (similar to the one mentioned above) that constantly calls the relevant public variables from the contract to read if they have been updated. It will function similarly to an event, in that you can look for updates to the contract and perform actions based on those updates. This does not work if what you are looking for does not change the state or update a public variable in the contract.
Watching the Address
A final solution may be to simply set up a watcher to watch the address of the contract itself and inspect it for incoming transactions. If there is a specific function you are looking for, you know that each transaction going in with the data to call that function is going to be what you are looking for (when a function is called, the first 4 bytes of data are the method ID). From here, you can analyze the data for whatever it is you are searching for.