Connect Planhat to AI Agents: Automate Tasks, Tickets, and NPS
Learn how to connect Planhat to AI agents using Truto's /tools API. Build autonomous workflows for NPS triage, task automation, and churn management.
Customer Success (CS) teams are drowning in data but starving for action. They have NPS responses, usage metrics, support tickets, and lifecycle phases living inside Planhat. But analyzing this data, categorizing risk, and manually assigning intervention tasks is a massive operational bottleneck.
Connecting Planhat to an AI agent allows your system to autonomously read client health, evaluate inbound tickets, process NPS detractors, and create strategic tasks for Account Managers.
If your team uses ChatGPT, check out our guide on connecting Planhat to ChatGPT or read our guide on connecting Planhat to Claude. But for developers building custom autonomous workflows, you need a programmatic way to fetch Planhat tools and bind them to an execution framework.
Leveraging LLM function calling to give a Large Language Model (LLM) read and write access to a complex CS platform is an engineering hurdle. You either spend weeks building, hosting, and maintaining a custom API connector, or you use a managed infrastructure layer that handles the boilerplate for you.
This guide breaks down exactly how to fetch AI-ready tools for Planhat using Truto's /tools endpoint, bind them natively to an LLM using frameworks like LangChain, LangGraph, or Vercel AI SDK, and execute autonomous Customer Success workflows.
The Engineering Reality of Custom Planhat Connectors
Building AI agents is the easy part. Connecting them to external SaaS APIs like Planhat is where projects stall due to the integration bottleneck.
Giving an LLM access to external data seems straightforward during prototyping. You write a Node.js function that makes a REST call, wrap it in an @tool decorator, and move on. In production, this architecture collapses. If you build a custom integration for Planhat, you own the entire API lifecycle. You own the schema maintenance, the pagination logic, and the error handling.
Planhat's API introduces specific integration challenges that break standard AI agent assumptions.
Polymorphic Relationships (Assigned Models)
Planhat relies heavily on polymorphic data models. When an AI agent creates a task or a timesheet, it does not simply pass a userId. It must define the assignedModel (which could be a Company, an Enduser, a Project, or an Opportunity) alongside the assignedId.
LLMs struggle with polymorphic routing. If you do not provide an extremely precise, typed schema that explains what models are valid and how to fetch their corresponding IDs first, the LLM will hallucinate relations. Your agent will attempt to assign a task to a "Company" but pass an "Enduser" ID, resulting in a silent failure or a corrupted database record.
Dynamic Custom Fields and Schema Drift
CS platforms are highly customized per enterprise. Planhat instances rely heavily on the custom attributes object inside Companies, Endusers, and Assets. An LLM operating on a generic hardcoded schema will not know that custom.churn_risk_score exists for Client A but is named custom.health_index for Client B.
Hardcoded tool definitions break as soon as the CS operations team adds a new mandatory custom field. To make AI agents reliable, your tool schemas must be dynamically generated directly from the live Planhat instance.
Explicit Rate Limits and 429 Errors
When you give an AI agent a loop instruction like "Audit the last 1,000 tickets to calculate churn risk," the agent will aggressively paginate through the API. This triggers rate limits.
Truto takes a strict, predictable architectural approach to rate limiting: Truto does not retry, throttle, or apply backoff on rate limit errors.
When the upstream Planhat API returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller. However, Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) according to the IETF specification.
It is the caller's explicit responsibility to read the ratelimit-reset header and apply the appropriate sleep and retry logic in the agent's execution loop. We do not absorb these errors, because masking 429s from an agentic loop leads to invisible hanging threads and unpredictable LLM timeouts.
Planhat AI Agent Hero Tools
Truto maps Planhat's complex REST endpoints into standardized proxy APIs and exposes them as strongly typed tools.
Here are the critical, high-leverage tools for automating Customer Success workflows.
Get Single Company
Tool Name: get_single_planhat_company_by_id
Before an agent can take action on an account, it needs context. This tool retrieves the core entity in Planhat: the Company. It returns critical CS data including the current phase, status, active domains, related owner data, and aggregated sales details. This is the root node for almost all investigative CS workflows.
"Fetch the current health status, phase, and custom MRR metrics for Acme Corp (ID: 64a...9b)."
List All NPS Responses
Tool Name: list_all_planhat_nps
Net Promoter Score (NPS) data is a leading indicator of churn. This tool allows the agent to list survey responses, filtering by date, score, or company identifiers (cId). The response includes the nps score, scoreType, and crucially, the verbatim npsComment which the LLM can analyze for sentiment and feature requests.
"Retrieve all NPS responses from the last 7 days where the score is 6 or below, and extract the written comments for analysis."
Create a Task
Tool Name: create_a_planhat_task
Analysis is useless without action. This tool allows the agent to assign work to human operators. The agent can specify the mainType (e.g., call, email, meeting), assign an ownerId, and link it to a companyId. This bridges the gap between autonomous analysis and human intervention.
"Create a high-priority task for the account owner of GlobalTech. Set the action to 'Urgent Renewal Outreach' based on their recent drop in usage."
List All Tickets
Tool Name: list_all_planhat_tickets
Support velocity impacts customer health. This tool fetches a list of support tickets tied to specific companies or users. The agent can read the subject, snippet (body), and status. LLMs excel at ingesting arrays of tickets and summarizing the overarching technical themes blocking a customer.
"List all open tickets for Wayne Enterprises and summarize the primary technical issues they are facing this month."
Create a Churn Record
Tool Name: create_a_planhat_churn
When the LLM detects a high likelihood of cancellation (via negative NPS, stalled tickets, and low usage), it can formally log this via the churn API. This requires the companyId and allows the agent to write specific reasons, monetary value impact, and a descriptive comment justifying the risk assessment.
"Log a churn risk record for Initech. Set the reason to 'Product Limitations', flag the monetary risk value, and include a comment summarizing their recent negative NPS feedback."
Update an Opportunity
Tool Name: update_a_planhat_opportunity_by_id
CS teams also drive expansion revenue. When an agent detects buying intent - perhaps an admin user asked a support question about a higher-tier feature - it can update an existing sales opportunity, shifting the salesStage, updating the mrr target, or adding context notes.
"Update the Q4 Expansion opportunity for Stark Industries. Move the sales stage to 'Evaluating' and append a note about their recent inquiry regarding enterprise SSO."
To view the complete inventory of available methods, JSON schemas, and query parameters, visit the Planhat integration page.
Workflows in Action
Individual tools are building blocks. The true value of AI agents emerges when you give the LLM a complex prompt, and it autonomously chains these Planhat tools together to complete multi-step operations.
Scenario 1: NPS Detractor Triage and Escalation
Customer Success leaders need to react instantly to negative NPS feedback, but routing that feedback contextually takes time.
"Analyze the NPS scores submitted this week. Find any scores 6 or below. For each detractor, lookup their Company record. If the company is in the 'Onboarding' phase or has an MRR over $5,000, create a priority task for their account owner to schedule a triage call, including a summary of the user's NPS comment in the task description."
Execution Step-by-Step:
- The agent calls
list_all_planhat_npswith a date filter to retrieve recent surveys. - It identifies surveys where the
npsvalue is <= 6. - For each detractor, it extracts the
cId(Company ID) and callsget_single_planhat_company_by_id. - It evaluates the returned
phaseand financial metrics. - If the criteria match, it extracts the
ownerID and callscreate_a_planhat_task, passing the formatted string of the NPSnpsCommentinto the task payload.
Result: The CSM arrives at work to find a fully prioritized task list with contextual background already attached to the CRM record.
Scenario 2: Proactive Renewal Risk Assessment
Instead of waiting for an account to churn, agents can run background audits on accounts approaching their renewal dates.
"Audit the account health for Pied Piper (ID: 88f...2a). Fetch their recent support tickets and active issues. If there are more than 3 unresolved 'High' severity tickets, or if the tickets contain sentiment indicating frustration, immediately log a Churn Risk record outlining the specific technical blockers."
Execution Step-by-Step:
- The agent calls
list_all_planhat_ticketsfiltered by the target Company ID andstatus: open. - The LLM reads the
snippetarray of the returned tickets, applying internal semantic analysis to detect frustration or recurring blockers. - It calls
list_all_planhat_issuesto check for linked engineering bugs. - Upon determining a high risk, the agent calls
create_a_planhat_churn(which acts as a risk log in this context), mapping thecompanyIdand writing a synthesizedcommentdetailing the technical roadblocks.
Result: Leadership gains automated, data-driven visibility into at-risk revenue before the customer sends a cancellation email.
Building Multi-Step Workflows
To execute these workflows reliably in production, you need to bind Truto's dynamically generated OpenAPI schemas to your agent's execution loop and implement robust error handling for rate limits.
Truto is framework-agnostic. Our proxy APIs serve standard JSON schemas. If you are using the Node ecosystem, you can utilize the truto-langchainjs-toolset which wraps the /tools endpoint perfectly for LangChain, LangGraph, and Vercel AI SDK.
Here is an architectural example of fetching Planhat tools, binding them to an Anthropic model, and explicitly handling the 429 Too Many Requests rate limits normalized by Truto.
import { ChatAnthropic } from "@langchain/anthropic";
import { TrutoToolManager } from "truto-langchainjs-toolset";
import { AgentExecutor, createToolCallingAgent } from "langchain/agents";
import { ChatPromptTemplate } from "@langchain/core/prompts";
// 1. Initialize the Truto Tool Manager with your Planhat Integrated Account ID
const toolManager = new TrutoToolManager({
trutoApiKey: process.env.TRUTO_API_KEY,
integratedAccountId: process.env.PLANHAT_ACCOUNT_ID,
});
// 2. Fetch standard CRUD & Custom tools for Planhat
const planhatTools = await toolManager.getTools();
// 3. Initialize the LLM and bind the Planhat schemas natively
const llm = new ChatAnthropic({
modelName: "claude-3-7-sonnet-latest",
temperature: 0,
});
const prompt = ChatPromptTemplate.fromMessages([
["system", "You are an elite Customer Success AI agent. Execute Planhat workflows accurately. Pay attention to assignedModel requirements."],
["human", "{input}"],
["placeholder", "{agent_scratchpad}"],
]);
const agent = createToolCallingAgent({
llm,
tools: planhatTools,
prompt,
});
const executor = new AgentExecutor({
agent,
tools: planhatTools,
});
/**
* 4. Custom Execution Wrapper for Rate Limits
* Truto passes 429s directly. We must parse the standardized IETF headers
* (ratelimit-reset) and handle backoff on the caller side.
*/
async function executeWithRateLimitHandling(input: string, maxRetries = 3) {
let attempt = 0;
while (attempt < maxRetries) {
try {
console.log(`Executing Agent Task (Attempt ${attempt + 1})...`);
const result = await executor.invoke({ input });
return result;
} catch (error: any) {
if (error.response && error.response.status === 429) {
// Extract Truto's normalized IETF rate limit headers
const resetHeader = error.response.headers['ratelimit-reset'];
if (resetHeader) {
// ratelimit-reset represents the Unix timestamp when the quota resets
const resetTime = parseInt(resetHeader, 10) * 1000;
const waitTime = Math.max(0, resetTime - Date.now());
console.warn(`[429 Rate Limit Hit]. Waiting ${waitTime}ms before retry...`);
await new Promise(resolve => setTimeout(resolve, waitTime + 1000)); // Add 1s buffer
attempt++;
continue;
}
}
// Rethrow if it's not a 429 or we exhaust retries
throw error;
}
}
throw new Error("Agent execution failed: Exhausted rate limit retries.");
}
// 5. Execute the Workflow
const workflowPrompt = `
Find all NPS scores submitted this week below 7.
Lookup the related company for each.
If they are active, create a follow-up task for the owner.
`;
executeWithRateLimitHandling(workflowPrompt)
.then(res => console.log("Workflow Complete:", res.output))
.catch(err => console.error("Workflow Failed:", err));By leveraging Truto's /tools endpoint, your AI agent automatically understands the current state of the Planhat instance. If the CS team adds a new mandatory field for churn reasons tomorrow, the dynamically generated tools will reflect that schema change instantly, preventing your autonomous workflows from crashing in production.
Shifting from Chat to Action
The era of basic conversational bots summarizing help docs is over. The next generation of B2B AI products must act as autonomous operators that read state, make logic-based decisions, and execute multi-step mutations across the SaaS stack.
Connecting an AI agent to Planhat directly involves parsing undocumented polymorphic relations, tracking schema drift across custom attributes, and engineering strict retry loops around vendor rate limits. By treating APIs as dynamically generated AI tools, developers can abstract away the integration layer entirely. You provide the instruction; the agent handles the API execution.
FAQ
- Can I use these Planhat tools with LangGraph or CrewAI?
- Yes. Truto's /tools endpoint provides framework-agnostic JSON schemas. You can consume these definitions in LangChain, LangGraph, CrewAI, Vercel AI SDK, or directly pass them to OpenAI and Anthropic native APIs.
- How do you handle Planhat API rate limits?
- Truto passes HTTP 429 errors directly to the caller without applying backoff or retries. It normalizes the upstream Planhat rate limit information into standard IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). Your agent execution loop is responsible for reading these headers and handling the retry logic.
- Do I need an MCP server to use these Planhat tools?
- No. While MCP is useful for desktop-to-local connections, developers building server-side autonomous workflows can fetch these tools programmatically via the Truto REST API and bind them directly to their agent frameworks.