Skip to content

CRM · Beta

Planhat
API integration

Ship CRM features without building the integration. Full Planhat API access via Proxy, normalized data through Unified APIs, and 140+ MCP-ready tools for AI agents — all extensible to your exact use case.

Built for specific customer use cases. Issues are resolved quickly.

Talk to us
Planhat

Use Cases

Why integrate with Planhat

Common scenarios for SaaS companies building Planhat integrations for their customers.

01

Sync subscription and billing data into Planhat for real-time revenue visibility

Billing and subscription management platforms can automatically create and update Licenses, Invoices, Sales, and Churn records in Planhat so CSMs see live MRR, renewal dates, and churn events without leaving their workspace.

02

Push NPS and survey responses directly into Planhat health scores

Customer feedback and survey tools can write NPS scores, comments, and respondent details into Planhat's NPS object immediately after survey completion, driving automated health score adjustments and CSM follow-up tasks.

03

Keep onboarding projects and tasks in sync between implementation tools and Planhat

Client onboarding and project management apps can create and update Projects, Tasks, and Time Entries in Planhat so VPs of Customer Success have accurate time-to-value metrics and implementation progress without manual data entry.

04

Surface support ticket context inside Planhat for QBR preparation

Helpdesk and ticketing platforms can sync open tickets and issues into Planhat, giving CSMs a complete picture of account health and unresolved escalations when preparing for customer reviews.

05

Enrich Planhat company and contact records with product usage data

Product analytics and engagement platforms can update Planhat Companies and Endusers with usage metrics and activity signals, enabling CSMs to identify expansion opportunities and at-risk accounts from a single pane of glass.

What You Can Build

Ship these features with Truto + Planhat

Concrete product features your team can ship faster by leveraging Truto’s Planhat integration instead of building from scratch.

01

Automated license and renewal sync

Automatically create and update Planhat Licenses with renewal dates, MRR values, and product details whenever a subscription changes in your platform.

02

Real-time NPS score ingestion

Push survey scores and verbatim feedback into Planhat's NPS object as soon as a respondent submits, triggering downstream health score recalculations.

03

Bidirectional project and task tracking

Sync onboarding milestones and task statuses between your project management tool and Planhat Projects and Tasks, including time entries for billable hour tracking.

04

Churn event logging from cancellation flows

Automatically create Churn records in Planhat with reason codes and lost revenue values when a customer initiates cancellation in your product.

05

Two-way ticket and issue sync via Unified Ticketing API

Map your helpdesk tickets to Planhat Tickets using Truto's Unified Ticketing API, keeping status, priority, and assignment in sync across both systems.

06

Custom field mapping for flexible data models

Read and create Planhat Custom Fields programmatically to ensure your integration adapts to each customer's unique Planhat configuration without hardcoding field names.

SuperAI

Planhat AI agent tools

Comprehensive AI agent toolset with fine-grained control. Integrates with MCP clients like Cursor and Claude, or frameworks like LangChain.

list_all_planhat_campaigns

List Planhat campaigns you are running inside companies, e.g. to drive adoption or deepen stakeholder relations. Returns campaigns with _id, name, campaignPurpose, companyId, and companyName.

get_single_planhat_campaign_by_id

Get a single Planhat campaign by id. Returns: _id, name, campaignPurpose, companyId, companyName, externalId, sourceId, custom, __v, usage. Required: id (Planhat _id; externalId/sourceId prefixed identifiers are also accepted).

update_a_planhat_campaign_by_id

Update a Planhat campaign by id. Returns the updated campaign with _id, name, campaignPurpose, companyId, and companyName. Required: id (Planhat _id; externalId/sourceId prefixed identifiers are also accepted).

create_a_planhat_campaign

Create a Planhat campaign. Returns the created campaign with _id, name, campaignPurpose, companyId, and companyName. Requires name and companyId (a company externalId or sourceId may be passed instead, prefixed with extid- or srcid-).

delete_a_planhat_campaign_by_id

Delete a Planhat campaign by id. Returns: n, ok, deletedCount. Required: id.

planhat_campaigns_bulk_upsert

Bulk upsert (create and/or update) multiple Planhat campaigns in one call with an array payload. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors. Creates require name and companyId; updates require one keyable (_id, sourceId, or externalId). Max 5,000 items per request.

list_all_planhat_companies

List Planhat companies. Returns company records including _id, name, status, phase, health score (h), and custom fields. Supports companyId filtering, sorting, and property selection. Max 5000 per page.

get_single_planhat_company_by_id

Get a single Planhat company by id. Returns the full company record including _id, name, status, phase, sales, licenses, and custom fields. Required: id. The company can also be addressed with a prefixed externalId or sourceId.

create_a_planhat_company

Create a Planhat company. Returns the created company object including _id, name, status, phase, and custom fields. Required: name.

update_a_planhat_company_by_id

Update a Planhat company by id. Returns the updated company object including _id, name, status, phase, and custom fields. Required: id. The company can also be addressed with a prefixed externalId or sourceId.

delete_a_planhat_company_by_id

