Hiểu file suggest-negatives

Hướng dẫn đọc output của lệnh npm run ads -- suggest-negatives và quyết định approve/reject từng candidate.

Mục lục

  1. Negative keyword là gì
  2. Cấu trúc file output
  3. Đọc 1 candidate từng dòng
  4. Framework quyết định approve/reject
  5. Match type cho negative (EXACT vs PHRASE)
  6. Ví dụ thực tế từ data KissTour
  7. Sau khi tick [x] — chuyện gì xảy ra
  8. Edge cases cần cẩn thận

1. Negative keyword là gì

Negative keyword = từ khóa cấm. Khi user search query chứa negative keyword thì Google KHÔNG hiển thị ad của mình — bất kể positive keyword có match hay không.

Ví dụ: campaign có positive keyword kiss tour. Nếu không có negative, search "koncerty kiss" (fan Ba Lan của band KISS) cũng trigger ad. Click về → 0% khả năng book tour → đốt tiền.

Add koncerty làm negative → từ đó Google không serve ad cho bất kỳ search nào chứa "koncerty". Tiết kiệm budget.

Vì sao cần list negatives?

Positive keyword dùng match type BROADPHRASE rất "rộng" — Google match cả variations, misspellings, synonyms, và đôi khi sai intent. Negative keyword là cách subtract cái không muốn ra khỏi cái rộng đó.

2. Cấu trúc file output

File .suggestions/YYYY-MM-DD-negatives.md có 3 phần:

Header (metadata)

# Negative keyword suggestions — 2026-04-24 - **Period:** 2026-03-26 → 2026-04-24 (30 days) - **Thresholds:** min cost 50,000 VND, min 3 clicks, status = NONE - **Candidates:** 56 search terms · total wasted: 8,231,716 VND Check `- [x]` on candidates you approve for negative keyword addition.

Group theo campaign × ad group

Mỗi ad group là 1 section. Cùng 1 search term nếu xuất hiện ở 2 ad group khác nhau → list 2 lần (ở 2 section khác nhau), vì negative keyword được thêm vào ở level ad group hoặc campaign.

Candidate item

- [ ] `koncerty kiss` — 263,119 VND · 2 clicks · 2 impr · CTR 100.00% - triggered by `kiss tour` [PHRASE] · suggested match: **EXACT**

3. Đọc 1 candidate từng dòng

Lấy ví dụ trên, giải thích từng field:

FieldGiá trịÝ nghĩa
[ ]empty checkboxChưa approve. Bạn sửa thành [x] để approve.
Search termkoncerty kissUser thực sự gõ gì lên Google
Cost263,119 VNDBudget đã chi cho click của search term này trong period
Clicks2Số người click ad sau khi search
Impressions2Số lần ad hiển thị (với search này)
CTR100.00%Click-through rate = clicks / impressions × 100. 100% = mọi người thấy ad đều click
triggered bykiss tourPositive keyword nào làm Google match search term này
[PHRASE]match typeMatch type của positive keyword → giải thích tại sao lại match. PHRASE nghĩa là query chứa cụm "kiss tour" (không cần exact)
suggested matchEXACTGợi ý match type khi add negative. EXACT an toàn nhất (chỉ block đúng chuỗi này)
Lưu ý

Cost cao + clicks ít = CPC cao. Ví dụ koncerty kiss chỉ 2 clicks mà 263k VND = 131k/click. Cao bất thường, có thể do positive keyword EXACT "kiss tour" có bid cao.

4. Framework quyết định approve/reject

Với mỗi candidate, hỏi 3 câu theo thứ tự:

Câu 1: Search term có intent match tour mình bán không?

KissTour bán tour xe máy Saigon/Da Nang, airport fast track, food tour. Nếu search term rõ ràng tìm thứ KHÁC:

REJECT intent → approve negative

Ví dụ: best beaches in vietnam — user muốn đi biển, không phải tour HCM. Dù triggered qua broad match, conversion = 0 là đúng. Approve.

Câu 2: Search term có phải brand variation không?

KissTour có nhiều cách viết: kiss tour, kisstour, kiss tours, kiss tour vietnam, kiss tour ho chi minh, kiss tour saigon... Nếu candidate là variation:

