Chọn domain cho app indie: .io.vn ở Mắt Bão hay .com
Vì sao bảy app iOS của mình dùng domain .io.vn mua ở Mắt Bão, ba bản ghi DNS để trỏ về Vercel, và những gì phải kiểm tra trước khi đưa domain vào build.

Trong bài này
App nào mình ship cũng cần một website trước khi App Review chịu xem: trang privacy policy, terms, support, và tốt nhất là một landing giải thích app làm gì. Một thời gian dài các site đó nằm trên hostname mà Vercel tự cấp. Giờ thì cả bảy app đều có domain riêng, và tất cả đều đuôi .io.vn: lockboxy.io.vn, minivid.io.vn, ringsy.io.vn và mấy app còn lại. Trang showcase gom tất cả nằm trên domain cá nhân apps.vanthuongdao.id.vn.
Bài này kể lại đường đi đó: vì sao chọn .io.vn thay vì .com, đúng mấy bản ghi DNS mình thêm ở Mắt Bão để trỏ domain về Vercel, bản ghi cho Search Console, và hai lần sai khiến mình coi domain là một phần của app chứ không chỉ của website.
Bắt đầu từ vercel.app, và lúc nào thì không đủ nữa
Mỗi landing là một project Next.js nhỏ trên Vercel. Project mới được tặng một alias *.vercel.app, và mấy lần submit App Store đầu tiên đều trỏ vào đó. Dùng được, nhưng cái tên không phải của mình. Hồi dựng site cho app lúc đó còn tên Toolbox (giờ là Lockboxy), toolbox.vercel.app đã có người lấy trong namespace chung của Vercel, nên alias production thành toolbox-vanthuongdao.vercel.app. Linkeeper may hơn: linkeeper-landing.vercel.app còn trống. Sau đó mình chuyển vài site sang alias ngắn hơn như minivid-app.vercel.app, talkzy-app.vercel.app. URL đẹp hơn, nhưng vẫn là namespace của người khác.
Còn một vấn đề khó thấy hơn. Deployment protection của một project từng để all_except_custom_domains. Setting này khoá mọi hostname .vercel.app, kể cả alias production, sau màn đăng nhập Vercel. Nếu App Review bấm vào link privacy thì sẽ gặp trang login chứ không phải policy. Mình đổi sang chỉ bảo vệ preview. Nếu URL trên App Store Connect của bạn đang là host .vercel.app, nhớ kiểm tra setting này. Có domain riêng thì hết chuyện, vì domain riêng không bao giờ bị chặn sau màn login đó.
Vì sao .io.vn mà không phải .com
Mình cũng muốn có .com, đuôi ai cũng gõ theo phản xạ. Nhưng tên app ngắn, dễ đọc thì gần như hết sạch. Lúc kiểm tra ngày 22/09/2026, minivid.com đã có chủ từ năm 2003, minivid.app thì từ tháng 2/2026, đều là người khác. minivid.io.vn thì chưa ai delegate, tức là còn mua được. Lockboxy đã đi đúng con đường này từ tháng 7.

Những thứ mình cân nhắc:
.io.vn | .com | |
|---|---|---|
| Tên app ngắn | vẫn còn | phần lớn đã có chủ từ lâu |
| Gợi ra điều gì | người làm ở Việt Nam | trung tính, toàn cầu |
| Kiểm tra còn trống | xem DNS delegation (không có RDAP) | RDAP qua HTTPS |
| Nơi mua | nhà đăng ký Việt Nam như Mắt Bão | đâu cũng được |
Với một dev làm một mình ở TP.HCM, cái "chất Việt Nam" đó không sao, nói thật còn là điểm cộng. App được dịch ra mười ngôn ngữ, nhưng domain chỉ là chỗ đặt trang pháp lý và landing. Người dùng bấm "Privacy Policy" trong Settings không quan tâm đuôi gì. Họ chỉ cần trang mở được.
Một cái bẫy khi kiểm tra domain còn trống hay không. Máy mình bị chặn port 43, nên whois bị timeout, và timeout nhìn y hệt "đã có chủ" nếu không để ý. Với các đuôi quốc tế thì dùng RDAP qua HTTPS. .io.vn không có dịch vụ RDAP, nên mình chỉ xem tên đó đã được delegate chưa:
# Không trả về NS nào → chưa ai delegate tên này
dig +short NS minivid.io.vnBản ghi DNS: A, CNAME, và chỉ vậy thôi
Mình mua domain ở Mắt Bão và giữ DNS ở đó luôn. Vercel có gợi ý chuyển nameserver sang họ, nhưng mình thích thêm bản ghi ngay ở nhà đăng ký hơn. Như vậy các bản ghi khác trong zone (email chẳng hạn) giữ nguyên, Vercel chỉ nhận đúng hai cái tên nó cần.
Sau khi add domain (cả apex và www) vào project Vercel, đây là các bản ghi mình thêm trong trang quản lý DNS của Mắt Bão:
; zone lockboxy.io.vn ở nhà đăng ký
@ A 76.76.21.21
www CNAME cname.vercel-dns.com.Bản ghi A trỏ apex về IP của Vercel. CNAME giao www cho Vercel, rồi Vercel redirect về cái nào bạn chọn làm primary. Khi Vercel thấy bản ghi, nó tự cấp chứng chỉ HTTPS. Với Lockboxy, mình chỉ coi là xong khi site mở được qua HTTPS bằng tên mới. Commit ngày 12/07/2026 ghi rõ "verified live over HTTPS", và giờ mình vẫn kiểm tra y như vậy.

