CRM & Funnels

Sidebar: CRM → Pipeline

Module: CRM — active on every account from the start.

The CRM is a Kanban board: funnels are boards, stages are the columns, and contacts move across them. It is also where most of the platform’s automation lives. The sidebar calls the board Pipeline, to tell it apart from Conversions, the funnel chart in the row below it.

Funnels

A funnel represents one process — sales, onboarding, support, recruitment. Each has a name and an icon, and can be restricted to specific users: check the people who get access and nobody else in the organization sees the funnel.

The restriction applies to every invited member, admins included — the account owner is the one exception, and always sees every funnel, so a list can never lock the account out of its own board.

Your plan caps how many funnels you can create.

Stages

A stage is a column. Its settings are:

SettingWhat it does
Stage name and iconHow the column reads on the board
Maximum stayAfter this long in the stage, the contact is moved on automatically. Set in minutes, hours or days.
Auto-move toWhere a contact goes when its maximum stay runs out
Auto-tags on entryTags applied the moment a contact lands here
Automatic qualificationFlags every arriving lead as qualified

Stages can be reordered, and a new stage can be inserted between two existing ones.

Deleting a stage does not delete its contacts — they are left with no stage in that funnel.

The board

The board loads one funnel at a time and each column scrolls independently, so a funnel with thousands of contacts stays fast. The counters on the column headers come from the server and always reflect the whole column, not just the cards you have scrolled to.

The board refreshes itself every minute without losing your place: new cards appear, moves made by teammates show up, and your scroll position is kept. The header tells you when it last synced, and you can force a refresh.

Contacts are moved by dragging, from the contact modal, or automatically by the rules below.

Each card also carries the contact’s lead owner — the avatar in the bottom corner, with the name on hover — and its lead score when the lead has scored anything.

A card showing a phone number also carries a small WhatsApp button on that line, in place of the phone icon to the left of the number. It opens the Inbox straight at that person’s conversation, on the All view — so a lead who has never written, or whose conversation was closed last week, is found rather than filtered out. It appears only if you may read conversations.

Table view

Table view, in the board’s header, opens the whole funnel as a table: every contact of every stage, one row each, with the stage, the contact’s details, the lead owner, the time spent in the current stage, the origin and all five UTM fields (source, medium, campaign, term and content). Clicking a row opens the contact.

  • Search looks through every column of the table — name, e-mail, phone, company, city, stage, lead owner, tags, origin and each UTM. It runs a second after you stop typing (press Enter to run it at once), and a phone number matches whether you type the digits or the number as it is written, with brackets and dashes.
  • Stage filter narrows the table to one or more stages. Beside each stage it shows how many contacts match the current search.
  • Columns hides or shows columns. Name and stage are always shown, and your choice is remembered on this device. Click a column header to sort by it, and again to reverse.
  • Changing the stage. If you may edit the CRM, the stage on each row is also a menu: pick another stage to move the contact, exactly as dragging the card on the board would, stage automations included. If an automation sends the contact somewhere else on arrival, the row shows where it actually landed.
  • Export CSV downloads every contact that matches the search and the stage filter, not only the page on screen, with the columns you are showing, up to 10,000 rows. It uses the same delimiter as your last export from Contacts. “Time in stage” is exported as the date the contact entered the stage.

Like the board, the table is computed on the server over the whole funnel, so the search, the sort, the stage counts and the export always cover every contact, not just the 25–100 rows on the current page.

Entry events

Entry events decide which platform events automatically put a contact into a funnel stage. The standard ones are:

GroupEvents
ContactsContact created
CaptureAppointment booked, Form submitted
Payments & subscriptionsPayment started, Payment completed, Payment failed, Subscription created, Subscription canceled
E-mailsE-mail sent, E-mail opened, E-mail button clicked
ConversationsSent a message on WhatsApp, Sent a message on FlyB Chat

Payment started fires when a checkout opens for somebody FlyB already knows: the guest of a calendar that charges, the moment they continue to payment. It is offered while Sales with Stripe and Scheduling are both on. A pricing table’s buyer is only known once they pay, so for those sales it fires with the payment.

Sent a message on WhatsApp fires on every message a contact sends to one of your numbers — Cloud API or WhatsApp Web — and the number is required: an organization’s sales number and support number rarely feed the same stage. Sent a message on FlyB Chat does the same for the FlyB Chat widget. A message stored twice (a redelivery) fires nothing twice.

