Skip to main content

Introduction

Salesforce Reporting imports a single, user-selected Salesforce report into Adriel as a data source. Rather than querying Salesforce objects directly, the connector runs the report you choose at data-source creation, exports its result as a file, and mirrors the report’s columns into Adriel fields. Because the fields come from the report definition, the available metrics and breakdowns are not a fixed Adriel catalog — they are whatever columns the selected report produces. Data is fetched through the Salesforce Analytics REST API (v60.0), parsed, and cached in an internal table that widgets query for display. As a schema-on-read connector, column data types are inferred from the report’s values and column labels, and any numeric column becomes a metric while non-numeric columns can serve as either a metric or a breakdown. To connect this data source, see How to connect Salesforce Reporting to Adriel.

Data refresh strategy

Salesforce Reporting data is refreshed once per day on a fixed schedule. Each sync re-runs the selected report and replaces the entire cached dataset — there is no incremental or date-partitioned fetching. Fixed daily cadence. The refresh runs on the cron schedule 0 17 * * * (17:00 UTC, approximately 4:00 AM US Pacific). This schedule is not user-configurable and applies regardless of workspace. Atomic replacement. The connector uses a simple file cache with an atomic-replace strategy: each sync writes the full report output to a temporary table, then atomically swaps it with the production table. A partial or failed refresh leaves the previous snapshot intact rather than producing empty results. Snapshot model. Cached rows are stored as JSON in a single virtual file keyed by the data source’s asset ID. Because the report is treated as a static snapshot, data added or changed in Salesforce between syncs becomes visible only after the next daily refresh.

Architecture levels

Salesforce org → Report folder → Report. At data-source creation, Adriel lists every report the authenticated user can access, displayed as FolderName / ReportName. You select one report, and that report’s columns become the fields of the data source. One Adriel data source binds to one Salesforce report. Connecting the same report again creates a separate data source backed by its own cache table. To import a second report, create a second data source.

Report model

The connector mirrors one Salesforce report into a per-data-source cache table.
  1. Report selection. During setup, Adriel fetches the accessible report list with a SOQL query against the Salesforce Query API and presents it as a dropdown. The list is cached briefly to keep the dropdown responsive.
  2. Report run and export. On each refresh, the connector runs the selected report and retrieves its output. The primary read path is the report’s Excel (XLSX) export; a synchronous report API and an asynchronous report-instance API serve as fallbacks.
  3. Column mapping. The report’s column display labels become Adriel field names after sanitization. Column names are cleaned so they can back a database column safely: sort-arrow characters (, ) are stripped; ., ?, and $ are replaced with a space; [ and ] become ( and ); and the substring as becomes _as_ to avoid being read as a SQL alias.
  4. Row cleanup. Leading metadata rows are detected automatically — the first row with more than one non-null value is treated as the header, and preceding rows are dropped. Exactly four trailing rows (the report’s summary/footer block) are always removed. Empty cells and Salesforce’s - placeholder are converted to null.
  5. Value normalization. Cells whose values carry a currency symbol (for example $, , , A$, S$, or any Unicode currency character) have the numeric portion extracted so the column reads as a number rather than text.

Field type mapping

Salesforce Reporting has no fixed metric or breakdown catalog. The available fields are the columns of the selected report, resolved from the report’s data each time the cache refreshes.
The Data type column below uses the platform’s ten-value vocabulary — Number, Currency, Percentage, Ratio, Duration, Date, Text, URL, Array, Boolean — and the Field role column indicates whether the field can serve as a metric, a breakdown, or both.
On the primary Excel export path, the data type is inferred from each column’s cell values (numeric detection and currency-symbol extraction); the Salesforce column-type metadata below is read only on the JSON fallback path. The two paths generally agree, but the value-inferred type wins for display.

Breakdowns

Any non-numeric report column can be used as a breakdown. Numeric columns are exposed as metrics only — the connector filters numeric columns out of the breakdown list so that measures are not accidentally grouped by. When you build a widget, results are grouped by whichever fields you place in the breakdown slot, and all other selected fields are returned as metrics.
Salesforce Reporting has no date breakdown and no date-range filtering — the full report is imported as a single snapshot, so widgets cannot segment or filter this data source by date.
Internal bookkeeping columns (id, filename, file_updated_at, created_at, updated_at) are hidden from the field list and are never available as metrics or breakdowns.

Limitations

Based on the current connector:
  • Daily refresh only. Data updates once per day at 17:00 UTC on a fixed, non-configurable schedule. There is no intraday or on-demand sync; changes made in Salesforce appear after the next daily refresh.
  • No date breakdown or date-range filtering. hasDateBreakdown is false and no date-range limit applies — the whole report is imported as a snapshot with no date segmentation.
  • Numeric columns cannot be breakdowns. Columns detected as numeric are available as metrics only.
  • Fields depend on the report definition. Metrics and breakdowns are dictated entirely by the selected report’s columns. If the report’s columns change in Salesforce, the data source’s fields change after the next refresh, which can affect widgets built on the removed or renamed columns.
  • Trailing rows are trimmed. Exactly four trailing rows are always removed as the report footer; reports whose layout differs from the expected summary block may lose or retain rows unexpectedly.
  • 50,000-row query cap. When no explicit limit is set, widget queries against the cache return at most 50,000 rows.
  • Generic data source. The imported data can be viewed in a generic table. To combine it with other connectors, the connectors must share breakdowns or be joined through Blend Data settings.
  • Auto-disconnect on lost authorization. If the Salesforce refresh token is revoked or expires, the connector reports an invalid-grant error and the data source is automatically disconnected — see the paired how-to for re-authorization steps.

API references

See also