Start here. This is the direct spoken answer to practice first.
Why this question matters
Billing is not only payment collection. Product access depends on a trustworthy entitlement boundary that keeps provider events, plan rules, and API authorization consistent.
I would model plans and entitlements separately from payment provider records. Provider webhooks update subscription state through an idempotent ingestion path, then the application derives effective entitlements for the account. Product APIs check those entitlements server-side before allowing gated actions. The UI can display plan state, but it cannot be the source of access truth.