In enterprise sales, speed to context matters. When someone at a target account reads your security documentation, searches your developer hub for SSO setup, or raises a technical blocker in an evaluation thread, that is a buying signal. In many go-to-market motions it sits in product telemetry, a CRM task queue, or a channel the account team never sees until the moment has passed.
This guide describes an event-driven pattern for closing that gap: routing search-intent signals from Google Cloud’s search stack (formerly Vertex AI Search) and account-context signals from Glean agents into dedicated Slack “war room” channels. It also covers what each product does today, where the integration points are, and where the limits are.
A note on naming (as of November 2026): At Google Cloud Next ‘26 on April 22, 2026, Google announced the Gemini Enterprise Agent Platform as the evolution of Vertex AI, and its documentation now says Agent Builder has transitioned into that platform. Search capabilities, and the user-event documentation used below, now live under Gemini Enterprise docs. This article keeps “Vertex AI Search” in the title because that is still the name most teams and existing code use. Check Google’s current documentation for exact console and API names before you build.
1. The Enterprise Challenge: Intent Decay and Siloed Knowledge
Buyers research through documentation portals, developer hubs, and sandboxes long before they book a discovery call. Three problems follow:
- Information gap: Signals such as repeated queries about SOC 2, API rate limits, or data residency are recorded in search logs and analytics tables that sales teams rarely look at.
- Latency: If the only way to see a signal is to run a report, reps find out late. The prospect’s urgency may have faded or a competitor may have engaged.
- Channel sprawl: Deal context is split across CRM, call recordings, tickets, email, and chat. No one person sees all of it.
A sales war room is a deal-specific Slack channel where AEs, SEs, solutions architects, and leadership coordinate on a strategic opportunity. Feeding it vetted, contextual signals turns it from a chat room into an operating surface for the deal.
2. Architecture: Two Signal Sources, One Dispatcher
It is tempting to draw a straight pipeline from search to Glean to Slack. In practice, the two products play different roles and connect to your stack in different ways:
- Search signals come from your own search experience. If you build search on Google’s platform and call its APIs from your own site or app, you are responsible for capturing user events and sending them to the platform. Google’s documentation describes
searchandview-itemevent types. Each carries auserPseudoId(required) and, optionally, auserIdand the search query text. Events can be recorded in real time, with the JavaScript pixel or the API, or imported in bulk, for example from BigQuery. For search tuning, Google asks that events be uploaded at least daily, with a maximum delay of 24 hours. - Account context and automation come from Glean. Glean agents can start from content triggers, which fire when something changes in a connected source. Documented recommended sources include Gong, Jira, Salesforce Sales Cloud, Gmail, Google Calendar, Outlook, and Slack. Glean’s documentation says latency for those sources is typically a few minutes, and that experimental sources can take a couple of hours but always less than a day.
- A small middleware service joins them. It scores intent, resolves the account, chooses the right Slack channel, and posts the message.
Your docs portal / dev hub / in-app search │ (search + view-item user events) ▼ Google search platform (Vertex AI Search lineage) │ your app also publishes events to Pub/Sub or BigQuery ▼ ┌──────────────────────────────┐ ┌────────────────────────────────┐ │ Intent-scoring middleware │◄───────│ Glean agents (content triggers │ │ (account match, thresholds, │ context│ on Salesforce, Gong, Zendesk, │ │ dedupe, channel lookup) │ │ Slack, etc.) │ └──────────────┬───────────────┘ └────────────────────────────────┘ ▼ Slack Web API (chat.postMessage) → deal-specific war room channel One caveat: Google’s search platform does not push events into Glean by default. If you want Glean to reason about search activity, send that activity to it deliberately, for example through your middleware, a custom connector, or by having the middleware call a Glean agent. Glean documents an Agents API for running agents programmatically, and its custom-connector content triggers are marked as beta and experimental. Confirm availability with your Glean account team before you design around either.
Step 1: Capture search intent
- Instrument your documentation or product search so every query and result click is recorded as a user event with the Google platform. The event schema is documented for both real-time recording and BigQuery import.
- Use
userPseudoIdfor anonymous visitors and adduserIdafter login so activity can be tied to a person across devices. - In your own backend, also publish a lightweight copy of each event to Pub/Sub. Pub/Sub is not a built-in output of the search product. It is a convenient way to stream events to your middleware, so you wire it up yourself.
- Account resolution, which maps a visitor to a company, comes from your authentication, CRM, or a reverse-IP or enrichment vendor. The search platform does not provide it.
Step 2: Add account context with Glean
Glean agents run with the permissions of the user who activates them, and each user who wants a content-triggered agent to run activates it for their own data. This design suits personal and team assistants, such as a Salesforce-opportunity briefing for an AE. It is not a single centralized event processor, so plan for it when deciding what runs in Glean and what runs in your middleware.
Useful patterns include:
- Trigger on a Salesforce opportunity being created or moving to a key stage, then summarize deal health and recommend next actions.
- Trigger on a new Gong call, extract key deal details, and draft a follow-up.
- Trigger on new Zendesk or Jira tickets from a named account, then summarize them for the war room.
Glean recommends at least one filter per trigger because unscoped triggers can consume the hourly quota quickly and produce noisy results. Glean also deliberately excludes messages sent by Gleanbot from content-triggered agents, to prevent loops. Other Slack apps and bots can trigger them, so check that your own alerts don’t re-trigger an agent that watches the same channel. Triggers for external Slack channels are not currently supported.
Step 3: Dispatch to Slack
Your middleware posts a Block Kit message to the account’s war room once a threshold is met.
3. Implementation Guide
Phase 1: Instrument search
- Build or configure your search app in the Google Cloud console, following the current Gemini Enterprise and Agent Platform documentation.
- Record
searchandview-itemevents from your site with the JavaScript pixel or the user events API. - Include
eventTimein RFC 3339 format when importing events. BigQuery imports require it. - Stream a copy of each event to Pub/Sub from your own backend if you want real-time scoring.
Don’t assume you can attach a “high intent” flag to queries through relevance tuning. Tuning affects ranking. Do the scoring yourself in the middleware, for example by matching queries against a maintained list of terms such as pricing, SLA, SSO, SCIM, security audit, data residency, migration.
Phase 2: Build the Glean agent
- Make sure your admin has enabled content triggers (Admin console → Agents → Content triggers).
- Create an agent in Agent Builder and add a content trigger, for example a Salesforce opportunity that meets a condition.
- Reference the event data in your instructions with
[[Trigger input]]. - Publish the agent, then have each intended user activate it.
Glean’s documentation says agents published to Slack can answer questions and run read tools, but write tools that require interactive approval in the Glean web app do not complete from Slack. Have the agent produce a briefing and let your middleware or workflow handle the posting.
Phase 3: Build the Slack dispatcher
Use a Slack app with the chat:write scope and post with chat.postMessage. A plain incoming webhook is bound to a single channel chosen at install time, and Slack’s documentation says you cannot override the channel, username, or icon in the payload. A per-deal war room design therefore needs the Web API or one webhook per channel.
import os import httpx from fastapi import FastAPI, Header, HTTPException app = FastAPI() SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"] # xoxb-..., scope: chat:write SHARED_SECRET = os.environ["ROUTER_SHARED_SECRET"] # authenticates upstream callers # In production, look this up from your CRM or a database. WAR_ROOMS = {"acme-corp": "C0123456789"} @app.post("/route-intent-signal") async def route_signal(payload: dict, x_router_secret: str = Header(default="")): if x_router_secret != SHARED_SECRET: raise HTTPException(status_code=401, detail="Unauthorized") account_id = payload.get("account_id", "") channel = WAR_ROOMS.get(account_id) if not channel: raise HTTPException(status_code=404, detail="No war room mapped") account_name = payload.get("account_name", "Unknown account") query_text = payload.get("query_text", "")[:500] deal_size = payload.get("deal_size", "n/a") crm_url = payload.get("crm_url", "") blocks = [ {"type": "header", "text": {"type": "plain_text", "text": f"High-intent signal: {account_name}"[:150]}}, {"type": "section", "fields": [ {"type": "mrkdwn", "text": f"*Opportunity value:*\n{deal_size}"}, {"type": "mrkdwn", "text": "*Source:*\nDocs search + Glean context"}, ]}, {"type": "section", "text": {"type": "mrkdwn", "text": f"*Recent search:*\n> {query_text}"}}, ] if crm_url.startswith("https://"): blocks.append({"type": "actions", "elements": [ {"type": "button", "text": {"type": "plain_text", "text": "View CRM record"}, "url": crm_url} ]}) async with httpx.AsyncClient(timeout=10) as client: resp = await client.post( "https://slack.com/api/chat.postMessage", headers={"Authorization": f"Bearer {SLACK_BOT_TOKEN}"}, json={"channel": channel, "text": f"High-intent signal: {account_name}", # notification fallback "blocks": blocks}, ) data = resp.json() if resp.status_code == 429: raise HTTPException(status_code=429, detail="Slack rate limited; retry later") if not data.get("ok"): raise HTTPException(status_code=502, detail=f"Slack error: {data.get('error')}") return {"status": "success", "routed_to": account_name} Notes on the code:
- Slack’s rate-limit documentation says apps may generally post no more than one message per second per channel, with short bursts allowed. Exceeding it returns HTTP 429 and a
Retry-Afterheader. Batch or debounce alerts for the same account. - Slack Web API methods return
ok: trueor an error code in the response body, so check the body as well as the HTTP status. - URL buttons work without extra setup. An action button with an
action_id, such as a “Deploy AI briefing” button, needs an interactivity endpoint configured on your Slack app to receive the click. - Never put secrets in query strings or alert payloads, and verify the caller, as the shared-secret check above does.
4. Best Practices for War Rooms at Scale
Too many alerts lead teams to mute channels. A few habits keep the signal useful:
- Threshold-based routing: Alert only when behavior crosses a defined bar, such as several people from one account reading security documentation within 24 hours, or one person repeating a pricing or SSO query. Tune the thresholds against your own data.
- Dedupe and batch: Collapse repeated events for the same account into one thread reply instead of a new top-level message.
- Enrichment, not noise: Include who (or which role) searched, what they looked at, the opportunity stage, and a suggested next step. Glean agents can generate a briefing for the middleware to attach.
- Closed-loop feedback: Let reps mark alerts as useful or a false positive with emoji reactions. This needs the Slack Events API (
reaction_added) and the relevant read scopes. Use the labels to adjust scoring rules. - Permissions and privacy: Search logs about identifiable people are personal data in many jurisdictions. Work with legal and privacy teams on consent, notices, retention, and which prospects may be tracked at the individual level. Avoid posting sensitive data into broad channels. Remember that Glean’s permission model applies to what its agents see, but your middleware has its own access and must enforce its own rules.
5. Measuring Success
Validate the program with data rather than assumptions. Useful metrics include:
- Time to outreach: The time from a qualifying signal to the first human follow-up, compared with a baseline from before the program.
- Alert precision: The share of alerts that reps mark as useful.
- Win rate and cycle length: Compare comparable opportunities with and without routed signals, controlling for deal size and segment. Treat early results cautiously, because deal cycles are long and samples are small.
- Alert volume per room: Watch for rising mute rates or declining reactions as an early sign of fatigue.
Conclusion
Search platforms are good at capturing what buyers look for. Glean agents are good at assembling context from the systems where deals live. Slack is where deal teams already work. Joined by a small, well-governed middleware layer that handles scoring, account mapping, and rate limits, these tools can shorten the path from a buyer’s question to a human response. Success depends less on the AI components than on clean event data, sensible thresholds, careful privacy handling, and a feedback loop with the reps who receive the alerts.
Sources
- Google Cloud: About user events (Gemini Enterprise)
- Google Cloud: Agent Builder documentation notice
- Campus Technology, Google Intros New Gemini Enterprise Agent Platform
- Glean: Content triggers
- Glean: Publishing agents to Slack
- Slack: Rate limits
- Slack: Sending messages using incoming webhooks
Originally published at https://instachime.com/blog/routing-google-cloud-vertex-ai-search-glean-autonomous-agents-to-slack-sales-war-rooms