Get a first look at what's coming. The Developer Passport Australia Release Preview kicks off March 12. Dive in! 

Luis Ataide
ServiceNow Employee

 

Understanding the New SPM Inbound Actuals Tables

 

DISCLAIMER: This article describes the two new tables introduced in Strategic Portfolio Management (SPM) to support the import of actual costs from external financial systems into Projects. These tables are installed as part of the Financial Core plugin. Configuration is required to integrate with your ERP system — no out-of-the-box integration or scheduled job is provided.

What problem does this solve?

Tracking actual project costs against planned budgets is critical for financial governance. However, project managers often rely on data that lives in external ERP or financial systems, with no native way to import that data directly into SPM.

The two new Inbound Actuals tables solve this by providing a structured staging layer to receive, validate, and process actual expense data from external systems — mapping it directly to your SPM Projects and their associated Cost Plans and Expense Lines.


Overview of the Two New Tables

Both tables are installed with the Financial Core plugin:

Table Name Label Purpose
sn_invst_pln_inbound_actuals_config Inbound Actuals Configuration Defines how inbound actuals are interpreted for a specific Task
sn_invst_pln_inbound_actuals Inbound Actuals Stores expense data imported from external financial systems

Table 1: Inbound Actuals Configuration

sn_invst_pln_inbound_actuals_config

This table stores the configuration that tells SPM how to interpret incoming actual costs for a given Task. It acts as the mapping layer between your ERP system and the SPM task structure.

 

Key Columns

Label Column Type Purpose
Task task Reference (task) Identifies the Task for which the inbound configuration applies
Entry Method entry_method Choice: Integration / Manual Entry / Manual Load Defines how actual costs will be entered for the related task
ERP System erp_system String Identifies the ERP System from which actuals will be loaded
Financial Code financial_code String The task's financial code in the ERP System, used to match incoming records
Note: The task field references the base task table, making this configuration compatible with Projects, Project Tasks, and other task extensions.

Table 2: Inbound Actuals

sn_invst_pln_inbound_actuals

This table acts as the staging area for all actual expense records received from external financial systems. Each record represents a single expense entry pending processing into Cost Plans as Expense Line.

 

Key Columns

Label Column Type Purpose
Task task Reference (task) Identifies the Task associated with the actual expense
Project project Reference (pm_project) Identifies the Project for the actual expense
Amount amount FX Currency The actual expense amount
Cost Center cost_center Reference (cmn_cost_center) Cost center associated with the actual expense
Expense Category expense_category String The expense category as received from the ERP system
Expense Date expense_date Date Date of the actual expense
Expense Type expense_type Choice: Capex / Opex (default: Capex) Expense type as received from the ERP system
External Identifier external_identifier String The expense identifier in the ERP system
External System external_system String Identifies the source ERP system
Invoice Number invoice_number String Invoice number linked to the actual expense
PO Number po_number String Purchase Order number linked to the actual expense
Processed Date processed_date Date/Time Date and time the expense was processed by the ERP system
State state Choice: Cancelled / Duplicate / Error / In Process / New / Processed / Ready to Process / Skipped Tracks the import processing state of the record
Target Expense Line target_expense_line Reference (fm_expense_line) Reference to the Expense Line created during the import process
Error Message error_message String Contains error details if record processing fails

How the Process Works (Example)

The following describes the expected end-to-end flow for importing actuals into SPM:

  1. Configure the mapping — For each Project Task receiving actuals from an external system, create a record in the Inbound Actuals Configuration table, specifying the Entry Method, ERP System, and Financial Code.
  2. Receive expense data — Actual expense records arrive in the Inbound Actuals table from your ERP system. These can be loaded via integration, manual entry, or file upload (based on your configured Entry Method).
  3. Process active configuration records — A custom integration or scheduled job retrieves active Inbound Actuals Configuration records to identify which tasks are eligible for actuals processing.
  4. Match or create Cost Plan and Expense Lines — For each Inbound Actuals record in Ready to Process state: find an existing Cost Plan that matches, or create a new one; then create the corresponding Expense Line.
  5. Update record state — After processing, update the Inbound Actuals record with the resulting State (Processed, Error, Skipped, etc.) and populate the Target Expense Line reference.
New SPM Tables - Inbound Actuals.gif

Important: No out-of-the-box integration, scheduled job, or automation is provided with these tables. The processing logic above must be built and configured by your implementation team. 


Key Considerations

  • Both tables are installed as part of the Financial Core plugin — ensure this plugin is active in your instance.
  • The task reference on both tables supports dot-walking to extended task tables (e.g., pm_project_task), enabling filtering and configuration for specific task types.
  • The State field on the Inbound Actuals table is the primary mechanism for tracking record lifecycle — monitor for Error states to identify processing issues.
  • The Financial Code in the configuration table must align with the identifier used in your ERP system to ensure correct record matching.
  • Consider building a scheduled job or integration flow to automate the processing of records in Ready to Process state.
Comments
Namita Mishra
ServiceNow Employee

Great work @Luis Ataide 

Version history
Last update:
7 hours ago
Updated by: