How can we help?

Bloom Credit

Report to the bureaus through Bloom Credit.


Ensuring the accuracy and reliability of your credit reporting is critical for maintaining trust with credit bureaus and consumers alike. That’s why LoanPro is integrated with Bloom Credit, offering a comprehensive solution for credit data validation and submission. Bloom manages nearly all aspects of the credit reporting process for you. From running 482 validations and quality checks to handling disputes, Bloom is an excellent choice for lenders looking to minimize administrative burden and maximize operational efficiency.

This article will guide you through setting up and using the Bloom Credit integration within LoanPro. To start, here’s an overview of the process.

 

Setup and configuration

First, you’ll need to sign up with Bloom Credit directly. Connect with your regular LoanPro contact, and they can help you get started.

Integration setup

Once signed up, Bloom will give you the following information, which you should pass back to LoanPro:

  • API Keys
  • Bloom Organization ID
  • Bloom Credit Product ID

LoanPro will use that information to set up the integration in your LoanPro LMS tenant.

Credentialing and access

Before activating this integration, you must be credentialed for data furnishing with your preferred credit bureau(s). The Bloom team can guide you through this process.

Additionally, make sure you have e-OSCAR access, as it’s required for handling credit bureau disputes. Registration with e-OSCAR must be completed before you can submit account data as tradelines to a consumer’s credit report. 

Data synchronization

Data is synced automatically once a month using webhooks that update your data based on changes to the account. This includes updates such as loan activations, address or phone number changes, ECOA code updates, status changes to 'Paid Off,' and more. Below, this article explains how to set up and use webhooks for creating and updating consumer and account information in Bloom.

Webhook for consumer and account creation

Upon loan activation or based on your defined business logic, LoanPro will create a Bloom ‘Consumer’ linked to the LoanPro ‘Customer’ object, and an ‘Account’ linked to the LoanPro ‘Loan’ or ‘Line of Credit’ objects.

In order to do this, we recommend you use the loan activation event-based triggers for this webhook.

Here’s a payload example:

  • Loan ID: [[v('loan-display-id')]]
  • Customer primary ID: [[v('customer.primary.id')]]
  • Customer secondary ID: [[v('customer.secondary.id')]]
  • Tenant ID: [[v('tenant-id')]]

Webhook for consumer and account events

Similar to the above, consumer and account events will use event-based notifications. The LoanPro implementation team has pre-defined the rules for these webhooks and will provide them to you during setup.

Here’s a payload example:

  • Event type: [[v(‘event-type’)]]
  • Event name: [[v(‘event-name’)]]
  • Tenant ID: [[v('tenant-id')]]
  • Loan display ID: [[v('loan-display-id')]]
  • Customer primary ID: [[v('customer.primary.id')]]
  • Customer secondary ID: [[v('customer.secondary.id')]]
  • Bloom Consumer Custom Field: [[v('Bloom Consumer Custom Field')]]
  • Bloom Account Custom Field: [[v('Bloom Account Custom Field')]]

Monthly reporting

Credit reporting is typically carried out monthly, but can vary based on your specific needs. On a designated date and time, LoanPro gathers relevant loan data and sends it to Bloom. Bloom then performs approximately 482 data validations and quality checks, ensuring  the highest accuracy of consumer information submitted to credit bureaus. They also provide exception reports. This rigorous process helps prevent errors and decreases the likelihood of disputes. In the event of discrepancies, however, Bloom can support you in dispute resolution, adding an extra layer of reliability to your credit reporting processes.  

Credit status notification events

LoanPro sends monthly Consumer and Account events to Bloom. To facilitate this, we recommend setting up event-based triggers within LoanPro. For ‘Consumer’ events, we recommend using a checklist to manage these triggers.
 

Bloom event LoanPro event and triggers Payload
Add_secondary_consumer

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Add Secondary Consumer” 
  • Event: Unchecked to checked - IF a secondary borrower exists on loan.
{     
   "bloom_login_client_id": "[id goes here],   
   "lp_tenant_id": "[[v('tenant-id')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "lp_loan_settings_id": "[[v('settings-id')]]",
   "event_name": "add_secondary_consumers",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "bloom_cust_cf_val": "[[v('customer.secondary.customer-custom-fields.id18.value')]]",
   "lp_cust_id": "[[v('customer.secondary.id')]]",
   "ssn": "[[v('customer.secondary.ssn')]]",
   "dob": "[[v('customer.secondary.birthdate')]]",
   "first_name": "[[v('customer.secondary.first-name')]]",
   "last_name": "[[v('customer.secondary.last-name')]]",
   "address": "[[v('customer.secondary.primary-address1')]]",
   "city": "[[v('customer.secondary.primary-city')]]",
   "state": "[[v('customer.secondary.primary-state')]]",
   "zip": "[[v('customer.secondary.primary-zipcode')]]",
   "phone": "[[v('customer.secondary.primary-phone-number')]]",
   "email": "[[v('customer.secondary.email')]]"
}
Remove_secondary_consumer

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist Change 
  • Checklist name: “Bloom Account Events - Remove Secondary Consumer” 
  • Event: Checked to unchecked - IF a secondary borrower exists on loan.
     
