webhook for the normal path, plus a nightly job that re-reads the subscription and fixes anything that drifted, since a missed webhook during a deploy is the usual way those columns go stale. and yeah current_period_end is probably the next column i'd add, "when do i renew" is the question that still sends you to the dashboard. how often does your nightly check actually catch something?
Not often, maybe a handful of rows a month, and almost always right after a deploy or a webhook endpoint timeout. That rarity is the point though, since those few are exactly the users who would email asking why their plan looks wrong. Logging each fix it makes also tells you when the webhook path itself needs attention.
logging each fix is a good idea, a few rows after every deploy would show you the webhook path is the weak spot. do you get pinged when the nightly job fixes more rows than usual?