Delete a Planhat company by id. Returns: n, ok, deletedCount, _id, name, mrr, arr, currency, fixedPeriod, autoRenews, length, packages, createdAt, updatedAt. Required: id.

planhat_companies_bulk_upsert

Bulk upsert up to 5,000 Planhat companies in one request with a JSON array body, creating and/or updating each array item — existing items are matched by _id, then sourceId, then externalId. Returns a summary envelope including created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, and permissionErrors.

planhat_companies_list_lean

List a lightweight set of all Planhat companies for matching against your own system ids. Returns per company: _id, name, externalId, and sourceId.

list_all_planhat_invoices

List Planhat invoices, which track the status of current and past invoicing for your customers. Returns invoice objects including _id, status, amountTotal, currency, invoiceDate, dueDate, and lineItems.

get_single_planhat_invoice_by_id

Get a single Planhat invoice by id. Returns the full invoice object including _id, status, amountTotal, currency, invoiceDate, dueDate, and lineItems. Required: id.

create_a_planhat_invoice

Create an invoice in Planhat, typically to track invoicing status for a customer alongside licenses. Returns the created invoice including _id, invoiceNo, status, currency, amountTotal, and lineItems. Required: cId (company id, may use extid-/srcid- prefixed references). Planhat recommends also specifying invoiceDate and currency; date fields use days-format integers.

update_a_planhat_invoice_by_id

Update a Planhat invoice by id, sending only the fields to change. Returns the updated invoice object including _id, invoiceNo, status, amountTotal, invoiceDate, and lineItems. Required: id.

delete_a_planhat_invoice_by_id

Delete a Planhat invoice by id. Invoice numbers are immutable and are not reused after deletion. Returns: n, ok, deletedCount. Required: id.

planhat_invoices_bulk_upsert

Bulk upsert (create and/or update) multiple invoices in Planhat with a single JSON array payload. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors. Required for creates: cId, currency, invoiceDate; for updates one of _id, sourceId, or extId. Max 5,000 items per request.

list_all_planhat_endusers

List Planhat end users (individual contacts at your customers). Returns: _id, email, firstName, lastName, name, companyId, companyName, companyExternalId, externalId, sourceId, position, phone, description, tags, featured, primary, archived, sharedNotificationsPrefs, otherEmails, npsUnsubscribed, nps, npsComment, npsDate, npsSent, beats, beatsTotal, beatTrend, experience, convs14, convsTotal,…

get_single_planhat_enduser_by_id

Get a single Planhat end user by id. Returns the full end user object including _id, name, email, companyId, tags, and last-touch data. Required: id.

create_a_planhat_enduser

Create a Planhat end user. Returns the created end user including _id, name, email, companyId, and createDate. Requires companyId and one of email, externalId, or sourceId; companyId can reference a company via 'extid-[company externalId]' or 'srcid-[company sourceId]'.

update_a_planhat_enduser_by_id

Update a Planhat end user by id. Returns the updated end user including _id, name, email, companyId, and updatedAt. Required: id.

delete_a_planhat_enduser_by_id

Delete a Planhat end user by id. Returns: n, ok, deletedCount. Required: id.

planhat_endusers_bulk_upsert

Bulk create or update Planhat endusers by sending a bare array of enduser objects. Returns a summary with created, updated, insertsKeys, updatedErrors, and upsertedIds counts and keys. Creates require companyId plus one of email, externalId, or sourceId; updates match on _id > sourceId > externalId > email. Max 5,000 items per request.

list_all_planhat_issues

List Planhat issues (bugs or feature requests) with optional filters. Returns issue objects including _id, title, description, status, companyIds, companies, and archived. Optional: companyId filter, sort order, and select of specific properties.

get_single_planhat_issue_by_id

Get a single Planhat issue by id. Returns the full issue object including _id, title, description, status, companyIds, companies, and createdAt. Required: id. Can alternatively be fetched by passing the issue sourceId with a prefix.

create_a_planhat_issue

Create a Planhat issue. Returns the created issue including _id, title, description, status, companyIds, companies, and createdAt. Required: title; companyIds is recommended to link companies and supports extid-/srcid- prefixed references.

update_a_planhat_issue_by_id

Update a Planhat issue by id. Returns the updated issue including _id, title, status, companyIds, companies, and updatedAt. Required: id. Can alternatively be updated by passing the issue sourceId with a prefix.

delete_a_planhat_issue_by_id

Delete a Planhat issue by id. Returns: n, ok, deletedCount. Required: id.

planhat_issues_bulk_upsert

Bulk create and/or update Planhat issues in one request using a JSON array payload. Returns a summary with created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, and permissionErrors. Creating an issue requires title and companyIds; updating requires _id or sourceId in the payload (priority: _id, then sourceId). Max 5,000 items per request.

list_all_planhat_licenses

List Planhat licenses — the subscription records that drive MRR/ARR reporting. Returns license records including _id, companyId, value, mrr, product, fromDate, and renewalStatus. Optionally filter by companyId, sort, or select specific properties.

get_single_planhat_license_by_id

