Skip to main content
The Reports page in OrbitForms is one fixed sales dashboard. Every report on it is available here with the same filters and the same definitions, and so is the list of deals, activities or contacts behind any number. Goal attainment and the forecast are read-only here too. The MCP server exposes the same numbers through get_sales_report, get_goals and get_forecast, and questions through ask_report_question.
Numbers follow the credential owner’s record access. A rep limited to their own records gets their own numbers, exactly as on the Reports page. Records in Recently deleted never count.

Endpoints

Scopes

Each report needs the read scope of the data it summarizes: deals:read for pipeline, win_rate, conversion, stage_time, deal_flow, renewals and recurring; activities:read for activity; contacts:read for response.

Filters

With deal splits on, win_rate also carries split_credit: { "split_deal_count": 3, "by_person": [{ "user_id": "4a3c…", "name": "Rex Ortega", "won_amount": 43200, "won_deals": 2.6, "split_deals": 1 }] }, the same won deals credited by their splits (a deal without splits credits its owner). The person filter picks credited people. Revenue won goals use it.

Definitions

Amounts are in the workspace currency (default_currency in deal settings): deals in another currency are converted at the workspace’s exchange rates (see GET /api/v1/currencies), won and lost deals at the rate they closed at. A deal whose currency has no rate is counted, its amount left out and counted in other_currency_count. Rates are fractions (0.4 is 40%), null when there is nothing to divide by. Durations are seconds.

Rows behind a number

Pass the report’s filters plus what the number is about: owner is a user ID, or none for records without one. period_start is a period’s first date as the report lists it in by_period. A linked contact, company or deal is only named in an activity row when the credential owner can open it and the credential also holds contacts:read, companies:read or deals:read respectively.

Goals and attainment

Admins set goals in OrbitForms (Analytics › Goals) per person or team (member group), for a month or a quarter of the fiscal year, on four metrics. Each actual is a number the Sales dashboard already shows, from the same calculation, so attainment always matches the reports for the same period: GET /api/v1/goals takes the period filters (period, or from and to, and time_zone), plus metric (default all four), owner_id (a user ID or me) or group_id to narrow who is listed, and order (attainment, the default, or actual). pipeline_id doesn’t apply: goals are for all pipelines. It needs deals:read; calls and meetings also need activities:read, and are listed in omitted_metrics without it. Over a range, a person’s goal adds up their goals for it: per fiscal quarter the range covers whole, its quarterly goal (or, without one, its months’ goals), plus the monthly goals of the other months. A range that isn’t whole months (last_7_days, say) has aligned: false and no goals. A team’s actual is the sum of its members’ now. attainment is actual ÷ goal, null without a goal.
People and teams follow the credential owner’s record access (a rep who sees only their own deals sees only their own goals), and the workspace’s goals visibility setting (Settings › Deals): with admins, everyone but admins sees only their own. A team is listed when everyone in it is.

Forecast

GET /api/v1/forecast (deals:read) answers the forecast for one month or fiscal quarter: period (this_month, next_month, last_month, this_quarter (default), next_quarter or last_quarter), or period_type (month or quarter) with period_start (its first day; a quarter must start a fiscal quarter). Also pipeline_id, owner_id, group_id and time_zone. Every deal counts in one forecast category, the deal’s forecast_category in the deals API: closed (won), commit, best_case, pipeline or omitted (lost, or left out). An open deal’s category comes from its stage (set per stage in Settings › Pipelines; until then by probability: 80% or more is commit, 50% or more best_case, else pipeline), unless it was set on the deal, which lasts until the deal moves stage. can_submit says whether the credential owner may submit their own forecast (members who can make changes; not the viewer role). rows has one entry per person (every member the credential owner may see, zero or not, plus deals with no owner as owner_id: null), groups one per team (its members added up; submitted_amount is the sum of their submissions, submitted_count how many submitted), and submissions every submission and override for the period and pipeline scope (pipeline_id, or all pipelines), newest first: numbers are never changed or removed. Submissions are made in OrbitForms (Reports › Forecast) until the period’s last day; the API reads them.

Ask a question

POST /api/v1/reports/questions answers a reporting question in plain English, the same as the question box on the Analytics page:
Orbit’s AI plans the report from the workspace’s field, list and people names only: it never sees a record and never writes a query. Orbit checks the plan against a fixed list of objects (deals, contacts, companies, tasks, activities), measures (count, sum, avg, min, max, median, win_rate), fields and filters, then runs it on read-only reporting views scoped to the workspace and the credential owner’s record access. A question reads at most 250,000 records and answers at most 200 rows.
explanation says what was counted, worked out from the spec rather than written by the AI. A question that isn’t about this data answers { "status": "unanswerable", "message": "…" } and uses no credit. The answer’s object needs its read scope (deals:read, contacts:read, companies:read, tasks:read or activities:read); without it the request is refused (403) and nothing is charged. Rates are fractions, amounts are in the workspace’s default deal currency. Limits are shared with record summaries: 40 AI requests per person per 10 minutes and 200 paid AI actions per workspace per day (429); 402 when the workspace is out of AI credits; 503 when the AI is unavailable. Each question is kept in the asker’s own question list on the Analytics page.