| name | feedmob-reporting-skills |
| description | 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. |
FeedMob Reporting Skills
🚨🚨🚨 STOP AND READ THIS FIRST 🚨🚨🚨
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:
- ❌ NEVER make up, guess, or calculate numbers in your head
- ✅ MUST display raw data → aggregation table → calculation steps → final report
- ✅ All numbers must be traceable to tool responses
- ✅ Use correct formula:
client_paid_action_count × gross_cpi
- ✅ Dynamically check
client_paid_action, don't hard-code event fields
Mandatory Workflow:
- Display raw data rows (from tool responses)
- Create aggregation table (grouped by date, click_url_id)
- Display calculation steps (each multiplication)
- Spot-check 3 data points to verify accuracy
- Then and only then generate final report
Complete anti-hallucination rules, verification checklist, and examples in references/anti-hallucination-protocol.md
Overview
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.
Important: MCP Tool Usage
First check if MCP tools are available:
- If
mcp__feedmob-reporting__* tools are available, call them directly
- If tools are unavailable (call fails or doesn't exist), ask user to configure MCP server
When tools are available:
- ✅ Call
mcp__feedmob-reporting__get_possible_finance_singular_reports(...) directly
- ✅ No need to check configuration or installation
When tools are unavailable:
- ✅ Inform user they need to configure feedmob-reporting MCP server
- ✅ Provide configuration instructions or guide user to MCP server documentation
🚀 Quick Start: Automation Scripts (Recommended)
Before diving into detailed workflows, understanding available automation scripts can greatly simplify your work.
Available Scripts Overview
| 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:
- ✅ All scripts are now universal, supporting any client (Possible Finance, TextNow, etc.)
- ✅ Automatically adapt to different report structures (Singular, Adjust, etc.)
- ✅ Dynamic CSV column detection, no code modification needed for new clients
- 📖 Detailed script usage instructions in "Step 3.5" section of each workflow
Recommended Workflow (must execute in order):
- Use MCP tools to fetch data and download CSV (Steps 1-2)
- Use
calculate_gross_spend_datafusion.py to calculate comparison (Step 3.5)
- 🚨 Mandatory: Use
analyze_gross_spend_datafusion.py to generate summary data (Step 3.6)
- LLM reads summary CSV and generates final report (Step 4)
⚠️ Warning: Don't skip Step 3.6!
- Summary data generated in Step 3.6 is the foundation for LLM to generate accurate reports
- Skipping this step leads to LLM manual calculation → extremely high hallucination risk
- All numbers must come from DataFusion summary, not LLM memory or manual calculation
Core Workflows
1. Gross Spend Verification Workflow (Universal)
Compare attribution reports (Singular/Adjust/etc.) with direct spend data to identify discrepancies.
Applicable Clients:
- ✅ Possible Finance (Singular reports)
- ✅ Koho Financial (Singular reports)
- ✅ TextNow (Adjust reports)
- ✅ Privacy Hawk (Singularreports)
- ✅ Uber Technologies (AgencyConversionRecords)
- ✅ AppsFlyer MMP clients (universal AppsFlyer reports)
- ✅ Any future clients
When to use: When verifying spend accuracy, reconciling reports, or investigating spend mismatches.
Workflow Steps:
Step 1: Fetch Attribution Report
Choose tool based on client:
- Possible Finance →
get_possible_finance_singular_reports
- Koho Financial →
get_koho_financial_singular_reports
- TextNow →
get_textnow_adjust_reports
- Privacy Hawk →
get_privacy_hawk_singular_reports
- Uber Technologies → See Uber Workflow
- AppsFlyer MMP clients → See AppsFlyer Workflow
For detailed API calls, data validation, and CSV saving process, see:
Data Collection Guide
Step 1.5: Fetch Partner Reports (When vendor_managed Campaigns Exist)
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:
- Jampp →
get_jampp_reports (requires client_id)
- Kayzen →
get_kayzen_reports
- YouAppi →
get_youappi_reports
- Samsung →
get_samsung_reports
Example:
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.
Step 2: Fetch Historical Rates and Direct Spend (Parallel)
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
Step 3: Match Event Fields and Calculate Expected Gross Spend
🚨 Mandatory: Use Correct Formula
calculated_gross_spend = client_paid_action_count × gross_cpi
Key Requirements:
- ✅ Dynamically match
client_paid_action field (don't hard-code)
- ✅ Aggregate multiple rows for same click_url_id
- ✅ Use
gross_cpi (not gross_rate)
- ✅ MUST display verification sections before calculating (raw data, aggregation, calculation steps)
For detailed calculation rules, verification requirements, and examples, see:
Calculation Verification Guide
Quick Checklist:
Step 3.5: Use Automation Scripts (Recommended)
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:
- Run the standard query for non-vendor_managed campaigns
- Run a vendor_managed query calculating
partner_net_spend × (1 - margin/100)
- Merge both results into a single output CSV
For detailed script version comparison, parameter descriptions, and usage examples, see:
Scripts Usage Guide
Step 3.6: Generate Multi-Dimensional Analysis Summary (⚠️ Mandatory)
🚨 Important: This is a mandatory step, cannot be skipped!
Why mandatory?
- Prevents LLM hallucinations and calculation errors
- Avoids token limit exceeded
- Lets SQL engine handle data aggregation
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:
- Read global summary
- Read key groupings (Vendor, Paid Action)
- Read Top anomalies
- Generate business report
For detailed script descriptions, 10 analysis dimensions, and LLM workflow, see:
Scripts Usage Guide
Step 4: Generate Final Report
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:
- Separate CPM and Non-CPM activities
- Non-CPM: Show Click URL and Vendor level comparison
- CPM: Only show Direct Spend (cannot verify without CPM rates)
- Only include Non-CPM accuracy statistics
- Sort tables by Calculated Gross (descending)
- Use status icons: ✅ (0-1%), ⚠️ (1-2%), 🚨 (≥2%)
Standard Sections:
- Overall Summary
- Non-CPM Activity Comparison (Click URL + Vendor tables)
- CPM Activity Section (separate)
- Verification Accuracy Statistics
- Key Findings and Recommendations
2. Net Spend Verification Workflow (Partner Reports)
Compare partner reports (Jampp, Kayzen, etc.) with direct spend data to verify net spend accuracy.
Applicable Partners:
- ✅ Jampp
- ✅ Kayzen
- ✅ YouAppi
- ✅ Samsung
- ✅ Smadex
- ✅ InMobi
- ✅ Liftoff
When to use: When verifying net spend from partner platforms against FeedMob direct spend records.
Key Difference from Gross Spend:
- Gross Spend: Requires calculation (
client_paid_action_count × gross_cpi)
- Net Spend: Direct comparison (
partner_net_spend vs feedmob_net_spend)
Workflow Steps:
Step 1: Fetch Partner Report
Direct Partners (Jampp, Kayzen, YouAppi, Samsung):
mcp__feedmob-reporting__get_jampp_reports({
client_id: 123,
start_date: "2025-01-01",
end_date: "2025-01-31"
})
mcp__feedmob-reporting__get_kayzen_reports({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
mcp__feedmob-reporting__get_youappi_reports({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
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):
mcp__feedmob-reporting__get_smadex_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
mcp__feedmob-reporting__check_smadex_report_status({
report_id: "abc-123"
})
mcp__feedmob-reporting__get_smadex_reports({
report_id: "abc-123"
})
InMobi (3-step process):
mcp__feedmob-reporting__get_inmobi_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
mcp__feedmob-reporting__check_inmobi_report_status({
report_id: "abc-123",
start_date: "2025-01-01",
end_date: "2025-01-31"
})
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):
mcp__feedmob-reporting__get_liftoff_report_ids({
start_date: "2025-01-01",
end_date: "2025-01-31"
})
mcp__feedmob-reporting__check_liftoff_report_status({
stash_report_id: "stash-123",
possible_finance_report_id: "pf-456"
})
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 identifier
partner_net_spend: Net spend from partner report
date: Report date
- Other partner-specific fields
Step 2: Extract Click URL IDs and Fetch Direct Spends
From 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", ...]
})
Step 3: Use Automation Scripts (Recommended)
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
Step 4: Generate Final Report
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:
- ✅ Perfect Match: 0% difference
- ⚠️ Minor Difference: <2% difference
- 🚨 Significant Difference: ≥2% difference
For detailed report structure, see:
Report Structure Guide
3. AppsFlyer MMP Client Workflow
Use this workflow when client uses AppsFlyer as MMP (instead of Singular or Adjust).
Key Features:
- ✅ First call
get_clients to check client's mmp_track_party field
- ✅ Use
get_appsflyer_reports to fetch attribution report
- ✅ Subsequent steps identical to other clients (Possible Finance, TextNow)
- ✅ Supports multiple clients, various filter options (client_ids, af_app_ids, campaign_ids)
For detailed workflow, examples, and considerations, see:
AppsFlyer MMP Client Workflow Guide
Quick Start:
- Check client MMP type:
get_clients({ client_name: "..." })
- Fetch AppsFlyer reports:
get_appsflyer_reports({ client_ids: [...] })
- Fetch historical rates and direct spend (parallel)
- Use DataFusion scripts to calculate comparison and generate summary
- Read summary CSVs and generate report
4. Client Report Spend Comparison Workflow
Compare client-provided gross_spend against feedmob_gross_spend directly — no event calculation needed.
Steps:
- Fetch client report:
get_client_report_spend_report_names() → get_client_report_spends()
- Fetch direct spends:
get_direct_spends()
- Run:
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
Reference Documentation
The following reference documents provide detailed workflow guides, best practices, and troubleshooting solutions:
Core Guides
Workflow Guides
Tools and Troubleshooting
Quick Find Common Issues: