<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Dealpuffin Blog</title>
        <link>https://dealpuffin.com/blog/general/</link>
        <description>Dealpuffin Blog</description>
        <lastBuildDate>Tue, 03 Nov 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Your editor extensions have production access now]]></title>
            <link>https://dealpuffin.com/blog/general/editor-extensions-are-production-access/</link>
            <guid>https://dealpuffin.com/blog/general/editor-extensions-are-production-access/</guid>
            <pubDate>Tue, 03 Nov 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A backdoored Claude Code build on the Cursor Marketplace planted SSH keys on developer laptops. What a two-person startup should check this week, and the habits that make the next one boring.]]></description>
            <content:encoded><![CDATA[<p>On 30 October, Phorion published an advisory about the official Claude Code for VS Code extension on the Cursor Marketplace. Versions 2.1.312 and 2.1.313 carried a prepended payload that ran the moment Node loaded the file. Cursor has pulled both versions. If you're a small team, the uncomfortable part is that the laptop running that extension is probably also the laptop with your Stripe key, your cloud CLI login, and push access to main.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="what-the-payload-did">What the payload did<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#what-the-payload-did" class="hash-link" aria-label="Direct link to What the payload did" title="Direct link to What the payload did" translate="no">​</a></h2>
<p>The <a href="https://phorion.io/blog/offical-claude-code-vsx-compromise/" target="_blank" rel="noopener noreferrer" class="">Phorion write-up</a> is detailed and worth reading in full. The short version:</p>
<ol>
<li class="">It appended an attacker's Ed25519 public key (comment <code>svc-telemetry</code>) to <code>~/.ssh/authorized_keys</code>.</li>
<li class="">It opened an outbound reverse SSH tunnel so the operator could reach your local port 22 without any inbound firewall rule.</li>
<li class="">It set up persistence: a user LaunchAgent named <code>com.apple.sysmond.plist</code> on macOS, an <code>@reboot</code> cron entry on Linux, a <code>SysMon</code> task or Startup script on Windows.</li>
<li class="">It sent a beacon with your hostname, git email, public IP, and the names (not values) of up to 40 environment variables matching <code>KEY|TOKEN|SECRET|PASS|AWS|GCP</code>.</li>
</ol>
<p>That last one is the tell. The operator wanted a shopping list of which machines hold cloud credentials. On a big company laptop that list is long and mostly guarded by SSO. On a founder's laptop it's often <code>STRIPE_SECRET_KEY</code>, <code>AWS_ACCESS_KEY_ID</code> and a long-lived GitHub token, all in one <code>.env</code>.</p>
<p>Phorion also found a bug: on macOS, as a standard user, the check for Remote Login reads an admin error instead of "Off", so the script never tries to turn SSH on. If Remote Login was already enabled, that doesn't help you. Don't plan around an attacker's typo.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="check-this-today">Check this today<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#check-this-today" class="hash-link" aria-label="Direct link to Check this today" title="Direct link to Check this today" translate="no">​</a></h2>
<p>If anyone on your team used Cursor with that extension in late October, uninstalling it is not enough. The cleanup list from the advisory, condensed:</p>
<ul>
<li class="">Look for <code>svc-telemetry</code> in <code>~/.ssh/authorized_keys</code>, and compare key fingerprints too, since the comment is easy to change.</li>
<li class="">Look for <code>~/.config/.smt</code>, <code>~/.config/.smtk</code>, and <code>$TMPDIR/.stk_*</code> files.</li>
<li class="">On macOS, check <code>~/Library/LaunchAgents/</code> for <code>com.apple.sysmond.plist</code>. Apple doesn't put its own agents in your home folder.</li>
<li class="">Check <code>crontab -l</code> for an <code>@reboot</code> line you didn't write.</li>
<li class="">Check System Settings for Remote Login, and SSH logs for logins from <code>127.0.0.1</code> with that key.</li>
<li class="">If SSH was on or you see a login, rotate everything that user could read. Start with payment keys and cloud credentials.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="habits-that-make-the-next-one-boring">Habits that make the next one boring<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#habits-that-make-the-next-one-boring" class="hash-link" aria-label="Direct link to Habits that make the next one boring" title="Direct link to Habits that make the next one boring" translate="no">​</a></h2>
<p>This won't be the last poisoned extension. Marketplaces are a distribution channel, and distribution channels get attacked. A few cheap habits shrink the blast radius without buying anything.</p>
<p><strong>Keep secrets out of your shell environment.</strong> The beacon only read variable names, but those names were the targeting data. Load secrets per command (<code>op run</code>, <code>doppler run</code>, <code>aws-vault exec</code>) so they exist for the process that needs them and not for every extension host.</p>
<p><strong>Use restricted keys wherever the provider lets you.</strong> Stripe restricted keys, scoped GitHub fine-grained tokens, short-lived cloud sessions. A read-only key that leaks is an incident report. A full secret key that leaks is a very bad week. This is the same reason Dealpuffin asks founders for a <a class="" href="https://dealpuffin.com/docs/publishing/connect-stripe/">read-only restricted key</a> and never a secret key.</p>
<p><strong>Pin and slow down extension updates.</strong> Turn off auto-update for extensions that can execute code, and let a new version sit for a few days before you take it. Most marketplace compromises get caught by someone else within 48 hours. Being a few days behind is a fair trade.</p>
<p><strong>Give agents their own keys.</strong> If you run coding or ops agents, give each one a separate token with only the tools it needs, so you can revoke one without rotating everything. Our <a class="" href="https://dealpuffin.com/docs/agents/api-keys/">API keys and OAuth</a> page shows how we split scopes per agent, and the pattern works anywhere.</p>
<p><strong>Treat the laptop as a server.</strong> Disable Remote Login if you don't use it. Watch for new files in <code>~/Library/LaunchAgents</code>. If you have a fleet of three, a weekly five-minute check is enough.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="frequently-asked-questions">Frequently asked questions<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="which-versions-were-affected">Which versions were affected?<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#which-versions-were-affected" class="hash-link" aria-label="Direct link to Which versions were affected?" title="Direct link to Which versions were affected?" translate="no">​</a></h3>
<p>Claude Code for VS Code 2.1.312 and 2.1.313 as distributed on the Cursor Marketplace, per Phorion's advisory and Cursor's notice. Cursor removed both.</p>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="did-the-malware-steal-secret-values">Did the malware steal secret values?<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#did-the-malware-steal-secret-values" class="hash-link" aria-label="Direct link to Did the malware steal secret values?" title="Direct link to Did the malware steal secret values?" translate="no">​</a></h3>
<p>The beacon sent environment variable names, not values. But an operator with an SSH shell on your machine can read anything your user can, so if the tunnel was usable, assume the values are exposed too.</p>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="is-uninstalling-the-extension-enough">Is uninstalling the extension enough?<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#is-uninstalling-the-extension-enough" class="hash-link" aria-label="Direct link to Is uninstalling the extension enough?" title="Direct link to Is uninstalling the extension enough?" translate="no">​</a></h3>
<p>No. The SSH key, persistence script and LaunchAgent or cron entry survive uninstalling. Remove each one and then decide on rotation.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="related-on-dealpuffin">Related on Dealpuffin<a href="https://dealpuffin.com/blog/general/editor-extensions-are-production-access/#related-on-dealpuffin" class="hash-link" aria-label="Direct link to Related on Dealpuffin" title="Direct link to Related on Dealpuffin" translate="no">​</a></h2>
<p>How we think about permissions when founders connect billing: <a class="" href="https://dealpuffin.com/docs/publishing/connect-stripe/">Connect Stripe</a> and <a class="" href="https://dealpuffin.com/blog/proof-points/">Proof points</a>. For agent setups: <a class="" href="https://dealpuffin.com/docs/agents/install/">Install the skill</a>.</p>]]></content:encoded>
            <category>security</category>
            <category>devtools</category>
            <category>early-founders</category>
            <category>news</category>
        </item>
        <item>
            <title><![CDATA[How to read a SaaS discount page]]></title>
            <link>https://dealpuffin.com/blog/general/reading-saas-discount-pages/</link>
            <guid>https://dealpuffin.com/blog/general/reading-saas-discount-pages/</guid>
            <pubDate>Tue, 03 Nov 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[What early adopters should check before pasting a promo code: who issued it, what Stripe will actually apply, and when a marketplace listing is safer than a screenshot.]]></description>
            <content:encoded><![CDATA[<p>Promo pages, launch threads, and affiliate posts all promise the same thing: a code that makes trying a new tool cheaper. The useful ones are specific. The rest waste a checkout.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="prefer-a-live-code-over-a-screenshot">Prefer a live code over a screenshot<a href="https://dealpuffin.com/blog/general/reading-saas-discount-pages/#prefer-a-live-code-over-a-screenshot" class="hash-link" aria-label="Direct link to Prefer a live code over a screenshot" title="Direct link to Prefer a live code over a screenshot" translate="no">​</a></h2>
<p>A percent off a plan means nothing if the code is expired, maxed out, or locked to one customer. The billing provider (Stripe, Paddle or Polar) enforces those rules at payment time. A listing that syncs from the provider can show only codes that still redeem. A static screenshot can't. Our <a class="" href="https://dealpuffin.com/docs/coupons/caps-and-expiry/">caps and expiry</a> page explains the two clocks a listed code runs on.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="check-duration-and-what-it-applies-to">Check duration and what it applies to<a href="https://dealpuffin.com/blog/general/reading-saas-discount-pages/#check-duration-and-what-it-applies-to" class="hash-link" aria-label="Direct link to Check duration and what it applies to" title="Direct link to Check duration and what it applies to" translate="no">​</a></h2>
<p>A 50% code for three months, 50% forever and $20 off the first invoice are three very different deals. Read the duration and the product or price the coupon attaches to before you rearrange your stack around it.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="know-who-is-giving-the-discount">Know who is giving the discount<a href="https://dealpuffin.com/blog/general/reading-saas-discount-pages/#know-who-is-giving-the-discount" class="hash-link" aria-label="Direct link to Know who is giving the discount" title="Direct link to Know who is giving the discount" translate="no">​</a></h2>
<p>Only the product that owns the billing account can honor the code. A directory that makes up its own codes is guessing. When Dealpuffin lists a coupon, the founder already created it in their billing provider and chose to publish it. <a class="" href="https://dealpuffin.com/docs/seeking/claim-and-checkout/">Claim and checkout</a> covers what happens when you use one.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="related-on-dealpuffin">Related on Dealpuffin<a href="https://dealpuffin.com/blog/general/reading-saas-discount-pages/#related-on-dealpuffin" class="hash-link" aria-label="Direct link to Related on Dealpuffin" title="Direct link to Related on Dealpuffin" translate="no">​</a></h2>
<p>How listings and proof points work: <a class="" href="https://dealpuffin.com/blog/introducing-dealpuffin/">Introducing Dealpuffin</a> and <a class="" href="https://dealpuffin.com/blog/proof-points/">Proof points</a>.</p>]]></content:encoded>
            <category>saas</category>
            <category>coupons</category>
            <category>early-adopters</category>
            <category>explainer</category>
        </item>
        <item>
            <title><![CDATA[Picking usage-based billing now that Stripe owns Metronome and Adyen owns Orb]]></title>
            <link>https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/</link>
            <guid>https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/</guid>
            <pubDate>Tue, 03 Nov 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The two best-known independent metering engines were bought by payment processors within six months. What that changes for an early-stage founder choosing a billing stack, and the questions to ask before you meter anything.]]></description>
            <content:encoded><![CDATA[<p>Stripe closed its acquisition of Metronome on 14 January 2026. Adyen closed its acquisition of Orb on 1 July. So the two metering engines most AI and API companies shortlisted are now owned by companies whose main business is processing your payments. If you're pre-revenue and about to put a usage meter on your product, that's worth ten minutes of thought before you write the integration.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="what-actually-changed">What actually changed<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#what-actually-changed" class="hash-link" aria-label="Direct link to What actually changed" title="Direct link to What actually changed" translate="no">​</a></h2>
<p>Nothing broke on day one. <a href="https://stripe.com/newsroom/news/stripe-completes-metronome-acquisition" target="_blank" rel="noopener noreferrer" class="">Stripe's announcement</a> talks about integrating Metronome's metering with Stripe Billing. <a href="https://www.adyen.com/knowledge-hub/talon-one-orb-acquisitions" target="_blank" rel="noopener noreferrer" class="">Adyen says</a> Orb keeps running under an "incubator model" and keeps supporting other processors during the first phase, with the stated long-term intent being "a single infrastructure experience for merchants across billing and payments." Orb's own post says customers can keep their preferred processor.</p>
<p>Read those together and the direction is clear. Billing is turning into a feature of your payment processor again. That's fine if you were going to stay on that processor anyway. It's a cost if you wanted the freedom to move.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="the-founders-version-of-the-decision">The founder's version of the decision<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#the-founders-version-of-the-decision" class="hash-link" aria-label="Direct link to The founder's version of the decision" title="Direct link to The founder's version of the decision" translate="no">​</a></h2>
<p>Most early teams don't need a metering engine yet. You need one when the thing you charge for is a volume (tokens, API calls, GB-months, minutes) and the numbers get big enough that summing them in your own database becomes a project. Before that, a flat plan plus a usage cap, or a few tiers, is easier to sell and easier to explain on a pricing page.</p>
<p>When you do need metering, the real choice is between three shapes:</p>
<ul>
<li class=""><strong>Processor-native.</strong> Stripe Billing with meters (and now Metronome behind it), or whatever your merchant of record ships. Fewest moving parts. Your pricing logic is coupled to that processor.</li>
<li class=""><strong>Processor-owned but nominally neutral.</strong> Orb today. Strong engine, and the neutrality is a promise with an "initially" attached. Get the multi-processor terms in writing if you care.</li>
<li class=""><strong>Independent or open source.</strong> Lago is the obvious one left. You own more of the plumbing, and some features you'll want for custom deals sit in paid tiers, so check the price page before you assume open source means free.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="questions-to-ask-before-you-sign">Questions to ask before you sign<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#questions-to-ask-before-you-sign" class="hash-link" aria-label="Direct link to Questions to ask before you sign" title="Direct link to Questions to ask before you sign" translate="no">​</a></h2>
<p><strong>Can it model your hardest meter live?</strong> Storage billed per GB-month needs a time-weighted aggregation, not a sum. Ask every vendor to build your trickiest meter in the demo. Most of the pain in billing migrations comes from one meter that turned out to be special.</p>
<p><strong>What does "credits" mean to them?</strong> Credits applied to an invoice and a prepaid balance that usage burns down are different features. If it's a balance, ask whether it draws down in real time or only when the invoice finalizes. The second one lets a customer blow past their balance mid-cycle.</p>
<p><strong>How are customer-specific deals stored?</strong> A negotiated rate on the contract and a coupon stacked on list price produce different invoices and different revenue reports. Early on you'll do a lot of both, for design partners and launch-week signups.</p>
<p><strong>How hard is leaving?</strong> Ask for an export of customers, plans, meters and invoice history in a format another system can import. If the answer is "talk to support", price that in.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="where-discounts-fit">Where discounts fit<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#where-discounts-fit" class="hash-link" aria-label="Direct link to Where discounts fit" title="Direct link to Where discounts fit" translate="no">​</a></h2>
<p>Whatever you pick, keep discounts as real objects in the billing system: a coupon or promotion code with a duration, a cap and an expiry. Don't make them a note in a spreadsheet or a manual credit. Real objects are auditable, they expire on their own, and other tools can read them. That's how <a class="" href="https://dealpuffin.com/docs/how-it-works/">Dealpuffin</a> works: we read coupons from <a class="" href="https://dealpuffin.com/docs/publishing/connect-stripe/">Stripe</a>, <a class="" href="https://dealpuffin.com/docs/publishing/connect-paddle/">Paddle</a> or <a class="" href="https://dealpuffin.com/docs/publishing/connect-polar/">Polar</a>, and the <a class="" href="https://dealpuffin.com/docs/coupons/caps-and-expiry/">caps and expiry</a> come from the provider, not from us. If your discounts live in your billing system, you can move them to any directory, marketplace or agent later.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="frequently-asked-questions">Frequently asked questions<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="is-metronome-still-available-on-its-own">Is Metronome still available on its own?<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#is-metronome-still-available-on-its-own" class="hash-link" aria-label="Direct link to Is Metronome still available on its own?" title="Direct link to Is Metronome still available on its own?" translate="no">​</a></h3>
<p>Metronome is part of Stripe since January 2026. Check Stripe's current docs for how new integrations are routed between Stripe's native meters and Metronome before you build.</p>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="does-orb-still-work-with-stripe">Does Orb still work with Stripe?<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#does-orb-still-work-with-stripe" class="hash-link" aria-label="Direct link to Does Orb still work with Stripe?" title="Direct link to Does Orb still work with Stripe?" translate="no">​</a></h3>
<p>Adyen and Orb say Orb continues to support other payment processors during the first phase after the acquisition. The long-term stated goal is convergence with Adyen's payments, so ask about multi-processor support in your contract.</p>
<h3 class="anchor anchorTargetStickyNavbar_zFqj" id="do-i-need-usage-based-billing-at-launch">Do I need usage-based billing at launch?<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#do-i-need-usage-based-billing-at-launch" class="hash-link" aria-label="Direct link to Do I need usage-based billing at launch?" title="Direct link to Do I need usage-based billing at launch?" translate="no">​</a></h3>
<p>Usually not. If your costs scale with usage, a flat plan with a clear cap protects your margin while you learn what customers actually use. Add metering when the cap starts costing you deals.</p>
<h2 class="anchor anchorTargetStickyNavbar_zFqj" id="related-on-dealpuffin">Related on Dealpuffin<a href="https://dealpuffin.com/blog/general/usage-based-billing-after-metronome-and-orb/#related-on-dealpuffin" class="hash-link" aria-label="Direct link to Related on Dealpuffin" title="Direct link to Related on Dealpuffin" translate="no">​</a></h2>
<p>For founders pricing a launch offer: <a class="" href="https://dealpuffin.com/blog/general/reading-saas-discount-pages/">How to read a SaaS discount page</a> and <a class="" href="https://dealpuffin.com/blog/why-target-early-adopters/">Why target early adopters</a>.</p>]]></content:encoded>
            <category>billing</category>
            <category>pricing</category>
            <category>saas</category>
            <category>early-founders</category>
            <category>comparison</category>
        </item>
    </channel>
</rss>