Follow Up Boss Leads And Airtable

follow up boss and airtable leads

Follow Up Boss is a popular CRM platform for real estate agents and brokers alike. Allowing you to track the lifecycle of a real estate deal all the way from a potential lead, to the final key transfer.

While Follow Up Boss is very customizable and has all of the features you’d expect from a great CRM cloud platform, perhaps you need to do something a little more custom.

A very frequent use case we run into for SheetDream is the desire to sync data from one platform to another. I.e. from Follow Up Boss to Airtable, or vice versa. You may want to pull data out of Follow Up Boss, or any other CRM software, for any number of reasons:

  • Better tooling: such as spreadsheet functions and automations within Airtable
  • Building dynamic dashboards for a better 10,000 ft. view
  • Simplified UI for non-agents to use

There’s a lot of value in being able to pull data out of a CRM platform, eradicate the rest of the noise, and build a custom dashboard to get a really good view of how your business is operating.

Let’s say for example: you want to track the incoming leads that are getting entered into Follow Up Boss.

Everytime a new lead gets created, you want it synced to an Airtable and populated with data from the platform. You intend on using this Airtable for constructing a simple dashboard of demographic information to show where your leads are coming from, as this will help you track and tailor your advertising campaign.

You can accomplish this by setting up a webhook in SheetDream, which you can then register with Follow Up Boss. You can tie your webhook to a specific event. In our case, we’re interested in the “People” object events, which can be seen here (from

supported webhook events in follow up boss

“peopleCreated” is the event we’re interested in.

So to start this process, we’re going to get SheetDream setup first. We create a new project, and we navigate to Data Sources -> Google Sheets, because that is where we’re going to create our webhook.

google sheets data source

[Webhooks are created and managed just like users, or any other table in SheetDream: in your platform of choice, whether that’s Google Sheets or Airtable. For this example, we’re creating the webhooks table in Google Sheets as it’s a little bit simpler to create a new Google Sheet than it is to create a new Airtable specifically for this purpose.]

Then, we head to Google Sheets to construct our webhooks table.

google sheets

As you can see, we’re missing some fields. We’ll fill those in next.

Webhooks consist of 3 different parts within SheetDream:

Field Description
target The target table that new records will be inserted into.
expression A JSONata expression indicating how you want to transform the incoming JSON from the platform (Follow Up Boss in our case) into an object that can be inserted into a spreadsheet or Airtable.
response A JSONata expression for constructing a suitable response to the caller.

We’re going to start with the expression field, for parsing the JSON that gets sent to our webhook from Follow Up Boss, and turning it into something that can be inserted into a table within SheetDream. If you take a look at Follow Up Boss’s documentation you can catch a glimpse at what the JSON looks like that will be getting sent to us:

follow up boss payload

We see a handful of fields here. eventId, eventCreated, event, resourceIds and uri.

The eventId and eventCreated are fairly self explanatory, as is the event field which should always be what we expect it to be (peopleCreated).

The resourceIds is the real ticket here: it’s telling us the IDs of the new people that have been created in the Follow Up Boss platform.

So we want to construct some JSONata to take this sort of JSON payload and transform it into a series of records to be inserted into our “incoming” table in SheetDream. To do that, we’ll copy + paste the above JSON payload into the handy tool to craft our JSONata expression:

jsonata try dialog

Our query expands the resourceIds into a series of records that can be successfully inserted into our incoming table. In our example, we’re creating new records in the incoming table with one single field: peopleId.

We copy + paste the above JSONata into our Google Sheets webhooks sheet:

google sheets webhooks

Next, we need to return a response.

This is a JSONata field used to construct the response you want to return to Follow Up Boss when they call your webhook.

Some platforms expect you to return some sort of acknowledgement to them. Follow Up Boss doesn’t really care, so we can just return something really simple:

adding response jsonata to google sheets

And then, we share this spreadsheet so that SheetDream can read it, and copy + paste the URL into SheetDream:

webhooks table in sheetdream

IMPORTANT: the Destination Table must be called “webhooks”. This is case sensitive!

After saving, we should eventually see SheetDream syncing from our sheet, and our webhook is created.

tables and activity in sheetdream

api tab in sheet dream

We can retrieve our new webhook’s ID by calling our very own API and issuing a GET request on /webhooks:

postman get request

We grab the _id field, which makes our URL for our webhook:

Then, we can take this URL and tell Follow Up Boss about it. Here is the example from the Follow Up Boss documentation:

webhooks documentation blurb

So our JSON we would POST to /v1/webhooks would look like this for our particular webhook:

  “event”: “peopleCreated”,
  “url”: “”

After calling that, Follow Up Boss will give us a confirmation letting us know they’ve registered our webhook.

That’s all fine and dandy. Now we’ve got a steady stream of new people IDs being created on a daily basis and filling our incoming table. These IDs are effectively meaningless to us without some context though, right? So our next step is to then make a subsequent call out to Follow Up Boss where we grab more information about these leads and populate some more fields in our incoming table.

We can do that by leveraging the External API feature of SheetDream.

We add a new API call to our SheetDream project:

API task configuration in sheetdream

From there, we are going to create a query against our incoming table where a field called “processed” does not exist. At the tail end of this API call when we update our data, we’ll be setting this field to true, which will effectively make sure we don’t process the same peopleId more than once:

jsonata window

After that, it’s just a matter of setting up the rest of the API call, and setting up the Data Import section of it correctly. The important thing for the Data Import section is that we set the Table Name to “incoming” (exact same table as the one we’re processing), our Table Key to “_id” (the unique identifier for each record in the incoming table) and that we make sure our JSONata expression includes both _id and processed fields:

  “_id”: __id,
  .. [fields you want to extract from Follow Up Boss] ..,
  “processed”: true

[Hint: if we lost you here, it’s because we skipped over a lot of the API configuration details. If you want to learn more about SheetDream’s API engine, head on over to the documentation here OR read our more in-depth use cases around Twitter syncing and Building a Job Board for a more in depth look at API processing.]

So let’s take a step back and take a look at what we’ve been able to do in pretty short order:

  • We setup a new webhook on SheetDream
  • We registered that webhook with Follow Up Boss, so that they’ll send new “peopleCreated” events to us
  • We setup an API call that repeats every 10 minutes, populating data from the peopleIds we receive from the webhook

The last thing that we have to do is probably the most important: we have to sync it to Airtable. If we don’t do that, well, it kind of defeats the purpose of this whole thing! So we head over to the Data Sources tab of SheetDream once again, and select Airtable:

incoming airtable

Next, we create the “incoming” table in Airtable. Take note that casing matters here, so we have to create a table called exactly that. We add the relevant People fields to this table, including our peopleId and processed fields mentioned above in the API call section.


With that finished, we grab our base ID from our specific Airtable base’s API documentation:

base name in airtable

We also make sure to grab our API key from the API documentation as well:

airtable api key

We fill out the relevant fields in SheetDream and then click Save Configuration.

airtable configuration in sheetdream

In relatively short order, you should begin to see the records within Airtable populate with your dataset.

From here, you can leverage the whole arsenal of tools at your disposal on the Airtable side to build out a relevant dashboard!