Each event names a destination stage, and can carry conditions so that only some contacts are added — for example, only leads from a particular UTM source, or only purchases of a specific plan and price. Billing events can be narrowed to one plan and price; e-mail events to one template; the two capture events to one calendar or one form; the WhatsApp message event to one number. The conditions are about the contact; conditions about the message itself belong to the stage automations.

Contacts already in the funnel

Each event has the option Move to this stage if the contact is already in the funnel:

  • Off (the default for every new event): only contacts who are not on the board yet — or whose deal there was won or lost — are placed in the stage. A contact already sitting in another stage of the funnel stays where it is.
  • On: a contact already in another stage is moved to this one too, every time the event happens — for example, “when a lead in Waiting for reply writes on WhatsApp, move it to Replied”.

Events created before this option existed have it on, which is how every event worked until then. The list of events marks the ones that move contacts already on the board.

Forms and calendars also have their own CRM setting: each one can name the funnel and stage its submissions land in. That one is unconditional and is configured by whoever owns the form or the calendar; the two capture events above are the conditional version, configured by whoever owns the pipeline. Both surfaces stay — a calendar can drop every booking into New leads while an entry event also sends the ones over R$ 500 to Priority.

The same events also feed message automation, which sends a WhatsApp message instead of moving the contact.

Automations

Each stage can carry automations. An automation is a trigger, a set of conditions and an action.

Trigger

TriggerWhen it is checked
On entryOnce, the moment the contact lands in the stage. A contact that does not match then is never checked again. Can ask the AI about the contact (see Contact matches the AI prompt).
While in stage (Continuous)On arrival and again every minute afterwards, so the automation also fires when the contact’s data changes later. Redirect actions only. Paid plans only. No AI conditions: it re-checks every contact of the stage every minute.
When a WhatsApp message arrivesEach time a contact sitting in the stage sends a WhatsApp message, on any of your numbers. Never on arrival. Every action. Can ask the AI about the message and about the contact.
When a FlyB Chat message arrivesEach time a contact sitting in the stage writes on FlyB Chat. Never on arrival. Every action. Can ask the AI about the message and about the contact.

The two message triggers are the only ones whose conditions can read the message — its text, the number it arrived on, whether it is a picture, a video, an audio or a document — and ask the AI about it (see below). Some details worth knowing:

  • Once per stay, by default. A message automation runs on the first matching message and then not again until the contact leaves the stage and comes back. Switch Run only once while the contact is in this stage off to run it on every matching message — right for a webhook or a point of Lead Score per message, risky for sending messages or drawing an owner, which would hand the lead to a different person on each one.
  • One message, one pass. The message is checked against the stages the contact is in when it arrives. An automation that moves the contact runs the destination’s on entry automations, as any move does — but not the destination’s message automations, so two stages can never bounce a lead between them on a single “hi”.
  • The message that brings a lead in counts. When an entry event places the contact in a stage because of a message, that same message is then checked against the stage’s message automations.
  • Each funnel on its own. A contact on two boards is checked on both.

Conditions

The same filter builder as everywhere else, combined with AND or OR — including Has a WhatsApp conversation and Has a FlyB Chat conversation, under Conversations, and Clicked an e-mail button (the e-mail and the button, by its label), under E-mail. An automation with no conditions runs for every contact in the stage. With the While in stage trigger, a click condition is re-read every minute, so “clicked the pricing button” moves the lead shortly after the click lands.

With the On entry trigger and the two message triggers, the field list also offers an AI group with Contact matches the AI prompt (Prime).

Conditions about the received message

With a message trigger, the field list also offers a Received message group — fields about the message that fired the automation, which no other filter in FlyB has:

FieldCompared with
Received message textcontains, does not contain, equals, does not equal, has text, has no text — or Matches the AI prompt. Case, accents and punctuation are ignored, so “Orçamento!” equals “orcamento”. A picture’s caption is its text
Connected WhatsApp numberis / is not one of your numbers, Cloud API or WhatsApp Web
Image receivedNo operator or value: holds when the message is a picture
Video receivedHolds when the message is a video
Audio receivedHolds when the message is an audio, voice notes included
Document receivedHolds when the message is a file (a PDF, a spreadsheet…)

