ASO cho 10 ngôn ngữ không cần tool trả phí, và một script giữ kỷ luật
Cách mình viết keyword App Store bản địa cho mười locale mà không dùng tool ASO trả phí, cùng một script Python chặn từ thừa hoặc rủi ro trước khi dán vào ASC.

Trong bài này
Phần lớn app của mình chạy mười ngôn ngữ: Anh, Việt, Nhật, Đức, Pháp, Tây Ban Nha, Bồ Đào Nha, Hàn, Trung và Ý. Thời gian đầu, metadata App Store cho các locale đó gần như làm cho có: dịch tên tiếng Anh, keyword để đó, rồi quay sang làm tính năng tiếp.
Ngày 1/10/2026 mình làm một lượt ASO đàng hoàng cho cả bảy app trong một ngày: Stampzy, Talkzy, Baton, Minivid, Ringsy, Lockboxy và Linkeeper. Không tool ASO trả phí, không gói dữ liệu search volume. Thứ mình có là một quy trình lặp lại được, mỗi locale một file JSON, và mỗi repo một script kiểm tra không cho mình dán keyword thừa hay rủi ro vào App Store Connect.
Mọi thứ bên dưới lấy từ file docs/app-store/aso-2026-10.md mà repo app nào giờ cũng có.
Ba trường Apple thật sự index
Với tìm kiếm, ba trường quan trọng là name (30 ký tự), subtitle (30) và keyword field ẩn (100). Apple index cả ba cùng nhau và tự ghép từ giữa các trường. Từ đó ra hai quy tắc:
- Mỗi từ chỉ nên nằm ở một trong ba trường. Name đã có "camera" mà keyword lại ghi "camera" thì không được gì, chỉ mất bảy ký tự.
- Keyword field không cần cụm từ đầy đủ. Subtitle đã có nửa cụm thì keyword chỉ cần nửa còn lại.
Quy tắc thứ hai đặc biệt có lợi với tiếng Việt, vì việc khớp từ diễn ra theo từng âm tiết. Subtitle tiếng Việt của Stampzy là "Chụp ảnh định vị, chấm công". Vì đã có công, cụm "công trình" chỉ cần thêm keyword trình: bốn ký tự thay vì mười. Trong một trường 100 ký tự, mấy chỗ tiết kiệm này cộng lại khá nhiều.

