The Pub/Sub Accounting Integration allows any system capable of accessing the Salesforce Pub/Sub API to seamlessly integrate accounting with the TMS. The TMS sends outbound accounting events (Customer, Vendor, Load, Customer Invoice, and Vendor Invoice) to the Pub/Sub API event bus for processing by the accounting system. The TMS is also able to process inbound accounting events (Customer Payment and Vendor Payment) sent to the Event Bus by the accounting system.
The main Salesforce components used by this integration include a Connected App for authentication purposes, Platform Events, and the Pub/Sub API.
Setup Connected App Access
A connected app is required to allow the accounting system to access the Pub/Sub API. Through the connected app there are several OAuth authorization flows supported by Salesforce. The setup below outlines the setup of an OAuth 2.0 Client Credentials Flow connected app. Other flows are also supported.
Three fields must be sent to the accounting partner to complete the Pub/Sub setup process. Each are referenced in the steps below. They are the Consumer Key, Consumer Secret, and Current My Domain URL fields.
Step 1: Create a new API user
Create a new user:
Navigate to Setup and then search for and click the Users link.
Click the New User button and add the following:
First Name: Accounting
Last Name: Integration
Email: Set to the system admin’s email.
Username: Change if necessary.
User License: Salesforce
Profile: Standard User
Note: The user’s First Name and Last Name can be any value, but should reference accounting for simplicity.
Click Save.
Add the Permission Set TMS Accounting Integration to the user.
Step 2: Create the Connected App
Skip these steps when the Accounting Integration App already exists.
Navigate to Setup and then search for and click the OAuth and OpenID Connect Settings link.
Enable Allow Authorization Code and Credentials Flows.
Create a Connected app by following the steps below.
Navigate to Setup and search for External Client Apps and select the Settings link.
From the Connected Apps section, choose On for Allow creation of connected apps.
Click the Enable button on the modal to create Connected Apps.
Click the New Connected App button.
Enter the following information:
Connected App Name: Accounting Integration
API Name: Auto-Generated based on the Connected App Name.
Contact Email: System admin’s email.
Enabled OAuth Setting: Checked.
Callback URL: https://login.salesforce.com/.
Selected OAuth Scopes: Add Manage user data via APIs (api)
Enable Client Credentials Flow: Checked.
Click Save.
Step 3: Setup the Connected App
Navigate to Setup and then search for and click the App Manager link.
In the Accounting Integration app row click the arrow and select to View.
Go to Trusted IP Range for OAuth Web Server Flow and add any applicable IPs (optional).
Click Manage Consumer Details to access the Consumer Key and Consumer Secret which are required for the accounting system.
The Consumer Key and Consumer Secret are provided by the accounting partner.
Step 4: Setup Client Credentials Flow
Navigate to Setup and then search for and click the App Manager link.
In the Accounting Integration app row click the arrow and select to View.
Click Manage at the top of the page.
Click Edit Policies.
Under Client Credentials Flow Set Run As to the new user that was created (Accounting Integration).
Click Save.
The following endpoint must be provided to the accounting system. “{domain}” is found by navigating to Setup, search for My Domain and click the link. Copy the link from Current My Domain URL into the URL below.
OAuth authorization endpoint: https://{domain}/services/oauth2/token
The Current My Domain URL field must be sent to the accounting partner to complete setup.
Accounting System Access to the Pub/Sub API
Salesforce documentation should be consulted for details on accessing the Pub/Sub API with the accounting system. The accounting system requires the URL created above with the Consumer Key and Consumer Secret.
Salesforce Pub/Sub API Documentation
Publishing and Subscribing to the Event Bus
Each time a payload is published or a subscribed payload is received is called an "Event." Each event has a unique field, the EventUUID. If there is an Event failure, a Queued Transaction is created with the EventUUID and the system administrator is notified.
Inbound Events
The TMS "listens" for subscribed events from the Event Bus. When subscribed events occur, the records are added to the TMS. The two events the TMS listens for are published Customer Payments and Vendor Payments.
Subscribing events call the streamFetchRequest API and receive a streamFetchResponse in return.
Customer Payment
When a cash application is posted to a Customer Invoice in the accounting system, a payload is published to the Event Bus. The TMS is subscribed to these events and accepts the payload.
The following fields for a Customer Payment record are created and populated from the Event Bus.
TMS Field | Type | Payload Field |
---|---|---|
Accounting Processed Date | Date/Time | paymentDate |
Check/Reference Number | Text(50) (External ID) | checkReferenceNumber |
Currency | Picklist | paymentCurrency |
Customer Invoice | Master-Detail(Customer Invoice) | invoiceId |
Description | Text(80) | paymentId |
Discount | Currency(16, 2) | discount |
Payment Amount | Currency(16, 2) | paymentAmount |
Payment Date | Date | paymentDate |
Payment Type | Picklist | paymentType |
Customer Payment TMS1 Field Set fields (Comments, Description, etc.) | Multiple types | Multiple fields |
{
"paymentId": "22s8dje8dje9dke9ew",
"paymentType": "Check",
"checkReferenceNumber": "12345",
"invoiceId": "1js8dje8dje9dke9ew",
"invoiceNumber": “L-1919293”,
"paymentDate": “2023-01-23”,
"paymentAmount": 1000.00,
"discount": 100.00,
"paymentCurrency": "USD",
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Additional fields may be added to the Customer Payment TMS1 Field Set and set by inbound Customer Payment events.
Vendor Payment
Payloads are published when a cash application is posted to a Vendor Invoice in the accounting system. The TMS is subscribed to these events and accepts the payload.
The following fields for a Vendor Payment record are created and populated from the Event Bus.
TMS Field | Type | Payload Field |
---|---|---|
Accounting Processed Date | Date/Time | paymentDate |
Check/Reference Number | Text(50) (ExternalID) | checkReferenceNumber |
Currency | Picklist | paymentCurrency |
Description | Text(80) | paymentId |
Discount | Currency(16, 2) | discount |
Payment Amount | Currency(16, 2) | paymentAmount |
Payment Date | Date | paymentDate |
Payment Type | Picklist | paymentType |
Vendor Invoice | Lookup(Vendor Invoice) | invoiceId |
Vendor Payment TMS1 Field Set fields (Comments, Description, etc.) | Multiple types | Multiple fields |
{
"paymentId": "33s8dje8dje9dke9ew",
"paymentType": "Check",
"checkReferenceNumber": "12345",
"invoiceId": "1js8dje8dje9dke9ew",
"invoiceNumber": "L-1919293",
"paymentDate": "2023-01-23"
"paymentAmount": 1000.00,
"discount": 100.00,
"paymentCurrency": "USD",
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Additional fields may be added to the Vendor Payment TMS1 Field Set and set by inbound Vendor Payment events.
Outbound Events
The TMS publishes events to the Event Bus. When publish events occur, the records are sent to the Event Bus and are then received by the accounting integration. There are five events the TMS publishes for the accounting system. They include Customer, Customer Invoice, Vendor, Vendor Invoice, and Load event payloads.
The TMS uses Platform Events when publishing to the Event Bus for lightweight and near real time sending of data.
Most outbound payloads include the Salesforce Record ID of the record that is sent as a payload field. See Salesforce for more information on locating the record ID.
Prepare to send accounting information from the TMS by setting the Accounting Status picklist field to Ready for Accounting. The Accounting Status field is a managed Global Picklist Value Set and should not be changed. After a successful publish event, the Accounting Status changes to Sent to Accounting. A status of Publish Error displays if there is an issue and an email is sent to the system administrator.
Several field sets trigger publishing events when values are changed. Add fields to these field sets to send updated information to the accounting integration.
Field Set | Event Trigger |
---|---|
Account TMS6 | Customer Accounting Event |
Account TMS7 | Vendor Accounting Event |
Contact TMS4 | Customer or Vendor Accounting Event |
Load TMS33 | Load Accounting Event |
Transportation Profile TMS3 | Customer Accounting Event |
Transportation Profile TMS4 | Vendor Accounting Event |
Publishing events call the PublishRequest API and receive a PublishResponse in return.
Customer Payload
The following fields for an Account (Customer) record are published to the Event Bus for the accounting integration.
TMS Field | Type | Payload Field |
---|---|---|
Account Currency | Picklist | customerCurrency |
Account Name | Text(255) | customerName |
customer.Id | Salesforce Record ID | customerId |
Payload | contacts | |
DBA Name | Text(80) | dbaName |
Default Customer Bill To (Transportation Profile) | Lookup(Account) | defaultCustomerBillToId |
Default Customer Bill To (Transportation Profile) | Lookup(Account) | defaultCustomerBillToName |
Billing Address | Address | billingStreet |
Billing Address | Address | billingCity |
Billing Address | Address | billingState |
Billing Address | Address | billingPostalCode |
Billing Address | Address | billingCountry |
Shipping Address | Address | shippingStreet |
Shipping Address | Address | shippingCity |
Shipping Address | Address | shippingState |
Shipping Address | Address | shippingPostalCode |
Shipping Address | Address | shippingCountry |
TMS Type | Picklist (Multi-Select) | tmsType |
Account TMS8 Field Set fields | Multiple types | Multiple fields |
Transportation Profile TMS5 Field Set fields | Multiple types | Multiple fields |
{
"customerId": "1js8dje8dje9dke9eq",
"customerName": "ABC Company",
"dbaName": "ABC Company",
"tmsType": "Customer",
"defaultCustomerBillToId": "aus8dje8dje9dke9ew",
"defaultCustomerBillToName": "ABC Company",
"billingStreet": "2333 Waukegan Road",
"billingCity": "Bannockburn",
"billingState": "IL",
"billingPostalCode": "60015",
"billingCountry": "US",
"shippingStreet": "2333 Waukegan Road",
"shippingCity": "Bannockburn",
"shippingState": "IL",
"shippingPostalCode": "60015",
"shippingCountry": "US",
"customerCurrency": "USD",
"contacts":
[
{
"contactId": "1d8dkj38djk39dk39d",
"firstName": "George",
"lastName": "Smiley",
"email": "gsmiley@revenova.com",
"phone": "312-333-9999",
"role": "Billing"
}
]
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Vendor Payload
The following fields for an Account (Vendor) record are published to the Event Bus for the accounting integration.
TMS Field | Type | Payload Field |
---|---|---|
Account Currency | Picklist | vendorCurrency |
Account Name | Text(255) | vendorName |
vendor.Id | Salesforce Record ID | vendorId |
Carrier Remit To (Transportation Profile) | Lookup(Account) | CarrierRemitToId |
Carrier Remit To (Transportation Profile) | Lookup(Account) | CarrierRemitToName |
Payload | contacts | |
DBA Name | Text(80) | dbaName |
Billing Address | Address | billingStreet |
Billing Address | Address | billingCity |
Billing Address | Address | billingState |
Billing Address | Address | billingPostalCode |
Billing Address | Address | billingCountry |
MC/MX/FF Number (Transportation Profile) | Text(20) | mcNumber |
Shipping Address | Address | shippingStreet |
Shipping Address | Address | shippingCity |
Shipping Address | Address | shippingState |
Shipping Address | Address | shippingPostalCode |
Shipping Address | Address | shippingCountry |
TMS Type | Picklist (Multi-Select) | tmsType |
US DOT Number (Transportation Profile) | Text(10) | dotNumber |
Account TMS9 Field Set fields | Multiple types | Multiple fields |
Transportation Profile TMS6 Field Set fields | Multiple types | Multiple fields |
Contacts Payload
The following fields for a Contact record are published to the Event Bus as part of Customer and Vendor payloads. Multiple Contact records may be added to a single Customer or Vendor payload.
TMS Field | Type | Payload Field |
---|---|---|
contact.Id | Salesforce Record ID | contactId |
Name | Text(40) | firstName |
Name | Text(80) | lastName |
Phone | Phone | phone |
Transportation Role | Picklist (Multi-Select) | role |
Load Payload
The following fields for a Load record are published to the Event Bus for the accounting integration.
TMS Field | Type | Payload Field |
---|---|---|
Carrier Sales Rep | Salesforce Record ID | carrierSalesRepId |
Carrier Sales Rep (Name) | Carrier Sales Rep (Name) | carrierSalesRepName |
Customer (Salesforce record ID) | Lookup(Account) | customerId |
Customer | Lookup(Account) | customerName |
Customer Bill To | Salesforce Record ID | customerBillToId |
Customer Bill To (Name) | Lookup(Account) | customerBillToName |
Customer Sales Rep | Salesforce Record ID | customerSalesRepId |
Customer Sales Rep (Name) | Lookup(User) | customerSalesRepName |
load.Id | Salesrorce Record ID | loadId |
Load Number | Text(80) | loadName |
Mode | Lookup(Mode) | mode |
Total Weight | Number(18, 0) | weight |
Weight Units | Picklist | weightUnits |
Payload | stops | |
Load TMS34 Field Set fields | Multiple types | Multiple fields |
{
"loadId": "1js8dje8dje9dke9et",
"loadName": "Load-12345",
"customerId": "1js8dje8dje9dke9eq",
"customerName": "ABC Company",
"customerBillToId": "1js8dje8dje9dke9eq",
"customerBillToName": "ABC Company",
"customerSalesRepId": "1je8dje8e6ehe9eie8",
"customerSalesRepName": "George Smiley",
"carrierSalesRepId": "1je8dje8e6ehe9eie8",
"carrierSalesRepName": "Roy Bland",
"mode": "Truckload",
"weight": 20000,
"weightUnits": "lbs",
"stops":
[
{
"stopId": "2j8fj3d9dkj3d9dk303",
"stopName": "Stop 1",
"stopNumber": 1,
"isPickup": true,
"isDelivery": false,
"expectedDate": "2023-01-22",
"appointmentTime": "10:00",
"locationName": "ABC Warehouse",
"street": "123 North Ave.",
"city": "Chicago",
"state": "IL",
"postalCode": "60603",
"country": "US"
},
{
"stopId": "2j8fj3d9dkj3d9dk223",
"stopName": "Stop 2",
"stopNumber": 2,
"isPickup": false,
"isDelivery": true,
"expectedDate": "2023-01-22",
"appointmentTime": "10:00"
"locationName": "DEF Warehouse",
"street": "333 North Ave.",
"city": "Chicago",
"state": "IL",
"postalCode": "60603",
"country": "US"
}
],
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Stops Payload
The following fields for a Stop record are published to the Event Bus as part of a single Load Payload. Multiple Stop records may be added to a Load payload.
TMS Field | Type | Payload Field |
---|---|---|
Appointment Time | Text(11) | appointmentTime |
Expected Date | Date | expectedDate |
Is Dropoff | Checkbox | isDelivery |
Is Pickup | Checkbox | isPickup |
Location Name | Formula (Text) | locationName |
Number | Number(3, 0) | stopNumber |
Location | Lookup(Account) | street |
Location | Lookup(Account) | city |
Location | Lookup(Account) | state |
Location | Lookup(Account) | postalCode |
Location | Lookup(Account) | country |
Stop | Text(80) | stopName |
stop.Id | Salesforce Record ID | stopId |
Customer Invoice Payload
The following fields for a Customer Invoice record are published to the Event Bus for the accounting integration.
TMS Field | Type | Payload Field |
---|---|---|
(Load) Customer | Salesforce Record ID | customerId |
Currency | Picklist | invoiceCurrency |
Customer Bill To (Billing Contact or Load Customer) | Salesforce Record ID | customerBillToId |
Invoice Date | Date | invoiceDate |
Invoice Due Date | Date | invoiceDueDate |
invoice.id | Salesforce Record ID | invoiceId |
Invoice Number | Text(80) | invoiceNumber |
Invoice Total | Currency(16, 2) | invoiceTotal |
Invoice Total (0 or greater is an Invoice; negative number is a Credit) | Currency(16, 2) | invoiceType |
load.Id | Salesforce Record ID | loadId |
Load | Master-Detail(Load) | loadNumber |
Payment Discount | Currency(16, 2) | paymentDiscount |
Tax Amount | Currency(16, 2) | taxamount |
See Charges Payload | Payload | charges |
Customer Invoice TMS2 Field Set fields | Multiple types | Multiple fields |
Customer Invoice Accessorial TMS1 Field Set fields | Multiple types | Multiple fields |
{
"invoiceId": "1js8dje8dje9dke9ew",
"invoiceNumber": "L-1919293",
"invoiceType": "Invoice",
"customerId": "aus8dje8dje9dke9ew",
"customerBillToId": "aus8dje8dje9dke9ew",
"loadId": "s823js8ew888fk39dk",
"loadNumber": "Load-123",
"invoiceDate": "2023-01-23",
"invoiceDueDate": "2023-02-23"
"invoiceTotal": 2222.50,
"paymentDiscount": 0.00,
"taxAmount": 0.00,
"invoiceCurrency": "USD",
"charges":
[
{
"chargeType": "Freight",
"description": "Freight",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 1.00,
"chargeAmount": 1000.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
},
{
"chargeType": "Fuel",
"description": "Fuel",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 1.00,
"chargeAmount": 1000.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
},
{
"chargeType": "Accessorial",
"description": "Lift Gate Pickup",
"accessorialId": "q2d4s8ewh37su28sj3",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 0.10,
"chargeAmount": 100.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
]
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Vendor Invoice Payload
The following fields for a Vendor Invoice record are published to the Event Bus for the accounting integration.
TMS Field | Type | Payload Field |
---|---|---|
Vendor | Lookup(Account) | vendorId |
Currency | Picklist | invoiceCurrency |
Remit To | Lookup(Account) Salesforce Record ID | vendorRemitToId |
Invoice Date | Date | invoiceDate |
Invoice Due Date | Date | invoiceDueDate |
invoice.id | Salesforce Record ID | invoiceId |
Invoice Number | Text(80) | invoiceNumber |
Invoice Total | Currency(16, 2) | invoiceTotal |
Invoice Total (0 or greater is an Invoice; negative number is a Credit) | Currency(16, 2) | invoiceType |
load.Id | Salesforce Record ID | loadId |
Load | Master-Detail(Load) | loadNumber |
Payment Discount | Currency(16, 2) | paymentDiscount |
See Charges Payload | Payload | charges |
Vendor Invoice TMS2 Field Set fields | Multiple types | Multiple fields |
Vendor Invoice Accessorial TMS1 Field Set fields | Multiple types | Multiple fields |
{
"invoiceId": "1js8dje8dje9dke9ew",
"invoiceNumber": "L-1919293",
"invoiceType": "Invoice",
"vendorId": "aus8dje8dje9dke9ew",
"vendorRemitToId": "1kmd8dk30d3ll30dd",
"loadId": "s823js8ew888fk39dk",
"loadNumber": "Load-123",
"nvoiceDate": "2023-01-23",
"invoiceDueDate": "2023-02-23"
"invoiceTotal": 100.50,
"paymentDiscount": 0.00,
"invoiceCurrency": "USD",
"charges":
[
{
"chargeType": "Freight",
"description": "Freight",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 1.00,
"chargeAmount": 1000.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
},
{
"chargeType": "Fuel",
"description": "Fuel",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 1.00,
"chargeAmount": 1000.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
},
{
"chargeType": "Accessorial",
"description": "Lift Gate Pickup",
"accessorialId": "q2d4s8ewh37su28sj3",
"unit": "Per Mile",
"unitQuantity": 1000,
"unitPrice": 0.10,
"chargeAmount": 100.00,
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
]
"customFields":
[
{
"fieldname": "Custom_Field__c",
"value": "customValue"
}
]
}
Charge Payloads
The following fields for a Charge record are published to the Event Bus as part of Customer and Vendor Invoice payloads. Multiple Charge records may be added to a single Customer or Vendor invoice from the respective objects.
TMS Field | Type | Payload Field |
---|---|---|
Accessorial | Salesforce Record ID
| accessorialId |
Charge | Currency(16, 2) | chargeAmount |
“Freight”/”Fuel”/”Accessorial”/”Adjustment”/”Taxes” | chargeType | |
Accessorial | Lookup(Accessorial) | description |
Adjustment Amount (Customer Invoice Adjustment/Vendor Invoice Adjustment) | Currency(16, 2) | adjustment |
Unit | Picklist | unit |
Unit Price | Number(16, 2) | unitPrice |
Quantity | Number(16, 2) | unitQuantity |
Customer Invoice Accessorial TMS1 Field Set fields (Customer Invoice Payloads ONLY) | Multiple types | Multiple fields |
Vendor Invoice Accessorial TMS1 Field Set fields (Vendor Invoice Payloads ONLY) | Multiple types | Multiple fields |
Freight & Fuel Accessorial Charge Fields
TMS Field | Freight/Type | Fuel/Type |
---|---|---|
Unit | Freight Charge Unit/Picklist | Fuel Surcharge Unit/Picklist |
Unit Price | Freight Charge Unit Price/Currency(16, 2) | Fuel Surcharge Unit Price/Currency(14, 4) |
Quantity | Freight Charge Quantity/Number(16, 2) | Fuel Surcharge Quantity/Number(16, 2) |
Charge | Net Freight Charges/Currency(16, 2) | Fuel Surcharge/Currency(16, 2) |