[{"data":1,"prerenderedAt":326},["ShallowReactive",2],{"project-46963177":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":36,"aspects":37,"strip":46,"post_text":48,"what":49,"said":93,"maker_in_thread":198,"shape":208,"grid":212,"attempts":282,"same_week":287,"maker_shows":35,"maker_hidden":318,"reader_version":319,"card":320},"46963177","Stripe-no-webhooks","Sync your Stripe data to your Postgres DB","title","Show HN: Stripe-no-webhooks – Sync your Stripe data to your Postgres DB","https:\u002F\u002Fgithub.com\u002Fpretzelai\u002Fstripe-no-webhooks","github.com","prasoonds",1770743688,2026,66,30,994,4366,23,"notable","web_saas","payments billing library","library",[24,25,26,27,28],"stripe sync","stripe postgres","stripe webhooks","usage billing","subscription billing","mixed",0.089,{"positive":32,"neutral":33,"mixed":34,"critical":35},6,7,0,3,16,{"idea":38,"pricing":41,"execution":42,"docs":43,"privacy":45},{"positive":39,"critical":40},4,1,{"positive":34,"critical":34},{"positive":40,"critical":34},{"positive":34,"critical":44},2,{"positive":34,"critical":34},[47,34,35,34,35,47,34,35,34,34,47,34,35,47,35,34,34,35,34,47,47,34,40,34,40,34,40,34,35,34],5,"Hey HN, stripe-no-webhooks is an open-source library that syncs your Stripe payments data to your own Postgres database:\nhttps:\u002F\u002Fgithub.com\u002Fpretzelai\u002Fstripe-no-webhooks.\n\nHere's a demo video: https:\u002F\u002Fyoutu.be\u002FcyEgW7wElcs\n\nIt creates a webhook endpoint in your Stripe account to forward webhooks to your backend where a webhook listener stores all the data into a new stripe.* schema. You define your plans in TypeScript, run a sync command, and the library takes care of creating Stripe products and prices, handling webhooks, and keeping your database in sync. We also let you backfill your Stripe d",{"problem":50,"audience":56,"pricing":64,"motivation":65,"time_to_build":64,"stack":69,"openness":90,"stage":91,"team_size":92},{"value":51,"source":52,"evidence":53},"Keeping Stripe payment data in sync with an app database and managing subscriptions, credits and usage billing without handling webhooks directly","maker",[54],{"id":55},"post",{"value":57,"source":58,"evidence":59},"Developers building subscription or usage-based products on Stripe","inferred",[60,61],{"id":55},{"id":62,"by":11,"text":63},"46964562","Yes, this is one of the bigger use-cases for this library. Lots of folks want custom analytics on their Stripe data and this provides a nice way to do just that. Let me know how…",null,{"value":66,"source":52,"evidence":67},"Avoid building entitlement, renewal and webhook handling by hand on top of Stripe",[68],{"id":55},[70,74,78,86],{"value":71,"source":52,"evidence":72},"TypeScript",[73],{"id":55},{"value":75,"source":52,"evidence":76},"Postgres",[77],{"id":55},{"value":79,"source":80,"evidence":81},"Next.js","commenter",[82],{"id":83,"by":84,"text":85},"46986909","ramonga","stripe-no-webhooks integrates automatically with nextjs via cli & gives you useful abstractions on top of postgres like await billing.credits.consume({ userId, key: \"api_calls\",…",{"value":87,"source":52,"evidence":88},"Stripe",[89],{"id":55},"open_source","launched","unknown",{"praise":94,"objections":116,"requests":139,"questions":153,"alternatives":175},[95,103,110],{"value":96,"source":80,"evidence":97},"Useful for custom analytics on Stripe data",[98,102],{"id":99,"by":100,"text":101},"46964282","hbcondo714","Thanks for sharing this! I had done a PWA that displays some revenue forecasting[1] based on Stripe Subscriptions but I found their APIs can be slow[2]. Having that data synced…",{"id":62,"by":11,"text":63},{"value":104,"source":80,"evidence":105},"Good marketing name that sells the value",[106],{"id":107,"by":108,"text":109},"46969621","nomilk","From a marketing perspective I'd argue it's good naming, since it sells the value of the library, rather than simply its feature\u002Fs. (i.e. its feature is 'handling webhooks' but…",{"value":111,"source":80,"evidence":112},"Handles subscription cancellation quirks like grace periods",[113],{"id":114,"by":84,"text":115},"46973182","this doesn't work. Most of people follow the workflow you described and call it a day. The problem comes later when, for example, you realise stripe gives a grace period when…",[117,132],{"value":118,"source":80,"evidence":119},"Name is misleading because it uses webhooks",[120,124,128],{"id":121,"by":122,"text":123},"46966185","enigma101","why call it no webhook when it's wait for it a webhook?",{"id":125,"by":126,"text":127},"46969388","bigtones","That's not the same as no webhooks. It's totally using webhooks.",{"id":129,"by":130,"text":131},"46966007","lukaslukas","Haha \"Stripe-no-webhooks library\" Library based on processing ... wait for it ... webhooks\".",{"value":133,"source":80,"evidence":134},"Teams already handle Stripe events and may not need a layer",[135],{"id":136,"by":137,"text":138},"46966247","whiskey-one","It is indeed painful to figure out all the Stripe events one needs to handle. However, for me it’s worth it to do it once, and then be able to handle the interactions between my…",[140,146],{"value":141,"source":52,"evidence":142},"Support migrating existing subscriptions to new prices",[143],{"id":144,"by":11,"text":145},"46964763","Great question. Basically, you would change your billing.config.ts and update the price. Then, you run the `sync` command - it matches prices by a composite key:…",{"value":147,"source":80,"evidence":148},"Clarify which Stripe API versions are supported",[149],{"id":150,"by":151,"text":152},"46969502","slig","Thank you for sharing. I've been using the Better-Auth's Stripe integration but it has some quirks. Which Stripe version does your lib support? Clover?",[154,161,168],{"value":155,"source":80,"evidence":156},"How are pricing changes handled",[157],{"id":158,"by":159,"text":160},"46964375","tonyx","This is really cool. How do you handle changes of pricing with something like this?",{"value":162,"source":80,"evidence":163},"Does it make the user PCI compliant",[164],{"id":165,"by":166,"text":167},"46968640","tiffanyh","If used, will you now have to be PCI-compliant?",{"value":169,"source":80,"evidence":170},"How does it differ from Supabase's stripe sync engine",[171],{"id":172,"by":173,"text":174},"46976118","acomagu","OK, so how does it differ from Supabase one? https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fstripe-sync-engine",[176,180,187,194],{"value":177,"source":80,"evidence":178},"Supabase stripe-sync-engine",[179],{"id":172,"by":173,"text":174},{"value":181,"source":80,"evidence":182},"dj-stripe",[183],{"id":184,"by":185,"text":186},"46968698","testbjjl","> You don't have to figure out which webhooks you need or write listeners for each one. The library handles all of that. This follows the approach of libraries like dj-stripe in…",{"value":188,"source":80,"evidence":189},"WebhookDB",[190],{"id":191,"by":192,"text":193},"46965963","xn","A related, generalized idea: https:\u002F\u002Fgithub.com\u002Fwebhookdb\u002Fwebhookdb",{"value":195,"source":80,"evidence":196},"Better-Auth Stripe integration",[197],{"id":150,"by":151,"text":152},{"comments":199,"answered":39,"key":200},8,[201,202,205],{"id":62,"text":63},{"id":203,"text":204},"46966518","haha yes, it’s definitely a bit of a silly name. The idea is you the user does not have to deal with the webhooks!",{"id":206,"text":207},"46964143","Hi HN, library creator here. I've linked a demo app linked in the post to try this out: \u003Chttps:\u002F\u002Fsnw-test.vercel.app> It uses Clerk for auth and Clerk seems to be having…",{"commenters":209,"max_depth":39,"maker_replies":199,"first_comment_mins":210,"lifespan_hours":211},19,53,41,[213,215,217,219,220,223,224,228,231,234,236,237,239,240,241,243,244,246,247,250,253,256,260,263,265,268,271,272,276,279],[99,34,47,214,100,34],"project\u002Fpositive\u002Fidea",[62,34,34,216,11,40],"commenter\u002Fpositive\u002Fidea",[129,40,35,218,130,34],"project\u002Fneutral\u002Fidea",[203,40,34,218,11,40],[221,40,35,218,222,34],"46968425","zffr",[107,40,47,214,108,34],[225,40,34,226,227,34],"46983863","other\u002Fneutral\u002Fnone","gurjeet",[229,40,35,218,230,34],"46971859","paulddraper",[232,44,34,233,108,34],"46969288","other\u002Fneutral\u002Fperformance",[206,35,34,235,11,40],"project\u002Fneutral\u002Fexecution",[136,39,47,214,137,34],[238,39,34,214,11,40],"46966503",[172,47,35,218,173,34],[83,47,47,214,84,34],[158,32,35,242,159,34],"project\u002Fneutral\u002Fpricing",[144,32,34,242,11,40],[191,33,34,245,192,34],"other\u002Fneutral\u002Fidea",[150,199,35,235,151,34],[248,199,34,249,11,40],"46970654","maker\u002Fneutral\u002Fnone",[251,199,47,252,84,34],"46973152","project\u002Fpositive\u002Fexecution",[254,199,47,255,151,34],"46974063","maker\u002Fpositive\u002Fnone",[257,258,34,226,259,34],"46979971",9,"rognjen",[184,261,40,262,185,34],10,"project\u002Fcritical\u002Fidea",[114,261,34,264,84,34],"commenter\u002Fcritical\u002Fidea",[121,266,40,267,122,34],11,"project\u002Fcritical\u002Fdocs",[269,266,34,270,11,40],"46966463","project\u002Fneutral\u002Fdocs",[125,266,40,267,126,34],[273,266,34,274,275,34],"46969921","commenter\u002Fneutral\u002Fnone","weird-eye-issue",[165,277,35,278,166,34],12,"project\u002Fneutral\u002Fprivacy",[280,277,34,281,11,40],"46970582","project\u002Fpositive\u002Fprivacy",[283,286],{"id":284,"t":285,"points":35,"comments":34},"46826841",1769792399,{"id":4,"t":12,"points":14,"comments":15},[288,293,298,303,308,313],{"id":289,"name":290,"points":291,"category":292},"46954696","Wall Street Raider",721,"games",{"id":294,"name":295,"points":296,"category":297},"46943568","AllTheViews",412,"learning_science",{"id":299,"name":300,"points":301,"category":302},"46916609","rememory",402,"security_privacy",{"id":304,"name":305,"points":306,"category":307},"46917033","Vecti",386,"creative",{"id":309,"name":310,"points":311,"category":312},"46930391","LocalGPT",331,"ai",{"id":314,"name":315,"points":316,"category":317},"46918429","Look Ma, No Linux",327,"dev_tools",false,"v2",{"id":321,"name":5,"line":6,"ai":318,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":322,"top":18,"kw":323,"maker":11,"domain":10,"tier":19,"attempts":44,"strip":324,"url":9,"mix":325,"praise":96,"objection":118,"sub":21},46963177,0.09,[24,25,26,27,28],"503035030050353003055010101030",[32,33,34,35],1794036692882]