KHÔNG approve — add làm POSITIVE thay vào

Ví dụ: kiss tour fast track — user đang tìm dịch vụ Airport Fast Track của KissTour. 0 conv trong period này không có nghĩa keyword xấu — có thể book qua kênh khác (chat, WhatsApp) không track được. Bỏ tick [ ] khỏi file, thay vì add negative thì add làm exact positive keyword trong Brand campaign.

Câu 3: Search term có phải competitor name không?

Ví dụ: xo tours, vespa adventures, back of the bike. KissTour đã chủ động bid vào competitor trademark qua campaign "Competitors-*" nên KHÔNG negative.

KHÔNG approve competitor names trong Nonbrand campaigns (để skip)

Nhưng nếu competitor name xuất hiện trong Brand campaign → có thể nên negative ở Brand để tránh Brand budget bị pull vào Competitor intent. Tuỳ strategy.

5. Match type cho negative keyword

Khi approve 1 candidate, chọn match type đúng ảnh hưởng lớn đến phạm vi block:

Match type Block gì Rủi ro Khi nào dùng
Negative EXACT
[koncerty kiss]
Chỉ search đúng chuỗi này (hoặc close variation như số ít/nhiều, typo) Thấp — block hẹp, an toàn Default an toàn cho mọi candidate. Công cụ suggest match này.
Negative PHRASE
"koncerty"
Mọi search chứa cụm từ này (đúng thứ tự) Trung bình — có thể vô tình block phrase tương tự Khi nhiều variation đều chứa 1 chữ vô nghĩa (vd Ba Lan koncerty xuất hiện trong koncerty kiss, koncerty rock, koncerty warsaw...). Block cả cụm tiết kiệm effort.
Negative BROAD
koncerty
Mọi search chứa TẤT CẢ các từ này (bất kỳ thứ tự) Cao — dễ over-block Hiếm dùng. Chỉ dùng với từ cực rõ ràng irrelevant (vd job, free, download).
Rule of thumb

Default EXACT. Chỉ nâng lên PHRASE/BROAD khi thấy rõ pattern lặp (vd 5+ search terms khác nhau cùng chứa 1 từ vô nghĩa, thì add PHRASE 1 từ đó thay vì add EXACT 5 lần).

Ví dụ: PHRASE tiết kiệm effort

Nếu search-terms report cho thấy:

koncerty kiss
koncerty rock warsaw
koncerty polska
kiss koncerty

Thay vì add 4 negative EXACT → add 1 negative PHRASE "koncerty" — block toàn bộ.

6. Ví dụ thực tế từ data KissTour 2026-04-24

APPROVE

- [x] `best beaches in vietnam` — 847,753 VND · 189 clicks · CTR 43.95% - triggered by `things to do in ho chi minh in 1 day` [BROAD]

Vì sao: User tìm biển, không phải tour HCM. 189 clicks × 0 conv × 847k VND = waste rõ ràng. Broad match đã lạc intent.

Action: Tick [x], add negative EXACT best beaches in vietnam. Hoặc mạnh hơn: negative PHRASE "beaches" hoặc "beach" vì Nonbrand HCM không bán tour biển.

APPROVE

- [x] `koncerty kiss` — 263,119 VND · 2 clicks · CTR 100.00% - triggered by `kiss tour` [PHRASE]

Vì sao: "Koncerty" tiếng Ba Lan = "concerts". User fan của band KISS tìm lịch diễn. Không liên quan tour Việt Nam.

Action: Tick [x]. Match type nên PHRASE "koncerty" để block mọi variation tương lai.

REJECT

- [ ] `kiss tour fast track` — 236,770 VND · 13 clicks · CTR 72.22% - triggered by `kiss tour` [EXACT]

Vì sao: Đây là brand search cho dịch vụ Airport Fast Track. CTR 72% = user rõ ràng muốn KissTour. 0 conv có thể do: (a) user book qua kênh khác không track, (b) landing page chưa tối ưu cho fast track. Block là mất opportunity.

Action: Bỏ qua candidate này trong file negatives. Thay vào đó: vào Google Ads UI, add kiss tour fast track làm EXACT positive trong Brand campaign (hoặc tạo ad group mới "Airport Fast Track" trong Brand).

