Skip to main content

Follow Up Boss — complete guide

Single reference for connecting Aventora Engagement Hub with Follow Up Boss (FUB): platform setup, tenant and user administration, embedded apps, agent workflows, activity sync back to FUB, tag automation, and integrator APIs.

Audience: Aventora admins/delegates, Follow Up Boss admins, real-estate agents, Aventora platform ops, integrators.

Related platform docs: API_SECURITY_MODEL.md (call-management API keys), BULK_CALL_CSV_GUIDE.md (CSV bulk from Admin — separate from FUB Smart List campaigns), AVENTORA_CRM.md (Aventora CRM / Twenty integration)

Hub implementation (engineers): Aventora-Assistant repo — docs/followupboss-integration.md, docs/fub-userguide.md (mirrors this document)


Table of contents

  1. How the integration works
  2. Who does what
  3. Prerequisites
  4. One-time platform setup (Aventora ops)
  5. Tenant settings (Aventora Admin)
  6. Per-user settings (Aventora Admin)
  7. Register embedded apps in FUB
  8. Two deployment tracks
  9. Track A — Shared FUB brokerage
  10. Track B — Separate FUB account per agent
  11. Day-to-day operations
  12. What syncs back to FUB
  13. What not to use for per-user outreach
  14. Troubleshooting
  15. Quick checklists
  16. Appendix: API & integrators

How the integration works

When FUB is enabled on a tenant, the Hub can:

  1. Start outreach from FUB — agents use embedded apps (single contact or Smart List bulk), or automations/API start calls on the tenant’s behalf.
  2. Sync activity back to FUB — when contact sync is on, the Hub resolves or creates FUB people and logs calls, SMS, WhatsApp, chat, and email activity on the matching person record.
FUB (embed / tag / API) → Aventora Hub → voice / SMS / email / chat

FUB person record (calls, texts, notes)

Per-agent identity: Embedded apps run as the FUB user who opened the iframe. The Hub maps that user by phone number to an Aventora user and applies that user’s outreach phone and optional per-user FUB API key.

Tenant-level flows: Tag webhooks and API-only starts do not know which FUB agent is acting. Use embedded apps when each agent must have separate caller ID and CRM attribution.

Where settings live (three layers)

FUB configuration is layered. Each layer authenticates something different — none replaces another:

LayerWhere setAuthenticatesKey settingsRequired?
PlatformHub server .env (Aventora ops)Aventora as a registered FUB system (X-System / X-System-Key headers on every FUB API call)FUB_SYSTEM, FUB_SYSTEM_KEYYes — without FUB_SYSTEM_KEY no FUB feature works at all (no sync, no webhooks, connection test fails), regardless of account/user keys
TenantAventora Admin → Account settings → CRMThe tenant’s data in FUB (HTTP Basic with fub_api_key)Provider, fub_api_key, Sync contacts, fub_start_call_tag, fub_embedded_app_secret, fub_campaign_embedded_app_secretYes per tenant — provider + API key + Sync contacts
UserAventora Admin → User account settingsThe acting agentOutreach phone, fub_api_key, fub_embedded_app_secretPhone required for per-agent identity; API key required in Track B, optional in Track A

Who does what

RoleResponsibility
Aventora platform opsOne-time Hub deployment: register Aventora as a FUB system, set platform env vars
Aventora admin / delegateTenant CRM settings, per-user phones and API keys, connection test, embed URLs for agents
FUB adminRegisters embedded apps (Track A: once for the brokerage; Track B: each agent in their own FUB); optional tag webhook in FUB
AgentUses embedded apps while logged into FUB as themselves

Prerequisites

Before you start:

  • Aventora admin access for your tenant (examples below use fub-test)
  • Each agent (e.g. u1, u2) as a user on that tenant
  • Each agent’s outreach phone (mobile or direct line for caller ID and call bridging)
  • FUB access for each agent
  • Hub call management billing/credits configured for the tenant (required for bulk campaigns)

