Separate domain, real mailbox, authenticate it, ten a day for two weeks, personalise enough that people actually reply. Warmup is just sending real mail slowly.
Fenella Doyle
@flashcard_fen
Four years of daily reviews without a real break, currently around 14,000 mature cards. Card wording is almost always the problem, not the scheduler.
215 credit Trusted
- From answers
- 0
- From questions
- 225
- Lifetime
- 225
Launched in May and made the same timezone mistake in the other direction - set it to midnight my time, which was mid-afternoon Pacific. Two things helped. I posted a comment on my own launch describing the specific problem in one paragraph with no marketing in it, and I replied to every single comment within about ten minutes for the entire day. Ended up with a decent comment count and finished better than my position at hour three suggested.
Also: make the first image a real screenshot, not a gradient with your logo on it. People decide in about a second.
Both, ideally, but the ordering is right. I have watched several people spend on gear while still buying beans from a shelf where the roast date is a best-before six months out.
The rotation advice exists because of volume, and because of what happens when a sequence tool sends the same seven paragraphs to two thousand people. At 30 handwritten a day you are a completely different animal.
Use a separate sending domain anyway - not for rotation, but so that a bad month never touches the domain your password resets go out on. One domain, one or two mailboxes, that's it. What will actually hurt you is not volume, it's complaints.
At 900 visits a month, attribution engineering is theatre. Twenty signups split three ways is six or seven each and every difference you see is noise.
Put one optional question on the signup form: how did you hear about this. Five options plus other, radio buttons, not required. I get 60 to 70% completion on that and it has been more useful than any analytics I have ever installed, partly because the answers include things no tool can see - a friend told me, my colleague uses it, someone mentioned it on a call.
At your size, twenty honest answers beats a perfect pipeline of events you will never query.
Third option nobody mentions: make the cold start not matter for the person at 08:55. If the first thing she loads is a dashboard, prerender the shell and stream the data in, so the 1.4s happens behind a page that is already on screen instead of in front of a white one. We took a 1.6s cold start from "customers complain" to "nobody has mentioned it in a year" without making it any faster.
Whoever said "that is not what keys are for" and walked off owed you two more sentences. Worth going back to them, both because the answer is short and because you want that person answering the next question rather than dropping a verdict.
Four minutes rather than an hour reframes the whole question. Most people arguing about whether tailoring works are picturing a full rewrite.
One channel that works surprisingly well for trades and gets dismissed: search, but for the problem rather than the product. Nobody in that sector is searching for scheduling software. Plenty of them are searching for things like how to handle a no-show policy, or a template for a service agreement, or what to do when a technician's paperwork keeps arriving three days late.
Write four genuinely useful pages answering those, with a downloadable template on each. It is slow and it is not glamorous, but it accumulates and it does not require you to find the room.
Twenty conversations a month is a lot for one person doing this alongside building. I would ask whether ten deeply researched ones would tell you the same thing. My learning per conversation went up sharply when I stopped trying to hit a number.
The inner/outer split is also where you want your error boundary, for the same reason. Pair them and you can copy the two-component pattern everywhere without thinking about it.
This was my real problem honestly. I had a vague feeling I was underpaid rather than a figure.
For what it is worth, 90ms functions and a 120 burst is exactly the profile where an HTTP-based database driver stops being a novelty. No sockets to run out of, no pool to size, and the connection ceiling stops being something you think about. Bigger change than a query string parameter, but it deletes the entire category.
Used this nearly verbatim. She said the band was 92-112 and booked the call. All that agonising for one sentence.
Whatever you pick, write the sync failure UI first. We built the queue, tested it on aeroplane mode, shipped it, and discovered that the interesting case is not "no signal" but "two bars of signal, requests take 45 seconds and then time out". That state looks online to every API you have and is where all the real bugs live.
Learned that one the hard way. Turned up planning to sleep in the terminal and got walked out to the pavement at 1am.
errors.Is only checks one level. You have to loop with errors.Unwrap yourself if it's nested more than once.
It was the database. 740ms of the 1.1s was the first query, and the compute is on a plan that suspends after five minutes of no connections. I had never even seen that setting.
Ran that: slow again after 6 minutes idle, fine at 4. Which matched the database suspend timer exactly, so the binary search worked before I had finished adding the header.
Coming back to say I did the hiring check on my three and two of them had job posts for enterprise sales. That was the whole signal. They are leaving the bottom of the market and I get to have it.
Gym shoes also get compressed differently, sideways rather than through the heel and forefoot, so the wear pattern won't look like a worn-out running shoe even when it is one.
Did the 6:30 thing twice now. Completely different. The first place the owner sat and talked to me for ten minutes because there was nobody else in.
Booked one for Thursday. Even if nothing comes of it socially I'll at least know what half the menu means.
How long between the comment and the invite? I've been doing same-day and it feels a bit obvious.
Small thing that made our ops dashboard actually usable: show the age of the data next to each widget rather than a spinner on every refresh. "14s ago" tells the operator more than a flicker does, and it makes a stalled poll immediately visible instead of looking like a quiet period.