Kéo báo cáo bằng n8n¶
Không cần node TikTok chuyên dụng — chỉ dùng HTTP Request thường.
1. Lưu API key vào Credential¶
Settings → Credentials → New → Header Auth
| Name | Logidata API |
| Header Name | X-API-Key |
| Header Value | ld_live_… |
Đừng gõ thẳng key vào node
Key trong node sẽ nằm nguyên văn trong bản export workflow và trong lịch sử execution. Credential thì không.
2. Node HTTP Request¶
| Trường | Giá trị |
|---|---|
| Method | GET |
| URL | https://api.logidata.vn/v1/tiktok-ads/v1.3/report/integrated/get/ |
| Authentication | Generic Credential Type → Header Auth → Logidata API |
| Send Headers | bật — thêm X-Account-Id = ldc_9fK2xQ... |
| Send Query Parameters | bật |
Query parameters:
| Name | Value |
|---|---|
advertiser_id |
7001234567890 |
report_type |
BASIC |
data_level |
AUCTION_CAMPAIGN |
dimensions |
["campaign_id","stat_time_day"] |
metrics |
["spend","impressions","clicks"] |
start_date |
={{ $now.minus(3, 'days').toFormat('yyyy-MM-dd') }} |
end_date |
={{ $now.minus(1, 'days').toFormat('yyyy-MM-dd') }} |
page_size |
1000 |
dimensions và metrics gõ đúng như chuỗi JSON ở trên
Kể cả dấu ngoặc vuông và ngoặc kép. n8n gửi nguyên văn — đó là điều TikTok cần.
3. Bắt lỗi nghiệp vụ của TikTok¶
TikTok trả HTTP 200 ngay cả khi lỗi. Node HTTP Request coi đó là thành công, nên phải kiểm thủ công.
Thêm node IF sau HTTP Request:
- Điều kiện: Number →
={{ $json.code }}→ Equals →0 - Nhánh true → xử lý dữ liệu
- Nhánh false → node Stop and Error, message:
={{ "TikTok " + $json.code + ": " + $json.message }}
4. Tách mảng kết quả thành từng dòng¶
Node Item Lists (hoặc Split Out), field: data.list.
Rồi node Set để làm phẳng:
advertiser_id ={{ $json.dimensions.campaign_id }}
date ={{ $json.dimensions.stat_time_day.slice(0, 10) }}
spend ={{ parseFloat($json.metrics.spend) }}
impressions ={{ parseInt($json.metrics.impressions) }}
clicks ={{ parseInt($json.metrics.clicks) }}
5. Phân trang¶
Node HTTP Request của n8n có mục Pagination sẵn:
| Pagination Mode | Update a Parameter in Each Request |
| Type | Query |
| Name | page |
| Value | ={{ $pageCount + 1 }} |
| Pagination Complete When | Other → ={{ $response.body.data.page_info.page >= $response.body.data.page_info.total_page }} |
6. Xử lý 429¶
Trong node HTTP Request, mục Settings:
- Retry On Fail: bật
- Max Tries: 3
- Wait Between Tries:
5000ms
Circuit breaker có thể yêu cầu chờ tới 300 giây
Khi nhận 429 upstream_rate_limited kèm Retry-After: 300, retry sau 5 giây
sẽ hỏng tiếp. Với workflow chạy theo lịch, cách đơn giản nhất là để nó fail
và đợi lần chạy sau — đừng dựng vòng retry dài trong n8n.
7. Lịch chạy¶
Node Schedule Trigger, Cron 0 6 * * * (6h sáng hàng ngày).
Luôn kéo lại 3 ngày gần nhất, không chỉ hôm qua: TikTok còn điều chỉnh số
liệu tới 48 giờ sau. Ghi vào đích bằng thao tác upsert theo khoá
(advertiser_id, campaign_id, date) để chạy lại bao nhiêu lần cũng ra cùng kết quả.