Three launch blockers from the Oct 17 direct-Stripe billing work: - verifyStripeCheckoutSession defaulted an unconfirmed checkout session to "active"/isPaying:true, and had no billing permission check, so an abandoned (unpaid) checkout marked the org as a paying subscriber for free. Now defaults to "incomplete" and only trusts a real subscription status or a confirmed paid payment_status; also pins org id to the caller's own organization instead of trusting session metadata. - The Stripe webhook fell back to parsing an unsigned request body as a real event whenever STRIPE_WEBHOOK_SECRET was unset, letting anyone POST a fake checkout.session.completed and grant any org a paid plan. STRIPE_WEBHOOK_SECRET is now required; unsigned requests are refused. Also maps Stripe's subscription.status properly (trialing counted as active) instead of collapsing anything but "active" to "canceled". - meterDataforseoCall and every credit-check in subscription.ts skipped all usage metering/capping whenever AUTUMN_SECRET_KEY was unset — which is exactly the mode the Oct 17 work introduced for self-host direct Stripe billing. Added a local per-org monthly usage ledger (usage_ledger table, sqlite + pg) checked against each plan's monthly data budget (src/shared/crawlerxPlanBudgets.ts, from the PRD's unit economics table) so DataForSEO spend is capped even without Autumn. Also: documented STRIPE_SECRET_KEY/STRIPE_WEBHOOK_SECRET/AUTUMN_SECRET_KEY in .env.example, and published the CrawlerX product demo as a static page at /demo.html (self-contained, no backend dependency). Verified: tsc --noEmit clean, schema-parity test green, full vitest suite green except two pre-existing unrelated failures (confirmed via stash), knip/oxlint show no new findings over the pre-change baseline. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
342 lines
6.8 KiB
JSON
342 lines
6.8 KiB
JSON
{
|
|
"version": "7",
|
|
"dialect": "sqlite",
|
|
"entries": [
|
|
{
|
|
"idx": 0,
|
|
"version": "6",
|
|
"when": 1772065863070,
|
|
"tag": "0000_fantastic_vanisher",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 1,
|
|
"version": "6",
|
|
"when": 1772127913577,
|
|
"tag": "0001_round_unus",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 2,
|
|
"version": "6",
|
|
"when": 1773261363719,
|
|
"tag": "0002_fair_toad_men",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 3,
|
|
"version": "6",
|
|
"when": 1773853209809,
|
|
"tag": "0003_light_sage",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 4,
|
|
"version": "6",
|
|
"when": 1773935379368,
|
|
"tag": "0004_faithful_sunset_bain",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 5,
|
|
"version": "6",
|
|
"when": 1773965298920,
|
|
"tag": "0005_low_red_hulk",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 6,
|
|
"version": "6",
|
|
"when": 1774320825595,
|
|
"tag": "0006_magical_alex_wilder",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 7,
|
|
"version": "6",
|
|
"when": 1776208279781,
|
|
"tag": "0007_sour_risque",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 8,
|
|
"version": "6",
|
|
"when": 1776288697036,
|
|
"tag": "0008_luxuriant_colossus",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 9,
|
|
"version": "6",
|
|
"when": 1776347182067,
|
|
"tag": "0009_smart_kitty_pryde",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 10,
|
|
"version": "6",
|
|
"when": 1777422740449,
|
|
"tag": "0010_high_liz_osborn",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 11,
|
|
"version": "6",
|
|
"when": 1778031161783,
|
|
"tag": "0011_colorful_dark_beast",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 12,
|
|
"version": "6",
|
|
"when": 1778113978173,
|
|
"tag": "0012_closed_impossible_man",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 13,
|
|
"version": "6",
|
|
"when": 1778532548655,
|
|
"tag": "0013_fat_network",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 14,
|
|
"version": "6",
|
|
"when": 1778750000000,
|
|
"tag": "0014_tag_color",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 15,
|
|
"version": "6",
|
|
"when": 1778750000001,
|
|
"tag": "0015_huge_celestials",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 16,
|
|
"version": "6",
|
|
"when": 1779138211145,
|
|
"tag": "0016_magical_the_fallen",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 17,
|
|
"version": "6",
|
|
"when": 1779331224828,
|
|
"tag": "0017_omniscient_dagger",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 18,
|
|
"version": "6",
|
|
"when": 1779849000462,
|
|
"tag": "0018_minor_mad_thinker",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 19,
|
|
"version": "6",
|
|
"when": 1780519331717,
|
|
"tag": "0019_true_absorbing_man",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 20,
|
|
"version": "6",
|
|
"when": 1780599087400,
|
|
"tag": "0020_drop_delegated_users",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 21,
|
|
"version": "6",
|
|
"when": 1780625404317,
|
|
"tag": "0021_autumn_billing",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 22,
|
|
"version": "6",
|
|
"when": 1781107930529,
|
|
"tag": "0022_purple_hitman",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 23,
|
|
"version": "6",
|
|
"when": 1781467831570,
|
|
"tag": "0023_sad_cobalt_man",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 24,
|
|
"version": "6",
|
|
"when": 1781809245835,
|
|
"tag": "0024_clumsy_barracuda",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 25,
|
|
"version": "6",
|
|
"when": 1781892941214,
|
|
"tag": "0025_loving_mojo",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 26,
|
|
"version": "6",
|
|
"when": 1782833723883,
|
|
"tag": "0026_wide_red_skull",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 27,
|
|
"version": "6",
|
|
"when": 1782851682143,
|
|
"tag": "0027_reflective_molten_man",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 28,
|
|
"version": "6",
|
|
"when": 1783117904905,
|
|
"tag": "0028_empty_beyonder",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 29,
|
|
"version": "6",
|
|
"when": 1783438453855,
|
|
"tag": "0029_location_name",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 30,
|
|
"version": "6",
|
|
"when": 1783306047190,
|
|
"tag": "0030_legal_reaper",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 31,
|
|
"version": "6",
|
|
"when": 1783630714621,
|
|
"tag": "0031_furry_monster_badoon",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 32,
|
|
"version": "6",
|
|
"when": 1783699001850,
|
|
"tag": "0032_public_shinko_yamashiro",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 33,
|
|
"version": "6",
|
|
"when": 1784069998475,
|
|
"tag": "0033_first_rick_jones",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 34,
|
|
"version": "6",
|
|
"when": 1784410130115,
|
|
"tag": "0034_wonderful_skrulls",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 35,
|
|
"version": "6",
|
|
"when": 1784423179842,
|
|
"tag": "0035_dashboard",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 36,
|
|
"version": "6",
|
|
"when": 1784426967421,
|
|
"tag": "0036_curvy_silk_fever",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 37,
|
|
"version": "6",
|
|
"when": 1784588247803,
|
|
"tag": "0037_small_caretaker",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 38,
|
|
"version": "6",
|
|
"when": 1784610563184,
|
|
"tag": "0038_happy_steel_serpent",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 39,
|
|
"version": "6",
|
|
"when": 1786066274811,
|
|
"tag": "0039_ga4_connections",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 40,
|
|
"version": "6",
|
|
"when": 1786208324064,
|
|
"tag": "0040_drop_reddit_attributions",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 41,
|
|
"version": "6",
|
|
"when": 1786209407629,
|
|
"tag": "0041_free_marvex",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 42,
|
|
"version": "6",
|
|
"when": 1787099999115,
|
|
"tag": "0042_project_memory",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 43,
|
|
"version": "6",
|
|
"when": 1787594237405,
|
|
"tag": "0043_user_last_active_organization",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 44,
|
|
"version": "6",
|
|
"when": 1787773498579,
|
|
"tag": "0044_outstanding_sage",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 45,
|
|
"version": "6",
|
|
"when": 1788983568067,
|
|
"tag": "0045_noisy_ghost_rider",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 46,
|
|
"version": "6",
|
|
"when": 1789226956645,
|
|
"tag": "0046_wooden_khan",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 47,
|
|
"version": "6",
|
|
"when": 1792268176220,
|
|
"tag": "0047_last_tony_stark",
|
|
"breakpoints": true
|
|
}
|
|
]
|
|
} |