My Million Dollar Domain Hobby

Setting the Stage

My name is Adam Doppelt and I’m one of the founders of Fresh Chalk. By day I create web sites and mobile apps, but I often get sucked into other projects.

Back in 2018 I was between jobs and tossing around startup ideas with a couple of close friends. We didn’t have anything concrete, and my two friends disappeared for simultaneous three week vacations. What was I to do with myself in the meantime?

I decided to buy some domains. I’d toyed with the idea before, but now I had the perfect opportunity to put in a few weeks of sustained effort.

My three week hobby project eventually mushroomed into a domain portfolio worth over $1M. Along the way I wrote a ton of hairy code and learned quite a bit about the domain business.

You can see the domain portfolio here — https://gurge.com. People are usually pretty shocked when they see the list of domains.

Read on for the full story!

Part One: Data

I initially focused on .io domains, but quickly broadened my scope to include .ai as well. Those two TLDs are often used by startups and I felt like I had decent insight into which domains might appeal to founders. After all, I’ve helped craft names for many tech companies. Surely I’d learned something from the experience?

The first thing I did was conduct a WHOIS crawl of .ai and .io. The whois system keeps track of who owns each domain, the date it was registered, and when the domain will expire if the owner fails to renew. You can buy whois data, but I’m cheap and I wanted to gather the data myself.

I started by building a word list using the trusty 6of12 file as a base. I culled the list to only include words less than 11 letters, which left me with roughly 22,000 words. That’s 44k potential .ai and .io domains.

My first attempt to crawl whois was a colossal failure. Whois servers have strict rate limiting, and the .ai whois server was particularly stingy. Running more than 10 .ai whois queries in one minute from a single IP would lock you out for hours.

I ended up writing a distributed whois crawler.

That sounds fancy, but it was just a short Ruby script that would ssh to a handful of cloud instances to run whois queries. I like to keep my hobbies cheap and cheerful — no database, no queue, no complexity. Just a CSV file, ssh whois, and my old friend sleep() to honor the rate limits. The results were cached in a Dropbox folder with one file per request. My precious data lives in a single Google Sheet, though I export periodically to feed my scripts.

Both crawls completed in a few hours and I was shocked to find that some wonderful domains were unregistered! Why hadn’t anyone registered Thump.io or Bullseye.ai? With shaking hands I quickly created an account at Namecheap and registered 50 domains that looked promising. It cost a few thousand dollars.

Now I had a new problem. How could I tell which of the remaining 44k domains were valuable? How could I separate the wheat from the chaff? My instincts were passable but I yearned for data. Luckily I had a bright idea.

Google rolled out the .app TLD in mid-2018. Rather than releasing all the domains into the wild on day one, they released the names in stages. It went something like this. On the first day, a .app domain could be registered for $10k. On the second day, a .app domain could be registered for $5k. On the third day, the price dropped to $2.5k. This would continue for ten days.

Here was my bright idea — a whois crawl of .app would reveal which domains were registered each of those ten days. Clearly, the domains registered on day one were more likely to be valuable than the domains registered on day two. I already had a whois crawler ready to go, so it was trivial to gather the data for .app. Now I had a reasonable way to value prospective .ai and .io domains from my list of 44k. I called my metric gscore and it became another column in my spreadsheet.

Now it was time to buy some domains.

Part Two: Dumb Money

The chummy world of domaining is filled with colorful characters. It’s hard to understand what’s happening, and the opacity of domaining is intimidating for newcomers. Especially amateurs like me.

In the beginning I bought domains on auction sites. The best auction site was park.io, which was friendly, well designed, and transparent. The founder Mike Carson had given a few interviews and seemed like a kindred hacker. Each day, new domains popped up for auction and the bidding was frantic. I bought a few domains, like Lobster.io. I had no idea if I was overpaying but I was determined to win. Auction sites love naive bidders like me.

I tried Flippa, but I couldn’t find many .ai or .io domains and they seemed overpriced even to my untrained eye. Most of the other auction sites were a bust.

Within a few days I amassed a starter .io portfolio, spending a few thousand on domains. It was slow and expensive. I began to suspect that I was an ignorant whale. I considered buying a chunk of the underlying park.io portfolio from Mike, but I couldn’t rid myself of that awful whale feeling.

How could I transform myself from whale into shark? I decided to dig deeper and figure out how to get the domains before they ended up at auction. Surely there was a way.

Part Three: Shark

In 2018, many people were letting .ai domains expire either on purpose or through neglect. ICANN has a strict process to manage domain expirations, but each TLD implements the rules in different ways. There is a rich ecosystem of companies and individuals attempting to “catch” dropping domains.

The .ai TLD is run by the tiny Caribbean island of Anguilla. More to the point, the registry is managed by a sharp fellow named Vince Cate, who was recently written up in the New York Times.

