CRM: Sales Forecasting
Problem Statement
Generating a sales forecast aggregates pipeline data by period, stage, team, or product line. This is a read-only analytical operation with complex filter parameters.
Why Human-Only Semantics Fail
- Forecast dashboards display charts that agents cannot parse
- Filter controls don't declare available dimensions or date ranges
- "Export" buttons produce files in undeclared formats
- Drill-down interactions are click-based with no declared navigation model
Why Scraping Fails Here
- Charts render as SVG/Canvas — no textual data in the DOM
- Filters reload the page asynchronously
- Data tables are paginated with lazy loading
- Export downloads trigger browser file-save dialogs
How AXAG Eliminates Scraping
forecast.generate declares the filter parameters, output format options, and scope boundaries. Agents get structured forecast data.
Annotated UI Example
CRM — generate forecast
<button
axag-intent="forecast.generate"
axag-entity="forecast"
axag-action-type="read"
axag-required-parameters='["period"]'
axag-optional-parameters='["team_id","product_line","stage_filter","format"]'
axag-scope="tenant"
axag-risk-level="none"
axag-idempotent="true"
axag-description="Generate a sales forecast for the specified period"
>Generate Forecast</button>
Semantic Manifest Excerpt
Manifest — forecast.generate
{
"intent": "forecast.generate",
"entity": "forecast",
"action_type": "read",
"operation_id": "forecast_generate",
"description": "Generate a sales forecast for the specified period",
"required_parameters": [
{
"name": "period",
"type": "string",
"enum": ["current_quarter", "next_quarter", "current_year", "custom"]
}
],
"optional_parameters": [
{ "name": "team_id", "type": "string" },
{ "name": "product_line", "type": "string" },
{
"name": "stage_filter",
"type": "array",
"items": {
"type": "string",
"enum": ["prospecting", "qualification", "proposal", "negotiation", "closed_won"]
}
},
{ "name": "format", "type": "string", "enum": ["json", "csv", "pdf"], "default": "json" }
],
"risk_level": "none",
"idempotent": true,
"scope": "tenant"
}
Generated Tool Example
{
"name": "forecast_generate",
"description": "Generate a sales forecast for the specified period",
"input_schema": {
"type": "object",
"properties": {
"period": {
"type": "string",
"enum": ["current_quarter", "next_quarter", "current_year", "custom"]
},
"team_id": { "type": "string" },
"product_line": { "type": "string" },
"stage_filter": {
"type": "array",
"items": {
"type": "string",
"enum": ["prospecting", "qualification", "proposal", "negotiation", "closed_won"]
}
},
"format": { "type": "string", "enum": ["json", "csv", "pdf"], "default": "json" }
},
"required": ["period"]
},
"metadata": {
"action_type": "read",
"risk_level": "none",
"idempotent": true,
"confirmation_required": false,
"approval_required": false,
"source_intent": "forecast.generate",
"source_entity": "forecast"
}
}
Constraints & Safety Notes
- Read-only, no side-effects
- Scoped to tenant — cannot access other organizations' pipeline data
customperiod type would require additionalstart_date/end_dateparameters- CSV/PDF formats are for human consumption; JSON is the agent-preferred format