Conversations
The inbox rebuilt with the things HubSpot's does not have: seven filters,
saved views with live counts, bulk assign, an
oldest-unanswered queue order, and the
approve / edit / reject draft loop. HubSpot's inbox stays live and
remains the sender until each message type is flipped — the parallel-running rule.
Sending is not flipped: every message type still routes to HubSpot,
so replies are still sent from HubSpot's inbox. The routing table below is the
authority on that.
Pick a conversation.
WhatsApp send routing (per message type)
Inbox
Every WhatsApp conversation, mirrored live from HubSpot — the same threads you'd see in HubSpot's own Conversations inbox, without needing to open HubSpot. Active Leads, Customers, Dead and Unknown are this same list split by lead status — Unknown being the conversations with nobody in the CRM yet — and always add back up to it.
Active Leads
The part of the WhatsApp Inbox still in play — everyone in the CRM who hasn't paid and isn't dead. Conversations with nobody matched in the CRM have their own page, Unknown, so nothing falls out of the split.
Customers
WhatsApp conversations with people who have paid — lead status "Paid". This is the customer-service view: everyone here is already a customer, so replies are support, not sales.
Dead
WhatsApp conversations with contacts marked Dead. They still get the win-back messages, so replies do land here — worth checking, because a reply from this list is someone coming back.
Unknown
WhatsApp conversations from numbers nobody has matched in the CRM — usually new inbound leads. Open one and use "Create contact" to put them in the CRM; their future messages then link automatically and the conversation moves to Active Leads.
Costs
Everything the app spends with outside vendors, across every feature — not just the dialler. OpenAI (gpt-4.1) powers every AI feature here: the voice agents, WhatsApp message classification, the social inbox, and assessment outreach. ElevenLabs and Deepgram are voice-only. There's no Claude/Anthropic usage anywhere in this app.
By vendor
WhatsApp template messages
Business-initiated WhatsApp sends Meta bills per message — the booking reminder ladder, drips, and this app's template outreach — counted from Meta's own delivery receipts, so HubSpot's sends are included. Replies inside a customer's free 24-hour service window don't count. Always shown per calendar month (how Meta bills), regardless of the time range above. Tracking began mid-July 2026, so July is a part month.
| Month | Billable templates | Marketing | Utility | Free (service window etc.) |
|---|
Where the OpenAI cost comes from
| Feature | Calls | Cost |
|---|
Daily breakdown
Assessment outreach arrives in bursts around each Introduction Session rather than spread evenly — this is where those spikes actually show up, day by day.
| Date | Feature | Calls | Cost |
|---|
Cost notes
Workflows
Every automated thing that happens to a lead — this app's and HubSpot's — on one map. Nothing on this page changes anything; it is here so nobody has to guess what already went out. Click any flow to see exactly what triggers it and what it writes.
Automation trees
Each automation as a branch tree — trigger at the root, conditions as forks, actions as leaves. A badge on a node means that write starts other workflows; click it to see which, and jump to them.
On right now
The live switches. Everything else on this page runs from code and has no toggle.
The lifecycle map
Columns are where the lead is. Rows are who acts. Scroll sideways for the later stages.
Always running
Engines and workers that run on a clock regardless of where any lead is.
Dial campaigns
The only automation in the system that is real configuration rather than code — edited on the Automations page.
What a parent actually receives
Each row starts from one thing this app writes, and plots everything both systems then send. This is where messages pile up.
Collisions & gaps
Places the two systems fight, or where something is missing. Each one names the file or the HubSpot flow to go and look at.
Dashboard
Leads
Lead flow
| Day | New leads | Made dead |
|---|---|---|
| Loading… | ||
Introduction Sessions
| Session | Booked | Of which Dead / Paid |
|---|---|---|
| Loading… | ||
Dialler
The quick read before you commit more spend to the dialler: how much it called, how often someone picked up, what it cost to get one real result, and how many people who missed a session it won back. Every figure here is the same calculation the Dialler Overview shows in full — this is just the short version.
Reminders
Manual tasks that need a human before the next Introduction Session — nothing here happens automatically.
Overview
All-time call outcomes
Key metrics
The Dashboard's Dialler panel is a cut of exactly these figures — same endpoint, same definitions. Picked up means the call completed and a human (not an answerphone) answered. A result logged means the agent finished the call having actually recorded something: confirmed, rescheduled, or can't attend.
| Result logged | Calls | Share of answered calls |
|---|
No-show recovery
Of the people who booked a session in this period and didn't turn up: how many we chased, how many took a new seat, and how many actually attended it the second time. Recovery rate is the number that decides whether chasing no-shows is worth the spend.
| Session | No-shows | Called back | Spoke to | Rebooked | Re-attended | Recovered |
|---|
Show-up rate & what the calls are worth
Booked-to-attended across every session in the period, then the comparison that actually tests the dialler: did the people it spoke to in the week before a session turn up more often than the people it never reached?
Best time to call
Pickup rate by UK hour and weekday, over the selected period — where to point the calling-hours window on each agent. Hours with fewer than 10 calls are shown but their rate is too thin to act on.
| Hour (UK) | Calls | Picked up | Pickup rate |
|---|
| Day | Calls | Picked up | Pickup rate |
|---|
How hard people are to reach
Retry-ladder health, across all time (retry state isn't dated per attempt). Contacts whose ladder ran out without a single answered call are pure wasted spend — if that number is high, the list is wrong or the retry schedule is too long.
Cost by campaign
| Campaign | Calls | Twilio | Deepgram | OpenAI | ElevenLabs | Total |
|---|
Campaign performance
| Campaign | Calls | Picked up | Pickup rate | Voicemail | Missed | Outcomes logged | Sales | Cost | Cost per sale |
|---|
A sale is a contact whose lead status turned Paid in the selected period, credited to the campaign of the last call they received in the 30 days before paying. Picked up means the call completed and wasn't voicemail; missed covers no answer, busy, failed, or cancelled.
Ways to reduce cost
Call Logs
| Contact | Phone | Agent | Started | Duration | Cost | Outcome | Status | Ended reason |
|---|
Tasks
The callback register. HubSpot stays the system of record — every task is created there first (callback requests, exhausted-retries handoffs, "claims already paid" checks) — and this is where the team works them. It defaults to due today or overdue, across all owners. That is deliberate: HubSpot's own "All" task view ships a hidden Assigned to = me filter, and it kept 655 open Call tasks — some due since December 2025 — off everyone's screen for eight months while the page said "You're all caught up on tasks. Nice work." Ownership is a column here, never a filter default.
| Subject | Contact | Due | Type | Status | Assignee |
|---|
Agents
New Agent
Trigger a Call
Test call
Call your own phone to hear how this agent sounds — no HubSpot contact needed.
Call a real contact
Automations
Auto-dial contacts from the segments assigned to each campaign, with retry timing and calling hours set per campaign. Nothing dials until a campaign is switched on and given at least one segment.
Two switches, deliberately. Pause dialling stops the voice dialler only — WhatsApp, the nightly bump and social replies keep running. Pause ALL outbound stops every outgoing message too: voice, all WhatsApp sends (including manual replies from the Inbox), the bump job and social replies. Use the second one when something is wrong and you don't yet know what. Neither one stops inbound calls, the attendance register, or anything that only reads.
⚡ Speed to lead
Calls a brand-new ad lead within minutes of the form landing in HubSpot, before it ever reaches the Attempted backlog. Only dials contacts the segment engine classifies as New Lead (no status, no owner, has a phone number), one call per contact — retries then belong to the normal Cold Outreach cadence. Honours both pause switches, calling hours and all daily caps. Leads arriving out of hours queue until the window opens.
Team
| Name | Role | Access | 2FA |
|---|
Pending invites
Each link works once and expires 7 days after it was created. Copy it and send it to the person yourself — nothing is emailed automatically.
| Name | Role | Expires |
|---|
Account & Security
Change Password
Other devices signed in to your account will be logged out.
Two-Factor Authentication
Scan with Google Authenticator, 1Password, or similar — then enter the 6-digit code to confirm.
Introduction Sessions
When Introduction Sessions run. This calendar drives the booking page, the dates the AI offers for reschedules, and the attendance register — click a day to add, block or restore a session.
weekly session one-off session blocked · Click a session day to block it, a blocked day to restore it, or an empty future day to add a one-off session.
Upcoming sessions overview
How many people are currently booked into each of the next few sessions.
| Session | Booked | Breakdown |
|---|
Previous sessions
How each past session went, from the register. Attended counts the name-matched; Adjusted adds the people who were in the room but whose display name matched no booking — resolve them by name on the Register tab. The adjusted rate divides by everyone booked.
| Session | Booked | Attended | Adjusted | No-shows | Show-up rate | Adjusted rate | Status |
|---|
Bulk reschedule
Moves everyone booked on one session to another. Each move updates HubSpot, re-registers them on Zoom when connected, and is logged so it can be undone per person. Anyone already marked as attended keeps that.
HubSpot's own WhatsApp confirmation + reminder ladder re-fires in full on any date change and cannot be picked from here.
Calendly sync
The reconcile worker checks every 30 minutes that everyone booked on the Calendly Introduction Session page exists in the CRM. Safe gaps are booked in automatically (they get the normal confirmation); anything with a status that must not be messaged — Dead, Customer, Unreachable — waits here for your call. Other Calendly event types (interviews, line management) are never touched.
| Flagged — needs you | Session | Why flagged | Found |
|---|
| Recent automatic actions | Session | Action | When |
|---|
Introduction Session Register
After each session ends, everyone on the Meet call is matched by name against that evening's bookings and attendance is written to HubSpot automatically. Names that can't be matched are listed against each run below for you to resolve.
Show-up rate per month
Show-up rate per session
Register
Click a session's date for its full named roster — who attended (and the Meet name they joined under), who no-showed, and any Meet names that never matched a contact.
| Session | Total bookings | Customer | Dead | Attended | No-shows | Show-up rate | Adjusted rate | Unmatched names | Status |
|---|
Duplicate contacts
A daily scan of the whole HubSpot base finds contacts sharing a phone number, email inbox, or full name. Pick which card survives and approve each merge. Merges cannot be undone, so nothing merges without your click — and same-name matches are the weakest evidence, so check those before merging.
Search HubSpot contacts
Look up any contact by name, phone, or email — not just ones flagged as duplicates.
Unknown WhatsApp numbers
Numbers messaging us on WhatsApp with no contact card. Approve a suggested match to save the number onto that contact, so their future messages attach to the right card.
| Number | First message | Suggested contact |
|---|
To Enrol
The enrolment desk's queue — one row per student, from structured
rows instead of the Onboarding Info blob the team used to read and retype. Filter
by state, watch the ageing, and move a record with the status picker on its row.
Every move is stamped with your name; nothing else in the system can write an
enrolment status.
HubSpot's To Enrol view stays the desk's working
surface until whoever works it signs this screen off — parallel running, both
reachable.
| Student | Parent | Status | In state | Subjects (tier · board) | Year | Delivery | Payment | Onboarding | Move to |
|---|
Contacts
The team's saved views, rebuilt. Eleven HubSpot tabs become eight:
views 1, 2, 3, To Enrol and All contacts keep their exact columns and order, and
the three webinar concepts that existed twice ("pool" and plain, 114 / 1,705 / 522
records apart with near-identical names) collapse into one tab each with the
dialler-eligible toggle above. Column order is data, not code.
The audit captured every view's columns and counts off the live tab strip on
4 Aug 2026, but never a filter panel — so seven of the eight predicates are
reconstructions. The count beside each tab is the check: more than a few per
cent off the audit figure means the predicate is wrong.
CRM Sync
A read-only local mirror of HubSpot contacts (HUBSPOT-REPLACEMENT-SPEC.md Phase 2a). Nothing here writes to HubSpot, and nothing else in the app reads from this mirror yet — this exists purely to prove it stays accurate before anything is built on top of it. An incremental sync runs automatically every 15 minutes.
One-time backfills
Full backfill re-pulls every contact (~20k — takes several minutes) and runs automatically once on the first sync after a fresh deploy. Lead-status history backfill pulls HubSpot's full status-change history for every contact already in the mirror — needed once for sales attribution, since that history can't be reconstructed after the fact. Both are safe to re-run.
Segment membership — defined vs counted
Two different timestamps, shown separately on purpose. Defined is when the segment's definition was last written; counted is when its membership was last materialised. HubSpot's list page shows only the first and labels it "Last updated", which is how a list defined in June and recounted continuously reads as three months stale. Nothing here can be misread that way.
| Segment | Priority | Members | Defined | Counted |
|---|
Event log coverage
The sixteen named events reports 6–12 read. A name at zero is either not wired yet or wired and silent — the difference matters, so every name is listed whether or not it has ever fired.
| Event | Count | Last seen |
|---|
Recent sync errors
WhatsApp via Meta — inbound shadow (Phase 3a)
Our own Meta app is subscribed to the same WhatsApp number as HubSpot's, which Meta permits — so both receive every inbound message. This side is read-only: it logs what arrives and sends nothing, because a reply from here would double up on the one HubSpot already sends. The point is to watch our feed match HubSpot's before anything depends on it.
Last 20 messages received via Meta
What our own webhook actually stored, newest first — the eyeball check that the inbound counts above describe real messages. Cross-reference a row against HubSpot's inbox to confirm both sides saw the same thing.
| Received | From | Message |
|---|
Message templates
Mirrored from Meta's Message Templates API. Category is the cost lever — Marketing templates are billed per message, Utility ones are free inside an open 24-hour service window — so this is the visibility needed before any volume moves across.
| Template | Language | Category | Status |
|---|
Template outreach — contacts with no WhatsApp thread
Roughly a quarter of any session's attendees have never messaged us, so the codes and the assessment question have nothing to reply into. This queue collects them; a pre-approved template opens the conversation, and the moment they reply every normal send path takes over. One template per contact per kind, ever — no repeats to people who don't respond. Nothing sends until a template is picked and the switch below is on.
| Contact | Kind | Session | Status | Detail |
|---|
Segments
The six dialler-list predicates (HUBSPOT-REPLACEMENT-SPEC.md Phase 2b, docs/hubspot-lists.md), evaluated against the local CRM mirror and re-materialized every 5 minutes. HubSpot's own lists stay authoritative — the scheduler is not pointed at these yet. The diff below is exactly what "watch it converge" means: once every segment's drift stays at zero for a few days, the scheduler can safely switch over.
| Segment | Priority | Local count | HubSpot list | HubSpot count | Matching | Only local | Only HubSpot |
|---|
Agent segment assignments
Which segments each agent works, highest-value first (lower number = worked first). The scheduler queues from these local segments — trigger lists are legacy and no longer read — so this IS the live routing once an agent's automation is switched on by a human. The legacy six trigger-list agents stay off with no segments; only agents assigned segments here (e.g. the seeded Cold Outreach / Session Agent / Closer) can dial.
Read Source
HUBSPOT-REPLACEMENT-SPEC.md Phase 2c. 5 read functions have been reimplemented against the local mirror, each behind its own flag. HubSpot stays the system of record for every write regardless of these flags — flipping a function to "local" only changes which side application code reads from, and can be rolled back instantly. Verify with the compare tool below before flipping anything real.
| Function | Current source |
|---|
Compare against HubSpot
Runs BOTH implementations for the same input right now, regardless of the flag above, and diffs the results. Use this to verify a function before flipping it.
Session Attendees
Fully automatic: the moment attendance is marked for a session, the AI reads every booked contact's WhatsApp chat and CRM notes — attended or not, and paid or not, since the assessment is offered independent of attendance — works out which assessment to send, and ticks it straight away — HubSpot sends the assessment itself, no approval step. If the year group is unclear, it sends a WhatsApp question asking instead. Turn either off on Configurations if you'd rather review each one by hand first. The button below is only for re-running a session manually (e.g. after resolving unmatched names).
| Who | Assessment(s) to tick | Summary (AI) | Full chat & notes | Status |
|---|
Configurations
Things you set once and that then run in the background — no separate tab needed for each.
WhatsApp Automations — master switch
One switch for every automated WhatsApp message the app sends: offer codes, the nightly bump, reschedule confirmations, assessment asks, unknown-sender chases, template outreach, and the property writes that make HubSpot send. Replies a person types in the Inbox (and manual resends from the dashboard) still work while this is off — use Pause ALL outbound on Automations to stop those too.
Send Guard
The anti-spam layer added after the 5 Aug Meta restriction. Every app send obeys it: Dead leads are never messaged, paying customers never get marketing, volume above the caps trips the outbound kill switch, and any run wanting to message more people than the batch threshold waits here for an approval before a single message goes.
Caps are ceilings against runaways, not targets. Hitting the hourly or daily cap pauses ALL outbound contact until someone turns it back on from Automations. Session-roster sends (reminders to tonight's booked, codes to tonight's attendees) skip the approval click up to the auto-limit; anything larger, or any other bulk run over the threshold, still holds for a yes.
Email sending (Resend)
The Phase 4 email send path — the foundation the nurture / no-show / attended ladders will run on. Off by default and it has never sent anything. Every send is ledgered before it goes, checks the person and address suppression stores, obeys the outbound kill switch and the Send Guard caps above, and carries one-click unsubscribe headers. The daily cap follows the domain-warming schedule: a brand-new sending domain that bursts gets junk-foldered for everyone, so the cap only rises week by week.
Setting the warming week snaps the daily cap to that week's ceiling (50 → 200 → 500 → 1,000 → 2,000 → 3,500 → 4,000); type a cap to override it downwards. Hold or step back a week if bounces pass 2% or Gmail Postmaster spam passes 0.1%. Nothing sends until the switch above is on and the founder has approved the Week-1 warming audience.
Offer Message
Discount codes sent on WhatsApp after each Introduction Session: instantly to anyone who messages "offer", and automatically to every other attendee once the register finishes. The button below is only needed to send again by hand. Anyone who is already a customer, has no WhatsApp chat, or already has the codes in their chat — including a copy sent by a person in HubSpot — is skipped.
The delay is why the codes arrive last. The same inbound message also starts HubSpot's Introduction Session notes and, if a year group is known, the assessment — and both of those are sent by HubSpot a moment later. Sending the codes straight away put them first, which reads backwards. Holding them a few minutes lets the other two land first. Set 0 to send immediately again. This applies to the automatic reply only; the batch button below always sends now.
On in production (user, 5 Aug: session-night post-session sends stay automatic). Runs itself once the register finishes, straight after the assessment step. With it off, the batch becomes the Preview + Send buttons below and the 10pm backstop and late-attendee sweep go dormant — somebody has to remember to press it (the 29 July failure).
Off by default (5 Aug): with this off, an "offer" message gets the codes drafted as an internal note on the WhatsApp thread — copy it into a reply in HubSpot to send. The app never sends the codes itself while this is off.
The two codes drop in wherever {{code20}} and {{code10}} appear, and {{expiry2}} becomes the right expiry day automatically — two days after the Introduction Session. Preview shows the exact final message before anything is sent. Send the same evening: WhatsApp only allows replies within 24 hours of a contact's last message.
Send to a session's attendees
Bump Message
A light "any final questions?" nudge sent automatically once per session, at the time below (UK, same evening as the session), to anyone who attended and hasn't paid yet. Customers and Dead contacts are always skipped. Runs on its own — no button needed for future sessions.
{{firstname}} drops in automatically. WhatsApp only allows replies within 24 hours of a contact's last message, same as the offer message above.
Manual send for a session
Only needed to send early, or re-send a session the automatic worker already skipped past. A session it has already processed can't be sent again from here.
Assessment Mapping
HubSpot's Send Assessment property has exactly one checkbox per row below — confirmed live against HubSpot, there's no separate box for, say, Year 3 vs Year 4. So whenever a child anywhere in that range is mentioned, the AI ticks that one box; it doesn't need to pick a specific year within the range. The rightmost column is that checkbox's internal HubSpot value — it's a legacy name that doesn't match its own displayed label on purpose (e.g. the box labelled "KS3" is internally called "Year 7"). Only change it if the property itself changes in HubSpot.
| Year group | Covers | HubSpot checkbox (legacy value) |
|---|
Ask Year Group Message
Sent automatically on WhatsApp when the AI can't tell what year group a child is in from the chat or CRM notes — right after the session, alongside the assessment tick. Turn auto-send off if you'd rather review these by hand on Session Attendees first.
Unknown Sender Messages
For WhatsApp numbers with no contact card that ask for the offer codes or the assessment on a session night. The identification ask below goes out first (the codes follow it straight away — they're never gated on who the person is), and anyone who then goes quiet gets the chase message once, the same evening only. When they reply with their details the contact card is created and the normal assessment flow takes over.
With this off, unknown numbers get nothing automatically — their messages still appear on the Inbox's Unknown page for a human to work by hand.
The chase goes out at most once, and only on the same UK evening as the ask — past midnight the moment is gone and nobody is chased. Minimum 5 minutes.
WhatsApp Reply Drafting
For genuine customer questions the other flows above don't handle — every reply is
posted as an internal HubSpot comment for a team member to review, edit and send;
nothing is ever sent to a customer automatically. Ported from the standalone
handover package — see docs/whatsapp-reply-handover.md for the full
reasoning behind every rule below.
Learned corrections
Captured automatically when a team member edits a suggested reply before sending — recent examples are fed back into later drafts so they match the team's own voice. Delete anything that isn't a genuine correction (e.g. an unrelated templated message that happened to follow a draft).
| Customer said | Drafted | Actually sent | When |
|---|
Callback Requests
Inbound WhatsApp messages are checked every 10 minutes for callback requests and buying signals. Pick an agent next to a lead, then press Call to dial them back. This is a queue of detected signals, not a segment of the Inbox — the same person can appear here and in Active Leads.
| Detected | Contact | Intent | Lead status | Wants call at | Summary |
|---|
Reschedule Requests
Anyone who messages on WhatsApp saying they missed or can't make an Introduction Session — whether that's minutes before it starts or days after they no-showed. They're automatically rebooked into the next available session (or their requested date, if they named one) and sent a WhatsApp confirmation signed Emily. Turn automation off below to review each one by hand instead.
| Detected | Contact | Previous session | Message / summary | Status | Confirmed |
|---|
{{firstname}} and {{new_date}} fill in automatically — new_date matches exactly what's written to the contact's HubSpot record. The right message is picked automatically by comparing when they messaged to the UK calendar day of the session they were originally booked into. The rejoin message uses {{meet_link}} instead of {{new_date}} and never changes their booking.
SMS Session Reminders
Text reminders for the Introduction Session, sent from the Twilio number. Only contacts whose lead status is exactly Webinar Booked and who are booked into the session are ever messaged — Paid, Dead, opted-out and unrecognised statuses are excluded by construction. Each rung below has its own switch; a rung that misses its window is recorded as missed, never sent late.
Test with your own number
Sends ONE real SMS to the number you type — the exact message a recipient would get, with tonight's time, link and the live discount codes filled in. Logged in the Message Log as a test. Nobody else receives anything.
SMS Message Log
Every SMS this system has sent — the exact rendered text, Twilio's delivery verdict and the cost — plus every reply that has come back. Replies are never dropped: non-STOP replies also file a task, STOP replies suppress the contact from every future send.
Campaign delivery
One row per broadcast. SMS has no read receipts, so there is no true open rate — "delivered" (the handset accepted the message) is the closest measurable thing. The rate counts concluded receipts only; messages still awaiting their receipt sit in their own column instead of dragging the rate down.
| Campaign | Session | Sent | Delivered | Not delivered | Awaiting receipt | Delivery rate | Cost |
|---|
Inbox — replies received
Every SMS reply lands here (and files a task). Type in the box to answer someone by SMS directly — replies to a number that has texted STOP are refused.
| When | From | Message | Handling | Reply by SMS |
|---|
Reschedule asks
Replies that read like "can't make it / missed it / can I have another date" — anyone who has already attended, paid, or is closed off never appears here. Pick a session and Move & text: the booking moves in the CRM and they get the same confirmation message the WhatsApp reschedules send.
| When | From | Message | Booked session | Status | Confirmation | Actions |
|---|
Sent
| When | To | Type | Session | Message | Length | Status | Cost |
|---|
SMS Configuration
Shared settings for every SMS the system sends. The join link fills {{link}}
in the reminder messages — leave it blank to use the session's Google Meet link (the same
meeting attendance is tracked against).
Instagram post comments and DMs, answered by the AI. In draft mode every reply waits here for your approval — edit, send, or dismiss. Switch a surface to auto once you trust its answers.
AI instructions (shared by Instagram and Facebook)
Facebook page comments and DMs, answered by the AI. In draft mode every reply waits here for your approval — edit, send, or dismiss. Switch a surface to auto once you trust its answers.
AI instructions (shared by Instagram and Facebook)
Integrations
Background jobs
Every recurring worker records a heartbeat. Stale means it hasn't completed for several of its intervals — either the worker is dead or every run is erroring; failing means recent runs are erroring. Either one is the silence that hid the 24 Jul drafting outage and would otherwise go unnoticed again.
| Job | Cadence | Last success | Last error | Status |
|---|
AI contact owner
When the AI calls or messages a lead that nobody owns, it sets this HubSpot user as the contact owner. Leads already owned by a team member are never taken over.
Seller assignment — attended, not paid
When a lead attends an Introduction Session and hasn't paid, give them an owner. Leads already owned by a team member are never taken over, and deactivated HubSpot users are skipped automatically.
| When | Lead | Outcome | Assigned to |
|---|