Bỏ qua

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

dimensionsmetrics 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 }}Equals0
  • 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: 5000 ms

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ả.