Changelog

What has changed in Dunity

A dated record of what changed, newest first, from the first commit on 22 August 2026. Only changes a person using Dunity can see or benefit from are listed.

  • $29/month, flat
  • Cancel anytime
  • Restricted Stripe key only
  1. 5 commits

    A quicker calculator and a clearer Connect Stripe page

    • The failed payment calculator is quicker to read and keeps your numbers when you come from the homepage.
    • Connect Stripe now shows what recovery looks like before you connect.
  2. 3 commits

    A rebuilt homepage

    • The homepage now walks through one failed payment from decline to recovery, lets you check what failed payments cost you, and links to the Stripe setup and decline code guides.
  3. 12 commits

    Retry, dashboard and Settings fixes, plus a founding discount reminder

    • Founding customers now get an email about a week before their discount ends, with the date and the price that follows.
    • Said so in the founding offer page and in the Terms.
    • Replaced the long dashes in Settings, the dashboard, the customers and activity pages, the payment pages and the alert messages with plain punctuation, and a missing value now reads "n/a".
    • Fixed the Settings time zone list so it can show and keep UTC, which every new account starts on, instead of showing Africa/Abidjan.
    • Made the retry summary on Settings count whole daily runs, so a short delay no longer reads "0 days", and capped the retry delay fields at the 720 hours Dunity accepts.
    • Card expiration reminders now use the reply-to address you set, like the other two emails.
    • The dashboard no longer files the do_not_honor decline under "Unrecoverable".
    • Retries now keep to the schedule you set: a 24-hour retry is picked up by the next daily run, so five attempts take about five days instead of ten.
    • Retries now stop on a hard decline. When a retry comes back with a decline Stripe lists as hard, such as a stolen card, or needs the customer to authenticate, the payment is marked Failed instead of being charged again on the days after. The decline guides and comparison pages now say so.
    • Win-back offers are no longer sent for an invoice with a payment pending, which a card that needs the customer to authenticate leaves behind. Stripe cannot credit that invoice, so the update page used to promise a discount that was never applied.
    • Retries, and the retry buttons on the dashboard, now wait while a payment on the invoice is still processing, such as a bank debit the bank has not confirmed, instead of trying to pay it again and using up an attempt.
    • The result of retrying several failed payments at once now stays on the dashboard until you close it or start choosing rows again, instead of disappearing a moment after the batch finishes.
    • The failed payments table no longer makes the dashboard scroll sideways on windows about 1,000 pixels wide.
    • Redrew the dashboard recovery chart so its axis shows exact, evenly spaced numbers, it reads clearly on a phone and for colour-blind readers, and you can step through it by keyboard or touch.
  4. 8 commits

    Decline code guides, email templates, more pages and a founding offer

    • Added guides to nine Stripe decline codes: what Stripe says each one means, whether a retry can work, and what Dunity does.
    • Added copy-ready wording for the three emails Dunity sends, each with a copy button and a note on where to paste it.
    • Added the founding-customer offer: 20% off the first 12 months for the first 50 customers, until 31 December 2026.
    • Added pages on security, how it works, the alternatives, and how Dunity compares with Stripe and with Churnkey.
    • Added a Stripe setup guide, a page on win-back offers, and a failed payment calculator.
    • Reworded the pricing estimate as an example, corrected two competitor claims, and moved the contact address to a business email.
    • Fixed headings that broke at a hyphen, and raised the contrast of the homepage price and button.
  5. 5 commits

    Terms, privacy and site basics

    • Rewrote the Terms and the Privacy Policy to match what Dunity actually does, and numbered the Terms.
    • Gave every marketing page the new footer, and titled the site Dunity.
    • Fixed the pricing and homepage wording to say the customer email goes out as soon as a payment fails.
    • Kept the header on one line on small phones.
    • Added robots.txt, a sitemap, proper page titles and descriptions, and one link-preview image.
  6. 11 commits

    Pricing, subscribe and reliability

    • Redesigned the pricing page and the subscribe page around the homepage look.
    • Added a “Save $49” badge on the yearly price, a failed-payment cost estimate, a “How Dunity compares” table and a pricing FAQ.
    • Added an outside watchdog that checks the scheduled retry jobs are running.
    • One shared subscription check now guards every action that changes settings, and a deleted Stripe billing customer no longer breaks checkout.
  7. 3 commits

    Account fixes before launch

    • Closed gaps found in a pre-launch review of sign-up and sign-in, and put the Dunity brand on those pages.
    • Accounts with a lapsed subscription are no longer served on the payment wall or on payment links, and can no longer change settings.
    • Each account has one Stripe billing customer, and an open checkout is reused.
  8. 1 commit

    Monitoring and accounting

    • Added a record of every run of the scheduled retry and reminder jobs, so a run that is cut short shows up on the Settings page.
    • Fixed the recovered total, which had ignored the discount from a win-back offer.
  9. 5 commits

    Security review, currencies and a new logo

    • Fixed all 14 findings from a backend and database security review.
    • Amounts now show in each invoice’s own currency.
    • Added a five-day grace period after a subscription ends before Dunity stops serving the account.
    • Added the new Dunity logo to the browser tab, the sidebar and the empty states.
  10. 7 commits

    First run experience and design system

    • Pages with nothing to show now ask you to connect Stripe, and the dashboard shows a sample of what it will look like.
    • Gave the sign-in and sign-up pages a 3D animated orbit.
    • Reviewed every connected page with real data and fixed how they read.
    • Renamed the color system by job, replaced the mascot with a hand-traced drawing, and rebuilt the 404 page.
    • Tuned the three data tables for density and correctness.
  11. 10 commits

    Security hardening and payment fixes

    • Redesigned the sign-in and sign-up pages, and stopped sending signed-in people back to the homepage.
    • Rate-limited two public endpoints that had no limit.
    • Upgraded Next.js to close two critical security advisories, and turned on automatic dependency alerts.
    • Made payment links signed and expiring.
    • Stopped repeat failures on one invoice from sending another email, and marked an invoice paid somewhere else as recovered.
    • Stopped a win-back discount from being credited more than once on an invoice.
    • Made the dashboard totals real totals, with fewer calls to Stripe.
    • Fixed a crash when a payment link pointed at a Stripe customer that no longer exists.
    • Closed a gap that let the public browser keys call four server-side database functions, three of which could read, replace or clear a saved Slack webhook address. It was found and closed before launch.
  12. 6 commits

    Dashboard polish

    • Added a return-on-investment line to the dashboard, and made the decline breakdown filter the table when you click it.
    • Redesigned the sidebar and tightened card styles across the dashboard.
    • Turned the three tables into cards on phones, and made common actions feel instant.
    • Fixed a crash on the payment page return when a Stripe key lacked a permission.
    • Fixed a hydration error on the account menu, and a table header that overlapped rows.
  13. 5 commits

    Five new ways to recover a payment

    • Card-expiration reminders: an optional email 30 and 7 days before a card expires.
    • A VIP list, so flagged customers are skipped by retries and emails.
    • A branded page where customers update their card, replacing Stripe’s hosted links.
    • Win-back offers: a discount credited on the stuck invoice when the last retry fails.
    • An in-app payment wall that shows a notice, then a countdown, then blocks access.
  14. 5 commits

    Your own email wording, retry schedule and bulk retry

    • Added links from the dashboard to the invoice and the customer in Stripe.
    • Fixed the customer email so it includes the link to update the card, and made its wording and reply-to yours to set.
    • Added settings for the retry delay and the number of attempts.
    • Added bulk retry, and fixed a bug that treated every card decline the same.
    • Added saved filter views and filtering Activity by type.
  15. 7 commits

    Settings, Emails, Activity and Customers

    • Added the Settings, Emails, Activity and Customers pages, an onboarding flow, and alerts.
    • Added time zone support, and accessibility fixes across the dashboard.
    • Made the first-run experience lead with connecting Stripe.
    • Protected the Stripe webhook against floods and duplicate deliveries.
    • Reviewed the database for performance.
  16. 5 commits

    A fuller dashboard

    • Stat cards show real changes against the last period, next to a recovery trend chart.
    • Added a decline-reason breakdown chart and a way to disconnect Stripe.
    • Added a Retry Now button for a failed payment.
    • Added a date-range control and a real table.
    • Added a mobile drawer for the sidebar.
    • Fixed a bug where the dashboard showed every signed-in account the same payment data. It was found before launch, and no customer’s data was involved.
  17. 10 commits

    Accounts, Stripe, subscriptions and pricing

    • Added sign-in with Clerk, with the dashboard behind it.
    • Added the Stripe connection with a restricted key, kept in a vault.
    • Made the webhook and the retry job work for many accounts, and registered the webhook automatically on connect.
    • Added subscribing through Stripe’s embedded checkout, and a billing portal link.
    • Added a pricing page with monthly and yearly plans.
    • Added the Terms and Privacy Policy pages.
    • Rebuilt the connect page as an integrations page.
  18. 5 commits

    The first working loop

    • Recorded each failed Stripe payment with its decline code in a retry queue.
    • Added a daily job that retries queued payments.
    • Sent the customer an email when a payment fails.
    • Added a recovery dashboard with amounts and decline badges.