Use these playbooks when you want ERP, BI, or spreadsheet systems to feed VisionAtlas without building a custom connector.
Prerequisites
- Intelligence+ plan with API access enabled
- Company administrator creates an API key under Settings → Integrations & API keys
- Map each KPI to an external metric on the KPI detail page (Integration mapping), or use internal
kpiIdvalues fromGET /api/v1/kpis - Review the OpenAPI spec at
/api/openapi
Authentication
All requests use a Bearer token:
Authorization: Bearer va_live_...Submit actuals (all playbooks)
POST /api/v1/kpi-values
Content-Type: application/json
{
"values": [
{
"externalSource": "ERP",
"externalMetricId": "NET_REVENUE_USD",
"asOfDate": "2026-07-01",
"actualValue": 1250000,
"targetValue": 1200000
}
]
}You may use kpiId instead of externalSource + externalMetricId. Use asOfDate for any date within the reporting period, or periodStart with the exact period start date.
Response semantics
totalSuccess— values writtentotalSkipped— rows skipped (validation, manual precedence)totalConflicts— rows queued for admin review in Settings → IntegrationsimportJobId— track the run in import history
Manual KPI edits win over automated ingestion for the same period unless an admin accepts a queued conflict.
Power Automate
- Create a scheduled cloud flow (e.g. every Monday 6:00 AM)
- Add your source action (SQL query, Dataverse list rows, SharePoint export)
- Add HTTP action:
- Method: POST - URI: https://your-tenant.visionatlas.app/api/v1/kpi-values - Headers: Authorization: Bearer {your-key}, Content-Type: application/json - Body: map dataset columns to the JSON values array
- Parse the response and alert if
totalErrorsortotalConflicts> 0
Sample payload: docs/integrations/sample-kpi-values-payload.json
Zapier
- Trigger: Schedule or your app trigger (Google Sheets, Salesforce, etc.)
- Action: Webhooks by Zapier → POST
- URL:
https://your-tenant.visionatlas.app/api/v1/kpi-values - Payload type: JSON
- Map fields to
values[0].externalMetricId,values[0].actualValue,values[0].asOfDate
n8n
- Use Cron + source node (Postgres, HTTP Request, Google Sheets)
- Add HTTP Request node targeting
POST /api/v1/kpi-values - Authentication: Header Auth with
Authorization: Bearer va_live_... - Reference workflow outline:
docs/integrations/n8n-kpi-sync.md
CSV alternative
For ad-hoc backfills, use KPIs → Import KPI actuals with:
external_source,external_metric_id,period_start,actual_value,target_value
ERP,NET_REVENUE_USD,2026-07-01,1250000,1200000Scheduled pull (built-in)
Under Settings → Integrations & API keys → Scheduled integrations, admins can configure:
| Type | Use when |
|---|---|
| **CSV URL** | A BI tool or data warehouse publishes a CSV over HTTPS (optional auth header) |
| **Google Sheets** | Finance maintains a sheet with `Publish to web` / export access |
| **Webhook ingest** | Your system pushes JSON batches on demand (no schedule) |
Scheduled CSV and Google Sheets syncs run automatically when VisionAtlas cron calls POST /api/cron/kpi-integration-sync (same CRON_SECRET as other cron jobs). Use Run now in Settings to test immediately.
CSV columns match the manual import format (kpi_id or external_source + external_metric_id, period_start, actual_value, optional target_value).
Webhook ingest endpoint
Create a Webhook ingest integration to receive a dedicated secret (vi_ingest_…). POST batches without a company API key:
POST /api/v1/ingest/kpi-values
Authorization: Bearer vi_ingest_...
Content-Type: application/json
{
"values": [
{
"externalSource": "ERP",
"externalMetricId": "NET_REVENUE_USD",
"asOfDate": "2026-07-01",
"actualValue": 1250000
}
]
}The ingest secret is shown once at creation. Manual KPI edits still win over automated values unless an admin accepts a queued conflict.