Ngày 01/10/2026 mình chuyển một lượt Minivid, Ringsy, Talkzy, Baton và Stampzy, cùng đúng hai bản ghi đó ở Mắt Bão, và trang showcase cũng chuyển sang subdomain id.vn trong ngày.
Search Console: bản ghi TXT
Với Google, domain mới là một site mới. Domain property trong Search Console bao luôn apex, www, cả http lẫn https. Xác minh nó bằng thêm một bản ghi nữa trong cùng zone:
@ TXT "google-site-verification=…"Copy đúng giá trị Search Console đưa (mình không dán của mình ở đây), chờ DNS cập nhật rồi bấm Verify. Bản ghi phải nằm yên trong zone. Xoá đi thì sớm muộn property cũng mất xác minh.
Landing của Lockboxy còn hỗ trợ cách kia: meta tag cho URL-prefix property. Token được đọc từ biến môi trường chứ không nằm trong code, nên thêm hay đổi token chỉ là một setting trên Vercel, không cần commit:
verification: {
...(process.env.GOOGLE_SITE_VERIFICATION && {
google: process.env.GOOGLE_SITE_VERIFICATION,
}),
},Cùng block đó có tag msvalidate.01 của Bing. Bing quan trọng hơn bản thân Bing, vì ChatGPT search chạy trên index của nó.
Search Console chứng minh giá trị khá nhanh. Ngày 22/09/2026 nó báo Google đã bỏ qua canonical của trang chủ /vi của Lockboxy và chọn domain trần, một URL chỉ redirect. Cách sửa là khai báo hreflang x-default. Không có console thì mình đã không biết.
Một hằng cho site, một hằng cho app
Landing nào cũng có đúng một SITE_URL trong src/lib/site.ts. Canonical, hreflang, sitemap, thẻ OpenGraph, JSON-LD và file llms.txt đều lấy từ nó. Chuyển site sang domain mới chỉ là diff một dòng cộng một lần deploy:
export const SITE_URL = "https://minivid.io.vn";Phần khó là app. Mỗi app tự dựng link privacy, terms, support từ SITE_URL của riêng nó (<SITE_URL>/<lang>/<page>), và giá trị đó nằm trong binary mà người dùng giữ hàng tháng. Nên khi các landing chuyển domain ngày 01/10/2026, các app vẫn đứng yên. Link trong app vẫn trỏ về host vercel.app cũ, và host đó vẫn phục vụ đúng site đó. Đừng gỡ alias cũ khi còn build ngoài kia đang dùng nó.

Sai theo chiều ngược lại còn tệ hơn. Build đầu tiên của Stampzy nhét stampzy.app vào app, một domain mình chưa từng mua. Link privacy, terms, support trong build 1 dẫn vào hư không. Build 2 trỏ chúng về alias Vercel đang thật sự chạy, còn domain .io.vn thì đến sau.
Chỉ đưa domain vào build khi nó đã resolve và trả về trang qua HTTPS. Link đã nằm trong binary thì rất khó rút lại.
Portfolio của mình cũng từng chuyển y như vậy. Ban đầu nó ở vanthuongdao.vercel.app, đến tháng 4 thì URL fallback đổi thành www.vanthuongdao.id.vn. File site.ts của nó ưu tiên biến môi trường ghi đè trước, rồi đến URL production của Vercel, cuối cùng mới tới giá trị fallback cứng.
Rút ra
- Nếu
.comcủa tên app đã mất,.io.vnlà một chỗ hợp lý cho dev indie Việt Nam. Ngắn, là của mình, và người dùng chỉ thấy nó ở trang pháp lý và landing. - Giữ DNS ở nhà đăng ký và thêm bản ghi:
A @ 76.76.21.21,CNAME www cname.vercel-dns.com, cộng mộtTXTcho Search Console. Các bản ghi khác giữ nguyên. - Kiểm tra domain còn trống bằng RDAP, hoặc
dig NSvới.io.vn. Whois timeout không phải là câu trả lời. - Một
SITE_URLcho site, một cho app. Chuyển site thoải mái, nhưng giữ mọi host cũ chạy tới khi không còn build nào dùng, và đừng bao giờ ship một domain chưa mua.
Cả bảy landing đều có link ở apps.vanthuongdao.id.vn.
Bài liên quan


