Salesforce Synchronization

Custom objects and Synchronization order

Whilst most objects in BillForward have two-way synchronization, some currently do not.

One-way: BillForward -> Salesforce

Data from the following types is synced from BillForward to Salesforce.

  • Product
  • ProductRatePlan
    • PricingComponent
      • FPricingComponentTier
  • PricingComponentValue
  • Receipt

Two-way: BillForward <-> Salesforce

Data from the following types are synced from BillForward to Salesforce and also editable in Salesforce natively.

  • Account
    • Profile
    • Address
  • Subscription
  • Invoice
  • CreditNote
  • PaymentMethod
  • BFPayment
  • Refund
  • Metadata


Individual types are synchronized to Salesforce based on created or updated time. Only the most recent version of any data is synchronized.

Records are also synced in a well defined order, this is to preserve referential integrity.

  1. Product
  2. RatePlan
  3. PricingComponent
  4. PricingComponentTier
  5. Account
  6. Profile
  7. Subscription
  8. PricingComponentValue
  9. Invoice
  10. CreditNote
  11. PaymentMethod
  12. Payment
  13. Receipt
  14. Refund
  15. Metadata


Metadata in BillForward is automatically synchronized against the corresponding Salesforce object. To facilitate this properties are dynamically added to the Salesforce type based on the metadata key and value.

As a new property is added it will not be in the default layout. Thus to display the metadata field the layout must be manually edited via the setup page.

See Adding metadata field to layout below for steps to add metadata columns

Resources and Limitations

Data usage

Salesforce has a restriction in the amount of data that can be stored. This should be taken into consideration when deploying the BillForward integration.

As an indicative number: 1,000 subscriptions billed monthly for 1 year would take between 20MB to 30MB. This represents:

  • 1,000 accounts
  • 12,000 invoices
  • 12,000 receipts
  • 12,000 payments
  • 1,000 payment methods

It is worth noting Salesforce imposes a minimum 2kb size per record regardless of the number of columns.

API usage

The the API calls needed per 24 hours can be estimated based on the amount of data and the frequency of the Salesforce synchronization.

Current usage values can be seen on the Salesforce system page.

Records are automatically synced using the Salesforce batch API to reduce round trips and number of API requests consumed.


The frequency of the synchronization job is customizable, by default it is set to a 15 second interval. This can be tweak based on the number of API requests available for that instance. If there are surplus API requests the sync interval can be lowered or if there is not enough API requests it can be slowed down.


Salesforce native Product and Pricebook have been associated with BillForward Objects to enhance the quoting flow by using BillForward quoting system.

A default BillForward All pricebook is automatically created in Salesforce. For each rate-plan in BillForward a Salesforce Product is created and linked to a BFRatePlan. These Salesforce Products can be added to multiple pricebooks manually.

When performing the quote process a Pricebook is selected per a quote.

Account hierarchy

Salesforce Account/Contact and BFAccount association can also be customized as required. This facilitates organizations who have one layer or hierarchy structure of accounts

Adding metadata field to layout

Step 1: Metadata column added to type

The metadata column has been added to this Account type.
The field has been named `bfMeta_METADATA-KEY__c`. Note the type of the metadata field. This can vary based on what is stored in the metadata.


Step 2: Add Metadata column to layout

Edit the Accounts layout type. Adding the `Foo` metadata type to the layout.


Step 3: Permission Metadata column for appropriate users

To be able to see the `Foo` field users must be permissioned.


Example Salesforce System Page

The below screen shows the Salesforce System Overview page. This indicates the number of API requests currently in use, and the data used.







Was this article helpful?