FlyB Chat messages are text only, so a FlyB Chat automation offers the text alone. These fields mix freely with the contact conditions under the automation’s AND/OR, and they exist only here: the filters of Contacts, campaigns, Lead Score and message automation do not offer them.

Matches the AI prompt

Matches the AI prompt lets you describe, in your own words, what the message should show — “the customer wants to book an appointment”, “the customer is complaining about a delay”, “the customer is asking for a discount” — and lets the AI decide whether each message does. It is part of the Prime plan; other plans see the option with a Prime chip.

  • What the AI judges. The customer’s new message, read in the context of the last 20 messages of that conversation — and nothing else about the contact. It answers how sure it is that the new message shows what you wrote: a “thanks!” after a price question is not “asking for the price”. To ask about the contact as well — where they came from, what they bought, what your notes say — add Contact matches the AI prompt to the same automation.
  • Once the conversation goes quiet. People write in short lines — “hi”, “how are you?”, “how much is the 5-session package?” — and your team answers in between. An automation with an AI condition waits until 45 seconds pass with no new message in the conversation — from the contact or from your team, whether it is sent from the Inbox, from the WhatsApp app on the phone or by an automation — and then judges, once, everything the contact sent since the conversation was last quiet, read together with your replies. One question to the AI about the whole exchange instead of one per line. Only a message from the contact starts that wait; a message from your team only postpones a wait already running — the AI judges what the contact said, never what you answered, so a “thanks” from your team after the AI has answered starts nothing. The automation’s other conditions about the message read those messages too: contains holds when any of them contains the text, does not contain only when none does, Image received when any of them is a picture. Automations without an AI condition are not delayed — they still answer each message the moment it arrives.
  • One AI condition of each kind per automation. An automation can ask the AI one question about the message and one about the contact: describe everything the message should show in one prompt. A second Matches the AI prompt stays listed on the other rows, greyed out.
  • Minimum match. The condition holds when the AI is at least this sure — 80% by default. Measured on real WhatsApp messages, clear matches come back above 90% and unrelated ones far below 50%; a message that only brushes the subject can come back in the low 80s, so the default leans towards acting rather than missing. If an automation fires on messages it should have left alone, raise it — 85–90% acts only on clear ones; lower it to catch more.
  • Prompt. Up to 500 characters. One situation about the new message works best.
  • Try it. Type a sample message and press Test to see how sure the AI is before the automation goes live. A test is a real evaluation and is counted like one.
  • Recent evaluations. Under the prompt, the automation lists the last messages it judged — every message of a burst, in order — with the AI’s percentage and the outcome, or why the AI was not asked (no text in the message, the daily limit). Use it to tune the minimum match.
  • Included in Prime. AI conditions use no Flights. Each organization has a daily limit of AI evaluations (2,000 by default); past it, AI conditions answer “no match” until the next day (UTC), and the history says so. Two automations asking the same prompt about the same message ask the AI once.
  • Evaluated last. The automation’s other conditions are checked the moment the message arrives, and the wait above is only started when they leave the answer to the AI: with AND, when every other condition passed; with OR, when none did — an OR automation one of them already satisfies runs at once, without the AI. They are checked again, on all the messages of the exchange, before the AI is finally asked. A message with no words (a picture without a caption, a voice note) is never sent to the AI and does not match.
  • Privacy. Names, e-mail addresses, phone numbers and street addresses are removed before anything is sent to the AI provider, including from inside the messages. See Privacy Policy, section 7.

Contact matches the AI prompt

