123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- <!doctype html><!-- This is a valid HTML5 document. -->
- <!-- Screen readers, SEO, extensions and so on. -->
- <html lang="fr">
- <!-- Has to be within the first 1024 bytes, hence before the <title>
- See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
- <meta charset="utf-8">
- <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
- <!-- The viewport meta is quite crowded and we are responsible for that.
- See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <!-- Required to make a valid HTML5 document. -->
- <title>I bought 300 emoji domain names from Kazakhstan and built an email service (archive) — David Larlet</title>
- <meta name="description" content="Publication mise en cache pour en conserver une trace.">
- <!-- That good ol' feed, subscribe :). -->
- <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
- <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
- <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
- <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
- <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
- <link rel="manifest" href="/static/david/icons2/site.webmanifest">
- <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
- <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
- <meta name="msapplication-TileColor" content="#f0f0ea">
- <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
- <meta name="theme-color" content="#f0f0ea">
- <!-- Documented, feel free to shoot an email. -->
- <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
- <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
- <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
- <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
- <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
- <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
- <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
- <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
- <script>
- function toggleTheme(themeName) {
- document.documentElement.classList.toggle(
- 'forced-dark',
- themeName === 'dark'
- )
- document.documentElement.classList.toggle(
- 'forced-light',
- themeName === 'light'
- )
- }
- const selectedTheme = localStorage.getItem('theme')
- if (selectedTheme !== 'undefined') {
- toggleTheme(selectedTheme)
- }
- </script>
-
- <meta name="robots" content="noindex, nofollow">
- <meta content="origin-when-cross-origin" name="referrer">
- <!-- Canonical URL for SEO purposes -->
- <link rel="canonical" href="https://tinyprojects.dev/projects/mailoji">
-
- <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick">
-
- <article>
- <header>
- <h1>I bought 300 emoji domain names from Kazakhstan and built an email service</h1>
- </header>
- <nav>
- <p class="center">
- <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
- </svg> Accueil</a> •
- <a href="https://tinyprojects.dev/projects/mailoji" title="Lien vers le contenu original">Source originale</a>
- </p>
- </nav>
- <hr>
- <p>TLDR; I bought 300 emoji domain names from Kazakhstan and built an <a href="https://mailoji.com" target="_blank">emoji email address service</a>. In the process I went viral on TikTok, made $1000 in a week, hired a Japanese voice actor, and learnt about the weird world of emoji domains.</p>
-
- <h3>🌅 The setup</h3>
-
- <p>Not long ago I decided it would be a brilliant idea to buy the domain name <a href="/posts/i_bought_netflix_dot_soy" target="_blank">netflix.soy</a>.</p>
-
- <p>Whilst arguably there are better ways to spend £17, I did learn a lot about domain names, including that it's possible to have emoji domains like <span class="domain">😊.ws</span>.</p>
-
- <p>It's pretty hard to go a day without seeing an emoji somewhere on the internet. Yet, I'd never seen an emoji domain name before.</p>
-
- <p>I wondered:</p>
-
- <p>Could I buy an emoji domain name?</p>
-
- <h3>💸 Buying an emoji domain name</h3>
-
- <p>My goal was to buy a single character emoji domain name, like 💡 or 🍰. I didn't know what I'd do with it, I just wanted to see if I could get one.</p>
-
- <p>I found a website that showed every available emoji domain for 4 different extensions.</p>
-
- <p>Sadly, nearly every single one had been registered. I was late to the party.</p>
-
- <p><img src="https://i.gyazo.com/6aa39e2f0e8e2f9039b61c95ea360cb7.png" alt="Taken emoji domains"></p>
- <p>A simple mailbox emoji with a .ws extension was still available though, so I bought it.</p>
-
- <h3>📪 The mailbox</h3>
-
- <p><img src="https://i.gyazo.com/1b78a0aab3ca0b04649eacf46fd3bc0a.png" alt="Mailbox emoji domain in GoDaddy"></p>
- <p><span class="domain">📪.ws</span> was now mine. Mission complete.</p>
-
- <p>I set up a website and felt rather accomplished with my tiny mailbox.</p>
-
- <p>I could've stopped there and called it a day. But, then I had another thought:</p>
-
- <p>Could I use my little mailbox emoji domain in an email address?</p>
-
- <p>That'd be pretty cute.</p>
-
- <h3>✉️ Emoji mail attempt #1</h3>
-
- <p>I gave it a go. I setup an email forwarder to route all email sent to <span class="domain">📪.ws</span> to my regular email address.</p>
-
- <p>Eagerly I typed <span class="domain">ben@📪.ws</span> into the "to" field of gmail and hit send.</p>
-
- <p><img src="https://i.gyazo.com/3ab67d13bcfad786b7f3ba9a01968272.png" alt="Sending first emoji mail"></p>
- <h3>🛑 Blocked</h3>
-
- <p>The email never hit my inbox. It was lost forever in cyberspace.</p>
-
- <p>Turns out emoji domain names score very highly for spam and were going to be blocked to high heaven.</p>
-
- <p>But, it was interesting that I could send mail towards an emoji email address.</p>
-
- <p>So I wondered:</p>
-
- <p>If a normal .com email address doesn't get blocked for spam, could I route my emoji mail through that?</p>
-
- <h3>💌 Emoji mail attempt #2</h3>
-
- <p>It would work like this: </p>
-
- <ol>
- <li>Email sent to <span class="domain">ben@📪.ws</span></li>
- <li><span class="domain">ben@📪.ws</span> forwards to <span class="domain">nospam@normal.com</span></li>
- <li><span class="domain">nospam@normal.com</span> forwards to my email address and won't get blocked.</li>
- </ol>
-
- <p>I cobbled together something using AWS, and tried my experiment again.</p>
-
- <p>
- </p>
-
- <p>to: <span class="domain">ben@📪.ws</span></p>
-
- <pre><code><p>message: Hi Ben, how's it going?</p>
- </code></pre>
- <p>Send.</p>
-
- <p><img src="https://i.gyazo.com/bdc529a214b0e2019a96a86c933c4bcb.png" alt="First emoji mail"></p>
- <p>It worked!</p>
-
- <h3>🧨 Where things started to get out of control</h3>
-
- <p>At this point I was inclined to stop and write a post about emoji email addresses. I'd had a good run.</p>
-
- <p>But then I wondered:</p>
-
- <p>My mailbox emoji email address is great and all, but do you know what would be better? <span class="domain">ben@⭐</span></p>
-
- <p>Now how do I get one of those?</p>
-
- <h3>🎣 Emoji domain name hunting</h3>
-
- <p>Only 13 TLDs in the world accept registrations of emoji domain names: .cf, .ga, .gq, .la, .ml, .tk, .st, .fm, .to, .je, .gg, .kz, and .ws.</p>
-
- <p>The website I had used to purchase <span class="domain">📪.ws</span> only showed 4 TLDs: .fm, .ws, .to and .ml. These are considered the gold standard of emoji domain name registrars.</p>
-
- <p>Every emoji had been taken on these though. You could of course get multi-character emoji domains like <span class="domain">🎉🐢.ws</span>, but I wanted single character emoji domains only.</p>
-
- <p>So I wondered:</p>
-
- <p>Do any of those other TLDs have any emoji domains left?</p>
-
- <h3>🔭 The great hunt</h3>
-
- <p>I already had some code that performed WHOIS lookups to see if a domain name is available for a list of TLDs.</p>
-
- <p>Previously I'd used this code to buy <a href="/posts/i_bought_netflix_dot_soy" target="_blank">facebook.网站</a>, only for Marky Z to snatch it back from me. Cheeky bugger.</p>
-
- <p>I booted up the code and loaded in some A-tier emojis (e.g. ⭐,😂,❤️) and the 13 TLDs that accepted them.</p>
-
- <p><i>>node search.js</i> [ENTER]</p>
-
- <h3>🎁 The results</h3>
-
- <p><img src="https://i.gyazo.com/6adaeb53f45f75605749f78d4dcac8c3.png" alt="Console output showing available TLDs for emoji domains"></p>
- <p>Instantly I was seeing results! .la, .ga, .gq, .je. There were plenty of emojis still out there on these alternative extensions.</p>
-
- <p>An extension that stood out to me straight away was .gg, for the Island of Guernsey. "GG" is an acronym for "Good Game", and I say it often when I lose at online games. It was perfect.</p>
-
- <p><span class="domain">⭐.gg</span> was available for €29. I hit purchase.</p>
-
- <h3>💔 No GG for me</h3>
-
- <p>The next day Guernsey sent me an email.</p>
-
- <p><img src="https://i.gyazo.com/527c4941fbb3ddcffbc92a0c2ef1c828.png" alt="Email from Guernsey saying emoji domains not available on .gg"></p>
- <p>Long story short, although you could register emoji domain names with them, they didn't actually work.</p>
-
- <p>Good game Guernsey. Back to the drawing board.</p>
-
- <h3>⭐ Crazy for KZ</h3>
-
- <p>With every other extension I kept hitting walls. A lot of the registrars wouldn't even let me search for emoji domains. Nothing was working.</p>
-
- <p>One extension that kept cropping up was .kz of Kazakhstan. But, I headed over to their registar website and it was entirely in Russian.</p>
-
- <p><img src="https://i.gyazo.com/6c20c8eea912beb320555c0dace78b1b.png" alt="Russian domain name website"></p>
- <p>I do not speak Russian.</p>
-
- <p>Using Google Translate, I tried to navigate the website and buy a .kz emoji domain.</p>
-
- <p>It was a long, painful process. But, after phoning my bank to confirm I was indeed trying to make a purchase using Kazakhstani tenge, <span class="domain">⭐.kz</span> was sitting in my account.</p>
-
- <p>I plugged it into my email system and <span class="domain">ben@⭐.kz</span> worked.</p>
-
- <p>Very nice.</p>
-
- <h3>💼 Let's start an email service</h3>
-
- <p>Something excited me. Nearly all single character emojis were available on .kz, and they were only $8 each.</p>
-
- <p>So, I wondered:</p>
-
- <p>What if you could get an email address with any emoji you wanted?</p>
-
- <p>I pictured email addresses like <span class="domain">bob@🚀</span>, <span class="domain">alice@🌸</span>, <span class="domain">melvin@🍆</span>.</p>
-
- <p>All I'd need to do is buy every emoji domain to build a service like this.</p>
-
- <p>It was insane, but it was possible.</p>
-
- <h3>🌙 The night of 150 emojis</h3>
-
- <p>I decided I was going to do it.</p>
-
- <p>If I was chuffed with my mailbox emoji email address, perhaps others would be too.</p>
-
- <p>I got out my debit card, and, one by one, started buying Kazakhstan emoji domains.</p>
-
- <p><span class="domain">💡.kz</span>, <span class="domain">👑.kz</span>, <span class="domain">🌈.kz</span>, <span class="domain">😎.kz</span>. Buy, buy, buy, buy.</p>
-
- <p>It was slightly painful watching my bank account going down, and the number of emoji domains go up.</p>
-
- <p>80 emojis in, forking over money for a goat emoji domain name, you seriously start to question what you're doing.</p>
-
- <p>$1200 later, 150 emoji domains were mine.</p>
-
- <h3>💻 Building an emoji email address website</h3>
-
- <p>Finally, I needed a website where you could register an emoji email address and it would forward mail like <span class="domain">ben@📪.ws</span> did.</p>
-
- <p>Using vanilla HTML, JS and CSS, plus Stripe's API for payments, I cobbled together an MVP over a few weeks.</p>
-
- <p>Once it was done, I bought one last domain name: <a href="https://mailoji.com" target="_blank">mailoji.com</a>. My new emoji email address service <a href="https://mailoji.com" target="_blank">Mailoji</a> was ready. Get your emoji email addresses.</p>
-
- <p><img src="https://i.gyazo.com/30c54b0bed4ffc85cb38940a2b26748e.png" alt="Mailoji emoji email address website"></p>
- <h3>📱 TikTok</h3>
-
- <p>I'd gone from being curious about emoji domain names to now owning 150 of Kazakhstan's finest.</p>
-
- <p>The next step was to convince someone else to buy an emoji email address.</p>
-
- <p>TikTok seemed like a good place to start given its demographic. So, I recorded a short video advert and started a "TikTok for business" application to publish it.</p>
-
- <p>On the final page of the application I was asked for a VAT registration number. Mailoji was not a proper business yet, so there was no way I could publish my ad.</p>
-
- <p>Screw it, I'll post the video normally.</p>
-
- <p>Upload.</p>
-
- <h3>🎉 First sales</h3>
-
- <p>Here is the <a href="https://www.tiktok.com/@mailoji/video/6925405275201539334?lang=en&is_copy_url=1&is_from_webapp=v3" target="_blank">advert</a> if you're interested.</p>
-
- <p>The video sat at 0 views for about 5 hours before the TikTok algorithm started to work its magic.</p>
-
- <p>Slowly, the views started ramping up. 500 views, to 5k views, to 50k views. It was incredible to witness.</p>
-
- <p>People were loving emoji email addresses, people were hating emoji email addresses.</p>
-
- <p>It was like Marmite, a talking point. None of it mattered though because emoji email addresses were selling! <span class="domain">@🚀</span>, <span class="domain">@📷</span> & <span class="domain">@💻</span> addresses were the most popular.</p>
-
- <p>Over 2 days the TikTok video reached 200k+ views, and 60 emoji email addresses had been sold netting ~$300/yr in revenue.</p>
-
- <p><img src="https://i.gyazo.com/e33fb288704cc42f58e50ff4a5d33fa8.png" alt="Stripe graph showing first sales from selling emoji domains"></p>
- <p>I took this as a fantastic indicator. So guess what I did?</p>
-
- <h3>💵 Buying more emoji domain names</h3>
-
- <p>I decided to purchase 100 more emoji domains.</p>
-
- <p>I cried into my keyboard forking out yet more money for a llama emoji that I probably didn't need.</p>
-
- <p>In the end I had 250 emoji domains. If there was ever a moat into the emoji email address world, this was it.</p>
-
- <h3>📅 Preparing for launch</h3>
-
- <p>I figured the more people with emoji email addresses, the more people who would see them, and the more people who would buy them. A beautiful cycle.</p>
-
- <p>My next goal was a Product Hunt launch to get exposure for Mailoji, and kickstart this cycle.</p>
-
- <p>I prepped my launch post, carefully choosing each word and image.</p>
-
- <p>I even created this over-hyped promotional video, complete with Japanese voice actor saying the words "Mailoji".</p>
-
- <p class="video-container">
- <iframe src="https://www.youtube.com/embed/JKxEXZv4G3c" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>VIDEO</iframe></p>
-
- <p>Mailoji was ready for launch.</p>
-
- <h3>🚀 Launch Day</h3>
-
- <p>At 12:03 AM PST Mailoji went live on <a href="https://www.producthunt.com/posts/mailoji" target="_blank">Product Hunt</a>. We had come a long way from that little mailbox emoji.</p>
-
- <p><img src="https://i.gyazo.com/0cf1d62b2d820c8f456a95da3cffda01.png" alt="Product hunt launch thumbnail"></p>
- <p>It was 8:03 AM UK time. Bleary eyed, with a cup of tea in hand, I watched as Mailoji did battle.</p>
-
- <p>I had chosen to launch on a Wednesday against some stiff competition, but Mailoji really held its own.</p>
-
- <p>At the end of the day it finished in 5th place. Here were the end of day stats: </p>
-
- <ul>
- <li>🌎 6.7k website views
- </li><li>💌 150+ emoji email addresses sold</li>
- <li>💵 $830/yr ARR</li>
- <li>🔺 320 upvotes</li>
- <li>🏅 5th place on Product Hunt</li>
- <li>🎀 Most popular Mailoji: @🚀</li>
- </ul>
-
- <p>Over 150 emoji email addresses were sold in a day, and I received some fantastic feedback from the Product Hunt community.</p>
-
- <p>It was done, Mailoji had officially launched.</p>
-
- <h3>📙 The aftermath</h3>
-
- <p>I wish this story ended with Mailoji blowing up and the queen registering an emoji email address or something (I'll reserve <span class="domain">Liz@👑.kz</span> just in case).</p>
-
- <p>But, currently Mailoji is sitting at ~$1440/year in revenue. There's now 300 emoji domains to choose from though.</p>
-
- <p><img src="https://i.gyazo.com/6eac0eb3bcdaa1ee78e57b6692ed9afc.png" alt="Final Stripe ARR chart for Mailoji"></p>
- <p>Even though I still haven't made the money back on all the emoji domains I bought, creating an emoji email address service was so much fun.</p>
-
- <p>It was an adventure. A rabbit hole containing multiple rabbit holes.</p>
-
- <p>This project started out as an exploration into emoji domain names; a weird, forgotten about internet feature that I've now become quite fond of.</p>
-
- <p>Yes emoji domains are hard to type on desktop, yes there's too many variations, and yes, most form validations hate them.</p>
-
- <p>But they're fun, and I think tech should be more fun.</p>
-
- <p>Thanks for reading. If you want to get in touch, I've got a brand new email address at the bottom of this website.</p>
- </article>
-
-
- <hr>
-
- <footer>
- <p>
- <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-home"></use>
- </svg> Accueil</a> •
- <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-rss2"></use>
- </svg> RSS</a> •
- <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-user-tie"></use>
- </svg> Pro</a> •
- <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-mail"></use>
- </svg> Email</a> •
- <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-hammer2"></use>
- </svg> Légal</abbr>
- </p>
- <template id="theme-selector">
- <form>
- <fieldset>
- <legend><svg class="icon icon-brightness-contrast">
- <use xlink:href="/static/david/icons2/symbol-defs.svg#icon-brightness-contrast"></use>
- </svg> Thème</legend>
- <label>
- <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
- </label>
- <label>
- <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
- </label>
- <label>
- <input type="radio" value="light" name="chosen-color-scheme"> Clair
- </label>
- </fieldset>
- </form>
- </template>
- </footer>
- <script>
- function loadThemeForm(templateName) {
- const themeSelectorTemplate = document.querySelector(templateName)
- const form = themeSelectorTemplate.content.firstElementChild
- themeSelectorTemplate.replaceWith(form)
-
- form.addEventListener('change', (e) => {
- const chosenColorScheme = e.target.value
- localStorage.setItem('theme', chosenColorScheme)
- toggleTheme(chosenColorScheme)
- })
-
- const selectedTheme = localStorage.getItem('theme')
- if (selectedTheme && selectedTheme !== 'undefined') {
- form.querySelector(`[value="${selectedTheme}"]`).checked = true
- }
- }
-
- const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
- window.addEventListener('load', () => {
- let hasDarkRules = false
- for (const styleSheet of Array.from(document.styleSheets)) {
- let mediaRules = []
- for (const cssRule of styleSheet.cssRules) {
- if (cssRule.type !== CSSRule.MEDIA_RULE) {
- continue
- }
- // WARNING: Safari does not have/supports `conditionText`.
- if (cssRule.conditionText) {
- if (cssRule.conditionText !== prefersColorSchemeDark) {
- continue
- }
- } else {
- if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
- continue
- }
- }
- mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
- }
-
- // WARNING: do not try to insert a Rule to a styleSheet you are
- // currently iterating on, otherwise the browser will be stuck
- // in a infinite loop…
- for (const mediaRule of mediaRules) {
- styleSheet.insertRule(mediaRule.cssText)
- hasDarkRules = true
- }
- }
- if (hasDarkRules) {
- loadThemeForm('#theme-selector')
- }
- })
- </script>
- </body>
- </html>
|