Promotional text (170 ký tự) và description không được index, nên mình coi chúng là copy để chuyển đổi. Ở Baton, tính năng chia sẻ với vợ/chồng được dời từ subtitle sang promotional text: nó giúp người ta quyết định tải, nhưng gần như không ai search chữ "shared".
Nghiên cứu không cần tool trả phí
Tool ASO trả phí bán con số search volume ước tính. Mình không dùng và ghi rõ điều đó: trong các doc có câu "no paid ASO tool was used", và nhu cầu chỉ được đánh giá định tính theo ba mức cao, vừa, thấp.
Thay vào đó mình dựa vào:
- iTunes Search API công khai. Một query kiểu
itunes.apple.com/search?country=vn&entity=software&term=…cho thấy app nào đang xếp hạng cho một từ ở một storefront. Nếu năm trong tám kết quả đầu có đúng cụm đó trong tên, từ đó vừa có nhu cầu vừa có cạnh tranh. Với Talkzy mình ghi thêm số lượt đánh giá để biết các app top bám chắc tới đâu. - Bài viết bản địa. Với tiếng Việt, mình đọc các bài hướng dẫn trên những trang công nghệ trong nước. Nhờ vậy "chụp ảnh có ngày giờ" và "camera chấm công" mới được đưa vào name và subtitle của Stampzy.
- Viết theo từng ngôn ngữ, không dịch. Doc của Talkzy ghi thẳng: "Keywords written per language, not translated from English." Creator Nhật gọi giấy nhắc thoại là カンペ, phụ huynh Đức search "Stillen", người Hàn gõ 보안폴더 khi tìm thư mục bảo mật. Danh sách keyword dịch từ tiếng Anh sẽ bỏ lỡ hết.
Nghiên cứu cũng lộ ra vài khoảng trống. Từ đợt sáp nhập tỉnh năm 2025, người Việt tìm địa chỉ mới rất nhiều ("địa chỉ mới", "sáp nhập"), mà chưa app camera nào nhắm vào hai từ này. Stampzy in được địa chỉ theo cấu trúc mới nên cả hai được thêm vào.
Cuối các doc đều có cùng một lưu ý: đây là danh sách giả thuyết đã xếp hạng, cần kiểm lại bằng độ phổ biến trong Apple Search Ads hoặc dữ liệu search term trong App Store Connect khi có traffic thật.
Những từ mình cố tình bỏ
Một lượt ASO tốt có cả phần xoá, không chỉ thêm:
- Tên thương hiệu của đối thủ. Keyword tiếng Việt cũ của Stampzy có tên một app đối thủ. Keyword của Minivid có tên các app nhắn tin. Giờ đều đã bỏ. Theo guideline 2.3.7, trademark của người khác trong metadata là bị reject sớm muộn.
- Giá và chữ "free". Talkzy từng bị reject theo 2.3.7 vì chữ "Free" trên screenshot. Từ đó không app nào để giá, "free", "miễn phí", 無料, 免费 hay 무료 trong name, subtitle hoặc keyword, cũng không có từ so sánh nhất kiểu "best". Giá chỉ nằm trong description, nơi vốn phải có điều khoản subscription.
- Những gì app không đảm bảo được. Ở bản tiếng Nhật, Stampzy bỏ 黒板, vì ở Nhật từ này gợi tới bảng điện tử công trình theo chuẩn ngành, mà Stampzy không phải. Nó cũng bỏ 証拠 (bằng chứng) trong tiếng Nhật và 证明 trong tiếng Trung. Ảnh có dấu thời gian là ghi chép của chính người chụp, không phải bằng chứng.
Mọi điều copy mới nhắc tới đều được đối chiếu với src/ trước, trong một bảng nối từng claim với code.
Script kiểm tra
Sáu trên bảy app dùng chung một cấu trúc: docs/app-store/locales/<locale>.json gồm name, subtitle, keywords, promo và description (Lockboxy để listing dạng Markdown). Bên cạnh là một script Python không phụ thuộc thư viện nào (docs/app-store/check_aso.py của Stampzy, tools/app-store/check_metadata.py của Talkzy, các repo khác cũng có bản tương tự). Có lỗi là script trả exit code 1.