With the On entry trigger or a message trigger, a condition can ask the AI about the contact: write what should be true of them — “the lead came from LinkedIn”, “the lead has shown interest in buying”, “the contact has already bought from us”, “the customer is unhappy with the service” — and set the minimum match, exactly as above. Also Prime only.

  • What the AI judges. The contact’s record as it stands at that moment — their profile (where they came from and the campaign of the link they arrived through, company, city, tags, Lead Score), custom fields, conversations, notes, appointments, e-mails, purchases and CRM history from the last 90 days, the same record Hunt AI reads — with names, e-mail addresses, phone numbers and street addresses removed. Of the e-mail and the phone only the e-mail’s domain (and whether it is a free provider like Gmail or the organization’s own) and the phone’s country code are sent, so “has a business e-mail” or “has a Brazilian phone” can be asked; the city and state go too. The AI answers whether the record shows it, shows the opposite or says nothing about it, and the percentage is how sure it is that the record shows it — through a value that stands for it, too: a campaign tag linkedin-marcos shows “came from LinkedIn”.
  • When, on entry. The automation’s other conditions are checked the moment the contact lands in the stage, and only when they leave the answer to the AI is the contact judged — a few seconds later, never inside the form submission, booking or import that placed them, and after the stage’s other on entry automations. If one of those moves the contact on, the AI is not asked. The contact is judged once each time they enter the stage.
  • When, on a message trigger. Like the message’s own AI prompt: once the conversation goes quiet, on the record as it stands then, and only when the automation’s other conditions leave the answer to it.
  • Message and contact together. On a message trigger, an automation can carry both — Received message text → Matches the AI prompt “the customer wants to book an appointment” and Contact matches the AI prompt “the lead came from LinkedIn”. That is two questions to the AI, one about the message and one about the record. The message is asked first; with AND the record is only asked when the message matched, with OR only when it did not.
  • Minimum match. 80% by default, measured on contact records: clear matches come back above 89%, records that do not show it below 50%. Conditions saved before the default changed keep the minimum they were saved with.
  • Recent evaluations. The history under the prompt lists each contact judged — on entering the stage, or with the message they had just sent — with the percentage and the outcome; the message prompt of the same automation keeps its own history. There is no Try it box: a contact prompt is about a whole record, which a typed sample cannot stand in for.
  • Not on While in stage. The continuous trigger re-checks every contact of the stage every minute, so an AI condition there would ask the AI about each of them each time. It is not offered there, and an automation switched to that trigger cannot be saved with one.

If the plan changes, the AI conditions already written are kept but answer “no match” — and the AI is not asked — until the plan includes them again.

Actions

ActionWhat it does
Redirect to stageMove the contact to a named stage
Redirect to random stagesDraw one of several stages, all equally likely
Redirect to stages sequentiallyDistribute contacts one by one, in the order the stages were picked
Redirect to stage with fewest contactsSend the contact wherever the load is lightest
Assign a lead ownerHand the contact to one chosen member
Assign an owner at randomDraw one of several members, all equally likely
Assign owners in rotationDistribute contacts one by one, in the order the members were picked
Assign to the owner with fewest contactsHand it to whoever owns the fewest contacts right now, across the whole base — not just this stage
Add Lead Score pointsAdd points to the contact’s lead score. May be negative
Mark as Won / Mark as LostClose the position
Mark lead as qualifiedSet the qualified flag
Send an e-mailSend one of your templates
Send WhatsApp template messageSend an approved WhatsApp template, from the number it lives on (requires a connected WhatsApp number). On a number linked through WhatsApp Web, which has no templates, pick one of your automation messages instead: it is sent as written, and the stage sends it even while its rule is paused
Send message via FlyB ChatSend the message of one of your message automations into the contact’s FlyB Chat — see below
Add DealAttach a deal to the contact
Perform HTTP RequestCall any external URL — see below

The three distribution actions are how a team shares incoming leads between its members, when each member owns a stage. The four Assign a lead owner actions are the same four algorithms applied to people instead of stages — use them when the team shares one board rather than a column each.

Two differences between the two families are worth knowing:

  • Assigning an owner does not move the contact, so it is never the end of the line: a rule that assigns an owner and a later rule that moves the contact both run.
  • The assignment actions are never continuous. A pooled draw re-evaluated every minute would keep handing the same lead to a different person for as long as it sat in the stage — which is also why a message automation runs once per stay unless you change it.

The WhatsApp action’s template is picked from a list grouped by number, and the automation sends from the number the chosen template lives on. An automation saved before you had more than one number keeps sending from your default number.

The WhatsApp action has no variable fields of its own, and that is deliberate: what a template’s variables are filled from belongs to the template, not to each rule that sends it. Set it once under How a template is sent, and every automation and reminder that sends that template fills it the same way. The same setting decides whether a contact who wrote to you in the last 24 hours receives the paid template or your free-form service message.