Anguilla had a delightful system for domain expiration. If you failed to renew your domain, it would be released on the third Friday of the month at noon. Noon Anguilla time, naturally. In other words, at noon on the third Friday of each month there was a fantastic haul of .ai domains suddenly available for registration. By anyone.

It took me a while to puzzle this out.

You could register the domains manually, or create an account directly with Anguilla and use the EPP system to register a domain. I cautiously created an account with Anguilla, nervously wired them a token amount of money, and started experimenting with EPP.

I wrote a Ruby script that attempted to use EPP to register dropping .ai domains. I spun up a Vultr cloud instance in Miami, not far from Anguilla. My script was pretty brain dead, but it was smart enough to focus on the domains that had the highest gscore. I fired the whole thing up at 11:57am Anguilla time and waited.

At first it looked like I had single handedly crashed the island of Anguilla, but gradually I started to receive some output. The results were amazing! I snagged Coffee.ai and Idea.ai. I got Payment.ai. By the time the script petered out, I had registered twenty excellent .ai domains. Most of the the action took place in the first 45 seconds. Total cost: $2,000.

There were a handful of other people trying to catch .ai domains. You could easily see who won by querying whois. It was an arms race and it turned out I could compete!

I was officially a shark.

I tried my hand at catching .io domains but it didn’t work out as well. The drop times were less predictable and the competition was intense. The APIs available from various registrars were not built for drop catching, and the people running those APIs were understandably not interested in high frequency registration attempts. I could’ve paid more money to get access to better APIs, but the whole enterprise felt uncertain.

I was able to grab some winners like Dependency.io, but for the most part it was a bust.

Plus, more players were getting into the game. Established players with deeper pockets. Hexonet and Dynadot started catching .io domains and selling them at auction. It was easy to see this happening, because my scripts would fail and then I would check whois to see who’d beaten me. I bought a few domains from them at auction, like Mousetrap.io, but I started to get that nagging whale feeling again.

At this point I had acquired over 200 domains.

Part Four: Anguilla Changes Course

In the fall of 2018 Anguilla wisely decided to move to a new system and collect more .ai revenue. Instead of dropping expired domains into the hands of hackers like me, they would instead be auctioned off each month. They licensed the excellent software from park.io to run the auctions.

For some reason I no longer felt like the dumb money. I owned a sizable portfolio and I had a sense for the value of individual domains. I understood the ecosystem a little more. I had the data. Nobody is a shark at those auctions, but I’d come a long way and felt like I could bid intelligently.

The first few months I was like a kid in a candy store. I bought a ton of .ai domains at auction and rarely felt like I overpaid. I only bid on domains that I thought would make good startup names. I tried to avoid bidding wars, though I may have gotten carried away with Clue.ai.

Nothing lasts forever, and eventually the .ai auctions became more competitive. There was one deep-pocketed person in particular who seemed determined to win most of the auctions. The two of us would swoop into the auctions at the last second to do battle, but I almost always let him win. It wasn’t worth the hassle, at least for me.

As the auctions gradually lost their appeal, I tried more experiments with my hard earned data. For example, I tried contacting existing domain owners just before their domain expired. I wanted to have a shot at the best domains before they went up for auction.

It was a tricky business, tracking down owners and convincing them to part with their neglected domains. I targeted domains that had almost expired and required fees to retrieve, pulled from the ghostly gray mist that looms before final expiration. I actually had good luck with this approach, but it was time consuming. It started to feel like a job.

Besides, Fresh Chalk was getting off the ground and it was time to focus on my startup.

The portfolio was complete. I owned over 300 domains.

Part Five: This Domain is For Sale

Have you ever tried to buy a domain? I can’t even tell you how many awful domain landing pages I’ve encountered. Terrible websites, filled with trackers. Vague and unfriendly landing pages. Malware. Domains that don’t resolve, or have broken websites. Redirect loops. Domains that only work with HTTP, or have misconfigured certs. It’s like people don’t even try.

After some consideration I decided to put up a whimsical landing page, one that fit my personality and felt approachable. All the domains would be listed, along with rough prices. This was extra work, but I was hopeful that it would lead to more transactions. For example — Admin.ai.

I have a single nginx instance running on Vultr. The site is generated with nanoc using my main CSV (from Google Sheets) as an input. Cloudflare acts as an HTTPS proxy. I use a simple script to add new domains to Cloudflare. I even added an I’M FEELING LUCKY button powered by nginx lua. Cheap and cheerful, as usual.

I also experimented with other domain marketing channels like Sedo and BrandBucket. Those were a complete bust. I don’t think either service generated a single lead.

Part Six: Horse Trading

