gtmjosh

CRM AI control plane: models, prompts, tools, usage, and governance

· 5 min read· Salesforce · HubSpot

A reference architecture for operating CRM AI as a governed system: provider and model configuration, prompt versions, tool permissions, usage and cost logging, feature state, and failure handling.

On this page

A context layer explains the business. A control plane operates the AI system that consumes that context.

Once CRM AI moves beyond one prompt and one model, ordinary operating questions appear quickly: Which model is active? Which prompt version produced this result? Which tools can this workflow call? How much did it cost? Can an operator disable one capability without taking the entire application down?

Those questions should not require a code deployment to answer.

Separate the control plane from the runtime

Admin control plane
Providers, models, prompt versions, tool registry, feature state, budgets, ownership
Context + policy
Business definitions, source authority, permissions, eligibility, action limits
AI runtime
Assemble request, resolve configuration, invoke model and approved tools
Execution history
Usage, latency, cost, tool calls, result state, errors, versions
Runtime executes a governed request. The control plane defines the configuration and evidence needed to operate that runtime safely.

Do not turn the control plane into a second prompt library. It owns operational configuration; the CRM AI context layer owns business meaning, and hard authorization still belongs at the tool boundary.

Configuration should be data, not scattered constants

A useful configuration record identifies at least:

ConcernWhat to store
CapabilityStable workflow or feature identifier
ProviderWhich model provider this capability uses
ModelActive model plus allowed alternatives
PromptVersioned system/instruction template
ToolsTools this capability may request
Context profileWhich rule/context bundle it loads
Feature stateEnabled, disabled, limited, or test-only
OwnerPerson/team accountable for the capability
Budget policyOptional usage or cost boundary
VersionConfiguration revision attached to every run

The runtime resolves this configuration at execution time or from a controlled cache. A model change should therefore be an observable configuration change, not an invisible code edit.

Tool availability and tool authorization are different

A tool registry answers what the application knows how to call. Authorization answers whether this user and this request may call it now.

A Salesforce-update tool might be registered globally while a summarization capability remains read-only. A tool can also be available to one user but blocked for another because record, object, field, or feature permissions differ.

  1. 1
    Model requests a tool
  2. 2
    Resolve registered tool
  3. 3
    Check capability allowlist
  4. 4
    Check user + data permissions
  5. 5
    Check action-specific policy
  6. 6
    Execute or reject
  7. 7
    Log decision + result
Registration makes a tool callable. Policy makes a specific call permissible.

Never encode this boundary only in prompt language. See CRM AI permissions.

Prompts need release discipline

Treat prompts like operating configuration with an identity and history. Store a stable prompt key separately from its versions so a workflow can point to an approved version and roll back without editing source code.

For each version, preserve the text or template, owner, status, effective time, model assumptions, context contract, test results, and replacement relationship. A production run should record the exact prompt/configuration version it resolved.

That makes a changed answer diagnosable. Without version history, operators are left comparing today's output with memory.

Provider abstraction should preserve the contract

Supporting multiple providers is useful only if the application contract stays stable. Keep provider-specific request formatting behind an adapter and normalize the result the rest of the application consumes.

The stable layer should describe things your application actually needs: generated text or structured output, usage, model identity, finish/error state, latency, and tool-call requests where supported. Do not pretend every provider exposes identical behavior; normalize the parts your product contract depends on and keep provider-specific capabilities explicit.

This also makes model migration safer. The question becomes “does this candidate satisfy our evaluation contract?” rather than “can we change one model-name string?”

Usage logging is part of observability

Every production invocation should leave enough evidence to explain cost and behavior without storing unnecessary sensitive payloads.

Useful run-level fields include:

  • Capability and configuration version.
  • Provider and model.
  • Start/end time and latency.
  • Input/output usage reported by the provider where available.
  • Estimated or reconciled cost.
  • Tool calls requested, allowed, rejected, and completed.
  • Context/rule version.
  • Result state and structured error category.
  • User or system actor at the appropriate audit granularity.

Usage data becomes much more useful when it can be grouped by capability rather than only by model. “Model X cost $900” is an invoice fact. “Opportunity summaries cost $620 and are opened by three people” is an operating decision.

Give operators bounded controls

An admin surface should expose controls that are safe to change without engineering while keeping dangerous boundaries in code.

Good admin controls include selecting among approved models, activating an approved prompt version, enabling/disabling a capability, managing bounded context rules, viewing usage, and inspecting failed jobs.

Controls that expand data or action authority deserve a stronger change path. Adding a new writable object, bypassing permission enforcement, or granting a tool a new destructive action is not ordinary prompt administration.

Failure states should be explicit

A CRM AI request can fail in several materially different ways:

FailureOperator response
Provider unavailable/rate-limitedRetry or fail over according to policy
Invalid configurationDisable capability or roll back configuration
Context unavailable/staleRefuse, degrade, or mark result depending on the contract
Tool authorization rejectedReturn a bounded refusal and log the rejected action
Tool execution failedPreserve model result separately from action failure
Output invalidRetry validation/repair only within a defined limit
Budget boundary reachedDefer, use an approved lower-cost path, or stop

Do not flatten all of these into AI_ERROR. Error categories are how an operator distinguishes a provider outage from a permissions regression or a bad configuration release.

Operate the system as a product

A mature control plane should let an operator answer five questions quickly:

  1. What configuration is active right now?
  2. What changed since the last known-good version?
  3. Which capabilities, models, and tools are actually being used?
  4. What is failing, how often, and why?
  5. What can be disabled or rolled back without a deployment?

That is the difference between an AI feature and AI infrastructure.

Related: CRM AI context layer, Operating a CRM context layer, CRM AI permissions, Workflow states and job history, and Golden-question testing.

Get the next guide

New guides and the occasional note on GTM tooling. Don't worry, I won't drop you into a three-month nurture.