{    
   "bloom_login_client_id": "[id goes here],    
   "lp_tenant_id": "[[v('tenant-id')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "lp_loan_settings_id": "[[v('settings-id')]]",
   "event_name": "remove_secondary_consumers",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "bloom_cust_cf_val": "[[v('customer.secondary.customer-custom-fields.id18.value')]]",
   "lp_cust_id": "[[v('customer.secondary.id')]]",
   "ssn": "[[v('customer.secondary.ssn')]]",
   "dob": "[[v('customer.secondary.birthdate')]]",
   "first_name": "[[v('customer.secondary.first-name')]]",
   "last_name": "[[v('customer.secondary.last-name')]]",
   "address": "[[v('customer.secondary.primary-address1')]]",
   "city": "[[v('customer.secondary.primary-city')]]",
   "state": "[[v('customer.secondary.primary-state')]]",
   "zip": "[[v('customer.secondary.primary-zipcode')]]",
   "phone": "[[v('customer.secondary.primary-phone-number')]]",
   "email": "[[v('customer.secondary.email')]]"
}
Voluntary_surrender

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Voluntary Surrender” 
  • Event: Unchecked to checked - IF Credit_status equals 95 - Voluntary surrender OR equals 61
     
{
   "acct_event_name": "voluntary_surrender",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]"
}
Repossession

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Repossession” 
  • Event: Unchecked to checked - IF Credit_status equals 96 - Merchandise was repossessed; there may be a balance due. OR Credit-status equals 63
{
   "acct_event_name": "repossession",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]"
}
Close

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Close” 
  • Event: Unchecked to checked - IF Credit_status  equals 13 - Paid OR closed account/zero balance
{
   "acct_event_name": "close",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]"
}
Charge_off

What gets sent: 

  • Payload via Webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Add Secondary Consumer” 
  • Event: Unchecked to checked - IF Credit_status equals 97 - Unpaid balance reported as a loss (charge-off) OR Credit_status equals 64
{
   "acct_event_name": "charge_off",
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "charge_off_amt": "[[v('status-net-charge-off')]]"
}
Delete_fraud

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name:“Bloom Account Events - Delete Faud” 
  • Event: Unchecked to checked
{
   "acct_event_name": "delete_df",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]"
}
Delete_other

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name: “Bloom Account Events - Delete Other” 
  • Event:Unchecked to checked
{
   "acct_event_name": "delete_da",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_id": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]"
}
Account_update

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Event-based trigger - Send webhook: Checklist change 
  • Checklist name:“Bloom Account Events - Account Update” 
  • Event: Unchecked to checked - IF checklist was clicked more recently than last update.
{        
   "lp_loan_id": "[[v('loan-id')]]",
   "lp_loan_settings_id": "[[v('settings-id')]]",
   "bloom_cons_list_cf_val": "[[v('settings-custom-fields-array.id16.value')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "prim_ecoa": "[[v('settings-ecoa-code')]]",
   "prim_bloom_cons_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "sec_ecoa": "[[v('settings-co-buyer-ecoa-code')]]",
   "sec_bloom_cons_id": "[[v('customer.secondary.customer-custom-fields-array.id18.value')]]"
}

For bankruptcy-related Bloom events, you need to add a webhook to your existing bankruptcy process. This will notify LoanPro to send bankruptcy consumer events to Bloom. 

Bloom event LoanPro event and triggers Payload
Bankruptcy_filed

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Based on an existing trigger from the client's bankruptcy process.
{
   "cons_event_name": "bankruptcy_filed",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "bloom_consumer_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "lp_cust_id": "[[v('customer.primary.id')]]",
   "bankruptcy_chapter": "[[v('bankruptcy-chapter')]]",
   "bankruptcy_filing_date": "[[v('bankruptcy-filing-date')]]",
   "bankruptcy_case_num": "[[v('bankruptcy-case-number')]]"
}
Bankruptcy_reaffirmed

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Based on an existing trigger from the client's bankruptcy process.
{
   "cons_event_name": "bankruptcy_reaffirmed",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "bloom_consumer_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "lp_cust_id": "[[v('customer.primary.id')]]"
}
Bankruptcy_withdrawn

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Based on an existing trigger from the client's bankruptcy process.
{
   "cons_event_name": 
"bankruptcy_withdrawn",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "bloom_consumer_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "lp_cust_id": "[[v('customer.primary.id')]]"
}
Bankruptcy_reaffirm_recinded

What gets sent: 

  • Payload via Webhook

How this gets sent: 

  • Based on an existing trigger from the client's bankruptcy process.
     
{
   "cons_event_name": "bankruptcy_reaffirm_rescinded",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "bloom_consumer_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "lp_cust_id": "[[v('customer.primary.id')]]"
}
Bankruptcy_discharged

What gets sent: 

  • Payload via webhook

How this gets sent: 

  • Based on an existing trigger from the client's bankruptcy process.
{
   "cons_event_name": "bankruptcy_discharged",
   "bloom_login_client_id": "[id goes here],
   "lp_tenant_id": "[[v('tenant-id')]]",
   "bloom_acct_cf_val": "[[v('settings-custom-fields-array.id17.value')]]",
   "lp_loan_id": "[[v('loan-id')]]",
   "bloom_consumer_id": "[[v('customer.primary.customer-custom-fields-array.id18.value')]]",
   "lp_cust_id": "[[v('customer.primary.id')]]"
}
 
 


Handling historical data

Before we launch your Bloom integration, LoanPro will make sure all of your existing customer and account data is accurately accounted for and transferred smoothly at go-live. 


console.log(location);