RUNMYBOT® Integration for HubSpot and Sage Intacct
1 Usage of this Document
This document provides a reference for implementing a data synchronization layer between HubSpot CRM and Sage Intacct ERP using the RUNMYBOT platform. It outlines the synchronization process for each module, describes the authentication mechanism, and explains how data conflicts and errors are managed, while ensuring the middleware layer remains completely transparent to end users.
2 Purpose
The purpose of this document is to present the detailed solution design for implementing a middleware orchestration layer using our internal low-code platform, RUNMYBOT, to integrate HubSpot CRM (the primary commercial system) with Sage Intacct (the ERP and financial system of record). The solution enables seamless, API-driven synchronization of customer master data, contact records, sales orders, product catalogs, invoices, and payments between the two systems. It eliminates manual intervention while ensuring data consistency, reliable error handling, and complete auditability through centralized logging and monitoring.
3 Objective
The HubSpot–Sage Intacct integration provides secure, API-driven orchestration of customers, contacts, sales orders, products, invoices, and payments across both platforms. The integration is designed to achieve the following objectives:
- Ensure customer and contact master data remains synchronized and consistent between HubSpot and Sage Intacct at all times.
- Enable bi-directional synchronization of Sales Orders, ensuring that lifecycle changes made in either system are reflected in the other. (Only deals with "Closed Won" stage are eligible).
- Synchronize product master data, sales invoices, and payment records from Sage Intacct to HubSpot, providing sales teams with complete commercial visibility.
- Maintain transaction consistency across systems through the use of cross-reference keys and upsert (Update or Insert) logic.
- Deliver a seamless integration experience using scheduled polling and delta-based synchronization to process only incremental changes.
- Provide comprehensive monitoring, centralized logging, automated retry mechanisms, and end-to-end audit tracking within the RUNMYBOT platform.
4 Scope
The integration solution includes the following key capabilities:
- A centralized RUNMYBOT interface for configuring, monitoring, and orchestrating integrations between HubSpot and Sage Intacct.
- Bi-directional synchronization of Customers and Contacts between HubSpot and Sage Intacct. Only HubSpot Deals with the "Closed Won" stage are eligible for Sales Order synchronization.
- Uni-directional synchronization of Products (Items), Sales Orders, Sales Invoices, and Payments from Sage Intacct to HubSpot.
- Secure token-based authentication for both HubSpot and Sage Intacct, including encrypted credential storage and automatic token refresh.
- Structured, field-level transactional data exchange instead of document-based file transfers.
- Configurable field mapping and data transformation within RUNMYBOT to normalize data schemas between the two systems.
- Support for Full Data Extraction to perform the initial synchronization of all eligible records between HubSpot and Sage Intacct.
- Support for Date Range Extraction to synchronize records created or modified within a user-defined date range.
- Delta Extraction using modified timestamps or change-tracking mechanisms to synchronize only incremental changes, minimizing API usage and improving performance.
- Configurable criteria-based data extraction using static values or mapped fields to support selective synchronization.
- Pre-built workflow templates for each supported integration process, allowing customers to extend and customize workflows to meet their business requirements.
- Comprehensive monitoring, centralized logging, automated retry handling, and end-to-end transaction tracking within the RUNMYBOT platform.
5 Prerequisites
| Component | Requirement |
|---|---|
| HubSpot Edition | Professional, Enterprise, or Developer Edition with Private App support. |
| HubSpot API Access | API access must be enabled for the connected profile. |
| HubSpot User | Dedicated integration user with System Administrator or equivalent custom permissions. |
| HubSpot Connection | Either install the RUNMYBOT HubSpot App (recommended) or configure a customer-owned HubSpot OAuth application by providing the Client ID and Client Secret in the RUNMYBOT Connection module. |
| Sage Intacct Edition | Web Services subscription enabled on the target Sage Intacct company. |
| Sage Intacct API | Web Services API user configured with permissions for the required objects (Customer, Contact, Item, Sales Order, Invoice, and Payment). |
| Network | Outbound HTTPS (port 443) access to *.HubSpot.com and api.intacct.com endpoints. |
| Custom Fields | Create necessary custom fields and custom objects for synchronization of payment & sales invoice in HubSpot. |
6 Connection Setup & Configuration
Connection setups inside the RUNMYBOT Unified API require setting up credentials, base URLs, and authentication configurations.
6.1 Reference Field Creation
Create a custom field for each module in HubSpot to maintain a permanent cross-reference between the integrated systems.
| Sage Intacct Object | Field Name | Field Label | Data Type |
|---|---|---|---|
| Contact | sage_intacct_contact_id | Sage Intacct Contact ID | Text |
| Customer | sage_intacct_customer_id | Sage Intacct Customer ID | Text |
| Product | sage_intacct_product_id | Sage Intacct Product ID | Text |
| Sales Order | sage_intacct_order_id | Sage Intacct Reference ID | Text |
| Sales Invoice | external_ref_id | External Ref ID | Text |
| Customer Payment | external_ref_id | External Ref ID | Text |
6.2 Custom Object Creation
Create Custom Objects for **Sales Invoice** and **Customer Payments** in HubSpot.
Sales Invoice Object Name: p246208318_sales_invoices
| Field Label | Field Name | Field Type |
|---|---|---|
| Invoice Amount | invoice_amount | Number |
| External Ref ID | external_ref_id | Single-line text |
| Note | note | Multi-line text |
| Status | status | Dropdown |
| Due Date | due_date | Date |
| Outstanding Amount | outstanding_amount | Number |
| Invoice Number | invoice_number | Single-line text |
| Invoice Date | invoice_date | Date |
| Company | company_id | Association |
| Deal | deal_id | Association |
Customer Payment Object Name: p246208318_customer_payments
| Field Label | Field Name | Field Type |
|---|---|---|
| Amount Paid | amount_paid | Number |
| External Ref ID | external_ref_id | Single-line text |
| Note | note | Multi-line text |
| Status | status | Dropdown |
| Payment Number | payment_number | Single-line text |
| Total Amount | total_amount | Number |
| Transaction Date | transaction_date | Date |
| Company | company_id | Association |
| Invoice | invoice_id | Association |
7 System Overview
7.1 RUNMYBOT® Platform
A real-time orchestration engine that aggregates data across multiple systems and manages complex cross-platform transactions. Unlike a simple connector model, it functions as a real-time transaction orchestration layer between HubSpot and Sage Intacct, making the integration layer completely invisible to end users.
7.2 HubSpot
Cloud-based CRM used as the primary commercial system and origin for customer relationship and sales pipeline management.
7.3 Sage Intacct
ERP system used as the financial and operational system of record, managing customers, contacts, order processing, and accounting records.
8 Scope Requirements
| Use Case | Direction | Description |
|---|---|---|
| Customer & Contact Sync | Intacct → HubSpot | Synchronize Customer and Contact records from Sage Intacct to HubSpot Companies and Contacts. |
| Company & Contact Sync | HubSpot → Intacct | Synchronize Company and Contact records from HubSpot to Sage Intacct Customers and Contacts. |
| Product Master Sync | Intacct → HubSpot | Sync items from Sage Intacct to HubSpot product catalog. |
| Sales Order Sync | HubSpot → Intacct | Sync Closed Won deals in HubSpot to Sales Orders in Sage Intacct. |
| Sales Invoice Sync | Intacct → HubSpot | Push Posted Sales Invoices from Sage Intacct to HubSpot custom objects. |
| Customer Payment Sync | Intacct → HubSpot | Push customer payments to HubSpot payment custom objects. |
9 Process in Detail
9.1 Authentication
HubSpot: OAuth 2.0 Client Credentials or Private App token is used. RUNMYBOT handles secure token storage and refresh.
Sage Intacct: XML-based Web Services API authentication is used securely with Sender ID, User ID, Company ID, and Password.
9.2 Standard Workflows
9.2.1 Sage Intacct Customer to HubSpot Company
Customer records created or updated in Sage Intacct are synchronized to HubSpot as Company records. When a
customer is synced, its ID is written back to HubSpot as the cross-reference key
(sage_intacct_id).
Connection: <Select Sage intacct Connection>
Operation: Export
Query Mode: Interactive Query
Module: Account Receivable
Object: Customers
Field Selection: Custom
Include Core Fields: True
Connection: <Select HubSpot Connection>
Resource: Companies
Operation: Create
Ignore existing records: True
Lookup Condition: True
Lookup Field: properties.sage_intacct_id
Operator: Equal
Source: Mapping
Field Mapping Table
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| name | properties.name | Company Name |
| id | properties.sage_intacct_id | Sage Intacct ID Reference |
| notes | properties.description | Company Description |
| contacts_default_mailingAddress_city | properties.city | City |
| contacts_default_mailingAddress_country | properties.country | Country Reference |
| contacts_default_mailingAddress_state | properties.state | State / Region |
| contacts_default_mailingAddress_postCode | properties.zip | Postal Code |
| contacts_default_mailingAddress_addressLine1 | properties.address | Address Line 1 |
| contacts_default_mailingAddress_addressLine2 | properties.address2 | Address Line 2 |
| contacts_default_phone1 | properties.phone | Phone Number |
| associations[*].types[*].associationCategory | Static: HubSpot_DEFINED | |
| associations[*].types[*].associationTypeId | Static: 1 |
9.2.2 HubSpot Company to Sage Intacct Customer
Company records created or updated in HubSpot are synchronized to Sage Intacct Customers to keep customer master data consistent across both systems.
Connection: <Select HubSpot Connection>
Resource: Companies
Extract Type: All - Always extract all data
Include All Fields: True
Connection: <Select sage intacct Connection>
Operation: Import
Import mode: Upsert
Module: Account Receivables
Object: Customers
Write mode: Batch
Enable lookup: True
Filter mode: Conditions (structured)
Lookup field: id
Operator: Equals
Source: Mapping
Mapping field: id
Logic: AND
Connection: <Select HubSpot Connection>
Resource: Companies
Operation: Upsert
Directly By ID: True
HubSpot Company to Sage Intacct Customer Mapping
| Source Data (HubSpot) | Target Data (Sage Intacct) | Description / Rules |
|---|---|---|
| properties.sage_intacct_id | id | Sage Customer ID |
| properties.name | name | Company Name |
| properties.description | notes | Description/Notes |
| properties.name | contacts.default.companyName | Company Name Ref |
| properties.address | contacts.default.mailingAddress.addressLine1 | Mailing Address 1 |
| properties.address2 | contacts.default.mailingAddress.addressLine2 | Mailing Address 2 |
| properties.city | contacts.default.mailingAddress.city | City |
| properties.domain | contacts.default.URL1 | Domain URL |
| properties.state | contacts.default.mailingAddress.state | State |
| properties.zip | contacts.default.mailingAddress.postCode | Postal Code |
| properties.country | contacts.default.mailingAddress.country | Country Code |
| id | prev_data.HubSpot_customer_id | HubSpot ID |
Sage Customer to HubSpot Reference Mapping
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| prev_data.hubspot_customer_id | id | HubSpot Company ID Reference |
| intacct_id | properties.sage_intacct_id | Sage Customer ID |
Customer records created or updated in HubSpot are synchronized to Sage Intacct as Company records.
RUNMYBOT validates the incoming payload and performs the necessary data mapping and transformation to align HubSpot customer fields with the corresponding Sage Intacct company fields.
RUNMYBOT checks whether a corresponding Company already exists in Sage Intacct using the cross-reference key stored on the Sage Intacct Company record. If no matching Company is found, RUNMYBOT creates a new Company record in Sage Intacct. If a matching Company already exists, RUNMYBOT updates the existing Sage Intacct Company record using the stored cross-reference key.
Integration Direction: HubSpot → RUNMYBOT → Sage Intacct
9.2.3 HubSpot Contact to Sage Intacct Contact
Contact records created or updated in HubSpot are synchronized to Sage Intacct, ensuring that customer contact information remains accurate and readily available for business communications.
Connection: <Select HubSpot Connection>
Resource: Contacts
Extract Type: All - Always extract all data
Include All fields: True
Connection: <Select Sage Intacct Connection>
Operation: Import
Import Mode: Upsert
Module: Company Configuration
Object: Contacts
Write Mode: Batch
Enable Lookup: True
Filter Mode: Conditions
Batch atomic: false
Lookup field: Id
Operator: Equals
Source: Mapping
Mapping Field: prev_data.sage_intacct_contact_id
Logic: AND
Connection: <Select HubSpot Connection>
Resource: Contacts
Directly By ID: True
HubSpot Contact to Sage Intacct Contact Mapping
| Source Data (HubSpot) | Target Data (Sage Intacct) | Description / Rules |
|---|---|---|
| properties.firstname | firstName | First Name |
| properties.lastname | lastName | Last Name |
| properties.firstname | printAs | Print As |
| properties.salutation | prefix | Salutation prefix |
| properties.email | email1 | Email 1 |
| properties.phone | phone1 | Primary Phone |
| properties.mobilephone | mobile | Mobile phone |
| properties.fax | fax | Fax Number |
| properties.website | URL1 | URL |
| properties.company | companyName | Company Name |
| showInContactList | Lookup rule: showInContactList: true | |
| properties.address | mailingAddress.addressLine1 | Address Line 1 |
| properties.address2 | mailingAddress.addressLine2 | Address Line 2 |
| properties.city | mailingAddress.city | City |
| properties.state | mailingAddress.state | State |
| properties.zip | mailingAddress.postCode | Postal Code |
| properties.country | mailingAddress.country | Country Code |
| properties.sage_intacct_contact_id | prev_data.sage_intacct_contact_id | Sage Contact ID Ref |
| id | prev_data.hs_contact_id | HubSpot ID |
| id | id | ID |
Sage Intacct Contact to HubSpot Contact Reference Update Mapping
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| prev_data.hs_contact_id | id | HubSpot Contact ID Reference |
| intacct_id | properties.sage_intacct_contact_id | Sage Contact ID Reference |
RUNMYBOT retrieves Contact data from HubSpot using REST APIs.
Each Contact record is validated, mapped, and transformed according to the integration rules before processing.
Based on the synchronization logic, RUNMYBOT determines whether to create a new Contact or update an existing Contact in HubSpot.
Integration Direction: HubSpot → RUNMYBOT → Sage Intacct
9.2.4 Sage Intacct Contact to HubSpot Contact
Contact records created or updated in Sage Intacct are synchronized with HubSpot, ensuring that customer contact information remains accurate and readily available.
Connection: <Select Sage Intacct Connection>
Operation: Export
Query Mode: Interactive Query
Module: Company Configuration
Object: Contacts
Load Type: Full Load
Field Selection: Custom
Include Core Fields: True
Enable lookup: False
Advanced Options: False
Connection: <Select HubSpot Connection>
Resource: Contacts
Operations: Upsert
Directly By ID: false
Lookup Field: properties.sage_intacct_contact_id
Operator: Equal
Source: Mapping
Field Mapping Table
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| id | properties.sage_intacct_contact_id | Contact ID Reference |
| firstName | properties.firstname | First Name |
| lastName | properties.lastname | Last Name |
| phone1 | properties.phone | Phone |
| mailingAddress.addressLine1 | properties.address | Address Line 1 |
| mailingAddress.addressLine2 | properties.address2 | Address Line 2 |
| mailingAddress.city | properties.city | City |
| mailingAddress.state | properties.state | State |
| mailingAddress.country | properties.country | Country |
| mailingAddress.postCode | properties.zip | Zip |
| prefix | properties.salutation | Prefix |
| email1 | properties.email | |
| mobile | properties.mobilephone | Mobile Phone |
| fax | properties.fax | Fax |
| URL1 | properties.website | Website |
| companyName | properties.company | Company Name |
9.2.5 Sage Intacct Product to HubSpot Product
Product records created or updated in Sage Intacct are synchronized to HubSpot to keep the CRM product catalog and pricing information current.
Connection: <Select Sage Intacct Connection>
Resource: Item
Extract Type: All - Always extract all data
Connection: <Select HubSpot Connection>
Resource: Product
Operation: Upsert
Lookup Condition: Lookup Field: properties.sage_intacct_product_id, Operator: Equal, Source: Mapping
Field Mapping Table
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| name | properties.name | Product Name |
| soDescription | properties.description | Product Description |
| isSuppliesItem | properties.hs_product_type | Product Type |
| sales_basePrice | properties.price | Unit Price |
| purchasing_standardCost | properties.hs_cost_of_goods_sold | Cost of Goods Sold |
| id | properties.sage_intacct_product_id | Sage Intacct Product ID Reference |
| itemType | properties.hs_product_type | Lookup Rule: • inventory → inventory • nonInventory → non_inventory • salesOnlyNonInventory → non_inventory • purchaseOnlyNonInventory → non_inventory |
| id | properties.hs_sku | SKU Code |
9.2.6 HubSpot Deal to Sage Intacct Sales Order
Closed Won HubSpot Deals are synchronized to Sage Intacct as Sales Orders to ensure that confirmed sales opportunities are converted into ERP sales transactions. RUNMYBOT retrieves Deal data from HubSpot through REST APIs, validates the incoming payload, and performs the required field mapping and data transformation to align HubSpot Deal, Company, Contact, and Product information with the corresponding Sage Intacct Sales Order fields. Once the data is validated and transformed, RUNMYBOT creates or updates the Sales Order in Sage Intacct while maintaining cross-reference identifiers for future synchronization and tracking.
Connection: <Select HubSpot Connection>
Resource: Deals
Associations: Companies, line items
Include all fields: True
Enable lookup: True
Lookup field: dealstage
operator: Equal
Source: Static
Value: closedwon
lookupfield: sage_intacct_order_id
Operator: Is Empty
Operation: filter
Field name: companies
Condition: Is Not Empty
Operation: filter
Field name: line_items
Condition: Is Not Empty
Operation: filter
Field name: sage_intacct_order_id
Condition: Is Empty
Operation: filter
Field name: id
Condition: Unique
Operation: Import
Import mode: Upsert
Module: Account Receivable
Object: Customers
Write Mode: Batch
Filter mode: Conditions (structured)
Enable lookup: True
Lookup field: id
Operator: Equals
Source: Mapping
Mapping field: id
Logic: AND
Connection: <Select HubSpot Connection>
Resource: Companies
Operation: Update
Directly By ID: True
Operation: Merge
Join Type: Left Join
Split Field: HubSpot_order_id
Left Data: WITH SPLIT KEY PRESENT
Group By Fields: company_id
Connection: <Select sage intacct Connection>
Import mode: Insert
Module: Order Entry
Object: Documents
Write mode: Batch
Document type: Sales order
Connection: <Select HubSpot Connection>
Resource: Deals
Operation: Update
Directly By ID: True
HubSpot Deal to Data Preprocess filter 1 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | associations[*].to.id | Deal ID Reference |
| properties.acumatica_order_id | OrderNbr | Order Number |
| Static : 21 | associations[*].types[*].associationCategory | Static Category: 21 |
| Static : USER_DEFINED | associations[*].types[*].associationTypeId | Static Type: USER_DEFINED |
| prev_data.ReferenceNbr | ReferenceNbr | Reference Number |
Data Preprocess 1 to Data Preprocess 2 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| companies | companies | Companies list |
Data Preprocess2 to Sage Intacct Customer Import Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| companies | companies | Companies list |
| properties.sage_intacct_id | id | Customer ID Reference |
| properties.name | name | Customer Name |
| properties.description | notes | Notes |
| properties.phone | contacts.default.phone1 | Phone Number |
| properties.address | contacts.default.mailingAddress.addressLine1 | Mailing Address |
| properties.city | contacts.default.mailingAddress.city | City |
| properties.state | contacts.default.mailingAddress.state | State |
| properties.country | contacts.default.mailingAddress.country | Country Code |
| properties.zip | contacts.default.mailingAddress.postCode | Postal Code |
| id | prev_data.hs_customer_id | HubSpot ID |
Sage Intacct Customer Import to HubSpot Company Update Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | properties.sage_intacct_id | Sage Intacct Customer ID |
| prev_data.hs_customer_id | id | HubSpot Company ID Reference |
HubSpot Company Update to Data Preprocess 3 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| properties.sage_intacct_id | customer.id | Customer ID |
| id | company_id | Company ID |
Data Preprocess Filter 1 to Data Preprocess Merge Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| companies[*].id | company_id | Company ID |
| id | HubSpot_order_id | Order ID Reference |
| properties | properties | Properties payload |
| line_items | Details | Line Items details |
Data Preprocess Merge to Sage Intacct SO Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| customer.id | customer.id | Customer ID |
| HubSpot_order_id | referenceNumber | Reference Number |
| state | state | State |
| properties.closedate | dueDate | Due Date |
| properties.closedate | txnDate | Transaction Date |
| txnCurrency | txnCurrency | Currency |
| baseCurrency | baseCurrency | Base Currency |
| Details[*].properties.sage_intacct_product_id | lines[*].dimensions.item.id | Line Item Product ID |
| lines[*].dimensions.location.id | lines[*].unit | Line Unit |
| properties.description | lines[*].memo | Line Memo |
| Details[*].properties.quantity | lines[*].unitQuantity | Line Quantity |
| Details[*].properties.amount | lines[*].unitPrice | Line Unit Price |
| HubSpot_order_id | prev_data.id | Origin HubSpot ID Reference |
Sage Intacct SO to HubSpot Deal Update Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| intacct_id | properties.sage_intacct_order_id | Sage Intacct Sales Order ID Reference |
| prev_data.id | id | HubSpot Deal ID Reference |
RUNMYBOT retrieves Closed Won Deal records from HubSpot through REST APIs. Synchronization can be initiated either manually by a user or automatically through scheduled polling. RUNMYBOT validates the incoming payload and performs the required field mapping and data transformation before processing the Deal.
RUNMYBOT verifies whether the corresponding Customer exists in Sage Intacct using the stored cross-reference key. If the Customer does not exist, RUNMYBOT creates a new Customer in Sage Intacct and writes the returned Customer ID back to the corresponding HubSpot Company as the cross-reference identifier for future synchronizations.
After the Customer reference is available, RUNMYBOT retrieves and combines the HubSpot Deal, Company, Contact, and associated Product information to construct the complete Sales Order payload.
RUNMYBOT performs field mapping, data transformation, and validation to convert the combined data into the Sage Intacct Sales Order format, including the Sales Order header, customer details, and line items generated from the associated HubSpot Deal Products.
RUNMYBOT submits the transformed Sales Order payload to the Sage Intacct Sales Order REST API. Sage Intacct validates the customer, product references, pricing, inventory, tax information (where applicable), and other business rules before creating the Sales Order.
Upon successful creation, Sage Intacct returns the Sales Order Number, which RUNMYBOT captures and stores for subsequent processing.
RUNMYBOT updates the originating HubSpot Deal by storing the Sage Intacct Sales Order Number in the sage_intacct_order_id field, establishing a permanent cross-reference between the HubSpot Deal and the Sage Intacct Sales Order.
All synchronization activities, including request and response payloads, processing status, timestamps, and error details, are logged by RUNMYBOT to support auditing, monitoring, and troubleshooting.
Integration Direction: HubSpot → RUNMYBOT → Sage Intacct → HubSpot
10 Custom Workflows
10.1 Sage Invoice to HubSpot Invoice
Synchronize posted Sales Invoices from Sage Intacct to HubSpot custom objects, linking them to corresponding HubSpot Companies and Deals.
Connection: <Select Sage Intacct Connection>
Operation: Export
Query mode: Interactive query
Module: Order entry
Object: Documents
Load Type: Full load
Field Selection: Custom
Include core fields: True
Fields: sourceDocument.id, sourceDocument.key
Enable lookup: False
Advanced option: False
Document type: Sales Invoice
Connection: <Select Sage Intacct Connection>
Operation: Export
Query mode: Interactive query
Module: Order Entry
Object: Documents
Document type: Sales order
Load Type: Full load
Field selection: custom
Include core fields: False
Fields: Id, key, documentnumber, document type, state, total
Enable lookup: True
Filter Mode: Key lookup
Advanced options: False
Source: Mapping
Mapping key field: key
Connection: <Select HubSpot Connection>
Resource: Deals
Associations: Companies, line items
Extract Type: All - Always extract all data
Include All Fields: True
Enable lookup: True
Lookup fields: sage_intacct_order_id
Operator: Equal
Source mapping: Mapping
Operation: Merge
Join type: Left join
Split field: prev_data
Left data: WITH SPLIT KEY PRESENT
Group By Fields: key
Operation: Filter
Field name: HubSpot_order_id
Condition: Is Not EMPTY
Operation: Merge
Join Type: Full Join
Group By Fields: key
Connection: <Select HubSpot Connection>
Resource: Custom object
Custom object name: p246208318_sales_invoices
Operation: Upsert
Directly By ID: false
Lookup Field: properties.invoice_number
Operator: Equal
Source: Mapping
Sage Intacct Invoice to Order Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| sourceDocument_key | key | Key reference |
| documentNumber | prev_data.inv_number | Invoice Number |
| key | prev_data.key | Record Key |
| state | prev_data.status | Status |
| total | prev_data.invoice_amount | Amount |
| dueDate | prev_data.duedate | Due Date |
| txnCurrency | prev_data.transaction_currency | Currency |
| txnDate | prev_data.invoice_date | Date |
Sage Intacct order to HubSpot Deal mappings
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | sage_intacct_order_id | Order ID Reference |
| prev_data.key | prev_data.key | Key |
HubSpot Deal to Data Preprocess Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | HubSpot_order_id | Order ID Reference |
| properties.sage_intacct_order_id | sage_intacct_order_id | Order ID |
Sage Intacct Order to Data Preprocess mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | sage_intacct_order_id | Order ID |
| prev_data | prev_data | Data payload |
HubSpot Deal to Data Preprocess 2 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| companies[*].id | associations[*].to.id | Company ID |
| Static : USER_DEFINED | associations[*].types[*].associationCategory | Static Category: USER_DEFINED |
| Static : 17 | associations[*].types[*].associationTypeId | Static Type ID: 17 |
| prev_data.key | key | Key |
Data Preprocess 2 to HubSpot AR Invoice Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| HubSpot_order_id | properties.external_ref_id | External Reference ID |
| prev_data.invoice_amount | properties.invoice_amount | Total Invoice Amount |
| prev_data.invoice_date | properties.invoice_date | Invoice Date |
| prev_data.dueDate | properties.dueDate | Due Date |
| prev_data.inv_number | properties.invoice_number | Invoice Number Reference |
| associations | associations | Links to Deals & Companies |
10.2 Sage Payment to HubSpot Payment
Sage Intacct Customer Payments are synchronized to HubSpot Payment custom objects, matching them against corresponding HubSpot Invoices.
Connection: <Select Sage Intacct Connection>
Operation: Export
Query mode: Interactive Query
Module: Account Receivable
Object: Payment Details
Include Core fields: True
Field selection: Custom
Fields: Id, arInvoice.id, txnCurrency.paymentAmount, txnCurrency.currency, arPayment.id, paymentDate, arPayment.documentNumber, arPayment.paidDate, arPayment.txnCurrency.currency, arPayment.txnCurrency.totalAmount, arPayment.txnCurrency.totalPaid, arPayment.customer.id, arPayment.customer.name, arPayment.paymentMethod, arPayment.baseCurrency.totalDue, arPayment.paymentSummary.title
Enable lookup: False
Advanced options: False
Connection: <Select Sage Intacct Connection>
Operation: Export
Query mode: Interactive Query
Module: Accounts Receivable
Object: Invoices
Load type: Full load
Field selection: Auto
Enable lookup: True
Filter mode: Key lookup
Advanced options: False
Source: Mapping
Mapping key field: id
Operation: Filter
Field Name: invoice_number
Condition: Is Not EMPTY
Connection: <Select HubSpot Connection>
Resource: Custom object
Custom Object Name: p246208318_sales_invoices
Associations: (blank)
Extract type: All - Always extract all data
Include All Fields: True
Enable lookup: True
Lookup fields: invoice_number
Operator: Equal
Source: Mapping
Operation: Merge
Join Type: Left Join
Split Field: associations
Left data: WITHOUT SPLIT KEY PRESENT
Group by fields: invoice_number, payment_number
Operation: Filter
Field Name: associations
Condition: Is Not EMPTY
Connection: <Select HubSpot Connection>
Resource: Companies
Associations: (blank)
Extract type: All - Always extract all data
Include All Fields: True
Enable Lookup: True
Lookup Field: sage_intacct_id
Operator: Equal
Source: Mapping
Operation: Merge
Join Type: Full Join
Group By Fields: invoice_number, payment_number
Resource: Custom Object
Custom Object Name: p246208318_customer_payments
Operation: Upsert
Lookup Field: properties.payment_number
Operator: Equal
Source: Mapping
Sage Intacct payment to Sage Intacct invoice mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| arInvoice_id | id | Invoice ID Reference |
| id | external_ref_id | External Reference |
| arPayment_id | prev_data.payment_number | Payment Number |
| arPayment_txnCurrency.totalPaid | prev_data.amount_paid | Amount Paid |
| arPayment_txnCurrency_currency | prev_data.currency | Currency |
| arPayment_paidDate | prev_data.transaction_date | Date |
| arPayment_txnCurrency_totalAmount | prev_data.total_amount | Total Amount |
| arPayment_paymentMethod | prev_data.payment_method | Payment Method |
| arPayment.paymentSummary.title | prev_data.description | Description |
Sage Invoice to Data Preprocess 1 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | invoice_id | Invoice ID |
| external_ref_id | external_ref_id | External Ref |
| prev_data.payment_number | prev_data.payment_number | Payment Number |
| prev_data.amount_paid | prev_data.amount_paid | Amount Paid |
| prev_data.currency | prev_data.currency | Currency |
| prev_data.transaction_date | prev_data.transaction_date | Transaction Date |
| prev_data.total_amount | prev_data.total_amount | Total Amount |
| prev_data.payment_method | prev_data.payment_method | Payment Method |
| prev_data.description | prev_data.description | Description |
| prev_data.status | prev_data.status | Status |
| customer.id | prev_data.customer.id | Customer ID |
| invoiceNumber | invoice_number | Invoice Number |
| prev_data.payment_number | payment_number | Payment Reference |
Data Preprocess1HubSpot Invoice Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| invoice_number | invoice_number | Invoice Number Reference |
| prev_data.payment_number | prev_data.payment_number | Payment Number |
HubSpot Invoice to Data Preprocess 2 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| properties.invoice_number | invoice_number | Invoice Number |
| id | hs_invoice_id | HubSpot Invoice ID |
| id | associations[*].to.id | Invoice ID Reference |
| Static : USER_DEFINED | associations[*].types[*].associationCategory | Static Category: USER_DEFINED |
| Static : 39 | associations[*].types[*].associationTypeId | Static Type ID: 39 |
| prev_data.payment_number | payment_number | Payment Number |
| properties.invoice_amount | total_amount | Total Amount |
Data PreProcess 2 to HubSpot Company Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| payment_number | payment_number | Payment Number |
| invoice_number | invoice_number | Invoice Number |
| prev_data.customer.id | sage_intacct_id | Customer ID Reference |
HubSpot Company to Data PreProcess 3 Mapping
| Source Data | Target Data | Description / Rules |
|---|---|---|
| id | associations[*].to.id | Company ID |
| Static : USER_DEFINED | associations[*].types[*].associationCategory | Static Category: USER_DEFINED |
| Static : 48 | associations[*].types[*].associationTypeId | Static Type ID: 48 |
| payment_number | payment_number | Payment Number |
| properties.name | company_name | Company Name |
| invoice_number | invoice_number | Invoice Number Reference |
Data Preprocess 3 to HubSpot Payment Mapping
| Source Data (Sage Intacct) | Target Data (HubSpot) | Description / Rules |
|---|---|---|
| payment_number | properties.payment_number | Payment Number Reference |
| amount_paid | properties.amount_paid | Amount Paid |
| prev_data.transaction_date | properties.transaction_date | Payment Date |
| description | properties.note | Notes/Memo |
| total_amount | properties.total_amount | Total Amount |
| associations | associations | Associated Company & Invoice |
| prev_data.status | properties.status | Status |
11 Exception Handling
Error handling is implemented across trigger, transformation, and action stages of each flow to ensure reliable synchronization:
- Validation: Checks identify missing mandatory fields, invalid data formats, and incorrect reference mappings before processing.
- Duplicates: Managed using external identifiers and upsert logic to prevent duplicate record insertion.
- Retries: Automated retry schedules for network interruptions, API timeouts, rate limits, or temporary service unavailability.
- Logging: All integration activities, payloads, and errors are logged inside the RUNMYBOT monitoring dashboard.
