<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78" -->

---
title: Test your SaaS replacement before cancelling the original
description: Run a homemade SaaS replacement side by side with the original before cancelling it, using read-only data and a comparison script. The example is an invoice...
canonical: https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Test your SaaS replacement before cancelling the original | daily.dev
og:description: Run a homemade SaaS replacement side by side with the original before cancelling it, using read-only data and a comparison script. The example is an invoice...
og:url: https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78
og:image: https://api.daily.dev/og/posts/XJngpSM78.png
og:image:alt: Test your SaaS replacement before cancelling the original
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Test your SaaS replacement before cancelling the original

**[Flavio Copes](https://daily.dev/sources/flaviocopes)** · 7 min read · 0 upvotes · 0 comments

## Summary

Run a homemade SaaS replacement side by side with the original before cancelling it, using read-only data and a comparison script. The example is an invoice reporting tool that reads copies of data while the old service keeps handling writes. A Node.js script, compare.mjs, normalizes fields like totalCents and issuedAt and flags any differences between old.json and new.json. It also recommends testing an unavailable source API to confirm the replacement can detect a failed refresh and preserve the last good report. Before cancelling, verify the provider's export terms and rehearse a restore of the exported data into a fresh instance.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://flaviocopes.com/parallel-saas-replacement>

## Questions this post answers

### How do I compare JSON output from two systems while ignoring harmless differences like timestamp format or string vs number types?

Normalize each record before comparing: convert cent amounts to integers whether they arrive as strings or numbers, and parse timestamps into a consistent ISO format before diffing. A Node.js script can map records by ID, normalize fields like totalCents, currency, status, and issuedAt, then compare JSON.stringify output per ID and report only real differences, ignoring row order and extra fields.

_daily.dev surfaces practical scripts like this for engineers validating a SaaS migration before committing._

### What should I test before cancelling a SaaS subscription and switching to a self-built replacement?

Test the replacement in parallel with read-only data while the old system stays the single source of writes, covering edge cases like refunds, foreign currency, corrected records, and empty periods. Disable any schedules that send emails or charge cards during the trial. Also simulate an unavailable source API to confirm the replacement detects a failed refresh and preserves the last successful report instead of silently showing stale data as current.

_Teams weighing a SaaS-to-homegrown switch can track migration practices like this on daily.dev._

## Similar posts on daily.dev

- [Run the Old and the New Side by Side: The Quiet Secret of Safe Software Modernisation](https://daily.dev/posts/run-the-old-and-the-new-side-by-side-the-quiet-secret-of-safe-software-modernisation-0f5zu9cxv) · Medium · 0 upvotes · 0 comments
- [I replaced a $120/year micro-SaaS in 20 minutes with LLM-generated code](https://daily.dev/posts/i-replaced-a-120-year-micro-saas-in-20-minutes-with-llm-generated-code-khhqaeluc) · The Pragmatic Engineer · 47 upvotes · 8 comments
- [Build vs buy software: when AI can replace a SaaS](https://daily.dev/posts/build-vs-buy-software-when-ai-can-replace-a-saas-ck67aw8rp) · Flavio Copes · 0 upvotes · 0 comments
- [I cancelled five subscriptions after one weekend of setting up open-source replacements](https://daily.dev/posts/i-cancelled-five-subscriptions-after-one-weekend-of-setting-up-open-source-replacements-gwstyer9a) · XDA Developers · 0 upvotes · 0 comments

---

Tags: [#nodejs](https://daily.dev/tags/nodejs)

[View this post on daily.dev](https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Test your SaaS replacement before cancelling the original","url":"https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78"},"datePublished":"2026-10-31T11:23:28.952Z","dateModified":"2026-10-31T11:23:56.374Z","description":"Run a homemade SaaS replacement side by side with the original before cancelling it, using read-only data and a comparison script. The example is an invoice...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/2b4dcd4c464be29d5a39ab86734a91fa?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/2b4dcd4c464be29d5a39ab86734a91fa?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Flavio Copes","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Flavio Copes","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/1f2dbd275797411bbd37bfdaaf0951a9","url":"https://daily.dev/sources/flaviocopes"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"nodejs","timeRequired":"PT7M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Flavio Copes","item":"https://daily.dev/sources/flaviocopes"},{"@type":"ListItem","position":3,"name":"Test your SaaS replacement before cancelling the original"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/test-your-saas-replacement-before-cancelling-the-original-xjngpsm78#faq","mainEntity":[{"@type":"Question","name":"How do I compare JSON output from two systems while ignoring harmless differences like timestamp format or string vs number types?","acceptedAnswer":{"@type":"Answer","text":"Normalize each record before comparing: convert cent amounts to integers whether they arrive as strings or numbers, and parse timestamps into a consistent ISO format before diffing. A Node.js script can map records by ID, normalize fields like totalCents, currency, status, and issuedAt, then compare JSON.stringify output per ID and report only real differences, ignoring row order and extra fields. daily.dev surfaces practical scripts like this for engineers validating a SaaS migration before committing."}},{"@type":"Question","name":"What should I test before cancelling a SaaS subscription and switching to a self-built replacement?","acceptedAnswer":{"@type":"Answer","text":"Test the replacement in parallel with read-only data while the old system stays the single source of writes, covering edge cases like refunds, foreign currency, corrected records, and empty periods. Disable any schedules that send emails or charge cards during the trial. Also simulate an unavailable source API to confirm the replacement detects a failed refresh and preserves the last successful report instead of silently showing stale data as current. Teams weighing a SaaS-to-homegrown switch can track migration practices like this on daily.dev."}}]}
```

