DEV Community

付小花
付小花

Posted on

The unsubscribe worked. The charge happened anyway.

Every few weeks someone launches another app that "finds your subscriptions". Pricing pages, Slack pings, a pretty list of logos with dollar amounts. It is a crowded category, and for a while I assumed the hard part was discovery — pulling billing emails out of an inbox and turning them into rows.

Then I spent a day reading the subscription-waste threads on Hacker News, and none of the expensive stories were about discovery. They were about what happens after you already know the subscription exists.

Five comments, five different years, one recurring shape.

1. "They ignored my request, were no answers at all"

"I stopped using NextDNS when I forgot to cancel subscription and contacted then immediately to issue a refund. They ignored my request, were no answers at all. I am not alone, this is a typical behavior."
— d7w, HN 48568078

The person knew about the subscription. They cancelled. They wrote the refund email the same day. What failed was the last mile: a human on the other side, and any way to prove the request existed.

Notice how much of that story a spending dashboard cannot fix. A dashboard tells you the charge happened. It tells you nothing about whether anyone read your email.

2. "Sign up for a monthly charge when I only need one article"

"I am so sick of having to sign up for a monthly charge when I only need one article...and then forgetting to cancel and getting another ding in the next billing cycle."
— Irongirl1, HN 44068570

This one is a pricing-model problem. The purchase was a one-time need; the vendor only sells a recurring commitment. The commenter's proposed fix — credits that do not expire — would require a different business model, and an audit tool cannot bolt that on afterwards.

3. When the refund conversation goes silent, the dispute escalates

"The owner of ScrapingBee tweeted about a company who forgot to cancel their subscription, they agreed to a partial refund, but then they went silent, and launched a chargeback for $3250."
— KomoD, HN 35183931

I am quoting a comment that quotes a tweet, so treat the details as second-hand. The shape is what matters: a forgotten renewal, a partial refund that was agreed and then not delivered, and a chargeback. A disputed charge is worse than a refund. It costs the vendor fees, the payment-processor relationship, and sometimes the account.

4. Seats are a contract, and contracts survive layoffs

"Unused seats? Still gotta pay for 'em. (It's called \"SaaS waste\" for a reason.) You committed to paying for 50 seats for a year."
— schnebbau, HN 29271087

This commenter is paraphrasing a vendor's reply, so it reads as the vendor's logic. That makes it more useful rather than less: it is the exact sentence that ends the conversation — the intent to cancel meets the fact of a yearly commitment. No tool wins that argument after the fact. The only moment where the argument is winnable is before the renewal, when someone can see the seat count and the contract end date side by side.

5. Headcount pricing is a growth tax

"Pricing tied to headcount means every hiring decision carries an immediate, non-value-adding software overhead."
— ThePoetDL, HN 45472221

Full disclosure: this commenter was promoting their own flat-rate product, so read it as a vendor's argument. The observation still holds — per-seat pricing means the bill grows with the team whether or not the team uses the tool, which is exactly why unused seats accumulate quietly after reorgs.

The counter-argument I could not dismiss

The strongest objection in these threads is that the real move happens at the bank:

"The real [...] here is not go to each individual website to one click cancel, but just cancel the direct debit / subscription from in your banking or credit card app."
— lifeisstillgood, HN 48865416

That is correct, and it is also why a bank-level cancel feature is not something I would build into a small audit tool. It needs banking or payment-processor integration, it needs to hold a license to act on your behalf, and it moves the failure mode from "you forgot" to "I cancelled the wrong mandate". The honest scope is smaller: make the renewal visible early enough that you can act yourself.

What this changed about the tool I work on

I work on SaaSClerk, which reads a finance mailbox through read-only OAuth, extracts vendor names, amounts and renewal dates from the past 12 months of billing email, and puts them on one dashboard sorted by next renewal. Paid plans email you two weeks before a renewal that is still marked active.

Three design decisions came out of reading these threads:

  1. Renewal date first. A vendor list answers "what do I pay for". A renewal date answers "what happens next". Every row shows the next date and the amount.
  2. Seat count and unit price on the same row. The waste in thread 4 was structural, and it was visible in the invoice long before anyone noticed it.
  3. No promises about refunds. I do not mediate refunds and I do not claim to cancel anything for you. Making a charge visible is a smaller promise, and it is one a tool can actually keep.

What I deliberately did not build

  • A bank feed. See above: correct idea, wrong liability for a two-person shop.
  • Automatic cancellation. If I cancel wrongly, I create the exact dispute in thread 3.
  • An "AI will find you savings" number. Every audit tool can produce a big number by assuming you would have cancelled everything it flags. I would rather show the charge and let you decide.

If you have a subscription story that fits one of these shapes — especially the silence-after-refund one — I would like to hear it in the comments. That story is the one I have the least product answer for.

If you want to check your own numbers first, there are two free calculators that need no signup: one for unused seats and one for shadow IT exposure.

Top comments (0)