← Projects Building

Dunning Engine Pro

The subscription revenue rescue layer

Check it out →

What it is

Dunning Engine Pro sits on top of whatever subscription tool a Shopify merchant already uses — ReCharge, Appstle, Shopify Subscriptions — and handles the thing none of them do well: recovering failed payments.

It classifies why a payment failed, sends the right email at the right time, and keeps a running count of exactly how many dollars it saved.

That dashboard number — "You recovered $2,340 this month" — is the whole product.

How I got here

I was researching the Shopify subscription space and noticed something wild. Shopify's own Subscriptions app has a 3.5-star rating, and the reviews are brutal. The same complaint over and over: "a customer's payment failed and there's no way to do anything about it."

$129 billion is lost to failed payments annually. That's not a niche problem. That's every subscription merchant, every day.

The only real solution is ReCharge at $499+/mo — which prices out most small and mid-size merchants. I realized there's an enormous gap between "nothing" and "$500/month." Dunning Engine Pro starts at $49.

I validated the idea the old-fashioned way — reading hundreds of complaint threads on Reddit, the Shopify Community forums, and DTC Discords. People are asking for this by name.

The interesting engineering problems

I hit a wall almost immediately. Shopify's read_own_subscription_contracts scope means billing webhooks only fire for contracts your app created. That's useless for an overlay app that connects to existing subscriptions. So I pivoted to direct provider integration — starting with ReCharge's API.

The failure classifier was the most fun to build. Not every declined payment is the same, and the messaging shouldn't be either:

  • Soft decline — temporary glitch, retry quickly with a gentle heads-up
  • Hard decline — card rejected, the customer needs to take action
  • Expired card — straightforward, just needs an update
  • Insufficient funds — more sensitive, retry after a delay
  • Fraud flag — completely different tone and approach

Each class gets its own 3-step dunning sequence with timing tuned to the failure type. 12 email templates ship ready to go. Data flows through ReCharge webhooks with a 15-minute polling backup because webhooks aren't 100% reliable.

One detail I'm proud of: emails go through Resend with idempotency keys, so even if the system retries a job, a customer never gets the same email twice. The Scale plan uses Shopify's appUsageRecordCreate API to bill 1% of recovered revenue — so the merchant only pays when the app actually works.

Where it's at

The MVP is done. Everything works end-to-end — provider connection, failure classification, dunning sequences, email delivery with open/click tracking, the recovery dashboard, and all four billing tiers.

Next up: production deploy, end-to-end testing with ReCharge's sandbox, and App Store submission.