Get a single Planhat license by id. Returns the full license object including _id, companyId, value, mrr, fixedPeriod, fromDate, toDate, and renewalStatus. Required: id (the Planhat _id).

create_a_planhat_license

Create a Planhat license representing a customer subscription (the base for MRR/ARR calculations). Planhat recommends also sending value, _currency, and fromDate, though only companyId is strictly required. Returns the created license object including _id, companyId, value, mrr, fromDate, toDate, and renewalStatus. Required: companyId.

update_a_planhat_license_by_id

Update a Planhat license by id. Returns the updated license object including _id, companyId, value, mrr, fromDate, toDate, and renewalStatus. Required: id (the Planhat _id).

delete_a_planhat_license_by_id

Delete a Planhat license by id. Returns: n, ok, deletedCount. Required: id (the Planhat _id).

list_all_planhat_opportunities

List opportunities in Planhat. Returns each opportunity with fields such as _id, title, status, salesStage, companyId, and mrr. Max 2000 per page.

get_single_planhat_opportunity_by_id

Get a single opportunity in Planhat by id. Returns the full opportunity object including _id, title, status, salesStage, companyId, mrr, and stageHistory. Required: id (the Planhat _id, or the externalId/sourceId prefixed with extid-/srcid-).

create_a_planhat_opportunity

