Skip to main content
Glama

App Store Connect MCP Server

revenue-calculation-fix-analysis.md6.6 kB
# Revenue Calculation Bug Fix - Technical Analysis ## Executive Summary A critical bug was discovered and fixed in the App Store Connect MCP server's revenue calculation logic. The bug caused massive overreporting of revenue due to double currency conversion, showing $5.37M MRR instead of the correct ~$220K MRR. ## The Original Bug: Double Currency Conversion ### Root Cause The system was incorrectly treating Apple's **Developer Proceeds** field as if it was in the customer's local currency, then converting it to USD. However, **Apple already converts Developer Proceeds to USD** before providing it in their reports. ### Technical Details - **Apple's Data Structure**: - `Customer Price`: Amount customer paid in local currency (e.g., "56,126 IDR") - `Customer Currency`: Local currency code (e.g., "IDR", "TZS", "USD") - `Developer Proceeds`: **ALREADY CONVERTED TO USD by Apple** (e.g., "$3.62") - **Our Bug**: We were applying our own currency conversion to `Developer Proceeds`: ```typescript // WRONG - This caused double conversion const revenue = parseFloat(row['Developer Proceeds'] || '0'); const currency = row['Customer Currency'] || 'USD'; const revenueUSD = this.convertToUSD(revenue, currency); // ❌ WRONG! ``` - **The Fix**: Use `Developer Proceeds` directly (it's already USD): ```typescript // CORRECT - Developer Proceeds is already in USD const proceedsUSD = parseFloat(row['Developer Proceeds'] || '0'); // No conversion needed - Apple did it for us ``` ## Symptoms Observed ### 1. Indonesia Revenue Inflation - **Reported**: $56,126 for a single day - **Actual**: ~$3.62 per day - **Cause**: Treating 56,126 IDR as if it was $56,126 USD, then "converting" it again - **Math**: Customer paid 56,126 IDR → Apple converted to $3.62 → We treated $3.62 as IDR and "converted" to ~$56,126 ### 2. Tanzania Revenue Anomaly - **Reported**: $17,382 in a single transaction - **Actual**: Likely ~$4-6 per transaction - **Cause**: Same double-conversion issue with Tanzanian Shillings (TZS) ### 3. Total MRR Explosion - **Reported**: $5.37M Monthly Recurring Revenue - **Actual**: ~$220K MRR - **Multiplier**: ~24x overreporting - **Cause**: Aggregating all the double-converted proceeds across all international markets ## The Fix Implementation ### Code Changes in `/src/services/finance-service.ts` #### Before (Buggy Logic) ```typescript // This was causing double conversion const revenue = parseFloat(row['Developer Proceeds'] || '0'); const currency = row['Customer Currency'] || 'USD'; const revenueUSD = this.convertToUSD(revenue, currency); ``` #### After (Correct Logic) ```typescript // Developer Proceeds is ALWAYS in USD (Apple does the conversion) const proceedsUSD = parseFloat(row['Developer Proceeds'] || row['Proceeds'] || '0'); return { ...row, _customerCurrency: customerCurrency, _proceedsUSD: proceedsUSD // Already in USD, no conversion needed }; ``` ### Key Comments Added - Line 220: `// Developer Proceeds is ALWAYS in USD (Apple does the conversion)` - Line 318: `// IMPORTANT: Developer Proceeds is ALWAYS in USD already (Apple converts it)` - Line 319: `// Customer Currency is what the customer paid in, but proceeds are in USD` ## Debugging Process Applied Following pragmatic debugging principles: ### 1. **"Fix the Problem, Not the Blame"** - Didn't assume our conversion rates were wrong - Investigated the actual data structure Apple provides - Found the root cause: misunderstanding of Apple's data format ### 2. **"Don't Assume It—Prove It"** - Created test scripts (`debug-indonesia.ts`, `debug-revenue.ts`) to examine raw data - Traced actual API responses to understand field meanings - Verified the fix with `test-fixed-revenue.ts` ### 3. **"Find Root Causes, Not Symptoms"** - Initial symptom: "Revenue is 24x too high" - Root cause: "We're double-converting currency that's already converted" - This explains ALL the symptoms consistently ## Validation of Fix ### Test Results from `test-fixed-revenue.ts` - ✅ Indonesia now shows ~$3.62 instead of $56,126 - ✅ Total daily revenue reduced to reasonable levels - ✅ Revenue calculations now proportional to actual usage ### Remaining Data Integrity - All non-USD customer transactions now calculate correctly - US transactions unaffected (USD → USD conversion was harmless) - Subscription metrics properly reflect actual revenue ## Remaining Issues & Next Steps ### 1. Sales vs Subscription Data - **Issue**: SALES reports only show NEW purchases, not recurring subscriptions - **Impact**: Daily revenue varies wildly ($1K-$250K) due to yearly subscription purchases - **Solution Needed**: Access subscription renewal data through different report types ### 2. Data Completeness - **Issue**: May need SUBSCRIPTION or SUBSCRIBER report types for accurate MRR - **Current**: Using SALES data which is incomplete for subscriptions - **Next Step**: Implement proper subscription reporting pipeline ### 3. Historical Data - **Issue**: All historical calculations were affected by this bug - **Impact**: Past revenue reports are incorrect - **Recommendation**: Re-calculate historical metrics with fixed logic ## Technical Lessons Learned ### 1. API Data Assumptions - Never assume data format without verifying with actual API responses - Apple's financial APIs have complex field relationships - `Customer Price` ≠ `Developer Proceeds` (different currencies, fees applied) ### 2. Currency Handling - Always verify which fields are pre-converted by the API provider - Apple handles currency conversion, tax calculations, and fee deductions - Our job is aggregation and analysis, not currency conversion ### 3. Debugging International Data - International markets revealed the bug due to large currency exchange rates - Indonesian Rupiah (15,500:1 USD) made the error obvious - US-only testing would have missed this critical issue ## Files Modified - `/src/services/finance-service.ts` - Fixed currency conversion logic - Added extensive comments explaining Apple's data format - Enhanced error checking and data validation ## Test Files Created - `/src/debug-indonesia.ts` - Identified the Indonesia anomaly - `/src/debug-revenue.ts` - Systematic debugging of revenue calculation - `/src/test-fixed-revenue.ts` - Validation of the fix - `/src/debug-tanzania.ts` - Confirmed pattern across multiple countries This fix represents a critical correction that brings the MCP server's revenue reporting in line with actual App Store financial data, enabling accurate business intelligence and decision-making.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TrialAndErrorAI/appstore-connect-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server