- Brand
- Crono
- Category
- Sales & CRM
- Primary Subcategory
- Sales Engagement & Outreach Automation
Integration details
Description
Crono is the Sales Execution Layer for B2B revenue teams and AI agents. Its MCP server connects AI assistants to your sales workspace, bringing prospect data, CRM history, buying signals and sales activity into the context of every task. With read and write access, your assistant can help you: • Find and enrich prospects and contacts. • Review deals, identify stalled opportunities and prioritize follow-ups. • Manage multichannel sequences. • Use buying signals to identify relevant outreach opportunities. • Access sales analytics to understand team performance. Ask questions about your pipeline or take action using natural language. For example: “Review deals closing this month, flag those with no recent activity and draft re-engagement messages.” Works with MCP-compatible clients, including Claude, ChatGPT, Cursor and custom AI agents, so your team can work with Crono directly from the tools they already use.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Sales Engagement & Outreach Automation
- Secondary Subcategories
- None listed
- Brand
- Crono
- Access
- Account required
- First tracked
- 2026-10-16
- Tool count
- 109
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Crono
Get updates when Crono’s Discoverability Score or category rank changes.
Competing in ChatGPT Sales Engagement & Outreach Automation
View Category109 tools agents can invoke
Add AB Testing templates to a strategy step. StrategyStepTemplate is an AB Testing template bound to a step. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. It can refer to StrategyStep or to a StrategyStepConditinal and always require a templateId. Returns created StrategyStepTemplate items.Example: 'add an AB Testing template to the 3rd step, use the template Sample Template' TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.
AddStrategyStepTemplate
Add one or more companies (accounts) to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects account ObjectIds (string, NOT integer Id). First search for the list by name to get its ListId (int), and search for companies to get their ObjectIds (string). Users provide list names and company names, not IDs directly. Example: 'Add Microsoft and Google to my Enterprise Clients list'.
AddAccountsToList
Add one or more companies (accounts) to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), but ObjectIds field expects account ObjectIds (string). First search for the lists by name to get their ListIds (int), and search for companies to get their ObjectIds (string). Users provide list names and company names, not IDs directly. Example: 'Add Apple Inc to both Enterprise Clients and Tech Companies lists'.
AddAccountsToMultipleLists
Enroll a prospect into an EXISTING, reusable outreach strategy sequence. This endpoint does NOT create a sequence: the strategy must already exist and you must resolve its Id first. If the sequence does not exist yet, or you are specifying the steps and copy yourself, or the content is personalized for this one contact, call CreateSingleUseStrategy instead, which creates the sequence and enrolls the contact in a single call. The prospect MUST be owned by the current user. The ProspectId field expects the prospect's ObjectId (string), and StrategyId field expects the strategy's Id (int, NOT ObjectId). First search for the prospect to get their ObjectId and search for the strategy to get its Id. Users provide prospect names/emails and strategy names, not IDs directly. The optional StartDate field schedules the sequence to start on a specific day instead of immediately: the first step lands on that date, ignoring its configured delay. Send it ONLY when the user asks for a start date, as a date-only value in 'yyyy-MM-dd' format (today or future, within one year); do not convert it to a UTC timestamp. Example: 'Add John Smith from Microsoft to the Cold Outreach for SaaS sequence', where that sequence already exists.
AddProspectToStrategy
Add one or more prospects to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects prospect ObjectIds (string, NOT integer Id). First search for the list by name to get its ListId (int), and search for prospects to get their ObjectIds (string). Users provide list names and prospect names, not IDs directly. Example: 'Add John Smith from Microsoft to my Hot Prospects list'.
AddProspectsToList
Add one or more prospects to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), but ObjectIds field expects prospect ObjectIds (string). First search for the lists by name to get their ListIds (int), and search for prospects to get their ObjectIds (string). Users provide list names and prospect names, not IDs directly. Example: 'Add Sarah Johnson to both Hot Prospects and Q4 Pipeline lists'.
AddProspectsToMultipleLists
Enroll multiple prospects into an EXISTING, reusable outreach strategy sequence simultaneously. This endpoint does NOT create a sequence: the strategy must already exist and you must resolve its Id first. If the sequence does not exist yet, or you are specifying the steps and copy yourself, use CreateSingleUseStrategy per contact instead, which creates the sequence and enrolls the contact in a single call. The Prospects field expects a list of entries, each with the prospect's ProspectId (ObjectId, string) and AccountId (ObjectId, string); StrategyId expects the strategy's Id (int, NOT ObjectId). First search for the prospects to get their ObjectIds and search for the strategy to get its Id. Users provide prospect identifiers and strategy names, not IDs directly. The optional StartDate field schedules the sequences to start on a specific day instead of immediately: each first step lands on that date, ignoring its configured delay. Send it ONLY when the user asks for a start date, as a date-only value in 'yyyy-MM-dd' format (today or future, within one year); do not convert it to a UTC timestamp. Example: 'Add all prospects from Microsoft to the Enterprise Follow-up sequence', where that sequence already exists.
AddMultipleProspectsToStrategy
Add a new stage to an existing sales pipeline. Stages represent steps in the sales process with configurable names and probability percentages (0-100%). Common stages include Qualified Lead, Discovery, Demo/Meeting, Negotiation, Proposal, and Closed Won. The PipelineId field expects an integer Id. First retrieve pipelines to find the correct PipelineId, then add a stage with a name and probability value. Example: 'Add a new stage called Technical Review with 70% probability to the Enterprise Sales pipeline'.
AddStageToPipeline
Add one or more strategies to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects strategy Ids (int). First search for the list by name to get its ListId (int), and search for strategies to get their Ids (int). Users provide list names and strategy names, not IDs directly. Example: 'Add ABM Starter and Inbound Nurture to my Enterprise Clients list'.
AddStrategiesToList
Add one or more strategies to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), and the Ids field expects strategy Ids (int). First search for the lists by name to get their ListIds (int), and search for strategies to get their Ids (int). Users provide list names and strategy names, not IDs directly. Example: 'Add Q4 Expansion Play to both Strategic Accounts and Q4 Pipeline lists'.
AddStrategiesToMultipleLists
Add one or more templates to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects template Ids (int). First search for the list by name to get its ListId (int), and search for templates to get their Ids (int). Users provide list names and template names, not IDs directly. Example: 'Add Outbound Sequence A and Event Follow-up to my Q4 Pipeline list'.
AddTemplatesToList
Add one or more templates to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), and the Ids field expects template Ids (int). First search for the lists by name to get their ListIds (int), and search for templates to get their Ids (int). Users provide list names and template names, not IDs directly. Example: 'Add Onboarding Sequence to both Enterprise Clients and Q1 Pipeline lists'.
AddTemplatesToMultipleLists
Add a new step to a strategy using the integer StrategyId. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Returns the created step as StrategyStepGetDto. If the task is type Generic, you MUST fill the subject field. ScheduleTime for automatic step is in format "HH:mm+hh:mm" or "HH:mm-hh:mm", the first part is the time of the day, the second part is the timezone. Example: 'add an email step at the 3rd position
AddStrategyStep
Bulk enrich multiple companies simultaneously with additional data like employee count, revenue, industry details, and contact information. Provide a list of companies with their details (name, domain, location) to enrich. This queues the bulk enrichment job and returns a job ID for tracking. Use this for processing multiple companies efficiently. Example: 'Enrich company data for all accounts in the tech industry segment'.
ScrapeBulkCompany
Bulk search for emails, phone numbers, or LinkedIn profiles for multiple prospects simultaneously. Provide one entry per prospect with its ProspectId — name, company domain and LinkedIn url are resolved server-side from the stored prospect and its account. Only set FirstName, LastName, Domain or LinkedinUrl to override those stored values with more accurate data (e.g. from web scraping). Specify what to find with FindEmail, FindPhone and FindLinkedin. This queues the bulk scraping job and returns a job ID for tracking: per-prospect outcomes are NOT part of the response, so do not report to the user whether anything was found. Example: 'Find emails for 50 prospects from the enterprise list'.
ScrapeBulkProspect
Create a new AI agent for the user. An agent is a job that runs on its own, without anybody watching it. It is made of two layers: the AGENT TYPE, which is the skill and is picked from a fixed catalogue, and the INSTRUCTIONS, which are the job you are writing for this user — what to work on, what to do, when to stop. AgentTypeSlug is REQUIRED and must be one of the slugs returned by SearchAgentTypes — ALWAYS call SearchAgentTypes first and pick the type whose purpose matches the request; never invent a slug. Name and Instructions are required too. ASK FIRST, BUT ONLY WHEN YOU MUST. Ask the user before creating ONLY when you cannot answer both of these from what they said: WHICH records the agent should work on, and WHAT it should do to them. Those two are what make Instructions work at all, and no sensible default exists for either. Ask at most three short questions, in their words, and prefer offering a concrete reading over an open question — 'contacts with no activity in the last 90 days, or also the ones still in a sequence?' beats 'which contacts?'. If a third thing is genuinely unclear — what counts as finished — ask that too. Everything else you do NOT ask: it has a default and you confirm it afterwards. THEN THE TWO-STEP FLOW — FOLLOW IT: create the agent with whatever the user specified, then ask about what they did not. Do NOT interrogate the user about configuration before creating, and do NOT invent values for the fields they left out: create first, then confirm. Anything the user did not mention takes a silent default — SupervisionMode becomes Autonomous (the agent acts WITHOUT asking for approval), InvocationType becomes Manual (it only runs when started by hand), and with no UserIds the agent is assigned to its creator alone — which also decides who its runs act as. The response echoes the values that were actually applied. After creating you MUST (1) show the user the Instructions you wrote, in plain words, so they can correct the job itself and not just its settings, and (2) tell them which defaults were used — the Autonomous one especially, since it means unattended actions — and ask whether they want to change the supervision mode, the assigned users, the schedule or the credit limit. If they do, call PatchAgent with the Id from this response; do NOT create a second agent. The user is redirected to the new agent automatically, so do not also call RedirectTo. HOW A RUN WORKS — Instructions is the whole job description, so write it against these facts: - ONE RUN PER EVENT. A Trigger agent starts a separate run for every matching event, a Scheduled agent one run per scheduled time, a Manual agent one run per start. - RUNS ARE ISOLATED. Two runs of the same agent cannot talk to each other, pass data, see what the other did or split work between them, and a run remembers nothing of the previous ones. Anything that has to survive between runs must be written into Crono — a note, a task, a list, a status, a custom property — and read back from there on the next run. So never write 'remember which companies you already handled'; write 'before acting, check whether the contact already has a note titled X'. - A RUN ACTS AS ONE USER: the assigned user it fired for, or the first assigned user when the event belongs to nobody. It sees and changes only what that user may, and many write actions are refused on records owned by somebody else — enrolling a contact in a sequence above all. A job meant to cover a whole team needs the agent assigned to each of them, which produces one independent run per user, never one run over everybody. - A RUN IS NOT A CHAT. Nobody is on the other side: it cannot ask a question while running, cannot see the screen, and cannot use what the user has selected, filtered or opened in the UI. 'the list I am looking at', 'the selected contacts', 'this company' mean nothing inside a run — name the list, the saved view, the status or the filter explicitly. - A RUN RECEIVES EXACTLY FOUR THINGS: the Instructions, today's date, whether it is supervised, and — for Trigger agents only — the record that fired it. Nothing else. Scheduled and Manual agents get no record at all, so their Instructions must say how to FIND the records to work on. - Supervised runs pause on their main action and wait for approval; Autonomous runs never pause. WRITING Instructions — this text decides what the agent CAN do, not only what it should: - Instructions (with Description) is analysed on every save to elect which tools the agent may call, and which action needs approval when supervised. Text that never names its actions leaves the agent without the tools for them, and the run fails later with no obvious cause. Name the actions in plain words: 'send an email', 'create a task', 'enrol the contact in a sequence', 'change the contact's status', 'write a note', 'search the web', 'add to a list'. - USE THE WORDS THE USER SEES IN CRONO, never this API's: contacts, companies, deals, leads, sequences, lists, tasks, notes, templates — NOT Account, Prospect, Opportunity, Strategy, ObjectId or any field name from these endpoints. For what starts the agent, write the event as a sentence the way the UI does — 'when a contact changes company', 'when someone visits the website' — not the object and event names from the trigger configuration. The user reads this text in the UI, and the model that runs it already knows its own tools. - DEFINE DONE. State what must be true for one run to be finished and what it leaves behind, e.g. 'done when every contact found is either enrolled in the sequence or has a note explaining why it was skipped'. Without it the agent picks its own stopping point and stops early. - GIVE A VOLUME AND A BUDGET: 'the 20 oldest', 'at most 50 per run', 'at most one web search per company'. Web research is the slowest and most expensive thing a run does; with no ceiling the agent burns the credit limit on the first few records. - SAY WHAT TO DO WHEN IT CANNOT ACT. Every job meets records it may not touch, contacts with no email, companies it cannot find. Spell out the fallback — skip and write a note, create a task for the owner, stop and report. Otherwise the agent invents one and the user is told the job succeeded. - NEVER PUT EXAMPLE OR PLACEHOLDER IDENTIFIERS in Instructions. An agent will pass 'test', '12345' or 'contact-1' straight into a tool call and loop on the failure. Describe how to find the record instead. - NAME ONLY FIELDS AND VALUES THAT EXIST. If the job depends on a status, a tag or a custom property, ask the user for the exact label they see in Crono: a workspace can define its own statuses, and writing the built-in one then changes nothing while still reporting success. - GIVE CRITERIA, NOT A PERSONALITY. 'B2B, 50-1000 employees, HQ in Europe' is actionable; 'high-quality leads' is not. CONFIGURATION RULES — only the fields belonging to the chosen InvocationType are read: - InvocationType = Manual (default): the agent runs only when a user starts it. No schedule or trigger fields may be sent. - InvocationType = Scheduled: ScheduleFrequency (Daily, Weekly, Monthly) AND ScheduleRunTiming (Morning, Afternoon, Evening) are both REQUIRED. Weekly additionally requires ScheduleWeeklyDay (Monday…Sunday) and forbids ScheduleMonthlyDay; Monthly additionally requires ScheduleMonthlyDay (1-31) and forbids ScheduleWeeklyDay. - InvocationType = Trigger: Triggers is REQUIRED (each entry takes ObjectType, EventType, and optionally UpdateProperty plus UpdateValues to fire only on specific new values). Trigger agents need the Webhooks feature enabled on the subscription, otherwise the call is rejected. Sending schedule fields on a non-Scheduled agent, or Triggers on a non-Trigger agent, is rejected. The agent type also restricts which InvocationTypes it supports — SearchAgentTypes reports them. TRIGGER OBJECT/EVENT PAIRS — ObjectType is the object the EVENT belongs to, NOT the record the event is about. An event sent under the wrong object is rejected. The only valid pairs are: - Account, Prospect, Opportunity, Lead (Lead is Salesforce-only): EntityCreated, EntityUpdated, EntityDeleted. - Strategy: StrategyCompleted, StrategyProspectReplied, StrategyProspectEnrolled. - Signal: SignalRoleChanged, SignalCompanyChanged, SignalWebsiteVisit, SignalInterestedOpen, SignalInterestedClick, SignalHiring. - Notification: NotificationEmailReplied, NotificationEmailOpened, NotificationEmailClicked, NotificationLinkedinReplied, NotificationLinkedinInvitationAccepted, NotificationLinkedinInmailReplied, NotificationLinkedinVoiceNoteReplied. So 'when a contact changes company' is ObjectType = Signal with EventType = SignalCompanyChanged — NOT ObjectType = Prospect. UpdateProperty and UpdateValues are only accepted with EventType = EntityUpdated. SupervisionMode: Autonomous means the agent acts on its own; Supervised means its actions wait for user approval. UserIds: the users the agent is assigned to. Only Managers may assign an agent to users other than themselves; for anyone else this must be empty or contain only their own id. An agent is never left unassigned — an empty list falls back to the creator on create and to the agent's owner on patch. AICreditsLimitPerMonth: optional cap, must be greater than zero when provided. GuardrailNoDelete: when true the agent is not allowed to delete data. TeamInvocationsAccess: how much of the team's activity on this agent a manager gets — ViewAndAct (default) the team's executions with confirm/reject on them, View the same executions read-only, Own only the manager's own. Only Managers may send anything other than ViewAndAct; it has no effect for anyone else, who always see their own executions only. Avatar: NEVER send this field. It is a raw SVG picked in the UI; the agent type's avatar is applied automatically and the user can change it there. Description: leave it out unless the user gave one in their own words — the agent type's description is applied automatically. Never invent one. Example: 'Create an agent that follows up on stale deals' → the action is clear (follow up) but the records are not, so ask one question: which deals count as stale, and what following up means — a task for the owner, or an email. Then SearchAgentTypes, pick the matching slug, and create it with Instructions that name the deals to look at, the action, a per-run ceiling, what to do with deals the user does not own, and what finished looks like. Then report that it was created as Autonomous and Manual, assigned to the user only, show the Instructions back and ask what to adjust.
CreateAgent
Create a new automation rule (Settings > Automations). Automations run in the background: whenever the trigger fires on a contact, lead or company, Crono performs the action automatically. Use this for requests like 'when a contact replies positively, set their status to Interested', 'when a deal moves to Closed Lost, stop the sequences of that company' or 'when a company starts hiring, create a call task'. PAYLOAD SHAPE — a rule reads as 'IF <trigger> [AND <trigger filter>] THEN <action>', plus up to 5 optional EXCEPT guards. Only the fields belonging to the chosen TriggerType and ActionType are read; everything else is ignored and cleared. Send the trigger block AND the action block that match your TriggerType / ActionType — a rule with a missing block is rejected. ALWAYS REQUIRED: Name (string), TriggerType, ActionType. TableType: the entity the ACTION applies to — Account (company), Prospect (contact) or Lead. Required for the UpdateField action when setting a default status. Shared: only Managers can create subscription-wide (shared) rules; for anyone else it is silently forced to false. 1) TRIGGER CONFIG — send only the block matching TriggerType: - StartNewSequence / MeetingScheduled / EmailBounced / LinkedInInvitationAccepted / SignalRoleChange / SignalCompanyChange / SignalWebsiteVisit / SignalHiring / SignalInterestedOpen / SignalInterestedClick: no extra trigger config at all. - Replied: optional ReplySentiments (Positive, Negative, Neutral) to fire only on those reply sentiments; omit to fire on any reply. NEVER send CallSentiments together with ReplySentiments. - CallConnected: optional CallSentiments (NotInterested, CallBack, SendEmail, MeetingScheduled, NotRightContact); omit to fire on any connected call. - SequenceStopped: SequenceStopReasons is REQUIRED (at least one) — e.g. Reply, MeetingScheduled, OptOut, AccountStatusChange, OpportunityStageChange, ChangeOwner, Finished, User. - AccountStatusChangedTo: send EXACTLY ONE of (a) TriggerAccountStatuses — one or more of Inactive, Nurture, Working, CallScheduled, OpenOpportunity, Customer — or (b) TriggerExternalPropertyId + TriggerFieldValues. Sending both, or neither, is rejected. The trigger property must belong to the Account table and be a List/MultiSelect (the status property is also accepted), and every value in TriggerFieldValues must be one of that property's Options. - ContactFieldChangedTo: same exclusive either/or, for contacts/leads: (a) TriggerProspectStatuses — one or more of New, Qualified, Interested, NotInterested, BadFit, OptedOut — or (b) TriggerExternalPropertyId + TriggerFieldValues on a Prospect/Lead property. - OpportunityStageChangedTo: PipelineExternalName AND StageExternalNames are both REQUIRED, and the stages must be ACTIVE stages of that exact pipeline. Get both with GetPipelines. 2) ACTION CONFIG — send only the block matching ActionType: - UpdateField: Targets is the list of fields the rule writes, at most 5, applied together in a single update. Each entry is either (a) a custom-field target - TargetExternalPropertyId + TargetFieldValues, where a List property accepts EXACTLY ONE value, a MultiSelect accepts one or more, and every value must be one of the property's Options; or (b) a default-status target - TableType plus AccountDefaultStatus (when TableType = Account) or ProspectDefaultStatus (when TableType = Prospect or Lead). The same property cannot appear twice, and only one entry may set the default status. ALWAYS use Targets, and on an update send it complete - it REPLACES the whole list, which is what the full-replace rule above means for this action. Do NOT use the older flat form (TargetExternalPropertyId / TargetFieldValues / AccountDefaultStatus / ProspectDefaultStatus at the top level): it is kept only for clients that predate Targets, and an update sent that way rewrites just the first field of the rule. - StopSequences: StopScope is REQUIRED — ThisContact (stop only the triggering contact) or AllCompanyContacts (stop the active sequences of every contact of their company). - CreateTask: TaskType is REQUIRED (Email, Call, Linkedin, InMail, Generic). TaskSubtype is REQUIRED when TaskType = Linkedin (LinkedinInvitation, LinkedinMessage, LinkedinVoiceNote, LinkedinProfileView, LinkedinLikeLastPost) and MUST BE OMITTED for every other task type. 3) EXCEPTIONS (optional, max 5) — guards that SKIP the action when the entity's CURRENT value of the referenced field is among the listed values. Each entry takes TableType (required), Values (required, at least one) and an optional ExternalPropertyId. When ExternalPropertyId is null the guard reads the DEFAULT status field, so Values must be status names (Inactive/Nurture/Working/CallScheduled/OpenOpportunity/Customer for Account, New/Qualified/Interested/NotInterested/BadFit/OptedOut for Prospect and Lead); when it is set, Values must be that property's Options. FORBIDDEN TRIGGER x ACTION PAIRS: StartNewSequence + StopSequences, SequenceStopped + StopSequences, Replied + StopSequences (stopping on reply is already a Crono default setting, not a user rule). SIGNAL SCOPE: SignalWebsiteVisit and SignalHiring fire on the COMPANY, so TableType must be Account. Every other Signal* trigger fires on a person, so TableType must be Prospect or Lead. COMBINATIONS THE UI SUPPORTS — stick to these so the rule stays editable in Settings > Automations: UpdateField pairs with the activity triggers (StartNewSequence, Replied, CallConnected, MeetingScheduled, EmailBounced, LinkedInInvitationAccepted, SequenceStopped) and with every Signal* trigger. StopSequences pairs with ContactFieldChangedTo, AccountStatusChangedTo and OpportunityStageChangedTo. CreateTask pairs with those same three plus every Signal* trigger. RESOLVING IDS AND VALUES: TriggerExternalPropertyId, TargetExternalPropertyId and Exceptions[].ExternalPropertyId are integer ExternalProperty Ids (NOT ObjectIds) — get them with GetExternalProperties (pass WithStatus = true to also see status properties) and read each property's Options for the allowed values. Get PipelineExternalName / StageExternalNames with GetPipelines. NEVER invent an Id, a stage name or an option value. DUPLICATES: the rule is rejected when an existing active rule in the same scope has BOTH an overlapping trigger config AND an overlapping action config. Fan-out is allowed: the same trigger may drive several rules with different actions or different targets. Example: 'When a contact replies with a positive sentiment, set their status to Interested' becomes Name = 'Positive reply to Interested', TriggerType = Replied, ActionType = UpdateField, TableType = Prospect, ReplySentiments = [Positive], Targets = [{ ProspectDefaultStatus = Interested }]. To also fill a reason field, add a second entry whose TargetExternalPropertyId and TargetFieldValues come from GetExternalProperties - never from a value you made up.
CreateAutomation
Create a new company (also referred to as account or organization) with details such as name, website, LinkedIn, country, industry, employee count, revenue, and owner. Optionally enrich it automatically or create it in the connected CRM. Returns the created account with both Id (int) and ObjectId (string). Always use the ObjectId (string) for subsequent CRUD operations. Example: 'Add a new company called Acme Inc. in the United States, 200 employees, website acme.com, and assign it to Sarah.'
InsertAccount
Create a new prospect (individual contact) with details like name, email, job title, phone, LinkedIn profile, and company. Returns the created prospect with both Id (int) and ObjectId (string). Always use the ObjectId (string) for subsequent CRUD operations. COMPANY — DO NOT CREATE THE COMPANY FIRST. Send the employer details on this request instead: Company (name, required unless you already have AccountId), CompanyLinkedin, CompanyLinkedinNumericId, CompanyWebsite, CompanyIndustry, CompanyCountry, CompanyNumberOfEmployees. This endpoint resolves them itself — it links the prospect to the existing Crono account when one matches on LinkedIn id, website or email domain, and creates the account from those same fields when none does, so passing more of them means a better match and a richer company record. Set AccountId ONLY when you already hold the ObjectId of a specific existing account (the user named it, or a dedup check returned it); when AccountId is set the company fields above are ignored for resolution. Creating a company up front and passing its ObjectId is the slow path and risks duplicates. If you have neither a company name nor any company identifier, ask the user which company to link the contact to before proceeding. IMPORTANT: If a data enrichment was performed before creating this prospect (e.g., via Find/Email, Find/Phone, or Find/Linkedin), you MUST pass the following fields from the scrape response: - ProspectScrapeId: set to Id from the email or LinkedIn scrape result - ProspectScrapePhoneId: set to Id from the phone scrape result - EmailStatus: set to VerificationStatus from the email scrape result This ensures the data source is correctly tracked in Crono. Do NOT skip these fields if a scrape was performed. Example: 'Create a new prospect John Smith, CTO at Microsoft, email [email protected]'. IMPORTANT: If you see, from the frontendcontext, that the integrationType is SalesForce, you have to use createAsLead=true if the user says 'Lead' instead of 'Contact', as in salesforce they are two different types
InsertProspect
Create a new sales opportunity/deal for a company with details like name, value, stage, close date, and assigned owner. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the company to get its ObjectId. Returns the created opportunity with both Id and ObjectId identifiers. Example: 'Add a new opportunity for TechWave Solutions worth $50,000, in Discovery stage, expected to close next month, assigned to Sarah.'
InsertOpportunity
Create a new list for organizing prospects, companies, templates, or strategies. Specify the list name, type (prospect/account/template/strategy), and optional description. CronoList uses only Id (int), NOT ObjectId. Optionally populate the list on creation by providing ObjectIds (string array for accounts/prospects) or Ids (int array for templates/strategies) based on the list type. If populating, first search for the entities (prospects, accounts, templates, or strategies) to get their IDs/ObjectIds, then include them in the request. Users provide entity names, not IDs directly. Example: 'Create a new prospect list called Q1 2024 Pipeline and add John Smith and Sarah Johnson to it'. IMPORTANT: From frontendcontext, if the integrationtype is salesforce, you must notice if the user is meaning a Lead type ot a Prospect type
CreateList
Create a new note and attach it to a prospect, company, or opportunity. The AccountId, ProspectIds, and OpportunityId fields expect ObjectIds (string, NOT integer Id) because these are CRM-mapped entities. First search for the entities to get their ObjectIds. Users provide entity names, not IDs directly. FORMATTING — IMPORTANT: a note Description is rendered as HTML. Use HTML tags for any formatting: <b> for bold, <i> for italic, <br> for line breaks, <p> for paragraphs, <ul>/<li> for lists. NEVER use Markdown: markers such as **bold**, # headings, - bullets or --- rules are NOT interpreted and will be shown to the user as literal characters. Keep the note concise and readable — it is a CRM note, not a report. Example: 'Add a note to John Smith saying we discussed pricing on the call today' or 'Add a note to Microsoft account about their Q4 budget approval'.
InsertNote
Create a single-use (one-off) personalized strategy/sequence on a specific contact. Prefer this endpoint when the user wants to create a unique sequence for a specific contact with personalized content, and doesn't need to reuse the same sequence for other contacts. This creates a strategy that is NOT reusable — it will only be visible in the contact's card and list. The contact is enrolled in this sequence as part of this same call: do NOT follow up with AddProspectToStrategy. Provide the contact's ProspectId (ObjectId, string) and AccountId (ObjectId, string). Plus a list of steps that reflects the quantity the user wants (if provided), using specific days delays, if requested. Each step can reference an existing TemplateId or provide inline Subject + Content to auto-create a single-use template. The strategy Name is optional. ScheduleTime for automatic step is in format "HH:mm+hh:mm" or "HH:mm-hh:mm", the first part is the time of the day, the second part is the timezone. Task subtype is needed only when Linkedin type is used. Example: 'Create a custom 3-step email sequence for John Smith with personalized content'. TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text. PRECONDITIONS: the contact must be owned by the acting user and must not already be in an active sequence, otherwise the call fails with "Contact not owned by user" or "Contact already in an active sequence". Check the prospect's owner first and pick a different contact or reassign it if it is not yours; stop any running sequence with StopProspectSequence before creating a new one. Neither error is retryable — re-sending the same payload fails again.
CreateSingleUseStrategy
Create a new task (follow-up activity) for a prospect with details like task type (email, call, LinkedIn message), activity date, associated template, and automation settings. The AccountId and ProspectId fields expect ObjectIds (string, NOT integer Id) because these are CRM-mapped entities. First search for the prospect and account to get their ObjectIds. Returns the created task with its integer Id. If the task is an Email or LinkedIn InMail and you want the message content pre-written (draft-style), you MUST provide TemplateId. If you don't have an existing template to use, you can create a one-off draft template by calling the CreateSingleUseTemplate endpoint with the desired subject + body content (and any other relevant template metadata). The CreateSingleUseTemplate response returns an Id; use that Id as TemplateId when creating the task. Note: SingleUseTemplates are one-off/hidden templates and are only retrievable/usable by Id (they do not appear in template search or lists). FORMATTING: Description is the to-do body and is PLAIN TEXT: no HTML tags and no Markdown. PersonalizedSubject/PersonalizedContent are the Email or InMail message instead, and PersonalizedContent is HTML (<b>, <i>, <br>, <p>, <ul>/<li>), never Markdown. Example: 'Create a follow-up email task for John Smith at Microsoft tomorrow at 10am using the cold outreach template' or 'Add a LinkedIn message task for the CTO at TechCorp next week'. IMPORTANT: ProspectId field MUST be filled if 'Type' field is not 'Generic'. 'Subject' field is MANDATORY to fill: if it's not provided in the request, you MUST generate it based on the context of the task. PRECONDITIONS: ActivityDate must not be in the past — the comparison is date-only against today in UTC, so today itself is accepted. Ownership depends on ProspectId: with one, the contact must be owned by the acting user, unless you set AssignToUser = true, which assigns the task to the contact's owner and only requires the company to be in your subscription; without one, only the company is checked. Failures report "Activity date cannot be in the past" or "contact not owned" and are not retryable unchanged.
CreateTask
Create a single-use (one-off) template and return its TemplateId. This endpoint only ever creates single-use templates; for a reusable one use GenerateTemplate / the normal template creation flows instead. Use case: when creating an Email or LinkedIn InMail task and you want the content already written as a draft, you can first create a single-use template here (provide subject + body/content and any relevant template metadata), then use the returned Id as TemplateId when creating the task. Important: single-use templates are hidden/one-off and are only accessible by Id (they do not appear in template search or lists). Example: 'Create an email TASK with subject "Quick question about {{Company}}" and a short intro + CTA, then use it for a follow-up email task to John Smith.' TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.
CreateSingleUseTemplate
Delete an A/B Testing template associated to a strategy step using StrategyStepTemplateId (int).First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'Delete the second AB Testing template from the 2st step
DeleteStrategyStepTemplate
Delete an agent permanently. AgentId expects the integer agent Id (agents have no ObjectId) — call SearchAgents first to resolve it by name. Only the agent's owner may delete it. This cannot be undone and the agent stops running immediately, so ALWAYS confirm the agent's name with the user before calling this when their request is at all ambiguous. If they only want to stop it temporarily, use PatchAgent with Active = false instead and say so. Example: 'Delete my deal follow-up agent'.
DeleteAgent
Delete an automation rule. The Id field expects the integer automation Id (NOT an ObjectId) — call SearchAutomations first to find the rule by name. Only the OWNER of a rule may delete it: a shared rule created by another user cannot be removed. Once deleted the rule stops firing and cannot be restored, so confirm the rule name with the user when their request is ambiguous. Example: 'Delete the automation that stops sequences when a deal is lost'.
DeleteAutomation
Deactivate or archive several companies at once. Optionally, apply the same change in the CRM. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the companies to get their ObjectIds. Users provide company identifiers, not IDs directly. Example: 'Archive all companies from the old prospecting list and remove them from the CRM.'
DeleteMultipleAccounts
Deactivate or archive a single company record. Optionally, also remove it from the CRM if requested. The account remains in the system but is no longer active. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the company by name to get its ObjectId. Users provide company names, not IDs directly. Example: 'Deactivate the company TechWave Solutions and remove it from Salesforce.'
DeleteAccount
Deactivate or archive a single prospect record. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospect by name/email/company to get the ObjectId. The prospect remains in the system but is no longer active. Optionally remove from CRM if requested. Users provide prospect names/emails, not IDs directly. Example: 'Deactivate the prospect Jane Doe from TechWave Solutions'.
DeleteProspect
Deactivate or archive multiple prospect records at once. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospects to get their ObjectIds, then deactivate them. Optionally apply the same change in the CRM. Users provide prospect identifiers, not IDs directly. Example: 'Archive all prospects from the old Q3 campaign and remove them from the CRM'.
DeleteMultipleProspects
Delete or archive an opportunity record. Optionally, also remove it from the CRM if requested. The opportunity remains in the system but is no longer active. The OpportunityId field expects the ObjectId (string), NOT the integer Id. First search for opportunities to get the correct ObjectId. Users provide opportunity identifiers or company context, not IDs directly. Example: 'Delete the stale opportunity for Widget Corp and remove it from Salesforce.'
DeleteOpportunity
Delete a 'Find New' search configuration. The FindNewSearchId field expects an integer Id, NOT ObjectId (FindNewSearch doesn't have ObjectId). First search for the configuration by name to get its Id, then use it to delete. Users provide search names, not IDs directly. Example: 'Delete the Find New search for German CTOs'.
DeleteFindNewSearch
Delete an existing list. The Id field expects an integer Id (CronoList doesn't have ObjectId). First search for the list by name to get its Id (int). Users provide the list name, not the ID directly. Example: 'Delete the Old Prospects list'.
DeleteList
Delete or archive a sales pipeline from the system. This will deactivate the pipeline and it will no longer appear in active pipeline lists. The PipelineId field expects an integer Id. First retrieve pipelines to find the correct PipelineId, then delete it. Warning: This operation may affect opportunities associated with this pipeline. Example: 'Delete the old 2023 Sales Pipeline' or 'Remove the unused SMB Pipeline'.
DeletePipeline
Delete a template permanently. The TemplateId field expects the integer template Id (NOT ObjectId). First search for the template by name/subject to get its integer Id. This will remove the template from the system and it cannot be recovered. Example: 'Delete the old Introduction template' or 'Remove the template named Q3 Campaign Draft'.
DeleteTemplate
Delete an email/outreach strategy by its integer Id. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Returns a base response with any potential errors. Example: 'Delete the sequence XYZ'.
DeleteStrategy
Delete a single step from a strategy using the integer StrategyId and the integer StepId. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'Delete the 3rd step from sequence XYZ'. Users will ask to delete the Xth step of the sequence, so you should retrieve the id from the step Once deleted, the StepId is permanently invalid: do not reuse it in PatchStrategyStep. To put a different step in its place, call AddStrategyStep after deleting.
DeleteStrategyStep
Enrich company information for a company NOT yet in Crono. Provide Name and/or Domain and/or LinkedinUrl. Do NOT use this endpoint if the company already exists in Crono — use Enrich/Company/ByAccount instead. Example: 'Enrich company data for TechWave Solutions at techwave.com'.
EnrichCompany
Enrich company information for a company that ALREADY EXISTS in Crono. Pass AccountId — the server fetches name, domain, and LinkedIn automatically from the stored account. Optionally provide Name, Domain, or LinkedinUrl to override the account's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for companies not yet in Crono — use Enrich/Company instead. Example: 'Enrich the company data for account with id abc123'.
EnrichCompanyByAccount
Search for and discover the email address of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or LinkedinUrl. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Email/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned fields forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapeId: set to Id from this response - EmailStatus: set to VerificationStatus from this response Do NOT skip these fields. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindLinkedin and FindPhone on the same person too. Example: 'Find the email for John Smith who works as CTO at TechCorp (techcorp.com)'.
FindEmail
Search for and discover the email address of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name, domain, and LinkedIn automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, LinkedinUrl, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Email instead. Example: 'Find the email for the prospect with id abc123'.
FindEmailByProspect
Search for and discover the LinkedIn profile URL of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or Email. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Linkedin/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned field forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapeId: set to Id from this response Do NOT skip this field. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindEmail and FindPhone on the same person too. Example: 'Find the LinkedIn profile for Mike Chen, VP of Sales at DataTech'.
FindLinkedin
Search for and discover the LinkedIn profile URL of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name and domain automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Linkedin instead. Example: 'Find the LinkedIn profile for the prospect with id abc123'.
FindLinkedinByProspect
Search for and discover the phone number of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or LinkedinUrl. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Phone/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned field forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapePhoneId: set to Id from this response Do NOT skip this field. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindEmail and FindLinkedin on the same person too. Example: 'Find the phone number for Sarah Johnson at Microsoft'.
FindPhone
Search for and discover the phone number of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name, domain, and LinkedIn automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, LinkedinUrl, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Phone instead. Example: 'Find the phone number for the prospect with id abc123'.
FindPhoneByProspect
Generate AI-powered personalized variables for prospects or accounts in bulk using a background job. Provide the list of prospect/account IDs and specify which AI variables to generate (e.g., icebreaker, pain points, value proposition). This queues a background job and returns a job ID for tracking progress. The AI analyzes available data (company info, LinkedIn, etc.) to create personalized content. Example: 'Generate icebreaker variables for prospects in my Q4 enterprise sequence' or 'Create personalized pain point variables for all prospects in TechCorp account'.
GenerateAiVariables
Generate a new email/outreach strategy (sequence) with AI assistance. Specify the strategy name, number of steps, and types of steps to include (Email, LinkedIn, Task, etc.). When users say 'short' use 4 steps, 'medium' use 8 steps, 'long' use 12 steps. This creates a new strategy structure that can be further customized. Example: 'Generate a short cold outreach sequence for SaaS companies' or 'Create a new normal lenght follow-up strategy with email and LinkedIn steps'. For the field StepTypesToUse, NEVER use 'Generic', even when the users says to use all the channels. Ignore that.
GenerateStrategy
Retrieve the full configuration of a single agent by its integer AgentId (agents have no ObjectId) — call SearchAgents first to resolve it by name. Returns everything SearchAgents returns plus the description, the instructions, the full schedule, the trigger rules, the assigned users and the creation date. Use this when the user asks how an agent is configured, or before describing an agent's behaviour, rather than guessing from the search result. Optional flags add run statistics: WithInvocationStats, WithConsumedCredits, IncludeAverageTiming and IncludeFunctionCallCount (the last two are ignored unless WithInvocationStats is true). Example: 'How is my deal follow-up agent set up?' or 'Is my agent supervised?'.
GetAgent
Crono ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Crono's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Crono alternatives on ChatGPT?
As of 2026-10-16, Crono competes with Outreach, Amplemarket, BoothIQ, Business Follow-up Assistant, FirstTouch, Hobbes, Instantly.ai, JobPhoning and 18 more in ChatGPT Sales Engagement & Outreach Automation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.