mirror of
https://github.com/rudrankriyam/App-Store-Connect-CLI.git
synced 2026-04-25 15:45:48 +03:00
[GH-ISSUE #26] Phase 8: Analytics and sales reports #4
Labels
No labels
bug
bug
documentation
enhancement
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/App-Store-Connect-CLI#4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @rudrankriyam on GitHub (Jan 20, 2026).
Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/26
PRD: Analytics and Sales Reports in ASC CLI
Overview
This PRD outlines the implementation of analytics and sales reporting commands for App Store Connect CLI, enabling developers and AI agents to download sales reports, request analytics reports, and retrieve usage metrics programmatically.
Goals
API Endpoints
Sales and Trends Reports
/v1/salesReportsQuery Parameters:
filter[vendorNumber](required) - Vendor number for your developer accountfilter[reportType](required) - Report type:SALES,PRE_ORDER,NEWSSTAND,SUBSCRIPTION,SUBSCRIPTION_EVENTfilter[reportSubType](required) - Report detail level:SUMMARY,DETAILEDfilter[frequency](required) - Time interval:DAILY,WEEKLY,MONTHLY,YEARLYfilter[reportDate](required) - Report date inYYYY-MM-DDformatfilter[version](optional) - Report format version:1_0(default),1_1Response: GZIP-compressed TSV file (binary)
Analytics Reports (Multi-Step Workflow)
/v1/analyticsReportRequests/v1/analyticsReportRequests/v1/analyticsReportRequests/{id}/v1/analyticsReports/v1/analyticsReportInstances/v1/analyticsReportSegmentsReport Categories:
CLI Commands
Command Structure
Subcommands
sales- Download Sales and Trends ReportsDownloads sales and trends reports as GZIP-compressed TSV files.
Flags:
--vendor(required) - Vendor number (orASC_VENDOR_NUMBERenv)--type(required) - Report type:SALES,PRE_ORDER,NEWSSTAND,SUBSCRIPTION,SUBSCRIPTION_EVENT--subtype(required) - Report subtype:SUMMARY,DETAILED--frequency(required) - Frequency:DAILY,WEEKLY,MONTHLY,YEARLY--date(required) - Report date inYYYY-MM-DDformat--version(optional) - Report format version:1_0(default),1_1--output(optional) - Output file path (default:sales_report_{date}_{type}.tsv.gz)--decompress(optional) - Automatically decompress GZIP file to.tsv--output-format(optional) - Output format for metadata:json(default),table,markdown--pretty(optional) - Pretty-print JSON outputExamples:
JSON Output (metadata):
Note: Reports are typically available the day after the report date. Monthly reports require dates aligned with Apple's reporting periods.
request- Create Analytics Report RequestCreates a new analytics report request for an app.
Flags:
--app(required) - App Store Connect app ID (orASC_APP_IDenv)--access-type(required) - Access type:ONGOING(daily updates),ONE_TIME_SNAPSHOT(single snapshot)--output(optional) - Output format:json(default),table,markdown--pretty(optional) - Pretty-print JSON outputExamples:
JSON Output:
Note: Requires API key with Admin permissions. Analytics data may take 1-2 days to unlock after API credentials are first saved.
requests- List Analytics Report RequestsLists analytics report requests for an app.
Flags:
--app(required) - App Store Connect app ID (orASC_APP_IDenv)--request-id(optional) - Filter by specific request ID--state(optional) - Filter by state:PROCESSING,COMPLETED,FAILED--limit(optional) - Maximum results per page (1-200)--next(optional) - Fetch next page usinglinks.nextURL--output(optional) - Output format:json(default),table,markdown--pretty(optional) - Pretty-print JSON outputExamples:
JSON Output:
get- Get Analytics ReportsRetrieves analytics reports for a request, including instances and segments.
Flags:
--request-id(required) - Analytics report request ID--instance-id(optional) - Filter by specific instance ID--date(optional) - Filter instances by date (YYYY-MM-DD)--include-segments(optional) - Include report segments with download URLs--limit(optional) - Maximum results per page (1-200)--next(optional) - Fetch next page usinglinks.nextURL--output(optional) - Output format:json(default),table,markdown--pretty(optional) - Pretty-print JSON outputExamples:
JSON Output:
download- Download Analytics ReportDownloads an analytics report file from a segment.
Flags:
--request-id(required) - Analytics report request ID--instance-id(required) - Report instance ID--segment-id(optional) - Specific segment ID (if multiple segments exist)--output(optional) - Output file path (default:analytics_report_{requestId}_{instanceId}.csv.gz)--decompress(optional) - Automatically decompress GZIP file to.csv--output-format(optional) - Output format for metadata:json(default),table,markdown--pretty(optional) - Pretty-print JSON outputExamples:
JSON Output (metadata):
Note: Report files are typically GZIP-compressed CSV files. Download URLs may expire; download promptly after retrieval.
Request/Response Shapes
Sales Reports (GET)
Request:
Response:
application/a-gziporapplication/gzipContent-Dispositionwith filenameCreate Analytics Report Request (POST)
Request:
Response:
Get Analytics Reports (GET)
Request:
Response:
Required Fields
Sales Reports
Required Query Parameters:
filter[vendorNumber]: String - Vendor number (8+ digits)filter[reportType]: Enum -SALES,PRE_ORDER,NEWSSTAND,SUBSCRIPTION,SUBSCRIPTION_EVENTfilter[reportSubType]: Enum -SUMMARY,DETAILEDfilter[frequency]: Enum -DAILY,WEEKLY,MONTHLY,YEARLYfilter[reportDate]: String - Date inYYYY-MM-DDformatOptional Query Parameters:
filter[version]: String - Report format version:1_0(default),1_1Analytics Report Requests
Required Fields:
type:"analyticsReportRequests"attributes.accessType: Enum -ONGOING,ONE_TIME_SNAPSHOTrelationships.app.data.type:"apps"relationships.app.data.id: String - App ID (UUID)Validation
Input Validation
Vendor Number
salescommand--vendorflag orASC_VENDOR_NUMBERenvironment variableReport Type
salescommandSALES,PRE_ORDER,NEWSSTAND,SUBSCRIPTION,SUBSCRIPTION_EVENTReport Subtype
salescommandSUMMARY,DETAILEDFrequency
salescommandDAILY,WEEKLY,MONTHLY,YEARLYReport Date
salescommandYYYY-MM-DD(ISO 8601 date)Version
salescommand1_0(default),1_1{major}_{minor}App ID
requestandrequestscommands--appflag orASC_APP_IDenvironment variableAccess Type
requestcommandONGOING,ONE_TIME_SNAPSHOTRequest ID
getanddownloadcommandsInstance ID
downloadcommandSegment ID
downloadcommandLimit
Date Validation
Report Date Format
YYYY-MM-DDformattime.Parse("2006-01-02", date)Monthly Report Dates
Future Dates
Error Handling
Common Errors
Invalid Vendor Number
Invalid Report Type
Invalid Frequency
Invalid Date Format
Report Not Available
Monthly Report Date Mismatch
Request Not Found
Report Not Ready
Download URL Expired
Unauthorized
Rate Limiting
File Write Error
Decompression Error
Error Response Format
All errors follow the existing pattern:
File Handling
GZIP Compression
Sales Reports
.tsv.gz.tsvAnalytics Reports
.csv.gz.csvDecompression
compress/gzippackage--decompressis used without custom output pathFile Naming
{reportType}_{date}_{frequency}.{ext}.gzsales_report_2024-01-20_SALES.tsv.gzanalytics_report_{requestId}_{instanceId}.csv.gz--outputflagFile Permissions
0644permissions (readable by owner and group)Testing Requirements
Unit Tests
Client Layer (
internal/asc/client.go)GetSalesReport
versionparameterCreateAnalyticsReportRequest
GetAnalyticsReportRequests
filter[app],filter[id],filter[state])links.next)GetAnalyticsReports
filter[analyticsReportRequest],include)GetAnalyticsReportInstances
filter[analyticsReport],filter[date])GetAnalyticsReportSegments
filter[analyticsReportInstance])DownloadAnalyticsReport
CLI Layer (
cmd/analytics.go)AnalyticsSalesCommand
AnalyticsRequestCommand
--app,--access-type)AnalyticsRequestsCommand
--request-id,--state)--next)AnalyticsGetCommand
--request-id)--instance-id,--date)--include-segmentsflagAnalyticsDownloadCommand
--request-id,--instance-id)Integration Tests (Opt-in)
Environment Variables:
ASC_ANALYTICS_VENDOR_NUMBER- Vendor number for sales reportsASC_ANALYTICS_APP_ID- App ID for analytics reportsASC_ANALYTICS_TEST_DATE- Test date for sales reports (default: yesterday)ASC_ANALYTICS_OUTPUT_DIR- Output directory for test files (default:/tmp)Test Scenarios:
Skip Conditions:
ASC_ANALYTICS_VENDOR_NUMBERnot set (for sales tests)ASC_ANALYTICS_APP_IDnot set (for analytics tests)Implementation Checklist
Phase 1: Client Methods
GetSalesReport(ctx, vendorNumber, reportType, reportSubType, frequency, reportDate, version)- Download sales reportCreateAnalyticsReportRequest(ctx, appID, accessType)- Create requestGetAnalyticsReportRequests(ctx, appID, opts...)- List requests with filtersGetAnalyticsReportRequest(ctx, requestID)- Get specific requestGetAnalyticsReports(ctx, requestID, opts...)- Get reports for requestGetAnalyticsReportInstances(ctx, reportID, opts...)- Get instancesGetAnalyticsReportSegments(ctx, instanceID)- Get segments with download URLsDownloadAnalyticsReport(ctx, downloadURL)- Download report filePhase 2: CLI Commands
AnalyticsCommand- Parent commandAnalyticsSalesCommand- Download sales reportsAnalyticsRequestCommand- Create analytics requestAnalyticsRequestsCommand- List requestsAnalyticsGetCommand- Get reportsAnalyticsDownloadCommand- Download report filesRootCommandsubcommands listPhase 3: File Handling
Phase 4: Validation
Phase 5: Output Formatting
Phase 6: Error Handling
Phase 7: Tests
API Reference URLs
Official Documentation
Download Sales and Trends Reports
Downloading Analytics Reports
Analytics Reports Overview
Analytics Reports Documentation
Sales and Trends Reports Availability
Sales and Trends Metrics and Dimensions
App Store Connect API Overview
OpenAPI Specification
Related Documentation
Design Decisions
Explicit Flags: All commands use long-form flags (
--vendor,--type,--frequency) following project conventionsJSON-First: Default output is minified JSON for AI agent consumption (metadata only; binary files written to disk)
Non-Interactive: No prompts; all required information via flags
File Handling: Binary reports written to disk; JSON output contains metadata (file path, size, etc.)
GZIP Handling: Support both compressed and decompressed output via
--decompressflagVendor Number: Support environment variable (
ASC_VENDOR_NUMBER) for convenienceDate Validation: Strict validation with helpful error messages for common mistakes
Multi-Step Workflow: Separate commands for each step of analytics report workflow (request → get → download)
Error Messages: Include actionable hints (e.g., "Reports available day after report date")
File Naming: Descriptive default names with option to customize via
--outputFuture Enhancements
Report Parsing: Parse TSV/CSV files and output structured JSON
asc analytics sales --vendor "..." --parse- Parse and output JSONReport Aggregation: Combine multiple reports into single output
asc analytics sales --vendor "..." --date-range "2024-01-01,2024-01-31"Automated Downloads: Schedule automatic report downloads
asc analytics schedule --vendor "..." --frequency DAILY --output-dir "reports/"Report Comparison: Compare reports across time periods
asc analytics compare --vendor "..." --date1 "2024-01-01" --date2 "2024-02-01"Analytics Report Types: Support filtering by specific report types
asc analytics request --app "..." --report-types APP_USAGE,PERFORMANCEReport Status Polling: Poll for report completion
asc analytics request --app "..." --wait- Poll until readyBulk Operations: Download multiple reports in one command
asc analytics sales --vendor "..." --dates "2024-01-01,2024-01-02,2024-01-03"Notes
BuildsCommandandBetaGroupsCommandfor subcommand structureReport Type Reference
Sales Report Types
SALES- Standard sales reports (downloads, proceeds)PRE_ORDER- Pre-order reportsNEWSSTAND- Newsstand reportsSUBSCRIPTION- Subscription reportsSUBSCRIPTION_EVENT- Subscription event reportsAnalytics Report Categories
Note: Implementation should verify available report types against the API documentation, as new types may be added over time.
@rudrankriyam commented on GitHub (Jan 21, 2026):
Implemented in PR #32 and released in 0.2.0. Closing as complete.