publ betaReference (MCP guide)
Open publ console

Sales overview observations

# Sales overview observations

No tool is added by that correction.

Use the sales reader for observed amounts; monetization_get with consoleAction:sales remains human navigation through its own entry permission. The dedicated reader needs OWNER or a MANAGE_SALES_OVERVIEW delegate, independently of monetization permission. An authorized target does not imply financial eligibility. Currency and period are options on one composed workflow, not separate tools or raw API requests.

## Four composed queries

After reading selected-channel identity, creation date and currency definitions, the tool issues these summaries in order. Each row independently obtains an ISSUER credential from POST /profitable/authorize at the core origin with role:ISSUER and the selected channelId, then GETs /api/v1/sales-aggregation/summary at the private PAY origin. Every query includes timezone:UTC and the same selected currency.

| Result | Range | unit | needsOnlyTotal | type |
| --- | --- | --- | --- | --- |
| overview.today | Current UTC date through itself | daily | true | net-income |
| overview.accumulated | Observed channel creation date through UTC today | daily | true | net-income |
| overview.monthly | Observed channel creation date through UTC today | monthly | false | net-income |
| period | Explicit/default inclusive range | daily | false | Omitted |

The selected range permits 1–93 inclusive calendar days, bounded by creation and today. Its default is max(creation, today minus seven days) through today. Accumulated/monthly lifetime queries are not capped at 93 days. The creation date is the validated first YYYY-MM-DD portion of source insertedAt, not an inferred launch date or a converted timezone. Input does not override timezone, type, unit or needsOnlyTotal.

Currencies come from the source base and up to 100 alternate definitions. Alternates must refer to the same base, differ from it and be unique; source order is retained. Omission selects base. Amounts are never converted or assigned an exchange rate. Final channel metadata must match the initial identity, title, creation date, base and ordered alternates, and the selected actor/permission/credential context must remain valid.

## Summaries and exact amounts

Each response must be HTTP 200 with a data.summary object. The shared payment transport bounds each response to 2 MiB. Every summary requires total; known total fields are optional individually. Monthly/selected-period summaries require records plus matching unit/startDate/endDate/timezone. Totals-only summaries may omit that metadata and records, but any supplied metadata must match. At most 1,200 records are accepted; this is a bounded observation, not a paginated export or proof of complete financial history.

| Known total or record field | Projection |
| --- | --- |
| netIncomePrice | Price object with currency and amount. |
| transactedIncomeInfo | count and transactedIncomePrice. |
| refundedInfo | count and refundedPrice. |
| transactedProductModels | Optional SubscriptionProduct and PAppUnlockProduct entries, each with productName (at most 4,096 characters), count and price. |
| Record coordinates | Required year 1–9,999, month 1–12, week 0–53 and day 0–31. Daily dates must be valid, unique and in range. Monthly year/month pairs must be unique and within lifetime range. |

Every count is a nonnegative safe integer. Every returned price must match the selected currency. An amount is a string with up to 60 whole-number digits and 30 fractional digits, optional minus sign, no exponent, plus sign or leading zeros except zero itself. Known values, including negative values and source decimal precision, are preserved; unknown fields are omitted. Missing prices/models remain absent and never become zero. Empty records are valid only when required metadata and the total envelope are present.

The average sums observed monthly net-income amounts using BigInt and divides by the number of returned monthly records. It does not fill missing months or use lifetime calendar length. A calculated result contains status:calculated, currency, recordCount, reduced integer-string exactRatio.numerator/denominator, rounding:none and basis:source-monthly-records. exactAmount appears only when that ratio has a terminating decimal. For monthly amounts 1, 0 and 0 the ratio is 1/3 with no exactAmount; for 1 and 2 it is 3/2 with exactAmount 1.5. These are arithmetic illustrations, not financial observations.

Empty rows return status:unavailable, reason:NO_MONTHLY_RECORDS and recordCount:0. Any missing row net income returns reason:MONTHLY_NET_INCOME_MISSING with the observed count. No exactRatio or exactAmount is invented for an unavailable average. This exact calculation and preservation of missing values deliberately differ from the original screen's Number arithmetic and zero defaults.

The original DTO timezone annotation differs from the executed source's UTC queries. A confirmed result covers validated fields and context, with atomicSnapshot:false, financialActionCompleted:false and settlementEligibilityVerified:false.

## Private transport and navigation

Use the [shared PAY settings](payment-gateway.md#operator-configuration): configured PAY origin plus exactly one private environment key or absolute key-file reference. Missing settings stop explicit provider and sales reads; invalid/partial settings fail startup. Never send keys/tokens through MCP inputs or conversation, and do not infer a PAY host from the core origin.

Each authorization uses the selected-channel bearer; its following GET uses only that issuer bearer. Both carry the operator apiKey query parameter, which must be redacted in proxy logs. No account fallback, cookie, channel/consumer header, redirect or automatic retry is used. Each fetch has a 30-second timeout. Credentials are checked around each transport; no token is persisted or reused for another query/channel. writesPerformed:false refers to business writes: up to four authorization POST/GET pairs occur for a successful screen.

One console URL uses /channels/{channelCode}/sales-overview/home. Any observed alternate definition adds /{selected-lowercase-currency}, including for base currency. Navigation verifies the suffix against the returned selection; no account home or invented date-query link substitutes. The console manages its own date selector. No export, CSV, task, invoice, payment, refund, withdrawal or other financial submission occurs.

## Failure boundaries

| Code/category | Meaning |
| --- | --- |
| INVALID_INPUT | Undeclared fields, invalid currency shape or malformed/incomplete date object. |
| SALES_PERIOD_UNVERIFIED / SALES_PERIOD_INVALID | Invalid current/creation context, or a selected range outside 1–93 inclusive days and observed lifetime. |
| SALES_CHANNEL_UNVERIFIED / SALES_CHANNEL_MISMATCH / SALES_CHANNEL_CHANGED | Unverifiable metadata, foreign identity or changed creation/currency metadata. |
| SALES_CURRENCY_UNVERIFIED / SALES_CURRENCY_UNAVAILABLE / SALES_CURRENCY_MISMATCH | Inconsistent alternate definitions, unavailable selection or a price in another currency. |
| SALES_RESPONSE_UNVERIFIED / SALES_QUERY_MISMATCH / SALES_RECORD_UNVERIFIED | Invalid summary shape, missing required records/metadata, mismatched query, duplicate or out-of-range records. |
| PAY/auth/context/lock errors | Shared payment-service configuration, authorization, bounded-response, network or connection continuity failure; see the [provider guide](payment-gateway.md#failures-and-rereads). |

A failure at any step stops later requests and suppresses earlier summaries. It does not fabricate zero income, empty sales or successful partial completion. Error reporting does not imply that earlier authorization requests never occurred. No financial write needs replay, and no task is available to resume; resolve the reported prerequisite before a new explicit read. Actual-service, UI/visitor/LLM/native-client/hosted operation and populated financial data remain separately unverified.

## Legacy channel identity

The adapter now follows the original channel reducer's alias convention: use nonempty channelCode, otherwise primitiveInvitationCode returned by the service. Null or omitted values are permitted at this raw step, but the normalized channel still needs a valid identity, creation date and currency configuration. Conflicting nonempty codes and wrong raw types are rejected. The observed numeric ID, code and title must match the selected channel before PAY authorization.

Do not replace a conflicting response identity with the requested target or supply an alias in MCP arguments. An identity pass followed by a PAY configuration error is still a failed sales read.