REJECT

- [ ] `kiss tour ho chi minh` — 227,468 VND · 18 clicks · CTR 51.43% - triggered by `kiss tour saigon` [EXACT]

Vì sao: Brand variation. User tìm KissTour cho HCM — đúng target. Đã có Brand-HCMC campaign → add làm positive ở đó.

Action: Skip trong file. Add kiss tour ho chi minh EXACT positive vào Brand-HCMC (id 23782413982).

APPROVE

- [x] `saigon private car` — 175,082 VND · 27 clicks · CTR 34.62% - triggered by `saigon city tour` [BROAD]

Vì sao: User tìm dịch vụ thuê xe riêng (taxi/transfer) — KissTour không bán. 27 clicks × 0 conv.

Action: Tick [x]. EXACT saigon private car hoặc PHRASE "private car" (nếu muốn block rộng).

AMBIGUOUS

- [ ] `services offered by tour operators` — 164,837 VND · 9 clicks · CTR 30.00% - triggered by `best city tour in ho chi minh` [BROAD]

Vì sao: Query informational (research) — user đang tìm hiểu chứ chưa muốn book. Nhưng cũng có thể là travel agent tìm partner.

Action: Approve nếu muốn cut research traffic. Hoặc skip nếu nghĩ cơ hội educate → conv sau đó. Thường approve.

7. Sau khi tick [x] — chuyện gì xảy ra

Hiện tại (Phase 2): Tick [x] trong file .md = chỉ là annotation. Không có gì đẩy lên Google Ads. File là work in progress.

Phase 3 (chưa build): Sẽ có command apply-negatives <file.md>:

  1. Parse file, lấy các dòng có - [x]
  2. Với mỗi dòng approved: extract search term + campaign ID + ad group ID
  3. Gọi Google Ads API AdGroupCriterionService.Mutate để add negative keyword
  4. Default match type: EXACT (hoặc đọc từ "suggested match" field trong file)
  5. Dry-run default (in mutate ops), --apply flag mới thực sự call API
  6. Refuse nếu số item approved > 50 (guardrail chống accident)

Đến lúc đó, workflow đầy đủ:

# Weekly workflow
npm run ads -- suggest-negatives --days 7
# → .suggestions/2026-05-01-negatives.md

# Human review trong editor, tick [x] trên items approved

# Dry-run preview
npm run ads -- apply-negatives .suggestions/2026-05-01-negatives.md

# Apply thật
npm run ads -- apply-negatives .suggestions/2026-05-01-negatives.md --apply

Trong lúc chờ Phase 3: Add negatives thủ công qua Google Ads UI (Tools & Settings → Shared Library → Negative keyword lists, hoặc ở cấp campaign/ad group).

8. Edge cases cần cẩn thận

Status = ADDED_EXCLUDED

Search term vừa là positive (ADDED) vừa là negative (EXCLUDED). Thường do setup lộn xộn — 1 ad group có kiss tour làm positive, 1 ad group khác có kiss tour làm negative. → Skip, chỉnh lại ad group setup thay vì add thêm negative.

Cùng 1 search term xuất hiện nhiều lần

Ví dụ kiss tour ho chi minh có thể xuất hiện 3 lần trong file (3 ad group khác nhau đều trigger). Quyết định từng cái theo context ad group đó:

Keyword có conv = 0 trong period ngắn

7 ngày data đôi khi quá ít để kết luận. Nếu search term chỉ 5 clicks trong 7 ngày và không conv → có thể chỉ là sample nhỏ. Dùng period 30 ngày để kết luận vững hơn.

High CTR + 0 conv

CTR cao (>30%) + conv=0 = user bị thu hút ad (headline tốt) nhưng landing page không deliver. Hoặc intent mismatch: headline promise X, user tìm Y, click vì headline hấp dẫn nhưng bounce ngay. → Vẫn là waste, approve negative.

Low CTR + 0 conv

CTR thấp (<5%) + conv=0 = ad copy không match ý user. Có thể fix bằng viết lại ad chứ không phải negative. Cân nhắc trước khi block.


Tạo bởi kisstour-ads · Cập nhật 2026-04-24 · Chi tiết commands xem README