skills/feedmob-reporting-skills/SKILL.md
MUST use this skill when using mcp__feedmob-reporting__* tools. Provides structured workflows for FeedMob reporting analysis. Key: All clients (Possible Finance, Koho Financial, TextNow, AppsFlyer MMP, etc.) use client_paid_action_count × gross_cpi (dynamic event field based on client_paid_action in click_url_histories). Critical for ensuring correct multi-step workflows and accurate data reconciliation. Trigger words: any feedmob-reporting MCP tool usage, Possible Finance, Koho Financial, TextNow, AppsFlyer, Singular reports, Adjust reports, direct spend, gross spend verification, spend reconciliation, client_paid_action.
npx skillsauth add feed-mob/agent-skills feedmob-reporting-skillsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Critical Principle: Prevent Hallucinated Numbers
Before performing any spend verification analysis, you MUST follow the anti-hallucination protocol. For detailed rules, see: Anti-Hallucination Protocol
Core Rules Summary:
client_paid_action_count × gross_cpiclient_paid_action, don't hard-code event fieldsMandatory Workflow:
Complete anti-hallucination rules, verification checklist, and examples in references/anti-hallucination-protocol.md
This skill provides structured workflows for FeedMob reporting tasks using feedmob-reporting MCP tools. Includes processes for Possible Finance, Koho Financial spend verification, TextNow Adjust report analysis, AppsFlyer MMP clients, and cross-platform spend reconciliation.
First check if MCP tools are available:
mcp__feedmob-reporting__* tools are available, call them directlyWhen tools are available:
mcp__feedmob-reporting__get_possible_finance_singular_reports(...) directlyWhen tools are unavailable:
Before diving into detailed workflows, understanding available automation scripts can greatly simplify your work.
| Script | Supported Clients | Speed | Recommended Scenario |
|--------|------------------|-------|---------------------|
| calculate_gross_spend_datafusion.py ⭐⭐ | All clients | ~0.1s | Calculate comparison (Step 3.5, recommended) |
| analyze_gross_spend_datafusion.py ⭐⭐ | All clients | ~0.1s | Generate summary (Step 3.6, mandatory) |
| compare_client_report_spend_datafusion.py | All clients | ~0.1s | Client report vs direct spend comparison |
| calculate_gross_spend.py | All clients | ~0.5s | Backup/zero-dependency environment |
Important Notes:
Recommended Workflow (must execute in order):
calculate_gross_spend_datafusion.py to calculate comparison (Step 3.5)analyze_gross_spend_datafusion.py to generate summary data (Step 3.6)⚠️ Warning: Don't skip Step 3.6!
Compare attribution reports (Singular/Adjust/etc.) with direct spend data to identify discrepancies.
Applicable Clients:
When to use: When verifying spend accuracy, reconciling reports, or investigating spend mismatches.
Workflow Steps:
Choose tool based on client:
get_possible_finance_singular_reportsget_koho_financial_singular_reportsget_textnow_adjust_reportsget_privacy_hawk_singular_reportsFor detailed API calls, data validation, and CSV saving process, see: Data Collection Guide
When to use: When click_url_histories contains entries with client_paid_action = "vendor_managed" and margin field.
Why needed: Vendor-managed campaigns (CPM billing) don't have event data in attribution reports. Instead, gross spend is calculated from partner partner_net_spend and margin:
calculated_gross = partner_net_spend × (1 - margin/100)
Choose tool based on partner:
get_jampp_reports (requires client_id)get_kayzen_reportsget_youappi_reportsget_samsung_reportsExample:
// Fetch Jampp partner report (if Jampp vendor_managed campaigns exist)
mcp__feedmob-reporting__get_jampp_reports({
client_id: 123,
start_date: "2026-01-15",
end_date: "2026-01-15"
})
Save the response CSV for use in Step 3.5.
Call two tools in parallel:
get_click_url_histories - number array [12345, 12346]get_direct_spends - string array ["12345", "12346"]For detailed type differences, CSV saving, and parallel download process, see: Data Collection Guide
🚨 Mandatory: Use Correct Formula
calculated_gross_spend = client_paid_action_count × gross_cpi
Key Requirements:
client_paid_action field (don't hard-code)gross_cpi (not gross_rate)For detailed calculation rules, verification requirements, and examples, see: Calculation Verification Guide
Quick Checklist:
DataFusion Python Version (auto-installs dependencies):
First use Glob to find: **/calculate_gross_spend_datafusion.py
python3 scripts/calculate_gross_spend_datafusion.py \
<attribution_report.csv> <histories.csv> <direct_spend.csv> <output.csv> \
[partner_report1.csv partner_report2.csv ...]
Optional partner_report CSVs: When vendor_managed campaigns exist, pass one or more partner report CSVs as additional arguments. The script will:
partner_net_spend × (1 - margin/100)For detailed script version comparison, parameter descriptions, and usage examples, see: Scripts Usage Guide
🚨 Important: This is a mandatory step, cannot be skipped!
Why mandatory?
python3 scripts/analyze_gross_spend_datafusion.py \
<comparison_report.csv> \
<output_directory>
Generates 10 summary dimensions: Global, Vendor, Click URL, trends, etc.
LLM reading order:
For detailed script descriptions, 10 analysis dimensions, and LLM workflow, see: Scripts Usage Guide
Prerequisites: Completed Steps 3.5 and 3.6, read summary CSVs
🚨 MUST reference standard format and section order defined in Report Structure Guide.
🎯 Report Structure
For detailed report structure and formatting guide, see: Report Structure Guide
Core Principles:
Standard Sections:
Compare partner reports (Jampp, Kayzen, etc.) with direct spend data to verify net spend accuracy.
Applicable Partners:
When to use: When verifying net spend from partner platforms against FeedMob direct spend records.
Key Difference from Gross Spend:
client_paid_action_count × gross_cpi)partner_net_spend vs feedmob_net_spend)Workflow Steps:
Direct Partners (Jampp, Kayzen, YouAppi, Samsung):
// Jampp - requires client_id
mcp__feedmob-reporting__get_jampp_reports({
client_id: 123,
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Kayzen - no client_id required
mcp__feedmob-reporting__get_kayzen_reports({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// YouAppi - no client_id required
mcp__feedmob-reporting__get_youappi_reports({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Samsung - no client_id required
mcp__feedmob-reporting__get_samsung_reports({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
Multi-step Partners (Smadex, InMobi, Liftoff):
Smadex (3-step process):
// Step 1: Get report IDs
mcp__feedmob-reporting__get_smadex_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Step 2: Check status (repeat until ready)
mcp__feedmob-reporting__check_smadex_report_status({
report_id: "abc-123"
})
// Step 3: Get report data when status is "ready"
mcp__feedmob-reporting__get_smadex_reports({
report_id: "abc-123"
})
InMobi (3-step process):
// Step 1: Get report IDs
mcp__feedmob-reporting__get_inmobi_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Step 2: Check status (repeat until ready)
mcp__feedmob-reporting__check_inmobi_report_status({
report_id: "abc-123",
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Step 3: Get report data when status is "ready"
mcp__feedmob-reporting__get_inmobi_reports({
skan_report_id: "skan-123",
non_skan_report_id: "non-skan-456",
start_date: "2025-01-01",
end_date: "2025-01-31"
})
Liftoff (3-step process):
// Step 1: Get report IDs
mcp__feedmob-reporting__get_liftoff_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
// Step 2: Check status (repeat until ready)
mcp__feedmob-reporting__check_liftoff_report_status({
stash_report_id: "stash-123",
possible_finance_report_id: "pf-456"
})
// Step 3: Get report data when status is "ready"
mcp__feedmob-reporting__get_liftoff_reports({
stash_report_id: "stash-123",
possible_finance_report_id: "pf-456",
start_date: "2025-01-01",
end_date: "2025-01-31"
})
Response contains:
click_url_id: Click URL identifierpartner_net_spend: Net spend from partner reportdate: Report dateFrom partner report, extract all unique click_url_id values, then fetch direct spends:
mcp__feedmob-reporting__get_direct_spends({
start_date: "2025-01-01",
end_date: "2025-01-31",
click_url_ids: ["12345", "12346", ...] // string array
})
Step 3.1: Compare Net Spend
First use Glob to find: **/compare_net_spend_datafusion.py
python3 scripts/compare_net_spend_datafusion.py \
<partner_report.csv> <direct_spend.csv> <output.csv>
Step 3.2: Generate Analysis Summary
python3 scripts/analyze_net_spend_datafusion.py \
<comparison_report.csv> <output_directory>
For detailed script usage, see: Scripts Usage Guide
Compare partner_net_spend vs feedmob_net_spend:
| Click URL | Date | Partner Net | FeedMob Net | Difference | Diff % | Status | |-----------|------|-------------|-------------|------------|--------|--------| | 12345 | 2025-01-01 | $1,500.00 | $1,500.00 | $0.00 | 0.00% | ✅ | | 12346 | 2025-01-01 | $2,000.00 | $1,950.00 | $50.00 | 2.56% | 🚨 |
Status Icons:
For detailed report structure, see: Report Structure Guide
Use this workflow when client uses AppsFlyer as MMP (instead of Singular or Adjust).
Key Features:
get_clients to check client's mmp_track_party fieldget_appsflyer_reports to fetch attribution reportFor detailed workflow, examples, and considerations, see: AppsFlyer MMP Client Workflow Guide
Quick Start:
get_clients({ client_name: "..." })get_appsflyer_reports({ client_ids: [...] })Compare client-provided gross_spend against feedmob_gross_spend directly — no event calculation needed.
Steps:
get_client_report_spend_report_names() → get_client_report_spends()get_direct_spends()python3 scripts/compare_client_report_spend_datafusion.py <client_report.csv> <direct_spend.csv> <output.csv>For detailed script usage, comparison modes, and output format, see: Client Report Comparison Guide
The following reference documents provide detailed workflow guides, best practices, and troubleshooting solutions:
Quick Find Common Issues:
tools
A clear, complete description of what this skill does and when Claude should use it
data-ai
Parse URLs in CSV files and extract query parameters as new columns. Use when working with CSV files containing URLs that need parameter extraction and analysis.
development
Delegate coding tasks to an attached OpenCode server via `opencode run --attach`. Use when: (1) building new features, (2) refactoring, (3) reviewing changes, (4) iterative coding with background monitoring. This skill is server-only and always uses `--attach` with `--dir` (server-side path).
development
Automatically installs and configures weekly-hubspot-report and weekly-hubspot-report-pipeline skills from feedmob-skills repository. Supports git clone or manual zip upload, runs npx skills add commands, and guides environment variable setup for FEMINI_API_TOKEN, FEEDAI_API_TOKEN, and AWS credentials. Use when: user needs HubSpot reporting, install HubSpot skills, generate weekly ticket reports, configure report pipeline, or when weekly-hubspot-report* skills are mentioned but not available. Triggers: install HubSpot skills, setup HubSpot reporting, HubSpot weekly report, configure HubSpot, feedmob-skills installation.