Nginx lit up and emails started pouring into my inbox. I nursed each newborn lead even as my gut told me that most of them were unlikely to convert to transactions. I quickly developed a few rules of thumb:

  • The vast majority of buyers were new to the process, just like me. They had no idea whether my prices were fair. Buying domains is terrifying and my friendly landing page helps immensely.
  • Lowball offers are extremely common. “I’ll give you $100” is a popular email. Aggressive buyers are eager to pay me $100 this very day!
  • Buyers love to concoct complicated schemes. They want to buy ten domains and get a discount. They want to lease domains. They want to avoid escrow. They want to discuss the ethics of domaining. They want a detailed breakdown of my costs.
  • Domains priced below $1,500 sell very easily. Domains priced higher require a motivated buyer.

Now that I’ve responded to hundreds of emails and sold dozens of domains, I can tell who’s serious. I keep canned responses in my note taking app. Here’s the first one:

When someone offers $200 for a $10,000 domain I try not to waste time:

I don’t get drawn into discussions about leases or equity. I don’t accept crypto. I don’t get excited when someone is eager to buy ten domains. I don’t do trades. Complexity kills transactions. Many of my canned responses are apologetic.

I’ve found that short, honest responses are the most likely to create trust. There’s less room for ambiguity. These days I barely even negotiate. My prices are fair, and genuine buyers accept that quickly.

On the other hand, I’m often moved by personal stories. I’ve given away domains, or sold them for almost nothing. I’ve been very lucky in life, and I try to keep that in mind when buyers hesitantly ask for help. I’ve rarely regretted an act of charity.

I’ve also made a few friends, including a handful of repeat buyers. This is a signal that my prices are too low, but life is short and I don’t need to maximize my hobby.

Part Seven: Profit

After we’ve agreed on price, it’s my job to nurse these fragile deals over the finish line through a combination of friendliness and grit. Domain sales always use escrow to protect both buyer and seller.

My emails are carefully crafted to create a gentle slope between first contact and completed transaction. In the beginning there is no trust and much fear. Gradually as we descend the slope, there is a modicum of trust and the uncertainty recedes somewhat.

Buying a domain is super scary. Let me explain in case you ever have to do it:

  1. I create a new transaction on escrow.com. They will send the buyer an email.
  2. Escrow.com charges escrow fees as a percentage of sale price. The buyer always pays these fees. That’s because the buyer has some control over the fees, which depend on method of payment. Also, buyers get cold feet. My feet are never anything other than red hot.
  3. The buyer submits payment to escrow.com. Depending on the method of payment, it might take a few days for the payment to clear. Many buyers are overseas, which can slow things down a little. Escrow.com sends me an email when the payment clears.
  4. While we wait, I gently encourage the buyer to create an account with a registrar. Some of the domains are hosted with nice registrars that allow a domain push. If the buyer creates an account, I can push the domain directly into their account for free. The domain is transferred instantly.
  5. If that isn’t possible, we go through a traditional domain transfer. This process is regulated by ICANN and can take a few days. Super scary, especially since the buyer already paid! I generate an authcode and send it to the buyer, which allows the buyer to initiate the transfer. Sometimes there are tricky confirmation emails that both buyer and seller have to click.
  6. After the domain has been transferred and verified, the buyer is supposed to go back to escrow.com and push a button to release the funds to me.

Occasionally buyers do not want to push this button. Sometimes they forget. Sometimes they think they already pushed it. Sometimes they stop responding to emails. I am not worried, though. After a few friendly emails to the buyer I just contact escrow.com support and they are happy to push the button on behalf of the buyer. Escrow.com can verify that the domain was transferred (via whois), and they can contact the buyer directly. I always get paid.

Special note to anyone reading this from escrow.com. Please implement 2FA. Thanks guys!

What Does it All Mean?

My little hobby is bearing fruit. I am extremely busy at Fresh Chalk, but not too busy to reply to buyers. I still enjoy the auctions and sometimes get carried away. Can I interest you in Barcode.ai?

I reckon the portfolio is worth roughly $1M. That number is extrapolated from existing sales and assumes that I sell every domain. It probably won’t work out that way, of course. The downturn will affect sales. Time passes and tastes change, even with domains.

Still, I’ve met my original goals. I wrote some code. I learned the ropes. Even factoring in my undoubtedly valuable time, I’m still ahead.

Which hobby should I try next? Let me know at amd@gurge.com

Fun Stats

  • Technology used — Ruby, Google Sheets, Dropbox, Nginx+Lua, Nanoc, Vultr+Ubuntu, Cloudflare, DomainTools, NameBio
  • First sale — Calypso.ai
  • Largest sale — Eth.io, price undisclosed
  • Domain with the Most Leads — Workforce.ai
  • Landing Page with the Most Traffic — Graviton.io
  • Fastest sale — 16 days from acquisition to sale
  • Number of People With Larger .ai Portfolios — 2