Whatever it sends arrives in the Inbox with a ⚡ badge reading CRM · <stage name>, so a thread always says which screen wrote to the customer.

This action and a message-automation rule can send the same message twice. Message automation covers the same ground from a list of its own — when a booking is made on this calendar, send this template — and a calendar or form that also drops the lead into a stage with this action will fire both. Nothing is wrong with either one; they simply do not know about each other. If a customer is receiving two copies, the ⚡ badges name the two senders, and turning off whichever you did not mean to keep is the whole fix.

Send message via FlyB Chat

Sends a ready message — the text, the buttons and the variables of a message automation — into the contact’s FlyB Chat when they enter the stage. The list offers every FlyB Chat automation, and every WhatsApp automation written as a free-form message (its words and buttons go through the chat); a WhatsApp template cannot, so it is not offered. Automations written only for this have no trigger and are listed first, and the chosen message is previewed with the chat’s own bubble.

  • It reaches people who have opened the chat. FlyB Chat writes into a conversation the contact already has, so the action starts with the condition Has a FlyB Chat conversation = Yes. Anybody else is not sent anything, and the automation’s history says why.
  • The automation’s switch still counts. A paused automation sends nothing from here either — the one switch that stops a message stops it everywhere it is automatic.
  • The rest of the automation is not consulted. Its trigger, conditions, delay, quiet hours and once-per-contact belong to its own trigger; here the stage’s conditions decide, and the message goes out on every entry into the stage.

Every send — or the reason it did not happen — is a line in that automation’s history, marked with this stage, and the message arrives in the Inbox with the automation’s ⚡ badge.

Add Lead Score points is deliberately repeatable: you attached it to a stage, and a lead coming back through that stage has done the thing again. It writes to the same history as the scoring rules, so the contact’s score stays explainable.

The Free plan allows one automation per stage.

HTTP Request automations

The HTTP Request action calls any external endpoint — a webhook, your ERP, an automation platform — using a saved request model.

A model has a method, a URL, headers and a body (raw JSON or form fields). Anywhere in the URL or the body you can insert variables carrying the contact’s data. The variable picker covers the contact’s own fields, the member who owns the lead, its tags, its deals, its funnel position and history, its subscriptions, payments and bookings. Deep paths into lists are supported, and index [0] is always the most recent item — except the booking list, which is ordered by the appointment’s own date, so its [0] is the one furthest ahead and the next and last appointments have groups of their own.

Records carry their internal ids as well as their names — the funnel, the stage, the calendar, the booking, the lead owner — which is what an external system needs to match what it is being told about. {{now.iso}} and {{now.timestamp}} carry the moment of the call, for an endpoint that wants one.

Two conveniences worth knowing:

  • Fill from cURL — paste a cURL command (including “Copy as cURL” from your browser’s developer tools) and the method, URL, headers and body are filled in.
  • Test — run the model against a real contact of your choice and see the response, without waiting for the automation to fire.

Deals

A deal is an amount attached to a contact: a description, a value, a status and notes. A contact can carry several. Only active deals count towards the funnel total and the reports.

Deals are what make the revenue figures in CRM Reports meaningful, so record them if you want those numbers to mean anything.

They are reached from the briefcase badge on the board’s card, from the contact record, and from the WhatsApp Inbox panel — which lists them beside the conversation with their active total, and adds one through + Actions → Add Deal.

Winning and losing

Mark as Won and Mark as Lost close the contact’s position in that funnel. Marking as lost asks for a reason, from a predefined list (price too high, bought from a competitor, no budget, went silent, bad timing, not the decision maker, chose another solution, missing a feature, project postponed, duplicate, invalid contact details, outside service area, not an ideal fit, poor experience) or your own short text.

Recording the reason is optional but it is the whole input to the loss analysis — see CRM Reports.

Both are also available from the WhatsApp Inbox, on the panel beside the conversation — which is usually where you learn the answer.

Stage-level bulk actions

The menu on each column header lets you add a contact to that stage, send an e-mail to every contact in the stage, move every contact of the stage somewhere else, add an automation to the stage, or open the stage settings. Adding an automation from the menu opens the automation editor straight away and saves it onto the stage the moment you confirm it, with no need to open the stage settings and save them too. On the Free plan, a stage that already has its one automation opens its Automations tab instead.