Your Order to Cash - Billing & Invoicing Data Template
Your Order to Cash - Billing & Invoicing Data Template
- Recommended attributes to collect
- Key activities to track
- Extraction guidance for NetSuite
Order to Cash - Billing & Invoicing Attributes
| Name | Description | ||
|---|---|---|---|
| Activity Name ActivityName | The name of the business event that occurred at a specific point in the invoice lifecycle. | ||
| Description The Activity Name describes a specific step or event within the billing process, such as 'Invoice Created', 'Invoice Approved', or 'Customer Payment Received'. These activities form the sequential building blocks of the process map. Analyzing the sequence and frequency of these activities is fundamental to process mining. It helps visualize the actual process flow, identify common and rare process paths (variants), and pinpoint activities that are frequently repeated, indicating rework or inefficiency. Why it matters This attribute is fundamental for constructing the process map, allowing for the visualization and analysis of the different steps and paths an invoice takes. Where to get Derived from system logs, status changes, or specific event records associated with the Invoice transaction in NetSuite. This often requires mapping transaction status changes or related record creations to defined activity names. Examples Invoice CreatedInvoice ApprovedCustomer Payment ReceivedInvoice Paid In Full | |||
| Event Timestamp EventTimestamp | The precise date and time when a specific activity or event occurred. | ||
| Description This attribute records the exact moment an activity took place. It is a critical component for ordering events chronologically and for all time-based analysis. In process mining, the Event Timestamp is used to calculate cycle times between activities, case durations, and waiting times. It is essential for identifying bottlenecks, measuring process performance against SLAs, and understanding the temporal dynamics of the billing process. For example, it is used to calculate the Invoice Generation Cycle Time and Days Sales Outstanding (DSO). Why it matters It provides the chronological order of events, which is essential for calculating all duration-based metrics, identifying bottlenecks, and analyzing process performance over time. Where to get Timestamp information is typically found in the system notes, audit trails, or 'Date Created' fields of related records for each invoice transaction in NetSuite. Examples 2023-10-26T10:00:00Z2023-10-27T14:30:00Z2023-11-15T09:05:00Z | |||
| Invoice Number InvoiceNumber | The unique identifier for each invoice document, serving as the primary case identifier for the billing process. | ||
| Description The Invoice Number is the cornerstone of the billing process analysis, uniquely identifying each invoice from its creation to its final closure. It groups all related activities, such as approval, sending, and payment application, into a single, cohesive case. In process mining, analyzing the journey of each invoice number allows for a comprehensive view of the entire billing lifecycle. This enables the identification of process variants, bottlenecks, and deviations from the standard procedure, providing critical insights for optimizing cash flow and operational efficiency. Why it matters It is essential for tracking the end-to-end lifecycle of each invoice, allowing for the reconstruction of the entire billing process and enabling detailed performance analysis. Where to get This is typically the 'Transaction ID' or a similar unique identifier field on the Invoice transaction record in NetSuite. Examples INV-0012345INV-0012346INV-0012347 | |||
| Last Data Update LastDataUpdate | The timestamp indicating the last time the data was refreshed from the source system. | ||
| Description This attribute records when the dataset was last updated. It provides context for the recency and relevance of the process mining analysis. Analysts and business stakeholders use this information to understand if the insights reflect the most current operational state. It is a critical piece of metadata for any dashboard or report, ensuring that decisions are based on data of a known age and not misinterpreted as real-time if it is not. Why it matters This informs users about the freshness of the data, ensuring they understand the time frame of the analysis and the relevance of the insights. Where to get This timestamp is generated and recorded by the data extraction tool or pipeline at the time of the data refresh. Examples 2024-05-21T02:00:00Z | |||
| Source System SourceSystem | The system from which the data was extracted. | ||
| Description This attribute identifies the origin of the process data. For this view, it would consistently be 'NetSuite'. In a broader analytics context, especially in organizations with multiple ERPs or integrated systems, this attribute is crucial for data lineage and governance. It helps differentiate processes that might span across different platforms and ensures that analysis is correctly attributed to the appropriate system of record. Why it matters It provides crucial context for data origin and governance, especially in environments where multiple systems might be integrated. Where to get This is a static value ('NetSuite') added during the data extraction and transformation process. Examples NetSuite | |||
| Customer Name CustomerName | The name of the customer to whom the invoice was issued. | ||
| Description This attribute identifies the legal entity or individual being billed. It links the billing process to the customer relationship management function. Analyzing the billing process by customer helps identify patterns in payment behavior, disputes, or invoice complexity for specific clients. This can inform customer segmentation strategies, credit limit decisions, and tailored collection approaches. For example, it can reveal if a particular customer consistently has invoices that require rework. Why it matters It allows for customer-centric analysis, helping to identify payment patterns, frequent issues, or process deviations specific to certain customers. Where to get This corresponds to the 'Customer' or 'Entity' name field on the Invoice transaction record in NetSuite. Examples Global Tech Inc.Innovate Solutions LLCCornerstone Corp | |||
| Due Date DueDate | The date by which the payment for the invoice is due. | ||
| Description The Due Date is calculated based on the Invoice Date and the agreed-upon Payment Terms. It represents the deadline for the customer to make a payment without being considered late. This attribute is essential for monitoring accounts receivable and managing cash flow. It is the benchmark used to calculate the On-Time Payment Rate KPI and to analyze customer payment behavior. Tracking deviations from the due date helps identify customers who frequently pay late and assess the effectiveness of collection strategies. Why it matters It is critical for measuring on-time payment performance and analyzing customer payment behavior, directly supporting collections and cash flow forecasting. Where to get This corresponds to the 'Due Date' (duedate) field on the Invoice transaction record in NetSuite. Examples 2023-11-252023-11-262023-12-15 | |||
| Event End Time EventEndTime | The precise date and time when a specific activity or event was completed. | ||
| Description The Event End Time marks the completion of an activity. While many activities are instantaneous (start and end time are the same), some, like an approval step, may have a measurable duration. This attribute, in conjunction with the Event Timestamp (Start Time), allows for the direct calculation of activity processing time. Analyzing processing time helps identify which specific steps consume the most time and resources, distinguishing it from waiting time between activities. This is crucial for pinpointing inefficiencies within specific tasks. Why it matters It enables the precise calculation of how long each activity takes to complete, which is essential for analyzing resource efficiency and identifying time-consuming tasks. Where to get Similar to StartTime, this can be sourced from system audit trails in NetSuite. It may require logic to pair a 'start' event with a corresponding 'end' event. Examples 2023-10-26T10:05:14Z2023-10-27T14:32:00Z2023-11-15T09:05:00Z | |||
| Invoice Date InvoiceDate | The official date of the invoice, as issued to the customer. | ||
| Description The Invoice Date, or transaction date, is the starting point for many financial calculations related to billing. It is the date from which payment terms and due dates are typically calculated. In analysis, this date serves as the primary anchor for calculating key financial KPIs like Days Sales Outstanding (DSO) and Invoice Aging. It allows for cohort analysis, enabling comparison of billing performance across different time periods, for example, month-over-month or year-over-year. Why it matters This date is the baseline for critical financial metrics like Days Sales Outstanding (DSO) and invoice aging, directly impacting working capital analysis. Where to get This corresponds to the 'Date' (trandate) field on the Invoice transaction record in NetSuite. Examples 2023-10-262023-10-272023-11-15 | |||
| Invoice Total Amount InvoiceTotalAmount | The total monetary value of the invoice, including taxes and other charges. | ||
| Description This attribute represents the full amount that the customer is expected to pay. It is a fundamental piece of financial data for each billing case. Analyzing the process based on invoice amount allows for value-based analysis. For example, it can reveal if high-value invoices follow a different, more complex process than low-value ones. It is also used to prioritize collection efforts and understand the financial impact of payment delays or invoice errors. Why it matters It enables value-based process analysis, helping to prioritize high-value invoices and understand the financial impact of process inefficiencies. Where to get This corresponds to the 'Total' (total) field on the Invoice transaction record in NetSuite. Examples 1500.0089.9912500.50 | |||
| Is Automated IsAutomated | A flag indicating if an activity was performed automatically by the system. | ||
| Description This boolean attribute distinguishes between activities performed manually by a user and those executed automatically by a system workflow, script, or integration. This attribute is key for measuring the level of automation in the billing process, directly supporting the 'Automated Billing Ratio' KPI. By filtering for automated or manual activities, analysts can identify bottlenecks caused by manual intervention and pinpoint opportunities to increase automation, reduce human error, and improve efficiency. Why it matters It helps measure the level of automation in the process, identifying opportunities to reduce manual effort and increase efficiency. Where to get This is typically derived by checking the 'User' associated with an activity. Events triggered by users named 'SYSTEM', 'Workflow', or 'Integration' are flagged as automated. Examples truefalse | |||
| Region Region | The geographical region associated with the customer or transaction. | ||
| Description The Region attribute classifies invoices based on geography, which could be derived from the customer's address or the business unit that issued the invoice. This is a powerful dimension for comparative analysis. The 'Regional Billing Process Comparison' dashboard relies on this attribute to compare KPIs like cycle times, error rates, and process variants across different regions. This helps to identify regional performance differences, uncover best practices in high-performing regions, and drive process standardization efforts across the organization. Why it matters It enables comparative analysis across different geographical areas, which is key for identifying regional performance gaps and standardizing best practices. Where to get This data is often stored in a custom segment or classification field on the customer master or transaction record in NetSuite. Examples North AmericaEMEAAPAC | |||
| User User | The name or ID of the user who performed the activity. | ||
| Description This attribute identifies the employee or system user responsible for executing a specific process step. This could be the person who created the invoice, approved it, or applied the payment. Analyzing the process by user helps in understanding workload distribution, individual performance, and identifying training needs. It can also highlight potential automation opportunities by showing which manual activities are performed by the most users. It is also key for compliance and audit trail analysis. Why it matters It enables analysis of workload distribution, user-specific performance, and process adherence, which is vital for resource management and targeted training. Where to get Available in the System Notes subtab or specific 'Modified By' fields on Invoice and related transaction records in NetSuite. Examples Alice SmithBob JohnsonSYSTEM | |||
| Activity Processing Time ActivityProcessingTime | The duration of time spent actively working on a specific activity. | ||
| Description This calculated metric measures the time elapsed between the start and end timestamp of a single activity. It represents the actual work duration, as opposed to waiting time between activities. This is a critical metric for the 'Activity Throughput & Bottlenecks' dashboard. By analyzing processing times, teams can identify which specific tasks are the most time-consuming and resource-intensive. This allows for targeted improvements, such as providing better training, improving system performance, or automating the task. Why it matters It quantifies the actual effort for each task, helping to distinguish active work time from idle waiting time and pinpointing inefficient activities. Where to get Calculated by subtracting the EventTimestamp (StartTime) from the EventEndTime for each activity record. Examples 300601200 | |||
| Currency Currency | The currency code for the invoice amount. | ||
| Description This attribute specifies the currency in which the invoice amount is denominated, for example, USD, EUR, or GBP. It is essential context for any monetary values. For multinational organizations, analyzing by currency is important for understanding financial performance across different markets. It ensures that monetary values are interpreted correctly and allows for proper aggregation and comparison after currency conversion, if necessary. Why it matters It provides necessary context for all monetary values, which is crucial for accurate financial reporting and analysis, especially in multi-national operations. Where to get This corresponds to the 'Currency' field on the Invoice transaction record in NetSuite. Examples USDEURGBP | |||
| Days Sales Outstanding DaysSalesOutstanding | The number of days between the invoice date and the date the payment was received. | ||
| Description Days Sales Outstanding (DSO) is a key financial metric that measures the average number of days it takes to collect payment after an invoice has been issued. This attribute is calculated for each individual invoice to allow for detailed analysis. While often aggregated as a high-level KPI, having DSO at the individual invoice level allows for powerful analysis. It can be used to identify which customers, regions, or invoice types have the highest DSO. The 'DSO Trend' dashboard relies on this metric to visualize collection efficiency over time, providing critical insights into working capital management. Why it matters It quantifies collection efficiency at the individual invoice level, enabling detailed root cause analysis for high DSO and its impact on cash flow. Where to get Calculated by subtracting the 'InvoiceDate' from the timestamp of the 'Customer Payment Received' activity. Examples 294562 | |||
| Department Department | The internal department associated with the invoice. | ||
| Description This attribute represents the internal department, such as Sales, Services, or a specific business line, responsible for the transaction. It is a standard classification segment in NetSuite. Analyzing the process by department allows for internal benchmarking and helps identify if certain departments have more efficient billing processes than others. It can reveal variations in process adherence or resource allocation, providing insights for targeted process improvement initiatives within specific parts of the organization. Why it matters It enables process performance to be compared across different internal departments, highlighting variations and opportunities for internal process standardization. Where to get This corresponds to the 'Department' classification field, which can be set at the header or line level of an Invoice transaction in NetSuite. Examples Sales - EnterpriseProfessional ServicesHardware | |||
| Invoice Status InvoiceStatus | The current status of the invoice in its lifecycle. | ||
| Description This attribute reflects the current state of the invoice, such as 'Open', 'Paid in Full', or 'Voided'. It provides a snapshot of where the invoice is in the process at any given time. The 'Open Invoices Status Overview' dashboard is directly built upon this attribute. It allows for a real-time assessment of accounts receivable, helping finance teams monitor outstanding balances, manage collections, and forecast cash inflows. Analyzing the final status also helps in understanding process outcomes. Why it matters It provides a snapshot of the current state of accounts receivable, enabling dashboards that monitor open invoices and overall billing progress. Where to get This corresponds to the 'Status' field on the Invoice transaction record in NetSuite. Examples OpenPaid In FullVoidedPending Approval | |||
| Is On-Time Payment IsOnTimePayment | A flag indicating if the customer payment was received on or before the invoice due date. | ||
| Description This calculated boolean flag compares the timestamp of the 'Customer Payment Received' activity with the 'DueDate' of the invoice. It is set to true if the payment was on time or early, and false if it was late. This attribute is the foundation for the 'On-Time Payment Rate' KPI and the 'Payment Terms Adherence' dashboard. It provides a clear, binary measure of customer payment behavior, simplifying analysis and reporting. It helps to quickly identify trends in payment timeliness and assess the effectiveness of collection strategies. Why it matters This provides a clear success metric for collections, directly supporting the calculation of the On-Time Payment Rate KPI and analysis of customer behavior. Where to get This is a calculated attribute. It requires comparing the timestamp of the payment event with the 'DueDate' attribute at the case level. Examples truefalse | |||
| Is Rework IsRework | A calculated flag that identifies activities considered to be rework or correction loops. | ||
| Description This boolean flag is set to true for activities that represent non-value-added rework, such as 'Invoice Corrected' or a second 'Invoice Approved' event within the same case. It is typically derived based on the activity name or the repetition of an activity. This attribute is essential for the 'Invoice Rework and Rejection Analysis' dashboard and the 'Invoice Error Rate' KPI. It allows for easy quantification of rework, helping to highlight process quality issues. By filtering for rework activities, teams can quickly identify the root causes of errors and measure the impact of process improvement initiatives. Why it matters It directly measures process quality by flagging inefficient rework loops, enabling analysis of the root causes and financial impact of billing errors. Where to get This is a derived attribute calculated during data transformation. Logic is applied to identify rework, such as flagging specific activity names ('Invoice Corrected') or repeated activities. Examples truefalse | |||
| Payment Terms PaymentTerms | The agreed-upon conditions for payment between the company and the customer. | ||
| Description Payment Terms define when and how a customer is expected to pay their invoice, for example, 'Net 30' or 'Due on receipt'. This information is used to automatically calculate the invoice due date. This attribute is crucial for the 'Payment Terms Adherence' dashboard. Analyzing on-time payment rates by different payment terms helps to evaluate their effectiveness. For example, it can show whether customers with 'Net 15' terms pay faster than those with 'Net 30', informing future contract negotiations and credit policies. Why it matters It is essential for analyzing the effectiveness of different payment conditions and their impact on customer payment timeliness. Where to get This corresponds to the 'Terms' field on the Invoice transaction record in NetSuite. Examples Net 30Net 60Due on receipt | |||
| Sales Order Number SalesOrderNumber | The identifier of the sales order from which the invoice was generated. | ||
| Description This attribute provides a direct link back to the originating sales order, connecting the billing process with the preceding sales and fulfillment processes. Including the Sales Order Number allows for a more holistic view of the entire Order-to-Cash cycle. It enables analysis that can trace issues in billing back to their source in the sales process. For example, frequent invoice corrections might be linked to data entry errors on specific types of sales orders. Why it matters It links the billing process back to the sales process, enabling a broader, end-to-end Order-to-Cash analysis to identify root causes of billing issues. Where to get Found in the 'Created From' field or on the 'Related Records' subtab of an Invoice transaction in NetSuite. Examples SO-0009876SO-0009877SO-0009878 | |||
Order to Cash - Billing & Invoicing Activities
| Activity | Description | ||
|---|---|---|---|
| Customer Payment Received | A payment has been received from the customer and recorded in the system. This is captured by the creation of a 'Customer Payment' transaction in NetSuite, which may apply to one or multiple invoices. | ||
| Why it matters Marks the receipt of cash, but not necessarily its application to a specific invoice. It is the first step in the cash application process and a key event for DSO calculations. Where to get Captured from the creation date of the 'Customer Payment' transaction record. The connection to the invoice is made on the payment's 'Apply' subtab. Capture Creation of a Customer Payment transaction record. Event type explicit | |||
| Invoice Approved | The invoice has been formally approved and is ready to be sent to the customer. This is captured when the approval status is updated from 'Pending Approval' to 'Approved', typically through a workflow action. | ||
| Why it matters A key milestone that gates the invoice from being sent to the customer. It is crucial for measuring approval cycle times and for calculating the 'Automated Billing Ratio' KPI. Where to get Inferred from the 'Approval Status' field on the Invoice record changing to 'Approved'. The precise timestamp is logged in the system notes for the transaction. Capture Inferred from 'Approval Status' field changing to 'Approved' in system notes. Event type inferred | |||
| Invoice Created | Marks the official creation of the invoice transaction record in NetSuite. This event is the starting point for the billing process for each unique invoice number and is captured from the transaction's creation timestamp. | ||
| Why it matters This is the primary start event for the billing process. Analyzing the time from this event to others reveals overall process efficiency and forms the baseline for the Invoice Generation Cycle Time KPI. Where to get Captured from the 'Date Created' timestamp on the Invoice transaction record. NetSuite's system notes for the invoice also explicitly log the creation event and user. Capture Event logged upon creation of the Invoice transaction record. Event type explicit | |||
| Invoice Paid In Full | The invoice status has changed to 'Paid In Full', indicating its balance is now zero. This is the successful conclusion of the billing and collection cycle for the invoice. | ||
| Why it matters This is the primary successful end event for the process. Analyzing the total time to reach this state provides the end-to-end cycle time for the cash conversion cycle. Where to get Inferred from the 'Status' field of the Invoice record changing to 'Paid In Full'. The timestamp of this status change is available in the transaction's system notes. Capture Inferred from 'Status' field change to 'Paid In Full' in system notes. Event type inferred | |||
| Invoice Sent to Customer | Signifies that the invoice has been dispatched to the customer, typically via email. This event is captured by tracking when a user executes the 'Email' action from the invoice record. | ||
| Why it matters This marks the beginning of the customer collection period and is the primary starting point for calculating Days Sales Outstanding (DSO). Where to get Inferred from the 'Date Last Emailed' field being populated on the Invoice record. Alternatively, it can be captured from the creation of an email message record under the Communication subtab. Capture Inferred from population of 'Date Last Emailed' or a communication record creation. Event type inferred | |||
| Credit Memo Created | A credit memo transaction has been created and applied to the invoice, reducing the outstanding balance. This typically indicates a product return, service complaint, or pricing correction. | ||
| Why it matters Highlights rework, quality issues, or customer disputes. Frequent occurrences can signal underlying problems and are key to the 'Invoice Rework and Rejection Analysis' dashboard. Where to get Captured from the creation of a Credit Memo transaction. The link to the original invoice is found in the 'Created From' field or on the 'Apply' subtab of the credit memo. Capture Creation of a Credit Memo record linked to the original invoice. Event type explicit | |||
| Invoice Closed | The invoice transaction has been closed, often as part of a period-end accounting process. This action prevents further changes to the transaction after it has been fully paid and reconciled. | ||
| Why it matters While often occurring after 'Paid In Full', this can be a final administrative step. Analyzing delays between payment and closure could impact financial reporting timeliness. Where to get Inferred from the 'Status' field changing to 'Closed' or a similar state. The timestamp for this change is captured from the system notes. Capture Inferred from 'Status' field change in system notes. Event type inferred | |||
| Invoice Submitted for Approval | Represents the invoice's status change to 'Pending Approval'. This event is captured when a user submits the invoice into a configured approval workflow, which is a common customization. | ||
| Why it matters This activity identifies the start of a potential approval bottleneck. The time spent awaiting approval is a key component of the overall invoice processing cycle time. Where to get Inferred from the 'Approval Status' field on the Invoice record changing to 'Pending Approval'. The timestamp for this change can be found in the system notes audit trail for the invoice. Capture Inferred from 'Approval Status' field change logged in system notes. Event type inferred | |||
| Invoice Voided | The invoice has been voided, effectively canceling it and reversing any general ledger impact. This action is usually taken for invoices created in error before they are paid. | ||
| Why it matters Represents a process exception and a terminal state. Understanding why invoices are voided can reveal data entry or process errors that need correction upstream. Where to get This is an explicit user action. It can be captured from the system notes for the invoice record, which logs when the transaction was voided and by whom. Capture Explicit 'Void' action logged in the invoice's system notes. Event type explicit | |||
| Payment Applied To Invoice | The received customer payment has been specifically applied against this invoice, reducing its amount due. This is recorded when the application is saved on the Customer Payment record. | ||
| Why it matters This is the crucial link between cash receipt and invoice settlement. The duration from 'Payment Received' to this event defines the 'Cash Application Cycle Time' KPI. Where to get Captured from the system notes or audit trail of the Customer Payment transaction, specifically when the application to the invoice line is saved. The timestamp of this application is key. Capture Logged when the Customer Payment record is saved with an application to the invoice. Event type explicit | |||
| Payment Due Date Reached | A calculated event that occurs when the current date matches the invoice's due date. This event does not correspond to a direct user or system action but is derived from existing data during analysis. | ||
| Why it matters Acts as a critical benchmark for measuring payment timeliness. It is essential for calculating the 'On-Time Payment Rate' KPI and analyzing customer payment behaviors. Where to get This is not an explicit event in NetSuite. It is calculated by comparing the event log's timestamp to the 'Due Date' field on the Invoice transaction record. Capture Calculated when event timestamp equals the 'Due Date' field on the invoice. Event type calculated | |||
| Payment Reminder Issued | A communication has been sent to the customer regarding an outstanding payment. This is captured as a logged activity or email sent from the invoice or customer record, often by a dunning solution. | ||
| Why it matters Essential for evaluating the effectiveness of collection strategies. Analyzing this activity's impact on subsequent payments helps optimize reminder frequency and timing. Where to get Captured from the creation of an email record on the Communication > Messages subtab of the Invoice or Customer record. Automated dunning solutions may also log these as custom records or tasks. Capture Logged as an email or activity record associated with the invoice. Event type explicit | |||
Extraction Guides
Steps
- Log into NetSuite: Access your NetSuite account using a role with sufficient permissions to create and run Saved Searches on transaction records.
- Navigate to Saved Searches: Go to Reports > Saved Searches > All Saved Searches > New. Select 'Transaction' from the list of search types. This will be the foundation for creating multiple searches, one for each event type.
- Create the 'Invoice Created' Search: This is the primary search that captures the creation of invoices.
- On the 'Criteria' tab, under 'Standard', set the 'Type' filter to 'is Invoice'.
- Add another filter for 'Main Line' and set it to 'is true' to get one record per invoice.
- On the 'Results' tab, add the required columns. Use formulas to create standardized fields like 'ActivityName'. For example, add a 'Formula (Text)' field with the formula
_UTF8'Invoice Created'.
- Create Searches for Status Changes (Approval, Paid, Voided, Closed): Many activities are status changes. The most reliable way to capture the exact timestamp is through System Notes.
- Create a new Transaction Saved Search.
- On the 'Criteria' tab, set 'Type' to 'is Invoice'.
- Under the 'Standard' subtab, add the filter 'System Notes : Field' and select the relevant status field, for example, 'Approval Status'.
- Add another filter 'System Notes : New Value' and set it to the target status, for example, 'Approved'.
- On the 'Results' tab, map 'System Notes : Date' to
EventTimestampand 'System Notes : Set by' toUser. - Repeat this process for each status-based activity: 'Invoice Submitted for Approval', 'Invoice Approved', 'Invoice Paid In Full', 'Invoice Voided', and 'Invoice Closed', adjusting the field and value filters accordingly.
- Create the 'Invoice Sent to Customer' Search: This event is typically captured by tracking email messages sent from the invoice record.
- Create a new Transaction Saved Search with 'Type' set to 'is Invoice'.
- On the 'Criteria' tab, under 'Related Records', add a filter for 'Messages : Date Sent' and set it to 'is not empty'.
- On the 'Results' tab, map 'Messages : Date Sent' to
EventTimestampand 'Messages : Author' toUser.
- Create Searches for Payment and Credit Memo Activities: These involve separate transaction types linked to the invoice.
- For 'Customer Payment Received', create a search for 'Type' is 'Customer Payment'. Capture the creation date as the event timestamp.
- For 'Payment Applied To Invoice', use the same 'Customer Payment' search but join to the 'Applied To Transaction' fields. The 'Date Created' of the payment transaction serves as the timestamp. You will get one row per invoice application.
- For 'Credit Memo Created', create a search for 'Type' is 'Credit Memo' and link to the 'Created From' field to get the original invoice number.
- Run and Export Each Saved Search: Execute each saved search you created. From the results page, click the export icon (CSV, Excel, or PDF) and choose CSV. You may need to export in batches if the result set is larger than your NetSuite export limit.
- Combine and Transform Data: Consolidate all exported CSV files into a single file using a tool like Microsoft Excel, a Python script, or a data preparation tool.
- Derive 'Payment Due Date Reached' Event: In your combined data file, for every 'Invoice Created' event, create a new row. Set the
ActivityNameto 'Payment Due Date Reached', theEventTimestampto the value from the invoice'sDueDatefield, and copy the other relevant invoice attributes. - Finalize the Event Log: Standardize all column headers to match the required schema (e.g.,
InvoiceNumber,ActivityName,EventTimestamp). Ensure timestamp formats are consistent. Add theSourceSystemandLastDataUpdatecolumns with static values for this extraction batch. Save the final consolidated file as a CSV for upload.
Configuration
- Prerequisites: A user role with permissions to create, edit, and run 'Transaction' type Saved Searches is required. Access to view Invoice, Customer Payment, Credit Memo, and System Notes records is also necessary.
- Search Type: The primary search type used for all extractions is 'Transaction'. This type allows access to all necessary records and their relationships.
- Date Range Filtering: To manage performance and data volume, apply a date range filter to each search. A filter on 'Date Created' for a period of the last 3 to 6 months is recommended for the initial analysis.
- Main Line Filter: Use the 'Main Line' criteria set to 'true' for events at the document header level, such as 'Invoice Created'. Set it to 'false' when you need to analyze line item details, which is not required for this process.
- System Notes: Capturing status changes relies heavily on System Notes. Ensure that auditing is enabled for key transaction fields like 'Status' and 'Approval Status' in your NetSuite configuration (Setup > Company > Enable Features > SuiteCloud > SuiteAudit Trail).
- Performance Considerations: Complex searches with many joins and formula fields across a large date range can be slow to run in the NetSuite UI. It is advisable to run and export these searches during off-peak hours. If a search times out, reduce the date range and export the data in smaller batches.
a Sample Query config
/*
This section describes the configuration for multiple NetSuite Saved Searches needed to generate the complete event log. Each block represents a separate Saved Search that must be created in the UI, exported, and then combined externally.
*/
-- Search 1: Invoice Created
Activity Name: 'Invoice Created'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Main Line is true
Results Columns (Mapped to Event Log Attributes):
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Created'
- EventTimestamp: Date Created
- User: Created By
- InvoiceDate: Date
- DueDate: Due Date
- InvoiceTotalAmount: Amount (Gross)
- CustomerName: Name
-- Search 2: Invoice Submitted for Approval
Activity Name: 'Invoice Submitted for Approval'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Approval Status
- System Notes : New Value is [Your 'Pending Approval' status]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Submitted for Approval'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 3: Invoice Approved
Activity Name: 'Invoice Approved'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Approval Status
- System Notes : New Value is [Your 'Approved' status]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Approved'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 4: Invoice Sent to Customer
Activity Name: 'Invoice Sent to Customer'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Messages : Date Sent is not empty
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Sent to Customer'
- EventTimestamp: Messages : Date Sent (use Maximum summary type if multiple)
- User: Messages : Author (use Maximum summary type)
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 5: Payment Reminder Issued
Activity Name: 'Payment Reminder Issued'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- User Notes : Note contains [Your dunning/reminder keyword]
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Payment Reminder Issued'
- EventTimestamp: User Notes : Date
- User: User Notes : Author
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 6: Credit Memo Created
Activity Name: 'Credit Memo Created'
Saved Search Type: Transaction
Criteria:
- Type is Credit Memo
- Main Line is true
Results Columns:
- InvoiceNumber: Created From : Document Number
- ActivityName: Formula (Text) = 'Credit Memo Created'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 7: Customer Payment Received
Activity Name: 'Customer Payment Received'
Saved Search Type: Transaction
Criteria:
- Type is Customer Payment
- Main Line is true
Results Columns:
- InvoiceNumber: Applied to Transaction : Document Number
- ActivityName: Formula (Text) = 'Customer Payment Received'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
-- Search 8: Payment Applied To Invoice
Activity Name: 'Payment Applied To Invoice'
Saved Search Type: Transaction
Criteria:
- Type is Customer Payment
- Main Line is false
Results Columns:
- InvoiceNumber: Applied to Transaction : Document Number
- ActivityName: Formula (Text) = 'Payment Applied To Invoice'
- EventTimestamp: Date Created
- User: Created By
- CustomerName: Name
-- Search 9: Invoice Paid In Full
Activity Name: 'Invoice Paid In Full'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Status
- System Notes : New Value is Paid In Full
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Paid In Full'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Search 10: Invoice Voided
Activity Name: 'Invoice Voided'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- Status is Invoice : Voided
- System Notes : Field is Status
- System Notes : New Value is Voided
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Voided'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
-- Search 11: Invoice Closed
Activity Name: 'Invoice Closed'
Saved Search Type: Transaction
Criteria:
- Type is Invoice
- System Notes : Field is Status
- System Notes : New Value contains Closed
Results Columns:
- InvoiceNumber: Document Number
- ActivityName: Formula (Text) = 'Invoice Closed'
- EventTimestamp: System Notes : Date
- User: System Notes : Set by
- CustomerName: Name
- InvoiceTotalAmount: Amount (Gross)
-- Event to be Derived Post-Extraction: Payment Due Date Reached
/*
This event is not extracted directly. After combining all other CSVs, create a new row for each unique invoice.
Set ActivityName to 'Payment Due Date Reached'.
Set EventTimestamp to the DueDate value from the 'Invoice Created' event for that invoice.
Copy other attributes like InvoiceNumber, CustomerName, etc.
*/ Steps
- Prerequisite: Enable SuiteAnalytics Connect: Ensure that the SuiteAnalytics Connect module is licensed and enabled in your NetSuite instance. This is typically done by a NetSuite administrator under Setup > Company > Enable Features > Analytics.
- Download and Configure ODBC Driver: Navigate to the NetSuite home dashboard and locate the 'Settings' portlet. Click the 'Set Up SuiteAnalytics Connect' link to download the appropriate ODBC driver for your operating system. Follow the installation instructions provided by NetSuite to install and configure the driver, providing your service host, port, Account ID, Role ID, email, and password.
- Establish Database Connection: Use a SQL client tool that supports ODBC connections, such as DBeaver, Tableau, or Power BI. Create a new ODBC connection using the driver you configured in the previous step. Test the connection to ensure you can successfully authenticate and access the NetSuite read-replica database.
- Prepare the SQL Query: Copy the complete SQL query provided in the 'Query' section of this document. This query is designed to extract all required activities and attributes for the Order to Cash billing process.
- Set Query Parameters: Before executing, locate the placeholder values within the query. You must replace
'YYYY-MM-DD'with your desired start and end dates for the extraction period. Also, replace[Your Subsidiary ID]with the internal ID of the NetSuite subsidiary you wish to analyze. - Execute the Query: Run the modified query in your SQL client. The execution time will vary depending on the date range and the volume of transactions in your NetSuite account.
- Review the Results: Once the query completes, a flat table representing the event log will be returned. Each row corresponds to a specific activity in the invoice lifecycle. Review the data for completeness and accuracy.
- Export the Event Log: Export the query results from your SQL client into a CSV file. Ensure the file is UTF-8 encoded to prevent character issues.
- Prepare for Upload: Before uploading to a process mining tool, confirm the column headers match the required attribute names, such as InvoiceNumber, ActivityName, and EventTimestamp. Check that date and time formats are consistent.
Configuration
- SuiteAnalytics Connect License: A valid license for the SuiteAnalytics Connect module is mandatory to access the NetSuite read-replica database. Without this, direct SQL access is not possible.
- Dedicated Role and User: It is highly recommended to create a dedicated NetSuite Role with appropriate permissions for SuiteAnalytics Connect. This role should have read-only access to the necessary records, including Transactions, Customers, and System Notes. Assign a dedicated user to this role for the extraction to ensure security and auditability.
- Date Range Filtering: The provided query includes a
WHEREclause on the invoice creation date (Transaction.TRANDATE). For initial extractions, it is advisable to start with a smaller date range, such as the last 3 to 6 months, to manage performance and data volume. For example:AND T.TRANDATE BETWEEN '2023-01-01' AND '2023-06-30'. - Subsidiary Filtering: For accounts with multiple subsidiaries, filtering by the specific subsidiary is critical for both performance and data relevance. The query includes a placeholder
WHERE T.SUBSIDIARY_ID = [Your Subsidiary ID]that should be configured. - Data Freshness: The SuiteAnalytics Connect database is a read-replica. Data is typically refreshed multiple times per hour, but it is not real-time. Be aware of a potential lag of up to a few hours between a transaction occurring in NetSuite and it appearing in the Connect database.
a Sample Query sql
WITH Invoices AS (
SELECT
T.TRANSACTION_ID,
T.TRANID AS InvoiceNumber,
T.TRANDATE AS InvoiceDate,
T.DUEDATE AS DueDate,
T.FOREIGN_TOTAL AS InvoiceTotalAmount,
C.COMPANYNAME AS CustomerName,
BUILTIN.DF(C.LOCATION) AS Region,
T.CREATED_DATE AS InvoiceCreationDate,
CREATOR.FIRST_NAME || ' ' || CREATOR.LAST_NAME AS CreatorUser
FROM
TRANSACTIONS T
JOIN
CUSTOMERS C ON T.ENTITY_ID = C.CUSTOMER_ID
LEFT JOIN
EMPLOYEES CREATOR ON T.CREATED_BY_ID = CREATOR.EMPLOYEE_ID
WHERE
T.TRANSACTION_TYPE = 'Invoice'
AND T.TRANDATE BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD')
-- AND T.SUBSIDIARY_ID = [Your Subsidiary ID] -- Add your subsidiary filter if needed
)
-- 1. Invoice Created
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Invoice Created' AS "ActivityName",
I.InvoiceCreationDate AS "EventTimestamp",
I.InvoiceCreationDate AS "EventEndTime",
I.CreatorUser AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN I.CreatorUser LIKE '%System%' THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
UNION ALL
-- 2. Invoice Submitted for Approval & 3. Invoice Approved
SELECT
I.InvoiceNumber AS "InvoiceNumber",
CASE WHEN SN.NEW_VALUE = 'Pending Approval' THEN 'Invoice Submitted for Approval' ELSE 'Invoice Approved' END AS "ActivityName",
SN.DATE_CREATED AS "EventTimestamp",
SN.DATE_CREATED AS "EventEndTime",
SN_AUTHOR.FIRST_NAME || ' ' || SN_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN SN.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
SYSTEM_NOTES SN ON I.TRANSACTION_ID = SN.TRANSACTION_ID
LEFT JOIN
EMPLOYEES SN_AUTHOR ON SN.AUTHOR_ID = SN_AUTHOR.EMPLOYEE_ID
WHERE
SN.FIELD = 'TRANSACTION.APPROVALSTATUS' AND SN.NEW_VALUE IN ('Pending Approval', 'Approved')
UNION ALL
-- 4. Invoice Sent to Customer
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Invoice Sent to Customer' AS "ActivityName",
M.MESSAGE_DATE AS "EventTimestamp",
M.MESSAGE_DATE AS "EventEndTime",
MSG_AUTHOR.FIRST_NAME || ' ' || MSG_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
MESSAGES M ON I.TRANSACTION_ID = M.TRANSACTION_ID
LEFT JOIN
EMPLOYEES MSG_AUTHOR ON M.AUTHOR_ID = MSG_AUTHOR.EMPLOYEE_ID
WHERE
M.INCOMING = 'F' -- Indicates an outgoing message
UNION ALL
-- 5. Payment Due Date Reached
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Payment Due Date Reached' AS "ActivityName",
I.DueDate AS "EventTimestamp",
I.DueDate AS "EventEndTime",
'System' AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
1 AS "IsAutomated"
FROM
Invoices I
WHERE
I.DueDate IS NOT NULL AND I.DueDate < SYSDATE
UNION ALL
-- 6. Payment Reminder Issued (based on Messages table, requires a specific subject line convention)
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Payment Reminder Issued' AS "ActivityName",
M.MESSAGE_DATE AS "EventTimestamp",
M.MESSAGE_DATE AS "EventEndTime",
MSG_AUTHOR.FIRST_NAME || ' ' || MSG_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN M.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
MESSAGES M ON I.TRANSACTION_ID = M.TRANSACTION_ID
LEFT JOIN
EMPLOYEES MSG_AUTHOR ON M.AUTHOR_ID = MSG_AUTHOR.EMPLOYEE_ID
WHERE
M.INCOMING = 'F' AND UPPER(M.SUBJECT) LIKE '%PAYMENT REMINDER%'
UNION ALL
-- 7. Credit Memo Created & Applied
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Credit Memo Created' AS "ActivityName",
CM.CREATED_DATE AS "EventTimestamp",
CM.CREATED_DATE AS "EventEndTime",
CM_CREATOR.FIRST_NAME || ' ' || CM_CREATOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
TRANSACTION_LINES T_LINES ON I.TRANSACTION_ID = T_LINES.APPLIED_TO_TRANSACTION_ID
JOIN
TRANSACTIONS CM ON T_LINES.TRANSACTION_ID = CM.TRANSACTION_ID
LEFT JOIN
EMPLOYEES CM_CREATOR ON CM.CREATED_BY_ID = CM_CREATOR.EMPLOYEE_ID
WHERE
CM.TRANSACTION_TYPE = 'Credit Memo'
UNION ALL
-- 8. Customer Payment Received & 9. Payment Applied to Invoice
SELECT
I.InvoiceNumber AS "InvoiceNumber",
'Customer Payment Received' AS "ActivityName", -- Can also create a separate 'Payment Applied' event if needed
PAYMENT.CREATED_DATE AS "EventTimestamp",
PAYMENT.CREATED_DATE AS "EventEndTime",
PMT_CREATOR.FIRST_NAME || ' ' || PMT_CREATOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
0 AS "IsAutomated"
FROM
Invoices I
JOIN
TRANSACTION_LINES T_LINES ON I.TRANSACTION_ID = T_LINES.APPLIED_TO_TRANSACTION_ID
JOIN
TRANSACTIONS PAYMENT ON T_LINES.TRANSACTION_ID = PAYMENT.TRANSACTION_ID
LEFT JOIN
EMPLOYEES PMT_CREATOR ON PAYMENT.CREATED_BY_ID = PMT_CREATOR.EMPLOYEE_ID
WHERE
PAYMENT.TRANSACTION_TYPE = 'Customer Payment'
UNION ALL
-- 10. Invoice Paid In Full, 11. Invoice Voided, 12. Invoice Closed
SELECT
I.InvoiceNumber AS "InvoiceNumber",
CASE
WHEN SN.NEW_VALUE_ID = 'Invoice:B' THEN 'Invoice Paid In Full' -- 'B' is status 'Paid In Full'
WHEN SN.FIELD = 'TRANSACTION.VOIDED' AND SN.NEW_VALUE = 'T' THEN 'Invoice Voided'
WHEN SN.FIELD = 'TRANSACTION.CLOSED' AND SN.NEW_VALUE = 'T' THEN 'Invoice Closed'
END AS "ActivityName",
SN.DATE_CREATED AS "EventTimestamp",
SN.DATE_CREATED AS "EventEndTime",
SN_AUTHOR.FIRST_NAME || ' ' || SN_AUTHOR.LAST_NAME AS "User",
'NetSuite' AS "SourceSystem",
SYSDATE AS "LastDataUpdate",
I.InvoiceDate AS "InvoiceDate",
I.DueDate AS "DueDate",
I.InvoiceTotalAmount AS "InvoiceTotalAmount",
I.CustomerName AS "CustomerName",
I.Region AS "Region",
CASE WHEN SN.AUTHOR_ID < 0 THEN 1 ELSE 0 END AS "IsAutomated"
FROM
Invoices I
JOIN
SYSTEM_NOTES SN ON I.TRANSACTION_ID = SN.TRANSACTION_ID
LEFT JOIN
EMPLOYEES SN_AUTHOR ON SN.AUTHOR_ID = SN_AUTHOR.EMPLOYEE_ID
WHERE
(SN.FIELD = 'TRANSACTION.STATUS' AND SN.NEW_VALUE_ID = 'Invoice:B')
OR (SN.FIELD = 'TRANSACTION.VOIDED' AND SN.NEW_VALUE = 'T')
OR (SN.FIELD = 'TRANSACTION.CLOSED' AND SN.NEW_VALUE = 'T');