Dev.to WebDev ๐Ÿ›  Dev ๐Ÿ‘ 0 ๐Ÿ“– 5 min read

I built 20 calculators that show their working. Here's the stack, the bugs and the SEO surprise

Most online calculators give you a number and expect you to trust it. I wanted the opposite: under every result, a line that prints the exact sum with your numbers in it, so you can check it by hand. That became EziSolu

Most online calculators give you a number and expect you to trust it. I wanted the opposite: under every result, a line that prints the exact sum with your numbers in it, so you can check it by hand.

That became EziSolutions, a free site with 20 calculators: Etsy, Mercari, Poshmark, Venmo, Stripe, Square and Fiverr fees, ROAS, customer LTV, CPM, BMI, TDEE, VAT, loans, freelance rates and a few more. No framework, no backend, no signup.

Here's how it's built, the bugs that taught me something, and an honest look at the SEO side, which didn't go the way I expected.

I built it with help from an AI coding assistant, and checked every formula and fee myself.

The stack (deliberately boring)

  • Python build script. content.py holds every page as data: title, description, form fields, the explanation, FAQs and sources. build.py turns it into plain HTML files in public/.
  • Vanilla JavaScript. One tools.js file with one function per calculator. No React, no bundler.
  • Cloudflare Workers with static assets. The Worker just serves public/. _headers sets security headers and _redirects handles old URLs.
  • GitHub + Workers Builds. Every push to main runs npx wrangler deploy. About 40 seconds from git push to live.

The whole deploy config is this:

{
  "name": "icy-shape-8ab9",
  "compatibility_date": "2026-11-01",
  "assets": {
    "directory": "./public",
    "not_found_handling": "404-page",
    "html_handling": "auto-trailing-slash"
  },
  "routes": [
    { "pattern": "ezisolutions.online", "custom_domain": true },
    { "pattern": "www.ezisolutions.online", "custom_domain": true }
  ],
  "workers_dev": false
}

I commit the built public/ folder instead of building on Cloudflare. It's less elegant, but the deploy step has nothing to break, and I can see exactly what ships in every diff.

The feature: a "working" line under every result

Each calculator ends by calling one helper:

function work(text) { set('ez-working', text); }

// Inside the Venmo calculator:
work(money(amt) + ' ร— ' + pct + '% + ' + money(fixed) + ' = ' + money(fee) + ' fee');
// โ†’ "$100.00 ร— 2.99% = $2.99 fee"

It's a tiny thing, but it changed how I wrote every calculator. If I couldn't print a clean one-line sum, the logic was probably too clever, and I simplified it.

Bug 1: "How much should I charge to receive $100?"

Fee calculators get asked this a lot. The textbook answer is:

amount to charge = (amount you want + fixed fee) รท (1 โˆ’ percentage)

For Venmo's 2.99% that gives $103.0821, which I rounded up to $103.09. But Venmo rounds its fee to the cent, so $103.08 already leaves exactly $100.00. I was telling people to overcharge by a cent.

Worse, the formula falls apart for fees with a cap or minimum. Stripe's ACH fee is 0.8% capped at $5. To receive $1,000 you need $1,005, but the formula said $1,008.06.

The fix was to stop solving it algebraically and search over whole cents instead:

// Smallest amount (in cents) whose fee still leaves `want`.
function askFor(want, pct, fixed, feeFn) {
  let lo = Math.round(want * 100);
  let hi = Math.ceil((want + fixed + 1) / Math.max(1 - pct / 100, 0.01) * 100) + 100;
  while (lo < hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (mid / 100 - feeFn(mid / 100) >= want - 1e-9) hi = mid; else lo = mid + 1;
  }
  return lo / 100;
}

feeFn is the real fee function, with rounding, caps and minimums, so whatever rule a platform uses, the answer is exact. The formula only sets the upper bound for the search.

Bug 2: my test caught a wrong number in my own article

Every tool page has a worked example in the text. I test each calculator by filling it with the example's numbers in headless Chrome (plain Chrome DevTools Protocol, no test framework) and comparing the output with what the page says.

That's how I found the $103.09 bug: the calculator and the article disagreed. Testing against the prose turned out to be a cheap way to keep the explanations honest.

Bug 3: the security header that would have blocked my revenue

My Content-Security-Policy only allowed scripts from my own domain and Cloudflare's analytics. When I added Google AdSense, the script would have been silently blocked in every browser. No error on my side, just no ads.

I caught it by loading the page with the real headers and reading the console for CSP violations before deploying. Lesson: if you ship a strict CSP, re-test it every time you add a third-party script.

Fees change, so every fee page has a date

Seven of the tools depend on other companies' fees. Blog posts about them disagree constantly, because they copy each other's old numbers. So every fee comes from the company's own page (Stripe's pricing page, Etsy's fee policy, Poshmark's fee policy and so on), and each tool page links its source and says when I checked it.

Two I couldn't verify, I left out. Cash App's site is region-blocked where I live, and Shopify redirected me to a local pricing page without US card rates. I'd rather ship 20 correct tools than 22 with two guesses.

The SEO surprise

Technically, everything went well:

  • Lighthouse 95โ€“100 across the board
  • Structured data (WebApplication, FAQ, Breadcrumbs) on every page
  • A clean sitemap, canonical URLs and fast static pages

Google indexed the pages within days and impressions started climbing. My first click came from "venmo fee calculator", one of the newest pages on the site.

Then, about two weeks in, Google moved almost every tool page to "Crawled โ€“ currently not indexed". The pages weren't broken. Google's live test said "URL is available to Google, page can be indexed". It just decided not to keep them yet.

What I learned:

  1. Technical SEO gets you crawled, not indexed. A new domain with no backlinks and 20 similar-looking pages published in three weeks looks like a calculator farm, even if every page is careful.
  2. Check the boring settings. Cloudflare's "Always Use HTTPS" was off, so every http:// URL returned a full page. Google found 24 duplicate copies of my site. It's one toggle, and now it's on.
  3. Requesting indexing isn't a fix. It gets pages recrawled faster, but Google re-checks them and says no again until it trusts the site.
  4. Slow down publishing. My next step is building real links and letting Google trust the pages I already have, not adding more.

I'll write a follow-up once pages come back (or don't).

Try it, break it

The site is ezisolutions.online. If you find a calculation that's wrong, or a fee that's out of date, I'd genuinely like to know. And if you've taken a new site through the "crawled, not indexed" phase, how long did it take for you?

๐Ÿ“ฐ Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes โ€” full credit and traffic to the original publisher.