Phần lõi, rút gọn:
LIMITS = {"name": 30, "subtitle": 30, "keywords": 100,
"promo": 170, "description": 4000}
def check(loc, d):
errs = [f"{k} is {len(d[k])} chars" for k, lim in LIMITS.items()
if len(d[k]) > lim]
if ", " in d["keywords"]:
errs.append("space after a comma in keywords")
head = words(d["name"] + " " + d["subtitle"], loc)
for kw in d["keywords"].split(","):
if words(kw, loc) & head:
errs.append(f"keyword {kw!r} repeats a name/subtitle word")
# + từ cấm (free, best, giá), tên đối thủ, NFC
return errsNhững chi tiết phải sửa hơn một lần mới đúng:
- Dấu cách sau dấu phẩy.
a, bphí một ký tự cho mỗi keyword. - Chuẩn hoá NFC. Tiếng Việt có thể lưu "ộ" thành một code point, hoặc thành chữ gốc cộng các dấu tổ hợp. App Store Connect đếm theo code point NFC, nên chuỗi chưa chuẩn hoá trông dài hơn thực tế và số đếm bị lệch. Script từ chối mọi chuỗi không ở dạng NFC.
- Tiểu từ tiếng Hàn. Tiếng Hàn gắn tiểu từ vào danh từ (
사진에), nên hàm tách từ cắt các tiểu từ thường gặp ở cuối trước khi so sánh. - Tiếng Nhật và Trung không có dấu cách. Tách theo dấu cách thì không ra gì. Với ja và zh, script của Stampzy đánh dấu keyword nằm trong một đoạn của name/subtitle, hoặc trùng bất kỳ cụm hai chữ Hán nào với chúng. Đó là kiểu trùng khiến
水印相机bị bỏ: các chữ của nó đã có trong tên tiếng Trung. - Luật riêng từng app. Script của Talkzy còn bắt mọi description phải có dòng EULA. Lockboxy chạy thêm một validator với danh sách từ cấm ở mọi ngôn ngữ, để listing giữ đúng cách diễn đạt đã được duyệt: "an optional opening screen", tức một màn hình mở đầu tuỳ chọn.
Đây là một lần chạy thật trên các locale của Stampzy, với keyword tiếng Anh bị làm hỏng có chủ đích:
ok de: name=27 subtitle=30 keywords=95 promo=167 description=3316
FAIL en: name=29 subtitle=30 keywords=93 promo=162 description=3251
- space after a comma in keywords
- banned word 'free' in keywords
- keyword 'camera' repeats name/subtitle word(s) ['camera']
...
ok vi: name=28 subtitle=27 keywords=100 promo=167 description=3127Số đếm có ích cả khi mọi thứ đều pass: keyword field tiếng Nhật, Hàn, Trung của Baton trước chỉ dùng 56 đến 68 trên 100 ký tự, giờ là 81 đến 90.
Một locale, trước và sau
Listing tiếng Việt của Stampzy gói gọn cả quy trình trong một ví dụ.
| Trước | Sau | |
|---|---|---|
| Subtitle | Đóng dấu thời gian, địa chỉ | Chụp ảnh định vị, chấm công |
| Keywords | 90 ký tự, có tên một app đối thủ | 100 ký tự: timestamp, dấu thời gian, tọa độ, địa chỉ mới, sáp nhập, xã, tỉnh, trình, nghiệm thu, giao hàng, âm lịch, excel |
Subtitle giờ mang hai ý định tìm kiếm lớn nhất của người Việt. "Đóng dấu thời gian" chuyển xuống keyword thành dấu thời gian. Tên đối thủ đã bỏ, và số ký tự dư dành cho địa chỉ sau sáp nhập, âm lịch và bảng công Excel, đều là tính năng app thật sự có. Kết quả xem ở stampzy.io.vn.
Không phải app nào cũng có mười locale: listing của Linkeeper chỉ có bản tiếng Việt và tiếng Anh, nên lượt đó chỉ viết lại hai bản này.
Custom product page là lớp tiếp theo
Keyword quyết định app có hiện ra hay không. Custom product page (CPP) quyết định người dùng thấy gì sau khi bấm vào quảng cáo nhắm đúng một ý định. Lockboxy, Linkeeper và Ringsy mỗi app có một file docs/app-store/cpp-2026-10.md phác ba CPP, mỗi trang cho một ý định tìm kiếm, với screenshot, promotional text riêng và mẫu URL quảng cáo kèm ppid mà App Store Connect cấp.
Luật cũ vẫn áp dụng: không frame CPP nào có paywall hay giá. Caption dùng lại các dòng screenshot đã duyệt kỹ. Ringsy bỏ hẳn CPP cho nhạc chuông báo thức vì ảnh chụp màn hình báo thức duy nhất là của iPad, mà đặt frame iPad vào slot iPhone là mô tả sai app. Hiện đây vẫn là bản nháp, chưa tạo gì trong App Store Connect.
Rút ra
- Coi name, subtitle và keyword là một ngân sách 160 ký tự chung, mỗi từ chỉ tính một lần.
- Không có tool trả phí vẫn nghiên cứu được: iTunes Search API công khai, bài viết bản địa và một nhãn "nhu cầu là định tính" trung thực.
- Viết keyword theo từng ngôn ngữ, tới mức âm tiết tiếng Việt và tiểu từ tiếng Hàn.
- Đưa luật vào một script trả exit 1 và chạy nó trước khi dán vào App Store Connect. Dấu cách thừa, từ lặp hay tên đối thủ đều bị chặn ngay.
Nửa còn lại của chuyện được tìm thấy là landing page, mình viết trong bài SEO và GEO cho landing page của app. Cả bảy app có ở apps.vanthuongdao.id.vn.
Bài liên quan


