Connect
Integrations
Every integration gives the agent new tools. Not just a notification channel, but actual capabilities — create a deal, book a meeting, enrich a contact, post to Slack. This page walks through each one.
Plan slots
| Plan | Integration slots |
|---|---|
| Free | 0 |
| Starter | 1 |
| Growth | 3 |
| Scale | Unlimited |
| Website + Widget | 1 |
Apollo.io and ZoomInfo are Growth+. All others are Starter+.
Page layout
The Integrations page is split into six top-level views. It lands on Categories — your connected tools grouped by what they do for the agent, with the order Quincer uses them in (next section). All tools is the visual rail of every connected integration; the rest are the developer-facing surfaces that used to live under Developer APIs.
In the panel below, the top row is that view switcher — Categories, then All tools (active), Custom REST, Webhooks, API keys, and MCP servers. On the All tools view the left Connected rail lists each service with a coloured status dot (green = live and recently synced), and clicking a row opens the detail pane on the right. That pane has its own five sub-tabs — Overview, Tools, Account, Activity, and Settings — with the connection state shown as a Connected pill and each granted tool sitting behind an on/off switch on the Tools sub-tab.
Overview · HubSpot • Connected
The six top-level views, the Connected rail with status dots, and a detail pane whose Tools sub-tab toggles each agent capability.
| Tab | What it is |
|---|---|
| Categories | The landing view. Connected tools grouped by capability — Calendar, CRM, Email, and so on — each group showing the numbered order Quincer uses them in, with Make default to change it. See below. |
| All tools | Connect / configure off-the-shelf integrations (HubSpot, Slack, Gmail, Calendly, Meta, etc.). Each one lives as a row in the left rail with a status dot; clicking opens a detail pane with Overview, Tools, Account, Activity, and Settings tabs. |
| Custom REST | Point the AI at any HTTP endpoint you own. See below. Scale plan + Custom Tools add-on required. |
| Webhooks | Subscribe an HTTPS endpoint to Quincer events (new conversations, leads, tool calls). Signed payloads. Moved here from the old Developer APIs page. |
| API keys | Programmatic access tokens for the Quincer AI REST API. Scope each key to the minimum it needs. Moved here from the old Developer APIs page. |
| MCP servers | Connect any remote MCP (Model Context Protocol) server — your own, or a vendor’s hosted server (Jira, GitHub, etc.). Quincer imports the tools it exposes and your AI personas can call them; toggle which tools are enabled per server. See below. |
Each view is URL-driven (?view=custom, ?view=webhooks, etc.;
Categories is the default and carries no ?view), so deep-links and
browser back/forward work the way you'd expect.
Categories
The Categories view answers the question the flat list can’t: when two of your tools can do the same job, which one does Quincer actually use? Instead of a rail of product names, your connected tools are grouped by what they do for the agent, and each group shows — and lets you change — the order Quincer walks them in.
There are seven capability groups:
| Category | What it buys you |
|---|---|
| Calendar | Check availability and put meetings on a real calendar. |
| CRM | Write contacts, deals and notes where your team already works. |
| Send follow-ups and replies from your own domain. | |
| File storage | Read and cite the documents Quincer answers from. |
| Team messaging | Where escalations, live pings and summaries land. |
| Social | DMs and comments Quincer picks up outside your website. |
| AI agents | Other agents Quincer can delegate research and long tasks to. |
One connection can appear in several groups — Gmail holds a calendar and a mailbox, HubSpot is a CRM and a scheduler — and its rank in each group is independent: Gmail can be first for Calendar and second for Email at the same time.
The order is the feature
Inside a category every connected tool is a numbered row. The row ranked 1 carries a Default badge; every other row shows a Make default link that moves it straight to the top, and hovering a row reveals up/down chevrons for one-step moves. Clicking the row itself opens that tool’s detail pane. Under the list, a plain sentence states the consequence of the current order — for example:
“Quincer tries Gmail, then Calendly, then HubSpot.”
That sentence is generated from the same order the engine reads, never written by hand, so it cannot drift from what actually happens. It also adapts to what the category really does:
- Categories that genuinely fall back read “Quincer tries …, then …”. Calendar and CRM are where this decides real traffic today: the engine walks your order and moves to the next tool when the one before it can’t serve — which calendar a meeting lands on, and which CRM a captured lead is written to, are decided in exactly this order (see how the booker decides). For the other categories the order is recorded and shown, and the tools themselves are picked per request.
- Categories that act on every tool at once (CRM reads merge across your CRMs; a lead ping posts to Slack and Teams) read “Quincer uses all of these: …” rather than promising a fallback chain that doesn’t exist. For CRM the order still matters on the write side: contacts, deals and notes are written to the first CRM in your order (unless a persona pins one — see the persona pick), and a failed write never lands in another CRM.
- A category with a single tool that genuinely falls back is flagged as a single point of failure: “Only Google Drive is connected — if it’s down, Quincer can’t do this. Connect a backup.”
Nothing changes until you reorder. Until you touch a category’s order, Quincer keeps the behaviour it has always had — the oldest connection is preferred first. Ordering is opt-in, not a migration.
Calendar 3 connected
Check availability and put meetings on a real calendar.
↻ Quincer tries Gmail, then Calendly, then HubSpot.
File storage 1 connected
↻ Only Google Drive is connected — if it’s down, Quincer can’t do this. Connect a backup.
The Categories view — four stat tiles, then one card per capability. Each row is numbered, the top row carries the Default badge, and the sentence under the list is generated from the order the engine actually walks.
Categories with nothing connected collect at the bottom under Things Quincer can’t do yet — Quincer will say it can’t help rather than taking the action. Each empty category is a one-click path into the marketplace, alongside suggested capabilities we don’t serve yet (Payments, E-signature) and a Suggest a category tile that opens a support request.
Custom REST
Scale + Custom Tools add-on
Custom REST lets the AI call any HTTP endpoint you control. The model sees the tool by name and description; when it decides the conversation needs that action it invokes the endpoint with the inputs you've defined, and you've got per-call logging + rate limiting + SSRF guardrails for free.
Full guide: Custom REST tools — the seven fields, the Create with AI builder, placeholders, and worked examples (create a persona, query Postgres, open a Jira ticket).
Use it for anything you can hit over HTTP: an internal CRM, an inventory lookup, an order-tracking service, a custom enrichment vendor, a Zapier webhook, a self-hosted endpoint behind a token. Anything.
Anatomy of a custom tool
Each tool is a row in the dashboard with these fields:
| Field | What it does |
|---|---|
| Name | Model-facing function name. Lowercase, underscores, max 64 chars. Examples: track_shipment, check_inventory, look_up_warranty. |
| Description | What the model reads to decide WHEN to call this tool. Be specific. "Look up a shipment by tracking number. Returns the latest status, location, and ETA." |
| Method + Endpoint | The HTTP method (GET / POST / PUT / PATCH / DELETE) and the absolute URL. Must use https:// in production. Private IPs (127.0.0.1, 10.x, 192.168.x, AWS metadata 169.254.169.254) are blocked by the SSRF guard. |
| Input schema | JSONSchema describing the arguments the model will produce. Example: { "type": "object", "properties": { "tracking_id": { "type": "string", "description": "Carrier tracking number" } }, "required": ["tracking_id"] } |
| Headers | JSON object of static headers — Authorization, custom keys, anything. Use template placeholders (below) for per-call values. |
| Body template | For POST/PUT/PATCH only. JSON object that's rendered with input + identity placeholders before the call. |
| Response JSONPath | Optional. A dotted path like data.shipment.status that narrows the response so you don't leak unrelated data back to the model. |
| Timeout (ms) | Per-call timeout. Default 10000, max 30000. |
| Visitor auth | If enabled, the tool only runs when the chat session has a verified visitor token. The verified claims can be injected into the request (next section). Without it the model gets auth-required and tells the visitor to sign in. |
Template placeholders
Three substitution patterns work in headers, body template, and endpoint URL:
{{input.field}}— substitutes the value the model passed for that input field.{{identity.sub}}— the verified visitor's user id (requires Visitor auth).{{identity.claim_name}}— any other claim from the verified token (email, role, custom claims).{{identity.jwt}}— the raw verified JWT, useful when forwarding auth to a backend that re-verifies.
Substitution is deep: a body template like { "user": { "id": "{{identity.sub}}" } }
works. Missing values resolve to empty string, except when a tool marks required claims
(in which case the call is refused before any HTTP fires).
Claim injection: the model can't lie about who's asking
On a tool with Visitor auth enabled, you can map verified-identity claims
directly into input fields. Example: a get_my_orders tool with
claims_to_inject: { "user_email": "email" } will overwrite
whatever the model put in input.user_email with the verified
email claim. The model can't spoof who it's looking up; the
backend always sees the real signed-in user.
Walking through a real example
Tool: track_shipment
- Method: GET
- Endpoint:
https://shipping.example.com/api/v1/track/{{input.tracking_id}} - Headers:
{ "Authorization": "Bearer YOUR_STATIC_KEY" } - Input schema:
{ "type": "object", "properties": { "tracking_id": { "type": "string", "description": "Carrier tracking number" } }, "required": ["tracking_id"] } - Response JSONPath:
data.status - Visitor auth: off (anyone can ask for a shipment status).
When a visitor asks "where's my order?", the model collects the tracking
number, calls track_shipment({tracking_id: "1Z…"}), which becomes
GET https://shipping.example.com/api/v1/track/1Z…, and the
bot summarizes the data.status field back to the visitor.
Auditing
Every tool call writes a row to CustomToolCallLog: the
sanitized request (rendered secrets are not persisted), response
status, response size, latency, error, and the visitor identity at call
time. Rows are kept for 30 days then purged. Logs are exportable from the
tool's row in the Custom REST tab.
MCP servers
Bring your own server
MCP (Model Context Protocol) is an open standard for exposing tools to AI agents. If a service you use — Jira, GitHub, an internal system, anything — runs a remote MCP server, you can plug it straight into Quincer and your personas pick up its tools, even when we don’t have a built-in integration for it.
Connect a server
Open Integrations → MCP servers
(?view=mcp) and click Add MCP server. That opens
the dialog below: a Name field for how the server shows up in
your dashboard, a Server URL (the remote MCP endpoint over
Streamable HTTP, which must be public https), and an Access token /
API key paired with an Auth header that defaults to
Authorization. The hint under the row explains that
Authorization sends Bearer <token> while any
other header sends the raw token — leave the token blank for an open
server. Connect & list tools stays disabled until Name
and Server URL are filled in.
Authorization sends Bearer <token>; any other header (e.g. X-API-Key) sends the raw token. Leave blank for an open server.
The Add an MCP server dialog — on save Quincer connects, lists the server’s tools, and enables them all by default.
- Name — how it shows up in your dashboard (e.g. “Jira”).
- Server URL — the remote MCP endpoint (Streamable HTTP). Must be a public
https://URL. - Access token / API key — optional. Sent as
Authorization: Bearer <token>by default; set the Auth header field (e.g.X-API-Key) to send the raw token instead. Leave blank for an open server.
On save, Quincer connects to the server, lists the tools it exposes, and enables them all by default. Untick any tool you don’t want your agents to call, hit Refresh to re-pull the list after the server changes what it offers, or Disconnect to remove it. Connect as many servers as you need — each one’s tools flow to your personas alongside the built-in integrations.
Per-server settings
Each connected server has three toggles beyond its tool list. They do not all default the same way, on purpose:
| Setting | Default | What it does |
|---|---|---|
| Use on voice calls | On | Whether this server’s tools are offered to the agent during a phone call as well as in chat. On by default so a server you connected before this setting existed keeps working on the phone. Turn it off for tools that are too slow for a live call, or that return output nobody wants read aloud. |
| Send who the visitor is | Off | Whether Quincer tells your server who it is talking to — see below. Off by default: sending your customers’ phone numbers and email addresses to a third-party server is a decision you make, not one we make for you. |
| Allow anonymous visitors | Off | Whether an unidentified web visitor can trigger this server’s tools at all. Off by default, so tools stay behind sign-in unless you open them up. |
Passing the caller’s identity
With Send who the visitor is switched on, every tool call carries a few extra HTTP headers so your server can look the person up — match a caller to an account by phone number, pull an order history by email, and answer with their own data instead of a generic reply.
| Header | Example |
|---|---|
Quincer-Visitor-Identity-Type | phone, email, or the social network’s id type |
Quincer-Visitor-Identity | +14155550123 — phone numbers are always sent in full E.164 form |
Quincer-Visitor-Identity-Verified | true / false — see the warning below |
Quincer-Visitor-Identity-Source | where it came from, e.g. voice_caller_id or web_identity |
Quincer-Channel | voice, web, and so on — the same vocabulary as the channel on a conversation |
Caller ID is not proof of identity. On a phone call the number
comes from the carrier and can be spoofed, so it is sent with
Quincer-Visitor-Identity-Verified: false. Treat it as a
lookup hint — fine for “find this account”, not enough on
its own to release private details or authorise a change. A signed-in web visitor
is sent as true. If your server ignores that header, it is trusting
whoever is on the line.
Security: every request to your MCP server is DNS-resolved and blocked from reaching private or internal addresses, and cross-host redirects are refused — so a server URL can’t be used to probe internal infrastructure. Your token is stored encrypted.
Using an MCP server as a persona’s CRM
An MCP server can be more than a bag of extra tools — it can be the CRM a persona writes to. In the Add an MCP server dialog, the Server type field decides this. It defaults to General tools (no special handling); choose one of the CRM types instead — CRM — HubSpot, CRM — Salesforce, CRM — GoHighLevel, or CRM — other / generic — and, as the dialog puts it, marking a server as a CRM lets Quincer look up callers, log call notes, and build campaigns across it alongside your other CRMs.
The type is how Quincer knows which of the server’s tools is “create
contact”, “log note”, “create deal” and so on: the
named types map that CRM’s standard MCP tool names, while
other / generic matches on tool names and descriptions
(create_contact, add_note, …). Two things gate
every call: the server must expose a tool for the action, and that tool must be
switched on in the server’s tool list — an action with no enabled tool
is simply skipped, never guessed.
Picking it for a persona
Once a typed CRM server is connected, it appears by name in the Which system this persona uses card on Personas → [Persona] → Persona tab, right alongside HubSpot and Pipeline CRM. Choose Only Acme CRM in the CRM select and everything this persona writes — contacts, deals, notes, conversation summaries — goes there and nowhere else. The line under the select shows the outcome before you save: “Writes to Acme CRM — pinned on this persona.” Leave it on Any connected CRM (default) and your brand’s order on the Integrations page decides instead. (The card only renders when there is actually something to choose between — two or more systems of a kind, or an existing pick that needs attention.)
Writes to Acme CRM — pinned on this persona.
Where contacts, deals and notes are written. Everything this persona writes goes there and nowhere else. If it stops being connected, this persona simply has no CRM — it will not fall back to another one.
A typed CRM MCP server (“Acme CRM”) pinned as a persona’s only CRM. The resolution line under the select is computed by the same code the engine runs, so it updates as you change the pick — before you save.
The pin fails closed. If the pinned server is later disconnected, re-typed away from CRM, or has all of its tools switched off, this persona has no CRM at all — Quincer will not quietly write your customers’ records into another system you didn’t choose. The persona page warns you directly above the control: “Acme CRM isn’t connected any more. Rather than quietly switching to another one, this persona has no CRM at all right now. Reconnect it, or choose a different one below.”
HubSpot
CRM · Starter+
Sync every conversation as a contact and a deal. Log messages as conversation records, create follow-up tasks, and track the full lifecycle in HubSpot.
Connect
- Open Integrations, click Connect next to HubSpot.
- Sign in to HubSpot and authorize the Quincer AI app. Required scopes: CRM objects read/write, conversations read/write, tasks read/write.
- Pick the pipeline and deal stage for new Quincer AI deals. You can change this later.
- Done. Every new conversation auto-creates a HubSpot contact (deduped by email) and associates it with a deal.
Tools the agent gets
- Create / upsert contact, company, deal, ticket, meeting, task, note.
- Search contacts, companies, deals by any property.
- Log a conversation summary to the contact timeline.
- Update deal stage when the conversation meets BANT thresholds.
Pipeline CRM
CRM · Starter+
Full parity with HubSpot against an agency-focused CRM — contacts, opportunities (deals), appointments, conversations, and support tickets. Install is one click from the CRM marketplace; agency-level installs pick a single sub-account to wire to this widget (connect a second widget if you need another sub-account).
Connect
- Open Integrations, click Connect next to Pipeline CRM (or install from the CRM marketplace).
- Sign in and choose the sub-account. Location-level installs skip the picker.
- Authorize the requested scopes (contacts, opportunities, appointments, conversations, businesses, users).
- Done. Every new conversation can create contacts and opportunities in this sub-account, and changes in the CRM flow back into Quincer AI leads via webhooks.
Tools the agent gets
- Create / find / update contacts, opportunities, companies, and tasks.
- Book calendar appointments onto a specific calendar.
- Log a chat transcript as an inbound conversation message (falls back to a note if the conversations scope isn’t granted).
- Open support tickets as opportunities in a Support pipeline (create one in the CRM to enable this tool).
- Pull recent notes, tasks, and appointments for a contact to catch up on prior interactions.
Webhook events synced back
ContactCreate— marks matching pending follow-up tasks as completed.ContactUpdate— mirrors name, email, phone, and company changes onto the Quincer AI lead.ContactDelete— unlinks the CRM references on the lead (the lead is not deleted so history is preserved).OpportunityCreate/OpportunityStatusUpdate— links opportunities to leads and upgrades stage (never downgrades except to lost).AppointmentCreate— logs the appointment on the lead timeline.APP_UNINSTALL— cleans up the Integration row automatically.
Slack
Team messaging · Starter+
Escalate questions to your team in real time, post summaries, and DM specific reps when a Hot lead lands.
Connect
- In Integrations, click Connect next to Slack.
- Authorize the app in your Slack workspace. No channel is picked during OAuth — you choose channels afterwards.
- Set your Conversation history channel under Integrations → Slack → Settings, then give each persona its own channels in the Slack row under Personas → [Persona] → Channels.
One-click install:
Add to Slack
— starts OAuth with the correct state/CSRF token set for your
Quincer AI session, then comes back attached to your org. (If you click
the raw slack.com install URL, the callback rejects with
missing_state because there’s no Quincer AI session
tied to the install.)
Recommended channel setup
Most teams end up with three purpose-built channels so signals don't drown each other out.
Create these in Slack and invite the Quincer AI bot to each (/invite @Quincer AI):
- #quincer-history — the raw feed. A summary of every conversation is posted here on close (optional; configure under Integrations → Slack → Settings → Conversation history channel). High volume, low attention — useful for search and compliance, not for triage.
- #quincer-escalation — only AI-triggered escalations land here. When this channel pings, someone needs to reply. Configure per-persona under Personas → [Persona] → Channels → Where your team gets notified → Slack → Escalations go to. Every destination your brand has already connected is one collapsed row that states its saved configuration in a line — click Slack to open it. Anything not connected yet sits in the dashed Not set up yet group at the bottom instead: one line, one action button, nothing to expand.
-
#quincer-live — proactive pings (new conversations, qualified leads) and
/quincer livetakeover threads land here. Activity is heavier than escalations but lighter than history. Set it as Live activity goes to in that same Slack row. If unset, Quincer AI falls back to the escalation channel.
Why three channels? Mixing escalations with new-conversation pings trains your team to ignore the channel — and that's the one channel where ignoring a message costs you a deal.
Tools the agent gets
- Post message to a channel (visible to all).
- Send a DM to a specific user (for hot-lead alerts).
- Post an escalation with the conversation transcript, allowing replies in-thread that stream back to the visitor.
- Post a conversation summary at close.
Live takeover from Slack
Slack is an escalation surface, not a mirror of every conversation.
Messages only appear in your channel when the AI calls
slack_escalate_question — i.e., a visitor asks for a human or the
AI can't answer. Conversations driven from the Quincer AI portal don't post here.
When an escalation lands, the message has Take over and Open in Quincer AI buttons. After clicking Take over the buttons change to:
- Hand back to AI — releases the lock; AI resumes driving the conversation.
- 🔒 Close — terminal. Closes the conversation from Slack: the widget shows the visitor “This conversation has ended”, the thread drops from the live inbox, and the Slack message strips its buttons. Use this when the conversation is fully resolved.
- Open in Quincer AI — deep-links to the conversation in the portal if you want the full tool-set.
During takeover, visitor follow-ups appear in the thread as
💬 {visitor}: {message} so you can see the whole conversation, not just
the first escalated question.
Interactivity, slash commands, and event subscriptions are all pre-configured in
Quincer AI's Slack app — there is nothing to wire up on your side. Once you click
Connect Slack and approve the OAuth prompt, Take over,
Hand back, and /quincer all work immediately.
Commands in Slack
Type these in any channel the bot is in — or DM the Quincer AI bot with the same terms (skip the leading /quincer):
/quincer live— list active conversations and take over without waiting for an escalation./quincer leads [today|hot|qualified]— list recent leads with optional filter./quincer lead <email>— show one lead's profile, score, stage, and open conversation link./quincer stats— snapshot of today: conversations, live takeovers, new leads, pending tasks./quincer takeover <id>//quincer handback <id>— claim/release a conversation by ID./quincer help— list every command.
Proactive notifications (per-persona)
Open the Slack row under Personas → [Persona] → Channels and tick the chips under Send these to your team:
- New conversations — a message posts to the Live activity goes to channel the instant a visitor engages, with a Take over button. Lets the team jump in before the AI escalates.
- Qualified leads — a message posts when a lead first provides an email or their score crosses the qualified threshold, with a deep-link to the conversation.
- Conversation summary — when a conversation ends, the summary posts to the conversation-history channel set under Integrations → Slack → Settings → Conversation history channel — not the live channel. Phone calls include the caller ID and date/time. Nothing is posted while that history channel is empty.
New conversations and qualified leads both fall back to the escalation channel if no Live activity goes to channel is set, and both are off by default — turn them on only for personas where proactive visibility is worth the channel noise. The conversation summary is the exception, and its default is decided on the server rather than by the chip: Quincer AI posts a summary for every persona as soon as the Slack integration has a Conversation history channel. The chip can’t see that integration-level setting — it only reflects the persona’s own Slack channels — so a persona with no Escalations go to and no Live activity goes to channel of its own shows the chip unticked while its summaries are still being posted.
Saving is what settles it. Whatever state the chip is in when you click Save changes gets written to the persona and wins over the default from then on. So to stop summaries for one persona, open its Slack row, leave the chip unticked, and save; to guarantee them, tick it and save. The flip side is worth knowing: a persona that was relying on the default also has the chip’s current state written on any save, so an unrelated edit can quietly switch its summaries off.
Chat with a persona in a channel
Everything above treats Slack as an escalation surface — the AI only
posts when it needs a human. This is the opposite: bind a persona to a channel and
your team can talk to that persona directly in Slack. A message in the
channel — a plain post or @mentioning the Quincer AI bot — is
answered in-thread by that persona, using its knowledge base and tools, posted under
the persona’s own name and avatar. Think of it as an internal help desk: ask
“what’s our refund policy?” or “draft a reply to this lead”
and the persona answers where your team already works.
These count as conversations. Every persona answer in a bound channel is metered as a conversation against your plan, exactly like a chat on your website, WhatsApp, or SMS — and shows up in your engagement analytics and monthly report.
Set it up
-
Reconnect Slack once for the posting-as-persona permission
(
chat:write.customize). Open Integrations → Slack and click Connect again to approve it. Until you do, the persona still answers — it just prefixes its name into the text (Riley: …) instead of posting under its own name and avatar. -
Invite the bot to the channel —
/invite @Quincer AIin the channel you want the persona to live in. The bot only sees messages in channels it’s a member of. - Bind the persona to the channel. Go to Personas → [Persona] → Channels → Slack → Assistant channel and pick the channel. Leave it on None — disabled to switch it off. One persona per channel. Slack is the only platform with an assistant channel.
How it behaves
- In-thread & multi-turn — the persona replies in a thread under the first message; keep replying in that thread and it remembers the conversation.
- Plain posts and @mentions both work — in a bound channel you don’t
need to @mention, but doing so routes to the persona too. (Outside a bound channel,
@Quincerstays the ops surface for/quincer-style queries — see Commands below.) - It won’t talk over a human takeover — if someone has taken the conversation over from the dashboard, the persona stays quiet.
- Escalations, DMs, and
/quincercommands are unchanged — those still route to their own handlers; only plain/mentioned posts in a bound channel reach the persona.
Bind a dedicated channel (e.g. #ask-riley) rather than a busy one — every
human message there is answered and metered as a conversation.
Chat with a persona in a DM
Prefer a private one-on-one? You can also DM a persona directly. Run
/quincer chat to see your AI teammates, then
/quincer chat <name> (e.g. /quincer chat Riley) to point your
direct messages at that persona. From then on, anything you DM the Quincer AI app is
answered by Riley — using its knowledge base and tools, under its own name and avatar
— until you run /quincer chat off.
Like the channel version, every DM answer is metered as a conversation and appears in your engagement analytics and monthly report.
How it behaves
- Per person — your
/quincer chatselection is yours alone; a teammate can be chatting with a different persona in their own DMs at the same time. - Switch anytime —
/quincer chat <other>hands the same DM thread to a different persona;/quincer chat offreturns your DMs to the ops commands (stats,leads) and instruction surface. - Ops commands still work —
/quincer stats,/quincer leads,/quincer liveand the rest are available whether or not you’re in chat mode. - No extra setup — uses the same Slack connection as above; once
you’ve done the one-time reconnect for
chat:write.customize, replies post under the persona’s name and avatar (otherwise they’re name-prefixed). - It knows it’s you — because the chat is internal, the persona greets your team members by name and behaves as a helpful colleague rather than pitching them like an outside prospect. Staff are never captured as leads.
Tailor how it talks to your team
Both the DM and the bound-channel chats above are treated as internal. By default the persona keeps its full identity and knowledge but drops the customer-facing pitch for teammates. To customize that, open Personas → [Persona] → Internal instructions and add guidance used only for internal chats — e.g. “you can speak candidly about internal pricing and help draft replies.” It is appended to the persona’s system prompt (never replaces it), so a persona built purely for internal use (say an HR assistant) keeps its detailed prompt intact. Leave it blank to use the default internal-teammate behavior.
Telegram
Team messaging · Starter+
Run escalations through a Telegram group. Tap Take over on any escalation to go live with the visitor — perfect for teams that already live in Telegram.
Connect
-
Message @BotFather
on Telegram, run
/newbot, and save the bot token it gives you. -
Run
/setprivacyin BotFather and choose Disable so the bot can read replies to its messages in group chats. - Add the new bot to the Telegram group you want to use for escalations.
- In Quincer AI, open Integrations → Telegram, paste the bot token, and click Test & Connect.
-
Set the group chat ID per persona under
Personas → [Persona] → Channels → Telegram → Escalation chat ID.
The easiest way to grab the ID:
send a test message in the group, then check
/api/integrations/telegram/webhook/...logs — or use a bot like@getidsbot.
The per-persona Telegram row is escalation-only. Unlike Slack, Teams, and Google Chat it has no separate live target and no “Send these to your team” chips — the escalation chat ID is its only field. There are no new-conversation or qualified-lead pings on Telegram, and no per-persona conversation-summary toggle; Telegram summaries exist only as the agent-invoked tool below.
Tools the agent gets
- Send a message to the persona's Telegram chat.
- Post a conversation summary to the team’s history chat. This one is agent-invoked
(
telegram_post_summary) rather than an automatic end-of-conversation action, and it posts to the Conversation history chat ID under Integrations → Telegram → Settings. Leave that blank to disable Telegram summaries entirely. - Escalate a question to the group with inline Take over / Hand back buttons.
Live takeover from Telegram
Telegram is an escalation surface, not a mirror of every conversation.
Messages only appear in your group when the AI calls
telegram_escalate_question — i.e., a visitor asks for a human or the
AI can't answer. Conversations driven from the Quincer AI portal don't post here.
When an escalation lands, the message has 🎧 Take over and Open in Quincer AI buttons. Tap Take over and reply to the escalation message (or the “X is now live” confirmation posted right below it — either anchor works) — every reply goes straight to the visitor as you.
During takeover, the inline keyboard shows:
- ✋ Hand back to AI — releases the lock. AI resumes.
- 🔒 Close — terminal. Closes the conversation from Telegram: the widget shows the visitor “This conversation has ended”, the thread drops from the live inbox, and the Telegram message loses its buttons.
- Open in Quincer AI — deep-links to the conversation in the portal.
Visitor follow-ups appear in the group threaded under the escalation as
💬 {visitor}: {message}, so you see the whole conversation.
Microsoft Teams
Team messaging · Starter+
Escalate questions to a Teams channel, DM specific teammates when a Hot lead lands, sync conversation summaries, and take over live chats from Teams — the same workflow as Slack, built on the Microsoft Teams bot.
Connect
Teams isn’t a one-click OAuth like Slack — your Teams admin installs the
Quincer AI app, then you link it with a one-time code. Clicking
Connect next to Microsoft Teams opens the dialog below: a
Download Quincer AI Teams app button for the install package
and Your linking code — a 6-character code that
expires in 30 minutes. The numbered steps under it walk your
admin through uploading the app and pasting
@Quincer AI connect <CODE> in the channel; the dialog stays
open and flips to connected the instant the bot links, so there’s
nothing to refresh.
The Teams connect dialog — download the app, then paste the 6-character linking code to the bot in your channel.
- In Integrations, click Connect next to Microsoft Teams. A dialog shows a Download Quincer AI Teams app button and a 6-character linking code (valid 30 minutes). The same package is always available at /teams-app/quincer-teams-app.zip.
- Your Teams admin uploads the downloaded zip: Microsoft Teams admin center → Manage apps → Upload custom app (or via the Teams app store once we publish it there). Then add the Quincer AI bot to the team and channel you’ll use for escalations.
- In that channel, type
@Quincer AIand pick it from the autocomplete popup so it highlights, then add the code:@Quincer AI connect <CODE>. The bot replies “Connected to Quincer AI” and the integration goes live. Posting the code from a channel (not a private chat) is what lets Quincer load your team’s channels into the persona pickers automatically — Teams only delivers a channel message to a bot when it’s @mentioned. - Set Escalations go to, Live activity goes to, and [Persona] can DM in the Microsoft Teams row under Personas → [Persona] → Channels → Where your team gets notified. If the channel list comes back empty, post or @mention Quincer AI in a channel you added the bot to and reload — a connection made from a 1:1 chat never lists channels.
Updating to a new version of the app
Teams copies the app package into your tenant when you first upload it, so it never re-fetches /teams-app/quincer-teams-app.zip on its own. When we ship a new version (a new icon, a new capability), grab the current package with the Download app button on the Microsoft Teams card in Integrations. It’s always there once you’re connected, so you never have to disconnect or re-link just to get the latest zip.
Then your Teams admin uploads it: Teams admin center → Teams apps → Manage apps → Quincer AI → Upload file. Existing app policies carry over, nobody has to re-approve or re-consent, and your connection stays live. Allow a few hours (up to 24) for the update to reach every Teams client — signing out of Teams and back in forces it sooner.
Tools the agent gets
- Post a message to a Teams channel.
- Send a DM to a specific team member (for hot-lead alerts).
- Post an escalation as an Adaptive Card; replies in the thread stream back to the visitor.
- Post a conversation summary to the history channel.
Live takeover from Teams
Like Slack, Teams is an escalation surface — messages appear only when
the AI escalates (a visitor asks for a human or the AI can't answer). Each escalation
card has Take over and Open in Quincer AI buttons. Tap
Take over and every message you post in that thread goes straight to the
visitor; the AI stops driving until you hand back. Visitor follow-ups appear in the thread
as 💬 {visitor}: {message}.
You can also @mention the bot or DM it with leads,
lead <email>, or stats to query your pipeline, and react to an
escalation card to mark its follow-up task done.
Chat with a persona in a DM
Beyond ops queries, you can chat with one of your AI teammates one-on-one in a
1:1 chat with the Quincer AI app. Type chat to list your personas, then
chat <name> (for example chat Riley) and everything you send is
answered by that persona — using its knowledge base and tools. Because the chat is
internal, the persona greets you by name and behaves as a colleague rather than an
external-facing agent (and you’re never captured as a lead). Type chat off to
go back to commands.
Teams shows every bot message under the app name, so each reply arrives as a card headed with the persona’s own name and avatar — that’s the Teams way to show who’s speaking. Every answer is metered as a conversation, just like a chat on your website, Slack, or WhatsApp.
Proactive notifications (per-persona)
Open the Microsoft Teams row under Personas → [Persona] → Channels and tick the chips under Send these to your team — the same three as Slack:
- New conversations — an Adaptive Card posts to the Live activity goes to channel the instant a visitor engages, with a Take over button.
- Qualified leads — a card posts when a lead first provides an email or their score crosses the qualified threshold, with a deep-link to the conversation.
- Conversation summary — when a conversation ends, the summary posts to the conversation-history channel set under Integrations → Microsoft Teams → Settings → Conversation history channel — not the live channel. Nothing is posted while that history channel is empty.
New conversations and qualified leads both fall back to the escalation channel if no Live activity goes to channel is set, and both are off by default. The conversation summary is on by default once the persona has a Teams channel set, so untick the chip on any persona you don’t want mirrored.
Google Chat
Team messaging · Starter+
Post conversation summaries to a Google Chat space, escalate live conversations to your team, and chat with your AI teammates directly in Google Chat — the same workflow as Slack and Teams, built on a Google Chat app. Requires a Google Workspace (Business/Enterprise) account.
Connect
Google Chat isn’t a one-click OAuth — you connect a space with a short connect code, the same way Microsoft Teams works. A Google Chat message doesn’t say which of your brands it belongs to, so the code carries that: you generate it for a specific brand, and pasting it in a space links that space to that brand.
- In Integrations → Google Chat, pick the brand this space is for and click Connect. Quincer shows a 6-character code (valid 30 minutes).
- In Google Chat, open the space, click the space name → Apps & integrations → Add apps, search Quincer, and add it.
-
In that space, type
@Quincer connect YOURCODE. Quincer confirms which brand the space is now linked to.
Each brand has one Google Chat space, so repeat this per brand to keep them separate. Running Connect again for a brand that’s already linked moves it to the new space rather than adding a second one — the dialog warns you first. A space belongs to exactly one brand and can’t be claimed by another until it’s disconnected, so nobody can re-point your space by removing and re-adding the app. (Your Workspace admin may need to allow the Quincer app.)
Add the app from the space menu — don’t just @mention it. Typing
@Quincer in a space you haven’t added the app to looks like it works (the name
autocompletes) but does not install it, and the app will never respond. Use
Apps & integrations → Add apps.
One space per brand
Because a space is connected with a brand’s code, it already belongs to that brand: its conversation summaries post there, and messages sent in it are answered by that brand’s personas. There’s nothing extra to configure. Connect a second space using a second brand’s code to keep them separate — one space per brand.
Direct messages are different. A 1:1 chat with the Quincer app isn’t a brand’s space, so it’s never used for conversation summaries — those belong somewhere your team can read them.
Conversation summaries
When a conversation closes, Quincer posts a summary card — visitor, caller ID (for phone calls), lead score, sentiment, CSAT, message count, date/time (in the location’s timezone), and a View full conversation link — to the space set as Conversation history space under Integrations → Google Chat → Settings. This is on by default once a space is connected; to turn it off for one persona, untick the Conversation summary chip in its Google Chat row (Personas → [Persona] → Channels).
Escalations and pings
Google Chat is a full team-notification destination, configured in the Google Chat row under Personas → [Persona] → Channels → Where your team gets notified. Only spaces you’ve added the Quincer app to appear in the pickers.
- Escalations go to — the space that receives escalation cards for this persona, whether the AI escalates a question itself or the Escalate on negative sentiment row (Scale) fires with Google Chat escalation space as its target. Replies happen in-thread, @mentioning Quincer; each card also carries Take over and Open in Quincer AI, and after taking over your thread replies go straight to the visitor until you hand back.
- Live activity goes to — an optional second space that keeps proactive pings out of the escalation space. If unset, pings fall back to the escalation space.
- Send these to your team — the same three chips as Slack and Teams: New conversations and Qualified leads (both post a card to the live space, both off by default, each with a Take over button when there’s a live conversation behind it), plus Conversation summary (which posts to the conversation-history space above, not the live space).
The row has no DM-recipient list and no assistant channel: per-persona DM alerts are Slack and Teams only, and the assistant channel is Slack only. Your team can still chat with a persona in a Google Chat DM or space — that’s the next section.
Chat with a persona
Your AI teammates answer inside Google Chat, the same way they do in Slack and Teams.
-
In a direct message with the Quincer app — type
chatto list your personas,chat <name>to pick one, then just talk.chat offends it. -
In a space —
@Quincerfollowed by your question. The persona replies in that thread, so a shared space with a client or supplier can have your assistant in it. (Google only delivers space messages to an app when it’s mentioned; a DM gets everything.)
Replies arrive as cards headed with the persona’s name and avatar, because Google Chat doesn’t let an app post under a different sender. Which brand’s personas answer is simply the brand that space was connected with.
OpenClaw
External AI assistant · All plans
Give an OpenClaw agent a first-class seat in your Quincer AI inbox. It can take over live chats, reply as a human, look up leads, and log activity through the Quincer AI API — with its own team-member identity and audit trail, not as an anonymous bot.
Connect
- In Integrations → OpenClaw, click Connect OpenClaw. This creates a dedicated “OpenClaw” team member in your workspace and issues an API token bound to it.
-
Download SKILL.md and drop it in
~/.openclaw/workspace/skills/quincer/. -
Add the token to
~/.openclaw/openclaw.jsonunderskills.entries.quincer.env.QUINCER_API_KEY. - Restart the OpenClaw gateway. The
quincertool is now available.
What OpenClaw can do
- Take over any live conversation (and hand back to the Quincer AI when done).
- Reply as the OpenClaw team member — every reply is attributed to it in the inbox.
- Look up leads, conversations, and BANT scores via the Quincer AI API.
- Log notes and update conversation status.
For the full API surface (takeover, reply, handback, webhook events), see API & webhooks → External agents.
Perplexity Computer
External AI assistant · All plans
Manage leads and live chats from inside Perplexity Computer using plain English. Ask “show me my hot leads” or “take over the chat on my pricing page” and Perplexity calls the Quincer AI API on your behalf, attributed to its own team-member identity in your inbox.
Connect
- In Integrations → Perplexity Computer, click Connect Perplexity Computer. This creates a dedicated “Perplexity Computer” team member in your workspace and issues an API token bound to it. The token is shown once — copy it.
- Download SKILL.md and upload it to Perplexity Computer under Skills → Add Skill.
-
When Perplexity prompts for the
QUINCER_API_KEYenvironment variable, paste the token from step 1. - Try asking: “Show me my hot leads from today.”
What Perplexity Computer can do
- List, read, and update leads (stage, temperature, tags, assignment).
- Read conversation transcripts, take over a live chat, reply as the Perplexity team member, and hand back to the Quincer AI.
- Read the agent task log (activities) to see what the AI and team have been doing.
Real-time: point a conversation.message_received webhook at your
Perplexity Computer endpoint (Integrations → Webhooks) if you want Perplexity
to react to new visitor messages without polling.
Calendly
Scheduling · Starter+
Let qualified leads book directly inside the chat. Quincer AI lists available times, and a one-click link closes the booking without leaving the widget.
Connect
- In Integrations, click Connect next to Calendly.
- Sign in with your Calendly account and approve access.
- Choose which event type is offered by default (e.g. Discovery Call, 30 min). You can override per persona on the Persona tab: Personas → [Persona] → Persona tab → Tools → Calendly link. Among links, a persona’s own link is consulted first, then a location’s own link, then this brand-level one — and every link is a fallback behind a connected calendar (see below). The Tools card appears once the persona has its own Gmail or Microsoft 365 inbox connected — it is where Book meetings on, Always include attendees, Meeting platform, and Share documents from live too, and the page’s single Save writes all of them.
Tools the agent gets
- List event types for the connected user.
- Show the next N available time slots in the visitor's timezone.
- Generate a one-click booking link pre-filled with the visitor's name and email.
A connected calendar outranks a pasted link
This is the brand-level rule the booker follows whenever both are configured: a connected calendar wins, and a pasted scheduling link is the fallback. When a visitor asks to book, Quincer first looks for a real calendar to put the meeting on, in this order:
- The persona’s own calendar — its connected Gmail / Microsoft 365 inbox with calendar access.
- A matching territory’s owner and their calendar.
- Your brand’s default calendar — whichever provider is ranked first in the Calendar category on Integrations → Categories.
Only when none of those resolves does a link answer: the persona’s Calendly link first, then the location’s, then the brand-level Calendly link. So a Calendly URL pasted on a persona a year ago no longer diverts callers to a second, unmanaged calendar while Google Calendar sits connected — the link steps in exactly when there is no calendar to book on. (When a visitor declines links and asks for a time directly, the link tiers are skipped entirely.)
Make default on the Calendar category decides which provider wins — and all four calendar providers rank there: Gmail, Microsoft 365, Calendly, and HubSpot. Putting Gmail or Microsoft 365 first means meetings are booked directly on that calendar. Putting Calendly or HubSpot first means “don’t book on the connected calendar — hand out the scheduling page instead,” and the link answers.
A persona can override the brand rule in the Which system this persona uses card (Personas → [Persona] → Persona tab): pinning Only Gmail or Only Microsoft 365 always books directly on that calendar and never offers a link, while pinning Only Calendly or Only HubSpot makes the live-calendar tiers stand down for that persona so its link answers.
Books via Gmail — inherited from your brand’s order on the Integrations page.
Where meetings are booked and availability is read. With no choice made, your brand’s order on the Integrations page decides — not the assistant.
The persona’s Calendar pick left on the default: the resolution line shows the booking landing on Gmail because it is ranked first (Make default) in the brand’s Calendar category.
Google Calendar
Scheduling · Starter+
An alternative to Calendly for teams that prefer to book directly on the rep's Google Calendar. Attendees receive standard calendar invites.
Connect
- In Integrations, click Connect next to Google Calendar.
- Sign in to the Google account that owns the calendar reps use. Approve free/busy read and event creation.
Tools the agent gets
- Check free/busy for the connected calendar.
- Create an event with attendee invites and an optional Google Meet link.
Connected calendars outrank pasted links. Once Google Calendar is connected and ranked first in the Calendar category, meetings are booked directly on it — any Calendly URL becomes the fallback for when no calendar resolves. How the booker decides.
Gmail
Email · Starter+
Send follow-up emails from your own Gmail address. Supports draft-for-review mode so you can edit before sending.
Connect
- In Integrations, click Connect next to Gmail.
- Sign in with Google and approve send + draft scopes.
- Pick which sender address to use (if you have aliases).
Tools the agent gets
- Create draft (goes to your drafts folder; you review and send).
- Send email immediately (for auto-send follow-up mode).
- Send a previously-created draft.
Microsoft 365
Email & calendar · Starter+
Outlook email and Microsoft calendar combined. Meetings include Teams links by default.
Connect
- In Integrations, click Connect next to Microsoft 365.
- Sign in with your work Microsoft account. Approve Mail.Send, Calendars.ReadWrite, OnlineMeetings.ReadWrite.
Tools the agent gets
- Send email, create draft, send draft.
- Check calendar free/busy.
- Create a calendar event with a Teams meeting link attached.
Email inbox monitoring
Automation · Scale+
Point a persona at a Gmail or Microsoft 365 inbox and Quincer AI will watch it for new messages, read the thread, search the persona’s knowledge base, and either auto-reply or save a draft for your review — using the same tools, personas, and KB the chat widget uses. Perfect for info@, sales@, support@ aliases you want the AI to triage first.
How it works
- Connect a Gmail or Microsoft 365 integration (see sections above). The persona authors the follow-ups under that connected mailbox, so replies land in the right sender’s Sent folder and thread correctly.
- Go to Personas → [Persona] → Channels. Until this persona has a mailbox, Email inbox sits in the dashed Not set up yet group with a single Connect button; once connected it becomes a row under Where visitors reach [Persona]. Open that row and, under What [Persona] does with this inbox, tick Auto-reply to emails to send automatically — leave it off and every response is saved as a draft for you to review. Context-aware follow-ups (one nudge per thread when the sender goes quiet) needs auto-reply on. Daily send limit caps responses per day (1–500).
-
Send email as (Gmail): if the connected Gmail account has verified
send-as aliases, pick which address this persona sends from — e.g. reply as
sales@company.comfrom a mailbox connected assupport@company.com. Leave it on Account default to send from the connected address. Only verified Gmail aliases are offered (add them in Gmail’s “Send mail as” settings); replies still arrive in the connected inbox. Microsoft 365 sends from the connected address only, since alias-send there is controlled by your tenant admin. -
A background cron polls the inbox every few minutes, matches each new message to a
Lead(by email), runs the same persona flow Quincer AI uses for chats, and produces a reply. Quincer AI threads correctly via In-Reply-To / References headers so the exchange stays tidy in the inbox.
What the agent can do per email
- Pull the full thread history for context, then ground answers in the persona’s KB.
- Run any tool the persona has enabled — e.g. book a Calendly slot, create a HubSpot or Pipeline CRM opportunity, post a Slack escalation — and reference the result in the reply.
- Draft or send. Draft-for-review lands the reply in your drafts folder; auto-send
writes it directly. Either way the outgoing message is logged as a
LeadEmailon the matching lead’s timeline.
Email the conversation summary
The Email inbox row also owns the emailed end-of-conversation summary. Tick Email the conversation summary in the same chip row and a summary goes out when a conversation ends — chat or phone call, and phone calls include the caller ID and date/time. It is sent from the connected Gmail / Microsoft 365 mailbox when there is one, otherwise from Quincer. Ticking the chip reveals Send the summary to: a comma-separated recipient list, or leave it blank to send to your team members. Because both controls live in this row, the persona needs a connected mailbox before you can set them.
Scale plan only. Monitoring is off by default on every persona, even after Scale is active — you pick which personas watch which inbox. Click Disconnect in the Email inbox row to stop one persona reading its mailbox; the brand-level Gmail / MS 365 integration stays connected.
The Bulk tab — mail the agent chose not to answer
Not everything that lands in a monitored inbox deserves a reply. Newsletters, no-reply notifications, and auto-responders are recognised on arrival and kept out of the reply pipeline — the persona doesn’t answer them and no AI tokens are spent on them. Instead of vanishing, they land in the Bulk tab on Inbox → Tasks, so the call is always reviewable and a misclassified real email is recoverable instead of silently gone.
The tab shows the 50 most recent set-aside messages as previews — sender,
subject, a short excerpt, when it arrived, and which persona’s inbox it hit
— each with a badge naming why it was filtered
(noreply-sender, bulk-mail, auto-reply).
Other reasons the agent stood down land here too, badged the same way: the daily
send limit was reached, the sender asked to unsubscribe, the recipient opted out,
or a human teammate was already active on the thread. Rows clear automatically
after 30 days.
If something in the list does deserve an answer, press Compose response. That single click puts the message back on the normal pipeline: it is composed with the persona’s knowledge and tools, threads into the existing exchange, creates the lead, and replies exactly as any inbound mail does — drafted or auto-sent per that persona’s settings, on the next inbox check. The row’s button becomes a Queued for reply badge, and this is the moment the AI cost is actually incurred — nothing was spent while the message sat in the tab.
Mail the agent judged automated, so it didn’t reply and didn’t spend tokens on it. Press Compose response on anything that deserves one. Cleared automatically after 30 days.
The Bulk tab on Inbox → Tasks. The first row is a genuine notification; the second was a real prospect caught by a bulk-mail header — one click on Compose response put it back on the reply pipeline.
Apollo.io
Lead enrichment · Growth+
Enrich leads on the fly. If a visitor gives you an email, Apollo fills in job title, company, employee count, tech stack, and LinkedIn URL. All in under a second.
Connect
- Get your Apollo.io API key from Settings → Integrations → API Keys in Apollo.
- In Quincer AI's Integrations, click Connect next to Apollo.io and paste the key.
Tools the agent gets
- Enrich a person by email or by name + company.
- Enrich a company by domain.
- Search people matching criteria (title, company size, industry).
- Search companies matching criteria.
ZoomInfo
Enterprise enrichment · Growth+
Enterprise-grade enrichment plus buying intent signals. Identify companies actively researching your category even before they reach out.
Connect
- Generate a ZoomInfo PKI key (or have your admin provide username + password auth).
- In Integrations, click Connect next to ZoomInfo. Choose auth method and enter credentials.
Tools the agent gets
- Enrich contact, enrich company.
- Search contacts, search companies.
- Pull intent signals — topics a target account is actively researching.
Managing connections
From Integrations, each connected service has a menu for: Reconnect (refresh OAuth), Test (run a health check), Logs (recent tool calls and responses), and Disconnect (revoke and delete tokens).
Disconnecting an integration immediately removes the corresponding tools from every persona. Any in-flight conversation mid-tool-call will gracefully fall back to a “can't do that right now” response.