Suite Utils
Back to Blog
SuiteScriptJul 26, 2026 • 5 min read

Customizing Statement of Cash Flows in NetSuite

The Statement of Cash Flows (SCF) is one of the most rigid reports in NetSuite. Unlike a standard Income Statement or Balance Sheet, where you can often modify layout elements via the "Customize Repor…

Ethan James MarshalEthan James MarshalSenior SuiteScript Architect & Lead NetSuite Engineer
Customizing Statement of Cash Flows in NetSuite
Photo by Stephen Dawson on Unsplash

The Statement of Cash Flows (SCF) is one of the most rigid reports in NetSuite. Unlike a standard Income Statement or Balance Sheet, where you can often modify layout elements via the "Customize Report" button, the SCF is governed by strict accounting principles and structural constraints. When a business requires specific categorizations, such as separating "Operating Activities" into sub-categories like "Investing" or "Financing" in a way that aligns with specific corporate reporting standards, the standard report often falls short.

The challenge lies in the fact that NetSuite's native Statement of Cash Flows is designed to aggregate data based on account types and specific transaction categories. If you need to manipulate how these flows are presented or grouped, you cannot simply "tweak" the report layout. You must approach the problem by controlling the underlying data flow or utilizing detailed reporting tools that allow for more granular manipulation.

The Limitations of Standard Report Customization

In many NetSuite environments, users attempt to modify the Statement of Cash Flows by looking for a "Customized" version of the report. However, because the SCF is a specialized financial statement, NetSuite limits the ability to add custom columns or rows directly within the report's layout.

While you can use the Financial Report Builder to add or reorder rows and change hierarchies, these modifications are often restricted by the underlying logic of the report. If your requirement involves grouping specific accounts into different categories (e.g., moving a specific asset account from an Operating activity to an Investing activity), the standard approach is to adjust the Account Type or the Category on the Chart of Accounts. However, this is often not feasible because it affects every other report in the system.

Solving Customization via SuiteQL and Saved Searches

When standard reporting customization fails, the solution is to move away from the "Report" object and toward a data-driven approach using SuiteQL or detailed Saved Searches. By extracting the raw transaction data, you can build a custom report that mimics the Statement of Cash Flows but allows for the specific grouping and filtering required by your stakeholders.

To build a custom Statement of Cash Flows, you need to pull data from the Transaction and Account records. You must filter for specific transaction types (such as vendorbill, invoice, or itemreceipt) and ensure you are capturing the correct amounts.

Querying Transaction Data for Custom Flow

To build a custom report, you need to identify the correct fields. Using SuiteQL allows you to pull this data into a custom dashboard or an external reporting tool, providing the flexibility that the standard report lacks.

SELECT 
    CASE 
        WHEN A.type = 'Accounts_Payable' THEN 'Liabilities'
        WHEN A.type = 'Accounts_Receivable' THEN 'Assets'
        ELSE 'Other' 
    END AS Category,
    T.tranid,
    T.amount,
    T.trandate,
    T.entity
FROM 
    transaction T
JOIN 
    account A ON T.account = A.id
WHERE 
    T.main_trust_account = 'Your_Account_ID'
    AND T._isdeleted = 'F'

Customizing the Flow via SuiteScript

If you need to programmatically generate a Statement of Cash Flows or export data for a custom report, you will likely use the N/query module. This allows you to execute SuiteQL queries directly within a script, bypassing the limitations of the UI-based report builder.

When writing scripts to handle financial data, it is critical to maintain data integrity. You should never modify the transaction amounts during the retrieval process; instead, you must ensure your logic correctly categorizes the amount and quantity fields based on the account's properties.

Example: Fetching Data for a Custom Cash Flow Report

The following script demonstrates how to use the N/query module to retrieve transaction data for a custom report. This approach allows you to filter by specific criteria that the standard Statement of Cash Flows might ignore.

/**
 * @NApiVersion 2.1
 * @NScriptType Suitelet
 */
define(['N/query', 'N/log'], (query, log) => {
    /**
     * Fetches transaction data for a custom Statement of Cash Flows.
     * This allows for grouping and filtering that standard reports cannot provide.
     */
    const getCustomCashFlowData = () => {
        try {
            // Define the SuiteQL query to fetch transaction amounts
            const sql = `
                SELECT 
                    amount, 
                    trandate, 
                    entity, 
                    memo 
                FROM 
                transaction 
                WHERE 
                    _isdeleted = 'F' 
                    AND trandate >= '2023-01-01'
            `;

            const queryResults = query.runQuery({
                query: sql
            });

            log.debug({
                title: 'Query Results',
                details: JSON.stringify(queryResults.asJsonIterator().iterator().toArray())
            });

            return queryResults;
        } catch (e) {
            log.error({
                title: 'Error executing SuiteQL',
                details: e.name + ': ' + e.message
            });
        }
    };

    const get = (request) => {
        const results = getCustomCashFlowData();
        // Logic to render the data would go here
    };

    return { get };
});

Handling Complex Groupings: The Mapping Table Approach

If the requirement is to group specific accounts into "Operating," "Investing," or "Financing" categories, and these groups are not standard in your Chart of Accounts, the best practice is to create a Custom Record Type or a custom field on the Account record.

Step-by-Step Configuration for Custom Grouping:

  1. Create a Custom Field: Navigate to Customization > Lists, Records & Fields > Custom Fields > New.
  2. Field Type: Select List/Record or Free-Form Text.
  3. Label: Name it "Cash Flow Category."
  4. Context: Ensure the field is available on the Account record.
  5. Mapping: Assign each account in your Chart of Accounts to one of these categories (e.g., "Operating," "Investing," "Financing").
  6. Querying: Update your SuiteQL or Saved Search to filter based on this new custom field.

By using a custom field, you can create a report that dynamically updates as your Chart of Accounts grows. This is far superior to hard-coding logic into a script, as it allows for administrative updates without requiring a code deployment.

Performance Considerations and Best Practices

When dealing with financial reports, especially those involving large volumes of transactions (e.g., high-volume retail or manufacturing), performance is a factor.

To ensure your custom solution remains performable:

  • Use Indexes: Ensure that any fields used in the WHERE clause of your SuiteQL queries are indexed.
  • Limit Results: If you are pulling data for a report, use SELECT only on the columns you need. Avoid using SELECT *.
  • Governance Limits: If processing large amounts of data for a Statement of Cash Flows, consider using a Map/Reduce script to handle the data processing in chunks, as standard Suitelets may hit governance limits.

Customizing the Statement of Cash Flows in NetSuite means moving beyond the standard report UI. Because the report itself is structurally rigid, the fix is to capture and group data at the source with SuiteQL or detailed Saved Searches. Adding a custom field on the Account record to define cash flow categories gets you a scalable reporting solution without touching the integrity of the core system.

For more detailed automation and custom reporting tools, check out Suite Utils at suiteutils.com.

About the author

Put these ideas to work.

Suite Utils builds small NetSuite tools that fix the specific thing breaking your day. Each one runs as a native SuiteScript SuiteApp inside your account. No sales call, no onboarding.

Browse the Tools

Enjoyed this one?

Get NetSuite tips like this in your inbox. No spam. Practical guides only.

Keep reading