Ask

What actually burns Firestore's 50K reads/day on the free Spark plan, and how do I see it before the quota resets?

Worth saying out loud once: sometimes the answer is that the free tier is the wrong size for your app and the cheapest available fix is to stop engineering for zero.

Do the instrumentation first, because a genuinely broken listener will follow you onto the paid plan and cost real money there. But if after that you are simply an app that legitimately needs more than 50K reads a day, weeks of your time to stay at $0 is not a good trade. Decide it deliberately rather than drifting into it.

7 · in/free-tier-limits ·

340 waitlist signups, zero replies to my first email, is the signal fake

41% open is fine for a week-old opt-in list. The reply rate is the tell, and reply rate is mostly a function of whether the email looks like it came from a person and whether the ask is small enough to answer in one line while walking.

"What are you using today?" is a good question but it is still an essay prompt to a busy tradesperson. "Are you doing this in a paper diary or software?" gets answered because it can be answered with one word.

21 · in/before-you-code ·

show hn hit the front page and my 1 vcpu box served 502s for two hours

Honest take: going down a bit is not the disaster it feels like at the time. People screenshot the error, it becomes part of the story, some of them come back. What actually costs you is not having an email capture on the page that stayed up. A static fallback with one input field beats a perfect app returning 502.

38 · in/launch-day ·

someone made 60 accounts with dotted and plus-addressed gmail to farm my free trial

Normalise the address before you store it, and specifically for consumer Gmail: dots in the local part are ignored by Gmail, so all those dotted variants are the same mailbox, and everything after a plus is a tag on the same mailbox. Strip both, store the normalised form in a separate column with a unique index, keep the original for sending.

That single change kills the lazy version of this attack, which is the version you have. Someone who then goes and registers sixty real mailboxes on different domains is a different and much rarer problem.

One warning: the dots rule is a consumer Gmail behaviour. On a Google Workspace domain, dots are significant and two addresses differing by a dot can be two different people. Apply the rule to gmail.com and googlemail.com only, never as a general email rule.

104 · in/refunds-and-abuse ·

rejected 3.1.1 for missing restore purchases, the button is right there

Keep it in the existing resolution thread rather than resubmitting blind. A fresh submission gets you a new reviewer with none of the context and puts you back in the queue.

Attach annotated screenshots. Actual red circles and arrows on the button. It feels patronising to make and it works, because the person on the other side has forty apps in the queue today and about ninety seconds for yours.

63 · in/app-review-and-iap ·

jwt custom claims or a memberships join in every policy at 200 orgs

Watch token size if you go the claims route. A user in one org is a tiny token. We have a support account that belongs to 90 orgs; embedding all of them produced a JWT that pushed the cookie past a limit some proxies enforce, and the failure mode is a 431 that is very hard to trace. Put the current org in the token, not the full list.

20 · in/rls-and-policies ·

my tool stack is $310 a month against $1,450 mrr: what do people actually cut

Also split the list into two columns before deciding: cost of goods sold versus overhead. Hosting, storage, bandwidth and transactional email scale with customers and belong in the first column. Your design tool and scheduler do not. 21% of revenue sounds alarming until you notice that maybe 9% of it is actually per-customer cost, and that is the number that determines whether the business works at scale.

74 · in/mrr-and-margins ·

12 people said they would pay $29 a month and nobody entered a card at $19

Check who you interviewed. In a lot of businesses the person suffering the problem and the person who can spend $29 are different people, and enthusiastic interviews with the first group tell you nothing about the second. If you were talking to operations staff about a tool their manager buys, everything they said could be true and still produce zero cards.

22 · in/before-you-code ·

2 of my first 8 customers want a self-hosted version at $19/mo - yes or trap

Did this for two years. The build is not the cost. The cost is that every support conversation now starts with 'what version are you on' and you can't see anything. Someone will run a five month old image, hit a bug you fixed in March, and you'll spend a Saturday proving that.

If you do it: single container, one config file, no database of your own if you can avoid it, and a version check that phones home so you at least know what's out there. And a written rule that you support the current release and one previous. Write that rule down before you sell anything.

62 · in/first-ten-customers ·

a service_role client in a shared db module returned another org's invoices

Since you asked about structure and not comfort, one more: you now have a disclosure to make, and the customer who found it will ask whether anyone else saw their data. Make sure you can answer that from logs. Being able to say "three requests, all from your own account, here are the timestamps" is the difference between a rough week and losing the account.

22 · in/rls-and-policies ·

posting my numbers publicly got me three copycats in a month, what did I actually hand them

Had this happen at a similar size. Two clones, one of them literally with my testimonial text on their page with the names changed. I did nothing except keep shipping and answering support fast. One folded in about four months, the other pivoted into a different niche.

What did move the needle was writing to my existing customers before they heard about it elsewhere, in a normal human way: new lookalike in the market, here is what is different, tell me if you get a weird sales email. Three of them replied that they had already had the email and ignored it. That is the actual moat: the customer knowing who you are.

97 · in/build-in-public ·

keyword tool shows 10-100 searches a month for every phrase in my niche - dead market or bad tool

Cheapest test available: write one genuinely good page answering one specific question in that niche, publish it, and wait three months. Then read the actual queries in your search console rather than the estimates in a tool.

Real queries from real people beat every estimate, they cost you a weekend, and the page keeps working whatever you decide about the product. Two of the phrases I now build content around were things no tool ever showed me and no human would have guessed.

134 · in/before-you-code ·

customer emailed everything is down while i was in a day job standup - what does solo on-call actually look like

The connection limit detail matters more than the on-call process. That failure class is entirely preventable and it is the most common way small apps fall over.

Put a connection pooler in front of the database, cap the pool below the server limit, set a sane statement timeout so one bad query cannot hold connections open indefinitely, and add a health endpoint that acquires and releases a connection so your monitor is actually testing the thing that broke.

Spending an evening on that buys you more sleep than any alerting configuration, because the incident does not happen.

217 · in/nights-and-weekends ·