2
5 Comments

I built a free bank statement decoder in 7 days. Here is my SEO/GEO setup.

Hi everyone,

As developers, we spend months over-engineering our backend databases but completely ignore the most brutal friction point: how our billing looks on a customer's bank statement.

When someone checks their card and sees a cryptic code like PADDLE.NET* ACY, DRI*ADOBE, or MSBILL.INFO, they panic. They don't recognize the brand, assume fraud, and hit the chargeback button. That triggers a $15–$50 penalty fee for the creator and blacklists the user's card.

I wanted to solve this. So last week, I put together ChargeDecode — a completely free, static directory that translates these weird bank statement descriptors back to their real-world brand websites, support phone numbers, and refund pages.

The site is fully live, but in 2026, the traffic game has changed. Here is how I set up the technical backend and optimized it for LLM citation search (ChatGPT/Google AI Overviews).


The Tech Stack (As simple as possible)

I didn't want any server maintenance or heavy database queries, so I kept the stack dead simple:

  • Frontend: Plain HTML5 + Tailwind CSS, hosted on Vercel.
  • Data: A single, static JSON file indexing 35+ of the highest-frequency statement codes. Lookups are handled client-side with zero latency.
  • Generator: A lightweight Cloudflare Worker that spits out legally-vetted FCBA dispute letter templates in 2 seconds if a user actually needs to write to their bank.

Generative Engine Optimization (GEO) Setup

Traditional SEO is mostly dead; Google's AI Overviews and Perplexity are directly eating up clicks. Since my site targets long-tail searches (e.g., "Why did DRIADOBE charge me?"*), I'm highly vulnerable to AI models scraping my data and hiding my links.

To force ChatGPT and Google AI to cite me as a primary source, I structured my pages like this:

  1. Semantic Entity Schema: Each page has a deep FAQ schema in the head, explicitly telling Google's NLP engine the exact relation between the billing code, the Merchant of Record, and the actual parent company (e.g. mapping DRI* -> Digital River -> Adobe Inc).
  2. The "Answer Capsule": Right below the H1, I put an 80-word, high-density bolded summary. It’s written specifically to be pulled as a featured snippet.
  3. Structured Scenario Tables: AI search models love tables. I translated the refund steps into explicit HTML tables (Scenario | Cost | Action). Perplexity frequently references these structured lists.

The monetization is simple: the lookup is free, but if someone needs a formal dispute document, I offer a premium Pro PDF template package on Gumroad for $19.99.


Mistakes and Lessons: Two Major Pivots

During this short launch window, I made two critical mistakes that almost killed the project:

1. The Active Outreach Trap

I initially set up search keyword alerts on Twitter/X to find people complaining about unrecognized charges and reply with helpful advice and our link.
It was a massive mistake. Even though I typed the replies manually, X’s automated bot-filters flagged my unverified, fresh account for posting outbound links to strangers. The account was permanently suspended within 24 hours.
Lesson: Don't waste time on active social link-spamming. Focus 100% on high-authority owned assets (SEO, Pinterest, Dev.to) where you own the content and linking is fully compliant.

2. The 20-Day Sitemap Void

My Google Search Console was stuck on "Could not fetch" for my subdirectory sitemap on Vercel for nearly 3 weeks.
I finally debugged it yesterday: I had completely forgotten to map the sitemap path inside my root robots.txt (Sitemap: https://glq-api.asia/charge-decode/sitemap.xml). Once I updated robots.txt and did a manual URL inspection ping in GSC, the crawlers woke up immediately.


Would love to hear some thoughts from other SaaS builders:

  1. How do you customize your billing descriptors to prevent user billing panic?
  2. What are some of the most confusing statement codes you've seen?

Check out the live tool: ChargeDecode

on July 8, 2026
  1. 1

    What stood out to me is that you're not solving a billing problem—you're solving a trust problem.

    People don't search those statement codes because they're curious. They search because they're worried. Reducing that uncertainty may end up being more valuable than the decoder itself.

    1. 1

      Spot on, Aryan. This is a massive realization for me during the build.

      When someone sees an unrecognized "DRI*ADOBE" charge on their card, their immediate psychological reaction isn't "how did this technical integration happen?" — it's "am I being scammed, or did my kid buy something?"

      That's why in my decoder pages, I prioritized putting direct customer support phone numbers, step-by-step refund pathways, and warning guides (like how Apple or MS will lock your account if you file a bank chargeback). The value of reducing anxiety is indeed where the real conversion happens.

      Really appreciate you pointing this out, it validates my UX decisions!

      1. 1

        Glad it resonated.

        Your reply made me think there's one strategic decision sitting underneath that trust model which becomes much more significant as the product grows, but I don't think I can explain the reasoning properly in a thread without oversimplifying it.

        If you're interested, what's the best email to reach you on?

        1. 1

          Hey Aryan,

          Appreciate you asking. I think you're spot on — the trust model trade-off becomes much sharper as the product scales, and the "right" answer heavily depends on where we want to end up.

          I would love to trade notes on this offline. You can reach me directly at decode@glq-api.asia. Drop me an email anytime!

          Just out of curiosity to keep the thread going: what specific part of the trust model stood out to you? Was it the onboarding UX, the data privacy framing, or something deeper like the "who owns the user relationship" question?

          — Zhen

          1. 1

            Thanks! I’ve just sent it over.

            Looking forward to hearing your thoughts whenever you have a chance.