1
0 Comments

The Reality Check: How my first user's feedback forced me to rebuild my infra and rethink SaaS pricing

A week ago, I received my very first feedback from my very first real user. And all my illusions about product development shattered against harsh reality.

I had just finished the MVP of my SaaS, started writing about marketing, and looking for clients. I managed to attract one agency, and I got exactly what I wanted — a clear vector for future development.

My plan was to sit down and do a redesign. I wanted everything to be beautiful, pixel-perfect, and stylish. But it turned out my first client couldn't care less about beauty. He needed one big "Make it work" button and a place to store his giant raw files (which is 50 to 100 GB per project).

Escaping AWS: How I cut costs by 2.5x in 6 hours

Initially, I deployed the entire infrastructure on AWS. Yes, Amazon S3 allows storing such volumes, but there's a catch — egress fees. The specifics of my product mean that heavy files will be downloaded very frequently. AWS would simply bankrupt me on bandwidth.

I started looking for alternatives and discovered Cloudflare R2. The storage is cheaper, and most importantly, egress traffic is absolutely free. Exactly what I needed! The migration went super smoothly since it uses the same S3-compatible driver under the hood.

But then my inner optimizer took over. Having ditched S3 and moved the domain to Cloudflare, I also dropped AWS Route53 and CloudFront. Only the compute servers (EC2) were left on AWS. And I thought: why pay Amazon for weak instances when I can rent powerful hardware from Hetzner?

  • My old infra (AWS): 2 EC2 instances, 2 CloudFront distributions, 2 S3 buckets, Route53 domain = $28 / month.

  • My new infra: 2 Hetzner servers (2 cores, 4 GB RAM, 40 GB SSD) + Cloudflare R2 = $12 / month.

In just 6 hours, I migrated the entire backend and cut costs by more than half.

The Final Boss: Uploading gigabytes via mobile Safari

I was as happy as a kid until I realized one thing: I needed to implement stable uploading for these massive files.

At first, everything seemed simple. Small photos flew back and forth, CORS was defeated, I even set up Presigned URLs. But when I tried to upload a 4 GB test file, Google Chrome threw an "Error 5", and the mobile app simply crashed.

It turned out my code was trying to load the entire file into the device's RAM before sending it to the server.

Solution: Multipart Upload. I started splitting the file into 50 MB chunks and sending them one by one, while the server stitched them back together. Good thing the S3 driver handles this painlessly. I pushed the update, called the client, he tried it and said: "It doesn't work."

The client was trying to upload an 800 MB video from his iPhone via the web app (Safari). The upload reached 20%, and the browser tab just silently refreshed itself!

I was furious. Tests on my own iPhone showed the exact same thing. But in Chrome on Android, everything worked perfectly.

The reason lay in iOS's aggressive memory management (Jetsam). Mobile Safari has a strict memory limit per tab (~250 MB). My 50 MB chunks quickly filled up the memory, and the Garbage Collector simply couldn't keep up with the fast internet to clear out the old chunks. iOS saw the RAM overuse and "killed" the tab.

A brilliant and simple solution: I added an artificial 50-millisecond delay after sending each chunk.

The Event Loop saw this pause and finally could pass ticks to the Garbage Collector! The memory cleared out. At the same time, I reduced the chunk size for the web from 50 MB to 5 MB. This not only saved Safari from crashing but also made the upload progress bar super smooth (percentages ticked 1-2-3-4% instead of jumping in large blocks).

Everything worked. The client was happy and uploaded his heavy files. But now I had another problem.

Competing with the Giants

Who should pay for storing all these heavy source files? I can't do it out of my own pocket. I needed to figure out storage pricing.

My initial thought for storage add-ons was straightforward based on my costs:

  • 100 GB for $5/mo

  • 500 GB for $25/mo

  • 1 TB for $50/mo

The margins were great (~60%+). But then I looked at the market. Google One offers 2TB for $9.99/mo. Apple iCloud is dirt cheap.

Why would a user pay me $50 for 1TB when they can get 2TB from Google for $10?

The answer is Context and Seamlessness.

In Google Drive, files are just dead links. In my app, the raw file is attached directly to the project, accessible instantly. People will pay a premium for that workflow, but they won't pay a 10x premium. I realized I needed to lower the prices to make it a "no-brainer."

The Hidden Profit: Overprovisioning

When you sell cloud storage, you aren't selling bytes; you are selling peace of mind.

If a user buys a 100GB plan, they rarely max it out. They might upload a 40GB project. I only pay Cloudflare for the physical 40GB sitting on the server. The rest is pure margin.

Here is the actual math (including my payment gateway fees of 5% + $0.50):

Worst Case Scenario (Storage is 100% Full):

  • 100 GB Tier ($3.99/mo)

    After Gateway Fees: $3.29

    R2 Cost: $1.50

    Net Profit: $1.79 (45% Margin)

  • 500 GB Tier ($12.99/mo)

    After Gateway Fees: $11.84

    R2 Cost: $7.50

    Net Profit: $4.34 (33% Margin)

  • 1 TB Tier ($21.99/mo)

    After Gateway Fees: $20.39

    R2 Cost: $15.00

    Net Profit: $5.39 (25% Margin)

Even if they max it out, I never lose money. But look what happens in a realistic scenario:

Realistic Scenario (Storage is 40% Full - Overprovisioning):

  • 100 GB Tier ($3.99/mo)

    After Gateway Fees: $3.29

    R2 Cost: $0.60

    Net Profit: $2.69 (67% Margin)

  • 500 GB Tier ($12.99/mo)

    After Gateway Fees: $11.84

    R2 Cost: $3.00

    Net Profit: $8.84 (68% Margin)

  • 1 TB Tier ($21.99/mo)

    After Gateway Fees: $20.39

    R2 Cost: $6.00

    Net Profit: $14.39 (65% Margin)

The margins equalize at a perfectly healthy SaaS standard of ~65%!

The Left-Digit Effect & The Final Pricing Grid

To seal the deal, I applied the "Left-Digit Effect" to my entry tier. Instead of $4.99, I dropped it by just one more dollar to $3.99/mo.

$4.99 feels like "five bucks" (requires thought). $3.99 feels like "three-something" (an impulse buy, cheaper than a coffee).

Here is the final storage add-on pricing grid I landed on:

  • 📦 100 GB for $3.99/mo (Impulse buy, lock-in trigger)

  • 🗂 500 GB for $12.99/mo (The sweet spot for active users)

  • 🗄 1 TB for $21.99/mo (Pro tier: highly profitable, but doesn't feel like a rip-off compared to Google Drive)

Even if a user maxes out all 100GB on the lowest tier, my R2 cost is $1.50, the payment gateway takes ~$0.70, and I still net a profit of $1.79.

The Ultimate Goal: Ecosystem Lock-in

The real goal here isn't just the profit from the $3.99 tier. The goal is Lock-in.

Once a user uploads their massive source files into my ecosystem for a measly $3.99, they are tied to the platform. Moving terabytes of data back to Google Drive is a nightmare. As their projects grow, they will naturally upgrade to the 500GB or 1TB tier because the friction of leaving is just too high.

SaaS pricing is 20% math and 80% psychology.

Curious to hear from other founders selling storage or usage-based limits: do you rely on overprovisioning to keep your margins healthy? Let's discuss! 👇

posted toAvatar for product Cutria
Cutria