Contacts
Sidebar: CRM → Contacts
Contacts are the centre of the platform. Forms, bookings, checkout, tracked URLs with a lead gate, blog sign-ins, the API and the Active Search all write here, and the CRM, e-mails and campaigns all read from here.
The contact record
Basic information
Name · Company · E-mail · Phone (with country dial code) · Website · Photo.
Address
Postal code · State · City · District · Street · Number · Complement · Reference · Country.
Marketing & origin
Origin (free text — where the lead came from, in your own words) and the five UTM parameters: Source, Medium, Campaign, Term, Content.
A lead captured by a form, a booking or a sign-up inherits the attribution of the visit
it came from — the same Source, Medium and Campaign that
Analytics recorded for that
visit, so the two always agree. That covers the UTM tags on the link, an advertising
click with no tags (a Google Ads click arrives as ads / google-ads) and the site the
visitor came from, such as a Google or YouTube search. Any of the three fields you send
yourself is kept as you sent it; only the empty ones are filled in.
Ad click ID is the click itself, kept next to the campaign fields and shown with a
copy button. Where the five UTMs say which campaign a lead came from, this says which
click — the gclid, fbclid or equivalent the ad platform put on the link. It is what
Google Ads and Meta match on when you upload an offline conversion, which is how you tell
them that the lead their ad produced went on to become a sale. It is filled automatically
on a sign-up, a form capture or a booking that followed an ad click, and is blank for
every other lead.
Custom fields
Any key/value pair you need. Field names must be lower case letters, numbers and underscores. Custom fields are usable in CRM conditions, in filters, in e-mail variables and in the API.
Answers to a booking calendar’s extra questions are stored here too, keyed by the question’s label.
Everything attached to the contact
Opening a contact also shows: its Notes & Tasks — the record your team writes about the person and the follow-ups scheduled from it — the CRM funnels it sits in, its full movement history, its tags, its deals, its bookings, its active subscriptions, its payment history and the analytics of the visit that created it.
Contacts are part of every account, whatever modules are active, but what hangs off a contact follows them: the CRM tab, the lead score, the qualified flag, tags and Notes & Tasks belong to the CRM module; the Bookings tab to Scheduling; the Subscriptions & Payments tab to Sales with Stripe; sending a template e-mail to E-mail marketing. With a module off, its tab and its actions are simply not there.
The WhatsApp Inbox shows the same history as a single chronological thread — bookings, e-mails opened, funnel moves and WhatsApp messages interleaved — and it is also where you write internal notes on a contact. The Inbox is each member’s own workspace, so it leaves out what belongs to colleagues: appointments on calendars they are not responsible for and reminders meant for somebody else. The contact record is where the whole picture is: every appointment with the members responsible for its calendar (or the whole team, when it names nobody), every task with its responsible member, and every reminder still waiting in somebody’s Inbox with the members it is waiting on.
The Bookings tab is not read-only: New booking takes an appointment for the contact — the one who phoned instead of clicking your link. It opens the team’s agenda: every calendar of your organization, one day at a time, with each time and who holds it. Pick a free time and the real booking page opens on it, straight on the form, with their details already filled in — or, when they already have an appointment on that calendar, reschedule it there. Each appointment shows the members responsible for its calendar. See Booking for someone who asked you to.
Last activity
Every contact carries the instant of the last thing they did — a message, a booking, an e-mail opened, a stage entered, a payment. It is what orders the WhatsApp Inbox, so a lead who books an appointment rises to the top of the queue at the moment they book. Somebody on your team editing the record is not an activity and does not move it, and neither does a reminder: a reminder lifts the person only in the Inbox of the members it is for (see Reminders are yours).
Automatic merging
If a contact arrives with a phone number or e-mail address that already exists, FlyB merges it into the existing record instead of creating a duplicate. Empty fields are filled in; fields that already held a value are kept, and the conflicting values are reported to you so nothing is silently overwritten. A member who sees only their own contacts only ever merges into contacts assigned to them.
This is why importing the same list twice does not double your base. A merged contact is not a capture: it does not count as a new contact in the daily summary by e-mail, which counts the records actually created that day.
Merging two contacts by hand
Automatic merging only catches the duplicate it can recognise — one that arrives with a phone number or an e-mail address you already have. The other kind collides on nothing: a form captured a name and an e-mail, and later the same person opened a WhatsApp conversation, which created a second contact with a name and a phone number. Nothing the two records hold can be compared, so only you can see that they are the same person.
Open the contact you want to get rid of and use Merge into another contact — on the contact record, next to Edit, and in the Actions menu of the WhatsApp Inbox context panel. Search for the contact you want to keep, check the direction on the confirmation screen, and confirm.
What happens:
- Fields: only the ones the contact you keep left empty are filled in from the other. Nothing it already holds is overwritten.
- History: bookings, WhatsApp conversations, deals, internal notes, notes & tasks, e-mails sent (with their opens and button clicks), orders, tags, CRM positions and lead-score history all move across. Tasks that had not run yet keep running on the contact you keep.
- The other contact is then deleted. This cannot be undone.
A few details worth knowing. If both contacts are in the same funnel, the position of the contact you keep is the one that stays. If both were already in the same e-mail campaign, the campaign keeps one of them, so nobody is mailed twice. If either of the two had e-mails disabled, the merged contact keeps them disabled. And the lead score is recalculated from the history that survived the merge, so it always matches the events listed underneath it.
When merging is refused
A contact that is linked to a FlyB account cannot be the one removed — that record is how the account reaches its plan, its billing and its owner. Merge the other contact into this one instead.
Qualified leads
A contact can be flagged qualified — the star on the CRM card and on the contact modal. It is a manual judgement (“right profile, real interest, can buy”), and it can also be applied automatically by a CRM stage. Qualified leads are a dimension in Analytics, in the dashboard widgets and in the CRM reports.
Lead owner
The lead owner is the member of your team responsible for the contact. It is a field on the contact, shown as a small avatar on the contacts list, on the CRM card and in the Lead management card of the contact screen.
Unassigned is a real state, and it is what every contact created before this feature holds.
Who can set it
Anyone can choose the owner while creating a contact — the modal defaults it to whoever is typing. Once the contact exists, only an owner or admin can change it, so a salesperson cannot quietly take a colleague’s lead. That is the entire reason the field exists.
What assigns it without anybody typing
| Source | Behaviour |
|---|---|
| Form | Each form can name the owner of the contacts it creates |
| Calendar | One of the calendar’s responsible members can be marked as the owner of the contacts a booking creates |
| WhatsApp number | One of the members who see the number in the Inbox can be marked as the owner of the contacts the number creates — a new person’s first message, and the contact import |
| Import | The whole file gets one owner, chosen on the import screen |
| CRM automations | The four Assign a lead owner actions — fixed, random, in rotation, or to whoever owns the fewest contacts |
All of them apply only when the capture creates the contact. A submission, booking or message that matches a contact that already exists keeps the owner it had: a new form fill never takes a lead away from whoever is already working it.
On a calendar and on a WhatsApp number the owner is marked with a crown on the list of members, and the first member you pick gets it automatically. Take it off if the contacts should stay unassigned — FlyB leaves that choice alone.
Restricting a member to their own leads
A team member can be flagged See only their own contacts in Settings → Team. That member then sees the same organization as everyone else minus the contacts they do not own — on this list, on the CRM board (cards and column counters) and its table view, on the stage screens, in the CRM reports, in the dashboard widgets, on a calendar’s dashboard (its appointments, counters and history), in a campaign’s audience and in the Inbox — its queue, its threads, their attachments and the reminder pop-up, where conversations whose contact was deleted are not shown either. The numbers count only their contacts too.
It is a visibility rule, not a permission: it never changes what the person may do, only which contacts an answer is computed over.
Such a member cannot reach somebody else’s lead by typing it in, either. Adding a contact whose phone or e-mail is already on a contact that is not assigned to them is refused — the screen says the contact exists and asks them to have an admin assign it — instead of merging into it, and an import skips those rows (they are counted as skipped). The same goes for cancelling an appointment: only their own contacts’ ones.
That is why the owner sources above matter for such a member: a contact created with nobody as its owner is invisible to them. To have a salesperson restricted this way see the conversations of their own WhatsApp number, or the bookings of their own calendar, give them the crown on that number or calendar — the contacts it creates are then born theirs.
Lead score
Each contact carries a lead score — a number built from what the lead did, under rules you write. It is shown as a badge beside the name here, on the CRM card and in the Lead management card of the contact screen; the contact’s CRM tab repeats the total under the active funnels and lists the full history of every point.
The score is never typed: it is awarded by the rules and by the CRM’s Add Lead Score points automation. See Lead Score.
Tags
Free-text labels with a colour. Tags can be applied by hand, applied automatically when a contact enters a CRM stage, or applied in bulk to everyone matching the current filter. Bulk removal works the same way.
The list
The contacts list loads 25 contacts at a time. Paging, searching and sorting are all answered by the server, so the screen opens at the same speed on a base of two hundred contacts and on one of two hundred thousand.
The search box looks at the whole base, not at the page in front of you. It matches
name, company, phone, e-mail, city, state, district, origin, UTM source and your custom
fields, and it searches a phone number the way you read it — paste
(11) 98765-4321 and it finds the number stored as digits.
The column headers sort the whole result set; click one twice to reverse it. Blank values always go last, whichever direction you sort in.
Everything else on this screen works over the whole result set too — the counter at the top, the bulk actions and the export all mean “every contact the current filter and search match”, never the 25 on screen.
Filters
Filters are the query language of the platform, and they are shared: the same builder powers the Contacts list, CRM automation conditions, campaign audiences, message-automation and Lead Score conditions, the Inbox’s advanced filter and the Custom Filter dashboard widget.
A filter is a set of conditions combined with AND (all must match) or OR (any may match).
Fields you can filter on
| Group | Fields |
|---|---|
| Contact | Every standard field, custom fields, creation date, last update, qualified |
| Acquisition | Origin, the five UTMs, registration form, registration calendar |
| Analytics | Country, city, browser and page path of the visit that produced the contact |
| Received / did not receive / opened / did not open a given template · Clicked / did not click an e-mail button — pick the e-mail, then one of its tracked buttons by its label (or any button). Leaving the e-mail blank means any e-mail. “Did not” also holds for a contact who never received it; combine with Received for “received but did not click” | |
| Conversations | Has a WhatsApp conversation · Has a FlyB Chat conversation — Yes or No. A FlyB Chat conversation counts once something was said in it, not when the visitor merely filled in the chat’s form. The WhatsApp field appears where the account can use WhatsApp |
| CRM | Stage, tags, lead owner, lead score |
| Billing | Active plan, inactive plan, payment made, payment failed |
A field about a module that is off is not offered — the e-mail fields without E-mail marketing, the registration calendar without Scheduling, the billing fields without Sales with Stripe, the CRM fields (except the lead owner) without the CRM. A saved filter that already uses one keeps working exactly as before.
Operators
Equals · Not equals · Contains · Does not contain · Is empty · Is filled · Greater than · Less than · Greater or equal · Less or equal · Between · Last X days · Last X hours · Last X minutes.
Which operators you get depends on the field: the numeric ones (lead score) offer the comparisons and Between, and leave out “is empty” — the score is always a number, even when that number is zero.
Filters can be saved with a name and reused anywhere a filter is accepted.
Bulk actions
With a filter applied, you can act on the whole result set at once:
- Add or remove a tag across every filtered contact (with the CRM module).
- Add to the CRM — put everyone into a chosen funnel and stage. Contacts already in that funnel keep their current stage; only those not in it are added.
- Send an e-mail — an immediate dispatch driven by your browser.
- New campaign — a scheduled dispatch that runs on FlyB’s servers. See E-mail Campaigns.
Tags and Add to the CRM belong to the CRM module, and the two e-mail actions to E-mail marketing: with the module off, its buttons are not shown.
Exporting
Export contacts produces a CSV of whatever the list is currently showing — the filter and the search are respected. You choose:
- Which columns — every standard field plus your custom fields, including the lead owner (as a name, an e-mail and an ID) and the lead score. A shortcut selects only the columns that actually contain data.
- Delimiter — semicolon (safest for Excel outside the US), comma, tab or pipe.
- Header row — on or off.
The file always holds the whole result set, however many pages it spans. The complete records are fetched when you open the export window, so on a very large base the column list takes a moment to appear — the window tells you while it is loading, and the download button becomes available as soon as the records are in.
Importing
Import contacts takes a spreadsheet in CSV, XLSX, TSV, TXT or JSON, up to 20 MB, in three steps.
1. File
Drop the file. FlyB reads the rows and columns and tells you what it found. Tell it whether the first row is a header.
2. Columns
FlyB proposes a mapping from your columns to FlyB fields. You can correct any of them, send a column to a custom field, or ignore it. A shortcut maps everything not yet matched to custom fields.
There is one question FlyB will not guess: phone numbers. You say whether the column
holds national numbers (and which dial code to prepend) or numbers that already carry
their country code. A number starting with + always keeps its own.
Elsewhere — the API, the booking page link — FlyB reads that from the number itself. It asks here because an import is a whole column decided at once: one wrong reading is one wrong number there, and thousands of them here.
An id column in your file is never imported — FlyB generates its own identifiers.
Point it at a custom field if you want to keep it.
3. Review
A preview shows the first rows exactly as they will be saved. Then decide:
- Contacts already here — complete the existing contact (fill in the blanks, keeping what is there) or leave it untouched and skip the row.
- Tag the batch — optional, and the easiest way to find this import again later.
- Lead owner — optional, and applied to the whole file. Rows that fold into a contact that already exists keep the owner they had.
Rows beyond your plan’s contact limit are only imported when they match an existing contact. The screen tells you how many slots you have left before you start.
Plan limits
Your plan caps how many contacts your organization may hold, and the dashboard warns you at 80% so you have time to upgrade.
What the cap actually blocks, once you reach it, is you adding contacts by hand — the Add contact button and the spreadsheet import. Leads that arrive on their own are still saved past the cap:
- a form submission,
- a booking on one of your calendars,
- a Stripe payment through your checkout.
That is deliberate. A visitor filling in your form has no way of knowing about your subscription, and a lead thrown away is worse for you than a base one contact over its limit. FlyB records the overage and e-mails the account owner instead, at most once every 48 hours. See Plans, Flights & Limits.
Your responsibility for this data
The people in your contact base are real people, and you are the controller of their data. You must have a lawful basis to hold and contact them, and bought, rented or scraped lists are prohibited. See the Acceptable Use Policy and the Data Processing Addendum.