Create an opportunity in Planhat. Returns the created opportunity including _id, title, status, salesStage, companyId, and mrr. Required: companyId (a Planhat company id, or the company's externalId/sourceId prefixed with extid-/srcid-).

update_a_planhat_opportunity_by_id

Update an opportunity in Planhat by id. Returns the updated opportunity including _id, title, status, salesStage, companyId, and mrr. Required: id; the id can also be the opportunity's externalId prefixed with extid-.

delete_a_planhat_opportunity_by_id

Delete an opportunity in Planhat by id. Returns the deletion result: n, ok, deletedCount. Required: id.

planhat_opportunities_bulk_upsert

Bulk create and/or update multiple opportunities in Planhat with a single array payload, matching existing records by keyable (_id takes priority over externalId). Returns an upsert summary with counts and ids: created, updated, insertsKeys, upsertedIds, nonupdates, plus createdErrors, updatedErrors, and permissionErrors for failed items. Required: companyId on each new record; _id or externalId…

list_all_planhat_projects

List Planhat projects. Returns projects with _id, name, companyId, companyName, currency, and custom fields. Max 2000 per page.

get_single_planhat_project_by_id

Get a single Planhat project by id. Returns the project including _id, name, companyId, companyName, mrr, and custom. Required: id.

create_a_planhat_project

Create a Planhat project. Returns the created project including _id, name, companyId, companyName, startDate, and mrr. Requires name and companyId; companyId may also reference a company by externalId or sourceId using 'extid-' or 'srcid-' prefixes.

update_a_planhat_project_by_id

Update a Planhat project by id. Returns the updated project including _id, name, companyId, companyName, mrr, and custom. Required: id.

delete_a_planhat_project_by_id

Delete a Planhat project by id. Returns a deletion summary including n, ok, and deletedCount. Required: id.

list_all_planhat_tasks

List Planhat tasks and calendar-synced events. Returns task records including _id, mainType, companyId, action, status, ownerId, and createdAt. Supports optional companyId, enduserIds, isArchived, sort, and select filters.

get_single_planhat_task_by_id

Get a single Planhat task by id. Returns the full task object including _id, mainType, companyId, action, status, ownerId, and custom. Required: id (the task's _id; a prefixed sourceId is also accepted as the identifier).

create_a_planhat_task

Create a Planhat task. Returns the created task object including _id, mainType, companyId, action, status, and createdAt. Requires companyId (a Planhat company id, or an extid-/srcid- prefixed external reference); mainType defaults to task.

update_a_planhat_task_by_id

Update a Planhat task by id. Returns the updated task object including _id, action, status, ownerId, and updatedAt. Required: id (the task's _id; a prefixed sourceId is also accepted as the identifier).

delete_a_planhat_task_by_id

Delete a Planhat task by id. Returns: n, ok, deletedCount. Required: id (the task's _id).

planhat_tasks_bulk_upsert

Bulk create and/or update Planhat tasks in a single request. Returns an upsert result with created, insertsKeys, upsertedIds, updated, updatedErrors, and permissionErrors. Required per item: mainType and companyId to create; _id or sourceId (in priority order) to update. Max 5,000 items per request.

list_all_planhat_tickets

List tickets in Planhat, including tickets synced from systems like Zendesk or Salesforce. Returns ticket objects with _id, subject, status, email, companyId, and status history.

get_single_planhat_ticket_by_id

Get tickets in Planhat by querying the ticket list endpoint. Returns ticket objects with _id, subject, status, email, companyId, and status history.

create_a_planhat_ticket

Create tickets in Planhat by posting an array of ticket objects (bulk upsert; updates match on _id or sourceId). Returns created and updated counts. Required per ticket: sourceId, email, domains. Max 5,000 items per request.

delete_a_planhat_ticket_by_id

Delete a ticket in Planhat by id. Returns the deleted ticket object including _id, subject, status, email, and companyId. Required: id (the Planhat _id).

list_all_planhat_users

List Planhat users — all team members with access to Planhat. Returns: _id, email, nickName, firstName, lastName, roles, externalId, inactive, removed, isHidden, image, radarOneLine, taskFilter, companyFilter, compressedView, notificationsEnabled, createDate, createdAt, updatedAt, permissions, tzOffset, managers, teams, isExposedAsSenderOption, custom, __v, dailyDigest, followerUpdate,…

get_single_planhat_user_by_id

Get a single Planhat user by id. Returns the full user record including _id, nickName, email, roles, permissions, inactive, and custom. Required: id (Planhat _id; the user's externalId prefixed with extid- is also accepted).

create_a_planhat_user

Create a Planhat user. Returns the created user object including _id, email, nickName, firstName, lastName, roles, inactive, and createDate. Required: nickName, email, firstName, lastName.

update_a_planhat_user_by_id

Update a Planhat user by id. Returns the updated user object including _id, nickName, email, firstName, lastName, roles, and inactive. Required: id (Planhat _id; the user's externalId prefixed with extid- is also accepted). Only fields sent in the body are changed.

delete_a_planhat_user_by_id

Delete a Planhat user by id. Returns an empty 204 response on success. Required: id.

list_all_planhat_workspaces

List Planhat workspaces. Returns each workspace with its _id, name, ownerId, companyId, companyName, externalId, sourceId, and custom.

get_single_planhat_workspace_by_id

Get a single Planhat workspace. Returns the full workspace record including _id, name, ownerId, companyId, companyName, externalId, sourceId, and custom.

create_a_planhat_workspace

Create a workspace in Planhat. Returns the created workspace record including _id, name, ownerId, companyId, companyName, externalId, sourceId, and custom.

update_a_planhat_workspace_by_id

Update a Planhat workspace by id. Returns the updated workspace record including _id, name, ownerId, companyId, companyName, externalId, sourceId, and custom. Required: id.

delete_a_planhat_workspace_by_id

Delete a Planhat workspace by id. Returns an empty 204 response on success. Required: id.

list_all_planhat_conversations

List Planhat conversations (emails, chats, tickets, calls, notes, or custom types). Returns conversation objects with _id, subject, companyId, type, date, and users.

get_single_planhat_conversation_by_id

Get a single Planhat conversation by id. Returns the full conversation object including _id, subject, companyId, type, snippet, users, and endusers. Required: id (the Planhat _id; a prefixed externalId is also accepted).

create_a_planhat_conversation

Create a conversation in Planhat of a given type (email, chat, ticket, call, note, or a custom type; unknown types default to note). Returns the created conversation with _id, subject, companyId, type, and createDate. Required: companyId (a Planhat company id, or an 'extid-'/'srcid-' prefixed company externalId/sourceId).

update_a_planhat_conversation_by_id

Update a Planhat conversation by id, e.g. to change its subject or description. Returns the updated conversation with _id, subject, companyId, type, and snippet. Required: id (the Planhat _id; a prefixed externalId or sourceId is also accepted).

delete_a_planhat_conversation_by_id

Delete a Planhat conversation by id. Returns the deleted conversation object including _id, subject, companyId, type, and createDate. Required: id (the Planhat _id).

planhat_conversations_bulk_upsert

Bulk create and/or update Planhat conversations from a JSON array body (max 5,000 items per request). Each create requires companyId; each update requires _id, externalId, or sourceId in the item for matching. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors.

list_all_planhat_custom_fields

List Planhat custom fields across models. Returns each field's _id, name, type, parent, and visibility flags such as isFeatured and isHidden.

get_single_planhat_custom_field_by_id

Get a single Planhat custom field by id. Returns: _id, name, type, parent, isFeatured, isHidden, isShared, isLocked, isMandatory, isFormula, treatUndefinedAsZero, formula, listValues, filter, formulaRefs, numberFormat, sortOrder, __v. Required: id.

create_a_planhat_custom_field

Create a custom field in Planhat on a parent model. Returns the created field with _id, name, type, parent, isFeatured, and isHidden. Requires name, parent, and type.

update_a_planhat_custom_field_by_id

Update a Planhat custom field by id, for example toggling isFeatured or isHidden. Returns the updated field with _id, name, type, parent, and isFeatured. Required: id.

delete_a_planhat_custom_field_by_id

Delete a Planhat custom field by id. Returns: n, ok, deletedCount. Required: id.

list_all_planhat_assets

List Planhat assets. Returns asset objects with fields such as _id, name, companyId, and companyName. Max 2000 per page.

get_single_planhat_asset_by_id

Get a single Planhat asset by id. Returns the full asset object including _id, name, companyId, companyName, custom properties, and usage data. Required: id (the asset's _id; a prefixed externalId or sourceId is also accepted).

create_a_planhat_asset

Create a Planhat asset. Returns the created asset including _id, name, companyId, companyName, externalId, sourceId, and custom properties. Required: name and companyId (companyId may use an 'extid-' or 'srcid-' prefix to reference the company's externalId or sourceId).

update_a_planhat_asset_by_id

Update a Planhat asset by id. Returns the updated asset including _id, name, companyId, externalId, sourceId, and companyName. Required: id (the asset's _id; a prefixed externalId or sourceId is also accepted).

delete_a_planhat_asset_by_id

Delete a Planhat asset by id. Returns a deletion summary containing n, ok, and deletedCount. Required: id (the asset's _id).

planhat_assets_bulk_upsert

Bulk create or update Planhat assets in a single request. Items are created when they define a name and a valid companyId, and updated when they carry one of the upsert keys (priority order: _id, sourceId, externalId). Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors. Max 5,000 items per request.

list_all_planhat_churn

List churn records in Planhat. Returns: _id, currency, name, mrr, arr, fixedPeriod, autoRenews, length, packages, createdAt, updatedAt. Filter by companyId; supports sort and select. Max 2000 per page.

get_single_planhat_churn_by_id

Get a single churn record in Planhat by id. Returns: _id, companyId, companyName, licenseId, isChurn, churnReason, externalId, createDate, snoozed, products, reasons, comment, replacement, churnDate, currency, value, custom, lastUpdated, __v. Required: id.

create_a_planhat_churn

Create a churn record in Planhat. Returns the created churn including _id, companyId, companyName, churnDate, reasons, value, and currency. Required: companyId, isChurn.

update_a_planhat_churn_by_id

Update a churn record in Planhat by id. Returns the updated churn including _id, companyId, companyName, churnDate, reasons, value, and currency. Required: id.

delete_a_planhat_churn_by_id

Delete a churn record in Planhat by id. Returns: n, ok, deletedCount. Required: id.

planhat_churn_bulk_upsert

Bulk create and/or update Planhat churn records with a single array payload (max 5,000 items per request). Returns the upsert result including created, createdErrors, insertsKeys, updated, updatedErrors, upsertedIds, and permissionErrors. New records require companyId and isChurn; updates require a keyable in the payload (_id or externalId, in priority order).

list_all_planhat_nps

List Planhat NPS survey responses. Returns per record: _id, email, nps, npsComment, scoreType, cId, campaignId, and dateSent. By default only NPS answered within the last 360 days are returned.

get_single_planhat_np_by_id

Get a single Planhat NPS record by id. Returns: _id, npsId, email, npsDate, nps, npsComment, npsSent, scoreType, cId, campaignId, euId, dateSent, dateReminderSent, dateAnswered, source, sourceId, comment, custom, __v. Required: id.

create_a_planhat_np

Create a Planhat NPS survey response for a surveyed contact. Returns: _id, name, mrr, arr, currency, fixedPeriod, autoRenews, length, packages, createdAt, updatedAt. Required: email, score.

update_a_planhat_np_by_id

Update a Planhat NPS record by id, e.g. to change its score or comment. Returns: _id, npsId, email, npsDate, nps, npsComment, npsSent, scoreType, cId, campaignId, euId, dateSent, dateReminderSent, dateAnswered, source, sourceId, comment, custom, __v. Required: id.

delete_a_planhat_np_by_id

Delete a Planhat NPS record by id. Returns: n, ok, deletedCount. Required: id.

planhat_nps_bulk_upsert

Bulk create and/or update multiple Planhat NPS records with a single PUT request. Returns an upsert summary including created, updated, insertsKeys, upsertedIds, and createdErrors. Required: email and score per item for creates; _id or sourceId to match updates. Max 5,000 items per request.

list_all_planhat_objective

List Planhat objectives. Returns objective records including _id, name, health, companyId, and companyName. Max 2000 per page.

get_single_planhat_objective_by_id

Get a single Planhat objective by id. Returns the objective including _id, name, health, companyId, companyName, custom fields, externalId, and sourceId. Required: id.

create_a_planhat_objective

Create an objective in Planhat. Returns the created objective including _id, name, health, companyId, companyName, externalId, sourceId, and custom. Requires name and companyId (a Planhat company id, or the company's id prefixed with extid- or srcid-).

update_a_planhat_objective_by_id

Update a Planhat objective by id. Returns the updated objective including _id, name, health, companyId, companyName, externalId, and sourceId. Required: id.

delete_a_planhat_objective_by_id

Delete a Planhat objective by id. Returns the deletion result: n, ok, and deletedCount. Required: id.

list_all_planhat_sales

List sales (non-recurring revenue records) in Planhat. Returns: _id, _currency, product, companyId, companyName, externalId, sourceId, salesDate, value, custom, __v. Filter by companyId, and sort or select specific fields via query params.

get_single_planhat_sale_by_id

Get a single sale in Planhat by id. Returns the full sale object including _id, product, value, _currency, salesDate, companyId, and companyName. Required: id (the sale _id, or an externalId/sourceId with the extid-/srcid- prefix).

create_a_planhat_sale

Create a sale (non-recurring revenue, such as an onboarding fee or one-off services project) in Planhat. Returns the created sale object including _id, value, product, _currency, salesDate, companyId, and companyName. Required: companyId. Planhat recommends also setting value and _currency.

update_a_planhat_sale_by_id

Update a sale in Planhat by id. Returns the updated sale object including _id, value, product, _currency, salesDate, companyId, and companyName. Required: id (the sale _id, or an externalId/sourceId with the extid-/srcid- prefix).

delete_a_planhat_sale_by_id

Delete a sale in Planhat by id. Returns: n, ok, deletedCount. Required: id (the sale _id).

list_all_planhat_time_entries

List time entries in Planhat. Returns time entry records including _id, hours, date, description, totalBilled, and createdAt. Max 2000 per page.

get_single_planhat_time_entry_by_id

Get a single time entry in Planhat by id. Returns the full record including _id, hours, date, description, timesheetStatus, totalBilled, and createdAt. Required: id.

create_a_planhat_time_entry

Create a time entry in Planhat. Returns the created record including _id, hours, date, description, and totalBilled. Requires date and hours, which must be between 0.1 and 24.

update_a_planhat_time_entry_by_id

Update a time entry in Planhat by id. Returns the updated record including _id, hours, date, description, and updatedAt. Required: id.

delete_a_planhat_time_entry_by_id

Delete a time entry in Planhat by id. Returns: n, ok, deletedCount. Required: id.

list_all_planhat_timesheet

List Planhat timesheets, collections of time entries used for tracking time. Returns timesheet records including _id, status, timeEntries, dateFrom, and dateTo. Max 2000 per page.

get_single_planhat_timesheet_by_id

Get a single Planhat timesheet by id. Returns the timesheet object including _id, status, timeEntries, dateFrom, dateTo, and assignedId. Required: id.

create_a_planhat_timesheet

Create a Planhat timesheet grouping a user's time entries. Returns the created timesheet including _id, status (defaults to submitted), timeEntries, dateFrom, and dateTo. No required fields; the date range should be provided in the body.

update_a_planhat_timesheet_by_id

Update a Planhat timesheet by id, for example to change its status. Returns the updated timesheet including _id, status, approvedBy, dateOfApproval, timeEntries, and dateFrom. Required: id.

delete_a_planhat_timesheet_by_id

Delete a Planhat timesheet by id. Returns: n, ok, deletedCount. Required: id.

update_a_planhat_conversations_conversation_by_id

Update a conversation in Planhat by id. Returns the updated conversation object with its _id, subject, description, type, companyId, users, and endusers. Required: id (the Planhat _id; a prefixed externalId/sourceId keyable is also accepted in its place).

planhat_deals_bulk_upsert

Bulk create or update Planhat deals by sending a JSON array of deal objects, up to 5,000 deals per request. Returns the upsert summary: created, createdErrors, insertsKeys, updated, updatesKeys, upsertedIds, and permissionErrors. Required: companyId for creates, plus one of externalId, sourceId, or name; updates match on _id, sourceId, or externalId in that priority order.

create_a_planhat_deal

Create a Planhat deal. Returns the created deal object including _id, name, companyId, stage, mrr, arr, and closeDate. Required: companyId, which may reference a company by externalId or sourceId using the extid- or srcid- prefix.

delete_a_planhat_deal_by_id

Delete a Planhat deal by id. Returns: n, ok, deletedCount, _id, name, companyId, companyName, stage, ownerId, mrr, arr, total, closeDate, renewalDate, startDate, endDate, subscriptionsCount, feesCount, activeSubscriptionsCount, followers, custom, createdAt, updatedAt. Required: id.

get_single_planhat_deal_by_id

Get a single Planhat deal by id. Returns the full deal object including _id, name, companyId, companyName, stage, mrr, arr, total, and closeDate. Required: id (the Planhat _id, or an externalId/sourceId prefixed with extid- or srcid-).

list_all_planhat_deals

List Planhat deals. Returns deal records including _id, name, companyId, companyName, stage, mrr, arr, and closeDate.

update_a_planhat_deal_by_id

Update a Planhat deal by id — pass the deal's _id in the URL, or identify it by externalId/sourceId using an extid-/srcid- prefix. Returns the updated deal object including _id, name, companyId, stage, mrr, arr, closeDate, and updatedAt. Required: id. Stage is free-form; "Closed Won" and "Closed Lost" are reserved immutable values.

planhat_line_items_bulk_upsert

Bulk upsert Planhat line items, creating and/or updating them in one request. Returns the upsert summary: created, createdErrors, insertsKeys, updated, updatedErrors, upsertedIds, and permissionErrors. Required: dealId and fromDate. Updates are matched by _id, sourceId, or externalId (in that priority order). Max 5,000 items per request.

create_a_planhat_line_item

Create a Planhat line item (subscription or fee) attached to a deal. Returns the created line item including _id, dealId, productType, fromDate, mrr, arr, and status. Required: dealId and fromDate. Subscriptions must include at least one of mrr, arr, or value; fees include value. Deals can be referenced with extid- or srcid- prefixed ids.

delete_a_planhat_line_item_by_id

Delete a Planhat line item by id (also accepts extid- or srcid- prefixed external/source ids). Returns: n, ok, deletedCount, _id, dealId, dealName, companyId, companyName, productId, productName, productType, fromDate, toDate, mrr, arr, fixedPeriod, status, autoRenews, createdAt, updatedAt. Required: id.

get_single_planhat_line_item_by_id

Get a single Planhat line item by id (also accepts extid- or srcid- prefixed external/source ids). Returns the full line item including _id, dealId, productType, fromDate, toDate, mrr, arr, and status. Required: id.

list_all_planhat_line_items

List Planhat line items (deal subscriptions and fees), filterable by companyId and dealId. Returns line item records including _id, dealId, productType, fromDate, mrr, arr, and status. Max 2000 per request.

update_a_planhat_line_item_by_id

Update a line item in Planhat by id (a Planhat _id, or a prefixed externalId/sourceId). Returns the updated line item with _id, dealId, productType, fromDate, toDate, mrr, arr, status, and createdAt. Required: id.

create_a_planhat_metric

Insert Planhat dimension data metrics (model-level metrics for Company, EndUser, Asset or Project models) via bulk insert. Accepts a single object or an array of records. Returns: processed, errors. Required: dimensiondata_id (your Planhat tenant token, tenantUUID), plus dimensionId, value, and externalId per record.

list_all_planhat_metrics

List Planhat dimension data records (model-level customer metrics). Returns records including _id, dimensionId, time, value, model, parentId, companyId, and companyName; filterable by company, dimension id, and day range.

planhat_products_bulk_upsert

Bulk upsert Planhat products from a JSON array of product payloads. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors, _id, name, mrr, arr, currency, fixedPeriod, autoRenews, length, packages, createdAt, updatedAt. Requires name for creates or one of _id, sourceId, externalId to update. Max 5,000 items per…

create_a_planhat_product

Create a Planhat product (a subscription plan or one-off fee that acts as a template for line items). Returns the created product including _id, name, type, mrr, arr, currency, packages, and createdAt. Required: name.

delete_a_planhat_product_by_id

Delete a Planhat product by id. Returns: n, ok, deletedCount, _id, name, mrr, arr, currency, fixedPeriod, autoRenews, length, packages, createdAt, updatedAt. Required: id.

get_single_planhat_product_by_id

Get a single Planhat product by id. Returns the product including _id, name, type, mrr, arr, currency, packages, and createdAt. Required: id.

list_all_planhat_products

List Planhat products. Returns product records including _id, name, type, mrr, arr, currency, and createdAt. Supports sort and select query options; max 2000 per page.

update_a_planhat_product_by_id

Update an existing product in Planhat by id (a prefixed externalId or sourceId is also accepted). Returns the updated product object including its _id, name, type, mrr, arr, currency, and packages. Required: id.

planhat_time_entries_bulk_upsert

Bulk create and/or update Planhat time entries from an array payload. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors, validationErrors. Each item requires date and hours to create, or _id to update. Max 5,000 items per request.

planhat_time_entries_duplicate

Duplicate existing Planhat time entries by id. Returns: count, errors. Required: ids.

planhat_timesheets_bulk_upsert

Bulk create and/or update timesheets in Planhat with a single request; items without _id are created and items with _id are updated. Returns: created, createdErrors, insertsKeys, updated, updatedErrors, updatesKeys, nonupdates, modified, upsertedIds, permissionErrors, validationErrors. Include _id in each item to update an existing timesheet; max 5,000 items per request.

planhat_user_activities_bulk_create

Bulk-track multiple user activity events in Planhat by posting a JSON array of activity objects. Returns a plain-text 'OK' acknowledgment on success. Required: bulk_id (Planhat Tenant UUID); each activity requires email and euExtId. The count property is capped at 300 — larger values are received as 1.

create_a_planhat_user_activity

Track a single real-time user activity event (e.g. a login or page view) in Planhat analytics. Returns a plain-text 'OK' acknowledgment on success. Required: analytic_id (Planhat Tenant UUID), email, and externalId. Planhat automatically creates a missing enduser when a customer id such as companyExternalId is supplied.

planhat_user_activities_create_segment

Send a Segment Identify or Track event to Planhat to record enduser activity, matching the user via user id and/or email. Returns the plain-text acknowledgement 'OK' on success. Required: type, traits (with email or user id inside traits). Events are ignored when type is not Identify or Track, or when both user id and email are missing.

Why Truto

Why use Truto’s MCP server for Planhat

Other MCP servers give you a static tool list for one app. Truto gives you a managed, multi-tenant MCP infrastructure across 800+ integrations.

01

Auto-generated, always up to date

Tools are dynamically generated from curated documentation — not hand-coded. As integrations evolve, tools stay current without manual maintenance.

02

Fine-grained access control

Scope each MCP server to read-only, write-only, specific methods, or tagged tool groups. Expose only what your AI agent needs — nothing more.

03

Multi-tenant by design

Each MCP server is scoped to a single connected account with its own credentials. The URL itself is the auth token — no shared secrets, no credential leaking across tenants.

04

Works with every MCP client

Standard JSON-RPC 2.0 protocol. Paste the URL into Claude, ChatGPT, Cursor, or any MCP-compatible agent framework — tools are discovered automatically.

05

Built-in auth, rate limits, and error handling

Tool calls execute through Truto’s proxy layer with automatic OAuth refresh, rate-limit handling, and normalized error responses. No raw API plumbing in your agent.

06

Expiring and auditable servers

Create time-limited MCP servers for contractors or automated workflows. Optional dual-auth requires both the URL and a Truto API token for high-security environments.

Unified APIs

Unified APIs for Planhat

Skip writing code for every integration. Use Truto’s category-specific Unified APIs out of the box or customize the mappings with AI.

Unified CRM API

Accounts

The accounts represent a company in a CRM.

View Docs

Contacts

The contacts represent an existing point of contact at a company in a CRM.

View Docs

Engagements

The engagements represent an interaction noted in a CRM.

View Docs

Fields

The fields of entities in a CRM.

View Docs

Notes

The notes represent a note on another object in a CRM.

View Docs

Opportunities

The opportunities represent an opportunity in a CRM.

View Docs

Projects

View Docs

Tasks

The tasks represent a task in a CRM.

View Docs

Users

The users represent a user in a CRM.

View Docs

Unified Ticketing API

Accounts

Accounts represent the companies or organizations that you are in contact with. Accounts have one or more Contacts associated with them.

View Docs

Collections

Tickets and contacts can be grouped into Collections. Collection resource usually maps to the various grouping systems used in the underlying product. Some examples are lists, projects, epics, etc. You can differentiate between these grouping systems using the type attribute of a Collection.

View Docs

Fields

Fields represent the attributes defined for various entities in the underlying product. Depending on the underlying product, custom attributes can be defined by a User on various entities like Ticket, Contact, etc. is_user_defined attribute within Field can be used to differentiate between custom and system defined Fields.

View Docs

Tickets

Core resource which represents some work that needs to be carried out. Tickets are usually mapped to issues, tasks, work items, etc. depending on the underlying product.

View Docs

Users

Users represent the people using the underlying ticketing system. They are usually called agents, team members, admins, etc.

View Docs

Workspaces

Workspaces represent the top-level subdivision in a ticketing system. They usually have their own set of settings, tickets, statuses, priorities and users. Some of the usual terminologies used by the products for the top-level subdivision are projects, bases, spaces, workspace, etc. A Workspace could belong to an Organization.

View Docs

How It Works

From zero to integrated

Go live with Planhat in under an hour. No boilerplate, no maintenance burden.

01

Link your customer’s Planhat account

Use Truto’s frontend SDK to connect your customer’s Planhat account. We handle all OAuth and API key flows — you don’t need to create the OAuth app.

02

We handle authentication

Don’t spend time refreshing access tokens or figuring out secure storage. We handle it and inject credentials into every API request.

03

Call our API, we call Planhat

Truto’s Proxy API is a 1-to-1 mapping of the Planhat API. You call us, we call Planhat, and pass the response back in the same cycle.

04

Unified response format

Every response follows a single format across all integrations. We translate Planhat’s pagination into unified cursor-based pagination. Data is always in the result attribute.

FAQs

Common questions about Planhat on Truto

Authentication, rate limits, data freshness, and everything else you need to know before you integrate.

What authentication method does the Planhat integration use?

Planhat uses a tenant-level API token (Bearer token) for authentication. Truto handles token storage and injection so your end users simply provide their Planhat API key during the connection flow.

Which Planhat objects are available through Truto's Unified APIs?

Truto maps Planhat to two Unified APIs. The Unified CRM API covers Accounts (Companies), Contacts (Endusers), Opportunities, Projects, Tasks, Notes, Users, and Fields. The Unified Ticketing API covers Tickets, Accounts, Collections, Users, Fields, and Workspaces. All other Planhat-specific objects like Licenses, Invoices, NPS, Churn, Sales, Time Entries, Conversations, Assets, Objectives, Campaigns, Issues, and Timesheets are accessible via dedicated native proxy endpoints.

Can I read and write custom fields on Planhat objects?

Yes. Truto exposes dedicated endpoints to list, get, create, update, and delete Planhat Custom Fields. You can programmatically discover your end user's custom field schema and include custom field values when reading or writing any supported object.

Does Truto handle pagination and rate limiting for Planhat API calls?

Yes. Truto automatically manages cursor-based pagination across list endpoints and handles Planhat's rate limits with appropriate retry logic, so you don't need to implement these yourself.

What CRUD operations are supported for Planhat objects?

Most Planhat objects support full CRUD — list all, get by ID, create, update, and delete. A few exceptions exist: Tickets support list and delete but not individual get, create, or update through the current tool set. Always check the specific endpoint availability for your target object.

Can I sync financial data like MRR, invoices, and churn records?

Yes. Truto provides native endpoints for Licenses (with MRR and renewal data), Invoices, Sales, and Churn objects — all with full create, read, update, and delete support. This lets you build complete revenue lifecycle integrations into Planhat.

Planhat

Get Planhat integrated into your app

Our team understands what it takes to make a Planhat integration successful. A short, crisp 30 minute call with folks who understand the problem.