For per-user outreach, agents should start engagements from the embedded apps in FUB.


One-time platform setup (Aventora ops)

These steps are done once per Hub deployment, not per customer tenant.

This layer is not optional. Account- and user-level API keys identify whose data is accessed, but FUB also requires the calling system to identify itself on every API call. Without FUB_SYSTEM_KEY, the Hub builds no FUB sync configuration at all — contact sync silently stays off, tag webhooks are rejected, and the connection test fails with FUB_SYSTEM_KEY is not configured on the Hub server.

  1. Register Aventora as a FUB system — follow FUB’s integration guide.
  2. Set Hub environment variables (Engagement Hub .env):
VariableRequiredPurpose
FUB_SYSTEMYes (defaults to Aventora)Registered system name; sent as X-System header on every FUB API call
FUB_SYSTEM_KEYYesSystem key from FUB registration. Sent as X-System-Key on every FUB API call; verifies tag-webhook signatures (FUB-Signature HMAC); final fallback for the embed secret. All FUB features are disabled without it
SERVER_URLFor webhooksPublic Hub URL (e.g. https://phone.aventora.ai); used only for FUB webhook registration
FUB_EMBEDDED_APP_SECRETNoPlatform-wide embed iframe secret for the single-contact app when tenants share one Aventora FUB app. Falls back to FUB_SYSTEM_KEY if unset; per-tenant fub_embedded_app_secret overrides both
FUB_CAMPAIGN_EMBEDDED_APP_SECRETNoPlatform-wide embed secret for the campaign (Smart List) app. FUB issues a distinct secret per app registration — set when it differs from the single-contact secret
INTERNAL_START_URLNoLoopback for internal /start (default http://127.0.0.1:{PORT}). Do not point this at SERVER_URL

Production note: If embed starts fail with Integration internal /start failed / Name or service not known, the Hub was likely using SERVER_URL for loopback. Use default loopback or set INTERNAL_START_URL=http://127.0.0.1:8010. Keep SERVER_URL for public webhooks only.


Tenant settings (Aventora Admin)

In Aventora Admin → Account settings → CRM, set CRM provider to Follow Up Boss.

SettingWhat it does
FUB_API_KEYAPI key from FUB Admin → API (HTTP Basic username). Owner/admin key recommended if using tag webhooks. Default for all agents unless overridden per user.
Sync contacts (fub_sync_contacts)When on: Hub resolves/creates FUB contacts and logs calls, messages, and notes on completion. Required for activity sync and Smart List campaigns.
FUB_START_CALL_TAGOptional. When this tag is added to a person in FUB, Hub starts an outbound engagement (requires FUB webhook — see Tag-triggered outreach).
FUB_EMBEDDED_APP_SECRETSecret from your single-contact FUB embedded app registration. Leave blank if your org uses the platform-wide Aventora FUB app (FUB_EMBEDDED_APP_SECRET on Hub).
FUB_CAMPAIGN_EMBEDDED_APP_SECRETSecret from your campaign (Smart List) FUB embedded app registration. FUB issues a different secret per app — set this when it differs from the single-contact secret.

After saving, use Test connection to validate the API key. The test requires FUB_SYSTEM_KEY on the Hub server.

Embedded app URLs (shown in admin; register these in FUB Admin → Embedded Apps):

AppURL (US)URL (Canada)
Single contacthttps://phone.aventora.ai/integration/followupboss/embedhttps://phone.aventora.ca/integration/followupboss/embed
Smart List campaignhttps://phone.aventora.ai/integration/followupboss/campaignhttps://phone.aventora.ca/integration/followupboss/campaign

For Track B (separate FUB accounts), append the tenant slug:
…/embed?domain_name=fub-test and …/campaign?domain_name=fub-test.

Embed secret resolution order (candidates tried in order until the signature verifies):

AppOrder
Single contactaccount fub_embedded_app_secret → Hub FUB_EMBEDDED_APP_SECRET → Hub FUB_SYSTEM_KEY
Campaignaccount fub_campaign_embedded_app_secret → account fub_embedded_app_secret → Hub FUB_CAMPAIGN_EMBEDDED_APP_SECRET → Hub FUB_EMBEDDED_APP_SECRET → Hub FUB_SYSTEM_KEY

Per-user settings (Aventora Admin)

Open User account settings for each agent who will use embedded apps.

SettingWhen to set
default_broker_phone / display_numberAgent’s outreach phone. Must match the phone on that agent’s FUB user profile (the number FUB sends when they open the embed).
fub_api_keyAgent’s own FUB API key. Required in Track B; optional in Track A if agents share the brokerage key.
fub_embedded_app_secretOnly if that agent registered embedded apps with their own FUB app secrets (Track B hybrid setups).

Each agent must exist as a domain user on the tenant. If FUB does not send user.phone in embed context, the Hub cannot map the agent and falls back to account-level API key and default broker phone.


Register embedded apps in FUB

Register two embedded apps in FUB Admin → Embedded Apps:

App name (example)PurposeURL
AventoraCall or message one contact from a person recordSingle-contact embed URL above
Aventora CampaignBulk outreach from a Smart ListCampaign embed URL above

Each app registration gets its own secret from FUB. When you save an embedded app, FUB shows you a secret key for that app — the two apps will have different secrets. Record both and store them in Aventora (tenant settings fub_embedded_app_secret and fub_campaign_embedded_app_secret, or the platform-wide Hub equivalents — your Aventora admin confirms which).

Agents see these apps in FUB after they are saved. The apps run in a sidebar iframe on the person record (single contact) or as a standalone panel (campaign). There is no FUB modal API — the Hub uses an inline form inside the iframe.


Two deployment tracks

Most teams fit one of these models:

TrackBest for
Track A — Shared FUB brokerageOne FUB account for the whole team; agents log in as themselves under that brokerage
Track B — Separate FUB account per agentEach agent owns their own FUB subscription
QuestionTrack ATrack B
One FUB subscription for the team?YesNo — each agent has their own
Shared contact database?YesNo
Who installs embedded apps?Brokerage FUB admin, onceEach agent in their own FUB
FUB API key in AventoraOne default + optional per userRequired per user
Link tenant to FUBFUB brokerage account.domain = tenant slug (e.g. fub-test)Embed URL always includes ?domain_name=fub-test

You can mix ideas (e.g. shared brokerage with per-user API keys). Talk to your Aventora admin for hybrid setups.


Track A — Shared FUB brokerage

Use this when the whole team works under one Follow Up Boss brokerage and agents have their own logins inside that account.

Step 1: Confirm the tenant name

Your Aventora tenant slug is fub-test. Use this name consistently in admin and with your Aventora team.

Step 2: Match FUB to Aventora

In Follow Up Boss (brokerage admin):

  1. Open brokerage / account settings.
  2. Set the brokerage domain (or equivalent identifier) to fub-test so it matches your Aventora tenant (accounts.domain_name).

If these names do not match, embedded apps may not connect to the right tenant.

Step 3: Turn on FUB on the tenant

In Aventora Admin → Account settings → CRM for fub-test:

  1. Set CRM provider to Follow Up Boss.
  2. Turn on Sync contacts.
  3. Add the brokerage FUB API key (FUB Admin → API).
  4. Save and run Test connection.

Step 4: Register embedded apps (once, brokerage FUB admin)

In FUB Admin → Embedded Apps, add Aventora and Aventora Campaign using the URLs from Tenant settings.


A2 — Set up each agent (u1 and u2)

Repeat for u1, then u2.

Step 5: Agent exists on Aventora

Each agent must be a user on tenant fub-test.

Step 6: Set each agent’s outreach phone

In Aventora Admin → User account settings:

  1. Select u1 (then u2).
  2. Set broker / outreach phone (default_broker_phone or display_number).
  3. This number must match the phone on that agent’s FUB user profile.

u1 and u2 must use different phones for separate caller ID and attribution.

Step 7 (optional): Personal FUB API key per agent

Only if an agent uses their own FUB API key instead of the brokerage default:

  1. In User account settings, add their FUB API key.
  2. Save.

If skipped, both agents use the brokerage key; outreach is still separated by phone.

Step 8: Agents in FUB

In Follow Up Boss:

  1. u1 and u2 each have their own FUB login under the same brokerage.
  2. Profile phone matches Step 6.
  3. They can open contacts and Smart Lists they are allowed to use.

A3 — Running outreach (Track A)

See Day-to-day operations below.


A4 — Verify (Track A)

Checku1u2
Opens Aventora on a test contact
Test call uses their phone / caller ID
Activity appears on the FUB person
Campaign from their Smart List runs under their identity

Track B — Separate FUB account per agent

Use this when u1 and u2 each have their own FUB subscription — there is no shared brokerage. They still share one Aventora tenant (fub-test) for calls and AI.

How this model works

SystemWhat is sharedWhat is per agent
AventoraOne tenant (fub-test)Phone, FUB API key, optional embed secret
FUBNothing — separate accountsContacts, Smart Lists, login, API key

Each agent’s embed apps must tell Aventora to route to tenant fub-test via ?domain_name=fub-test in the embed URLs, even though their FUB accounts are different.


B1 — Set up the Aventora tenant (once)

Step 1: Confirm tenant fub-test

Admin ensures tenant fub-test exists and FUB integration is enabled (Sync contacts on).

Step 2: Tenant CRM settings

In Aventora Admin → Account settings → CRM for fub-test:

  1. CRM provider: Follow Up Boss.
  2. Sync contacts: on.
  3. Default brokerage FUB API key: optional placeholder — each agent’s own key (Step B5) does the real work.

You do not need to match a single FUB brokerage domain to fub-test in this track.

Step 3: Get embed URLs for agents

Use embed URLs that include the tenant:

  • https://phone.aventora.ai/integration/followupboss/embed?domain_name=fub-test
  • https://phone.aventora.ai/integration/followupboss/campaign?domain_name=fub-test

(Canada: replace host with phone.aventora.ca.)

Every agent pastes these same URLs into their own FUB Admin.


B2 — Set up each agent (u1 and u2)

Repeat for u1, then u2.

Step 4: Agent on Aventora

u1 (then u2) is a user on tenant fub-test.

Step 5: Connect the agent’s own FUB

In Aventora Admin → User account settings for u1:

  1. Add u1’s FUB API key (from u1’s FUB → Admin → API). Required in this track.
  2. Set u1’s outreach phone.
  3. If u1 registered embedded apps with their own secrets, add the embed secret (admin will confirm).

Repeat for u2 with u2’s API key and phone.

Step 6: Install apps in the agent’s own FUB

u1 logs into their Follow Up Boss (not u2’s):

  1. FUB Admin → Embedded Apps.
  2. Add Aventora and Aventora Campaign — URLs from Step B3, including domain_name=fub-test.

u2 repeats in their own FUB account.

Step 7: Phone alignment

u1’s FUB profile phone = outreach phone in Aventora for u1. Same for u2.


B3 — Verify (Track B)

Checku1u2
Apps installed in their own FUB
Their own FUB API key in Aventora user settings
Test call from embed uses their phone
Sync appears in their FUB only
u1 does not see u2’s contacts in embed

Day-to-day operations

Ways to start outreach

MethodPer-agent identityBest for
Embedded app — single contactYesAgent calls/messages one person from their FUB record
Embedded app — campaignYesAgent bulk-outreaches a Smart List
Tag on personNo (tenant-level)Automation when a tag is added in FUB
Hub APINoMiddleware, custom integrations

Single contact (embedded app)

  1. Agent logs into FUB as themselves.
  2. Opens a person with a valid phone (or email for email channel).
  3. Opens the Aventora embedded app in the sidebar.
  4. Chooses call type, channel, and instructionStart.

The Hub reads the contact phone from FUB, starts the engagement, and syncs activity back to that person under the agent’s identity.

Call types (embed): Informational, Appointment booking, Confirmational, Conversational.

Channels (single-contact embed): Phone, SMS, WhatsApp message, WhatsApp voice, Chat, Email.

Bulk Smart List campaign (embedded app)

  1. Agent logs into FUB as themselves.
  2. Opens Aventora Campaign (sidebar or pinned app). No open person record is required.
  3. Picks a Smart List (created and managed in FUB as usual).
  4. Sets channel, call type, and instruction → Start campaign.

The Hub paginates all people in the list, queues engagements with source_system=followupboss, and returns batch/queued/skipped counts.

Channels (campaign embed): Phone, SMS, Email only. People without a valid phone (or email for email channel) are skipped.

Requirements: Sync contacts on, valid fub_api_key (lists people via FUB API), Hub call-management API key on the account for billing/submit.

Note: FUB Smart List campaigns are started from the embedded app inside Follow Up Boss. CSV bulk upload from Aventora Admin is a separate flow — see BULK_CALL_CSV_GUIDE.md.

Tag-triggered outreach

For tenant-level automation (not per-agent):

  1. Set FUB_START_CALL_TAG in account settings (e.g. Aventora Call).

  2. Register a FUB webhook for peopleTagsCreated pointing to:

    {SERVER_URL}/integration/followupboss/webhook/{domain_name}

    Example: https://phone.aventora.ai/integration/followupboss/webhook/fub-test

    Registration options:

    • FUB Admin — add the webhook manually in FUB.
    • Hub API — after saving settings, call the connection test with "register_fub_webhook": true (Aventora ops / integrators).
  3. When the tag is added to a person, Hub fetches the person, reads the primary phone, and starts an outbound engagement.

Webhook requests are verified via the FUB-Signature header (HMAC-SHA256 of base64-encoded body using FUB_SYSTEM_KEY).


What syncs back to FUB

When Sync contacts is enabled (fub_sync_contacts=true):

At call start

Hub looks up the person by phone/email (GET /v1/people). If missing, creates the contact via POST /v1/events (preferred over creating people directly).

During and after the engagement

As transcript rows are recorded, the Hub syncs unsynced messages to FUB:

Hub channelWhat appears in FUB
SMS, WhatsApp message (sms, wmsg)Notes with channel-labeled subject and inbound/outbound direction
Chat, emailNotes with channel-labeled subject
Phone, WhatsApp voice (phone, wvoice)Call log on completion (POST /v1/calls) with summary, outcome, and duration

Initial engagement.created events are not synced to FUB.

Call outcome mapping

Hub outcomeFUB call outcome
no_answerNo Answer
voicemailLeft Message
busyBusy
invalid_phone, bad_numberBad Number
connected, delivered, completedInterested
not_interestedNot Interested

Other Hub outcomes may map to FUB-native outcome labels when they match FUB’s allowed values.


What not to use for per-user outreach

These flows run at tenant level, not as a specific FUB agent:

  • Starting calls by adding a configured tag in FUB (tag webhook)
  • API / middleware starts that do not include embed context or acting user
  • POST /integration/followupboss/start-from-person without per-user context

For u1 and u2 to keep separate identity, use the embedded apps while logged into FUB as themselves.


Troubleshooting

ProblemWhat to check
Embed says domain not foundTrack A: FUB brokerage domain matches tenant slug. Track B: embed URL includes ?domain_name=your-tenant.
Wrong caller ID or shared identityAgent phone in Aventora user settings matches FUB profile; agents use embed while logged in as themselves.
Contacts or Smart Lists missingTrack B: that agent’s own FUB API key in user settings. Track A: agent has access in shared FUB.
Embed won’t open / unauthorizedEmbed secret matches Aventora expectations. Single-contact app: fub_embedded_app_secret / FUB_EMBEDDED_APP_SECRET. Campaign app: fub_campaign_embedded_app_secret / FUB_CAMPAIGN_EMBEDDED_APP_SECRET — FUB issues a different secret per app, so check you stored the right one for the failing app.
Activity not in FUBSync contacts enabled; connection test passed; person has matching phone/email.
Campaign queues nothingSmart List has people with valid phone (or email for email channel); sync contacts and API key set.
Tag webhook does not start callsFUB_START_CALL_TAG set; webhook registered to correct {SERVER_URL}/integration/followupboss/webhook/{domain_name}; FUB_SYSTEM_KEY on Hub.
Embed start fails internallyHub INTERNAL_START_URL or loopback — see One-time platform setup.
CRM connection test failsValid FUB API key; Hub has FUB_SYSTEM_KEY; save settings before test if using masked key in UI.

Quick checklists

Track A — shared brokerage (fub-test + u1 + u2)

  1. ☐ FUB brokerage domain = fub-test
  2. ☐ Tenant CRM: Follow Up Boss, Sync contacts on, brokerage API key
  3. ☐ Both embedded apps registered once in brokerage FUB
  4. ☐ u1 & u2 on Aventora with outreach phones matching FUB profiles
  5. ☐ (Optional) per-user FUB API keys
  6. ☐ Connection test passed
  7. ☐ Each agent tests single contact + campaign from embed as themselves

Track B — separate FUB accounts (fub-test + u1 + u2)

  1. ☐ Tenant fub-test on Aventora, Sync contacts on
  2. ☐ Embed URLs include ?domain_name=fub-test
  3. ☐ u1 & u2 on Aventora with own FUB API keys and phones
  4. ☐ Each agent installs both apps in their own FUB
  5. ☐ Phones match FUB profile ↔ Aventora user settings
  6. ☐ Connection test passed (per agent key if testing user-scoped API)
  7. ☐ Each agent tests single + bulk; CRM data stays in their own FUB

Optional tag automation

  1. FUB_START_CALL_TAG set in tenant CRM settings
  2. ☐ FUB webhook peopleTagsCreated → Hub webhook URL
  3. ☐ Test tag on a person with a valid primary phone

Appendix: API & integrators

Canonical reference: ENGAGEMENT_HUB_START_API.md — full /integration/start and /start documentation (phone, SMS, email with email_body_html, templates, lifecycle).

For middleware or custom automation (tenant-level, not per-agent embed context). Hub base URL examples: https://phone.aventora.ai (US), https://phone.aventora.ca (Canada). Authenticate with the account call-management API key — see API_SECURITY_MODEL.md.

Start from FUB person ID

POST /integration/followupboss/start-from-person
Authorization: Bearer {call_management_api_key}
Content-Type: application/json

{
"domain_name": "fub-test",
"person_id": "12345",
"type": "informational",
"instruction": "Optional call script",
"channel": "phone"
}

Generic integration start

POST /integration/start
Authorization: Bearer {call_management_api_key}
Content-Type: application/json

{
"phone_number": "+14165550000",
"domain_name": "fub-test",
"source_record_id": "12345",
"source_org_id": "fub-test",
"source_system": "followupboss",
"type": "informational"
}

Connection test (includes optional webhook registration)

POST /account-settings/test-crm-connection
{
"domain_name": "fub-test",
"crm_sync_provider": "followup_boss",
"fub_api_key": "...",
"fub_sync_contacts": true,
"register_fub_webhook": false
}

External references

  • Follow Up Boss API reference
  • Hub code map: Aventora-Assistantservices/crm_sync/fub_client.py, server/routers/integration_followupboss.py
  • Technical env/API appendix: Aventora-Assistant/docs/followupboss-integration.md

See also