I would suggest a layer of caching is a necessity, and a pattern to ensure consistency should you miss an update or something else goes amiss, a popular safeguard is a list and watch pattern in the absence of stateful change streams.
Implementation of list and watch varies, in terms of webhooks you would listen for updates, but every X minutes poll for a full list of changes (possibly restricting time range) to compare for missed updates. Kubernetes controllers actually do this something like this.
When building your tooling add operations to ensure consistency, so in addition from ./pull-from-coda --watch and ./pull-from-coda [--dry-run] {resync, rebuild} - This will save your behind one day when it matters and time is precious.
On the zapier yes there is no hook for row updates but there is already built in automation to notify users on row change via email, you would need add a user update-consumer@mydomain and consume messages from this - you don’t need to digest pop3/imap if using gsuite, heck you could even build an App Script to consume the mesages and push to your webhook if you wanted to remove the mail dependency completely. This would be the simplest approach given the restrictions combined with the list+watch pattern.
@Codians - Is there a reason row update isn’t exposed as a zapier trigger? Also I’m surprised to see there is a webhook pack where I can simple configure a post URL and subscribe to events such row added to table, updated etc…