Rename finance → monetization (keep finance_* tables via app label), add
RevenueCat webhook + ledger upserts so store IAP syncs subscriptions and
billing history like Stripe. Companion to chat_web_app#100 / #68.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
finance→monetizationDjango app (keepfinance_*tables vialabel = "finance")services/stripe.py+services/revenuecat.py; RevenueCat webhook upserts subscription + Invoice/Payment (billing history parity with Stripe)/api/monetization/+ keep/api/finance/aliasSource/Providerwithrevenuecat; product→plan mapping viarevenuecat_product_id/REVENUECAT_PRODUCT_PLAN_MAPCloses #68. Companion to chat_web_app#100.
Test plan
manage.py test monetization.tests(54 OK)chat_backend.tests.test_views_documents+test_oauthREVENUECAT_WEBHOOK_SECRET; point RC webhook at/api/finance/webhooks/revenuecat/SubscriptionPlan.revenuecat_product_id(or env JSON map)source=revenuecat+ invoice in/finance/invoices/07c03ce65dto29c69b91f7