π¦ ClawHub
Amazon Ads Reporter
by @zero2ai-hub
Fetch Amazon Ads Sponsored Products campaign reports asynchronously by requesting and polling separately to avoid API timeouts, with no npm dependencies.
TERMINAL
clawhub install skill-amazon-ads-reporterπ About This Skill
skill-amazon-ads-reporter
Description
Fetch Amazon Ads Sponsored Products campaign performance reports using a decoupled async pattern. Avoids timeout issues with the v3 Reporting API (2β10 min generation time) by splitting request and poll into separate steps. Also includes keyword-level winner/dead analysis and a quick bid inspector.Why two steps?
Amazon's Reporting API v3 is async β you request a report, get areportId, and poll until it's ready. Doing this inline in a cron causes timeouts. The correct pattern:request β save reportId β (wait 1-2 min) β poll + download
Usage
Campaign-level report (step-by-step, recommended for crons)
# Step 1: Request report β exits immediately with reportId
node scripts/request-report.js --days 7Step 2: Poll + download (run 1-2 min later, or from a separate cron)
node scripts/poll-report.js
Campaign-level report (all-in-one, for manual runs)
node scripts/get-report.js --days 7
Keyword-level winner/dead analysis (14-day async report)
node scripts/keyword-report.js
Output: table of all ENABLED keywords with clicks > 0 OR impressions β₯ 50 (winners), plus count of dead keywords (0 clicks, <50 imp).Quick bid inspector (live, across campaigns)
node scripts/get-bids.js
Output: all ENABLED + PAUSED keywords per campaign with current bids. Reads live data (no report needed).Arguments
| Arg | Default | Description | |-----|---------|-------------| |--days N | 7 | Number of days to include in report (campaign and keyword reports) |Configuration
Reads credentials fromAMAZON_ADS_PATH env var, defaulting to ~/amazon-ads-api.json.amazon-ads-api.json format
{
"refreshToken": "...",
"lwaClientId": "...",
"lwaClientSecret": "...",
"profileId": "...",
"region": "EU"
}
Regions: EU (default, includes UAE), NA (North America), FE (Far East).
Output
~/.openclaw/workspace/tmp/amazon-report-pending.json β created by request-report.js~/.openclaw/workspace/tmp/amazon-report-latest.json β created by poll-report.js after successReport columns (campaign-level)
campaignName, campaignId, impressions, clicks, spend, purchases7d, sales7dPaused campaigns are automatically filtered out by cross-referencing GET /sp/campaigns/list.
Report columns (keyword-level β keyword-report.js)
keywordId, keywordText, matchType, impressions, clicks, cost, purchases7d, sales7dDependencies
Node.js built-ins only (https, zlib, fs, path). No npm install required.Notes
GZIP_JSON format is gunzipped automatically by poll-report.jsget-bids.js uses the live v3 keyword list endpoint β no async report needed, instant responseπ‘ Examples
Campaign-level report (step-by-step, recommended for crons)
# Step 1: Request report β exits immediately with reportId
node scripts/request-report.js --days 7Step 2: Poll + download (run 1-2 min later, or from a separate cron)
node scripts/poll-report.js
Campaign-level report (all-in-one, for manual runs)
node scripts/get-report.js --days 7
Keyword-level winner/dead analysis (14-day async report)
node scripts/keyword-report.js
Output: table of all ENABLED keywords with clicks > 0 OR impressions β₯ 50 (winners), plus count of dead keywords (0 clicks, <50 imp).Quick bid inspector (live, across campaigns)
node scripts/get-bids.js
Output: all ENABLED + PAUSED keywords per campaign with current bids. Reads live data (no report needed).βοΈ Configuration
Reads credentials from AMAZON_ADS_PATH env var, defaulting to ~/amazon-ads-api.json.
amazon-ads-api.json format
{
"refreshToken": "...",
"lwaClientId": "...",
"lwaClientSecret": "...",
"profileId": "...",
"region": "EU"
}
Regions: EU (default, includes UAE), NA (North America), FE (Far East).
π Tips & Best Practices
GZIP_JSON format is gunzipped automatically by poll-report.jsget-bids.js uses the live v3 keyword list endpoint β no async report needed, instant response