toflow.ai
Prospect, enrich, and outreach
- Category
- Sales & CRM
- Primary Subcategory
- Sales Engagement & Outreach Automation
Integration details
Description
Connect to toflow.ai to prospect, enrich, and run multi-channel outreach, all through ChatGPT. Search for people and companies using filters like title, seniority, industry, company size, and location. Enrich contacts to find verified emails, phone numbers, and LinkedIn profiles. Build and manage lists, then add contacts to outreach sequences via email, LinkedIn, and WhatsApp. Create deals, log calls, create tasks, and track email opens without leaving the chat.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Sales Engagement & Outreach Automation
- Secondary Subcategories
- None listed
- Brand
- toflow.ai
- Access
- Account required
- First tracked
- 2026-08-17
- Tool count
- 128
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
toflow.ai in Sales Engagement & Outreach Automation
#12of 14competitors
This is the score for the Integration’s Primary Category, Sales Engagement & Outreach Automation. Claude found toflow.ai in connector search, but did not show it in the connector picker or invoke it in the measured contested Runs. That is why the score is 0.
What we measure
One core score. Three important factors to discoverability.
- How often your Plugin appeared in the picker, or Claude invoked it directly, across contested conversations. This percentage is the Discoverability Score; the headline number is rounded.Sets the score
Picked
· 0/100 - Whether Claude found your Plugin in connector search. It must be Found before it can reach the picker, but the score counts picker appearances—not search results.Diagnostic
Found
· 0.2/100 - What position your Plugin appeared in when it was shown in the picker. This shows prominence, but it does not affect the score.Diagnostic
Positioned
· 0/100
Competing in ChatGPT Sales Engagement & Outreach Automation
View Category128 tools agents can invoke
Add companies to a list using LinkedIn URL or website as the unique identifier. Each entry in `companies` must include at least one of: - linkedin_url — primary deduplication key - website — fallback deduplication key Optional fields used when creating a new record: - name (required if no existing match is found — used to create the company) - description - employee_range ("1", "1-10", "11-50", "51-200", "201-500", "501-1,000", "1,001-5,000", "5,001-10,000", "10,001+") Behaviour: - Dedup order: linkedin_url first, then website (case-insensitive match). - If a matching company exists → reuse, no duplicate created. - If new and name is provided → create a minimal record, then add to list. - If new and name is missing → skip with error. - If already in the list → silently skipped. Returns a summary: total processed, added, already in list, newly created, errors. After any follow-up bulk action on this list's members (attribute update), proactively suggest creating a focused filtered view — see the LISTS section of the server instructions for details.
add_companies_to_list
Add people to a list using LinkedIn URL as the unique identifier. Each entry in `people` must include: - linkedin_url (required) — unique identifier for deduplication Optional fields used when creating a new record: - first_name - last_name - email - job_title - description Behaviour: - If a person with the same LinkedIn URL already exists → reuse, no duplicate created. - If the person is new → a minimal record is created, then added to the list. - If the person is already in the list → silently skipped (no duplicate list entry). Returns a summary: total processed, added, already in list, newly created, errors. After any follow-up bulk action on this list's members (email enrichment, phone enrichment, attribute update), proactively suggest creating a focused filtered view — see the LISTS section of the server instructions for details.
add_people_to_list
Associate a person (contact) with a deal. Links an existing person record to an existing deal. A deal can have multiple people associated with it.
add_person_to_deal
Add existing records to a list by their IDs. Use this when you already have record IDs and want to add them to a list directly — no deduplication or record creation is performed. Typical use case: bulk_create succeeded but the automatic list add failed — pass the returned IDs here to retry adding them to the list. resource_type: "person" | "company" | "deal" — must match the list's resource type. resource_ids: list of record IDs to add. Already-present IDs are silently skipped (no duplicates created).
add_records_to_list
Bulk create records (companies, people, or deals). Call get_resource_schema first to get attribute IDs, then pass records as a list of dicts where each key is an attribute_id (string) and value is the field value. resource_type: "company" | "person" | "deal"
bulk_create
Find email addresses for multiple people at once. Accepts a list of person_ids (max 50). For each person: - If email already exists → skipped (no credit charge) - If LinkedIn URL available → enqueues enrichment task - If no LinkedIn URL → failed with error message Returns task_ids for queued enrichments. Enrichment runs asynchronously. IMPORTANT — do NOT call get_bulk_enrichment_status immediately. After this tool returns, tell the user: "Enrichment has been queued for N people. Please check back in at least [N × 30] seconds before asking for the status." Do not call get_bulk_enrichment_status until the user explicitly asks for the results after waiting the recommended time. Credit cost: 1 credit per person actually enriched (skipped = free).
bulk_enrich_emails
Enrich all people in a list for a given enrichment type. enrichment_type must be one of: - "email" — find email addresses (1 credit per person enriched) - "phone" — find phone numbers (10 credits per person enriched) - "profile" — fill job_title and description from LinkedIn (0.2 credits per person enriched) For each person in the list: - Already has the requested data → skipped (no credit charge) - No LinkedIn URL stored → failed (cannot enrich without it) - Otherwise → queued for async enrichment Credits are only charged when data is actually found (not on enqueue). Use get_bulk_enrichment_status(task_ids) to check results after waiting at least [N × 30] seconds, where N is the number of queued people. MANDATORY — you MUST call estimate_bulk_enrich_list(list_id, enrichment_type) before calling this tool. Show the credit estimate to the user and get their explicit confirmation before proceeding. Never call this tool without first completing that step. IMPORTANT — do NOT call get_bulk_enrichment_status immediately after this tool returns. Tell the user enrichment has been queued and ask them to check back after the recommended wait time.
bulk_enrich_list
Find phone numbers for multiple people at once. Accepts a list of person_ids (max 50). For each person: - If phone already exists → skipped (no credit charge) - If LinkedIn URL available → enqueues enrichment task - If no LinkedIn URL → failed with error message Returns task_ids for queued enrichments. Enrichment runs asynchronously. IMPORTANT — do NOT call get_bulk_enrichment_status immediately. After this tool returns, tell the user: "Enrichment has been queued for N people. Please check back in at least [N × 30] seconds before asking for the status." Do not call get_bulk_enrichment_status until the user explicitly asks for the results after waiting the recommended time. Credit cost: 10 credits per person actually enriched (skipped = free).
bulk_enrich_phones
Check LinkedIn connection status with a CRM person. Use this before deciding the outreach channel: - **"connected"** → use send_linkedin_message in an existing thread - **"no_invitation"** → use send_connection_request for cold outreach - **"pending"** → connection request already sent; wait for acceptance - **"ignored"** → request was ignored; consider InMail if premium account ## Parameters - **person_id**: CRM person to check (must have a LinkedIn URL). - **message_account_id**: Your LinkedIn message account to check from.
check_linkedin_connection
Create a new AI enrichment configuration. MANDATORY: call get_ai_enrichment_guide first for model options, template variables, and approval steps. resource_type: "person" | "company" | "deal". base_prompt is REQUIRED — provide a non-empty system-level prompt. field_mappings: [{"output_field": "<col>", "target_attribute_id": <int>, "attribute_prompt": "<required>", "is_enabled": true}]
create_ai_enrichment
Create a new custom attribute (field) for a CRM resource type. resource_type: "person" | "company" | "deal" attribute_type: text | number | currency | date | datetime | boolean | email | phone | url | select | multiselect | record_reference CONFIG — required for certain types: select / multiselect: config={"options": [{"value": "1", "label": "Low"}, {"value": "2", "label": "High"}]} currency: config={"currency_code": "USD"} record_reference: config={"reference_resource": "person" | "company" | "deal", "is_multiselect": false} WORKFLOW: 1. Call list_attributes(resource_type=...) to confirm the field does not already exist. 2. Confirm title, type, and config with the user. 3. Show "Create '{title}' ({attribute_type}) field for {resource_type}?" and wait for explicit user approval before calling this tool.
create_attribute
Create a new dashboard. Call this when list_dashboards returns an empty list or when the user explicitly asks to create a new dashboard for their report. BEFORE CALLING: confirm the dashboard name with the user — do not invent one. AFTER CALLING: use the returned id as dashboard_id in create_report. Share the url with the user so they can open the new dashboard. name: Display name for the dashboard — must be unique in the workspace description: Optional description of what this dashboard is for
create_dashboard
Create a new list for people, companies, or deals. resource_type: "person" | "company" | "deal" Returns the created list ID — use it with add_people_to_list or add_companies_to_list.
create_list
Create a new note. WORKFLOW — follow these steps before calling: 1. Confirm the person / company / deal context with the user if relevant. 2. Show the user a summary: "Create note '{title}' on [context]?" and wait for explicit approval before calling this tool. The note is attributed to the current user (owner_id = actor_id).
create_note
Create a new record (person, company, or deal). resource_type: "person" | "company" | "deal" Call record_schema(resource_type=<resource_type>) first to see all available fields, which are required, and allowed values for select fields. Workflow: 1. Read the schema to find required fields. 2. ALWAYS ask the user for any required field they did NOT provide — never auto-resolve or assume a value. Wait for the user's reply before proceeding. 3. Once the user provides a value: - If the field is a record_reference, use the appropriate lookup tool to resolve the name the user gave into a numeric ID: * reference_resource=pipeline → list_pipelines * reference_resource=stage → list_pipelines first, then list_stages(pipeline_id) * reference_resource=workspace_member → list_workspace_members * reference_resource=person → list_records(resource_type="person", search=<name>) * reference_resource=company → list_records(resource_type="company", search=<name>) - For "Categories" field (company only): call list_company_categories to get existing category IDs, or get_or_create_category(name=<name>) to resolve a name to an ID. Pass the resolved IDs as a list: {"title": "Categories", "value": [12, 34]} - For other types (text, select, etc.), use the value directly. 4. For optional fields the user did NOT mention, omit them entirely — do NOT ask, assume, or look them up. IMPORTANT: `attributes` must be a JSON object, NOT a string. Example: { "resource_type": "person", "attributes": { "items": [ {"title": "First Name", "value": "John"}, {"title": "Last Name", "value": "Smith"}, {"title": "Email Addresses", "value": "john@acme.com"} ] } }
create_record
Save a report permanently to a dashboard. PREREQUISITES — do not call this unless ALL of the following are true: 1. validate_and_preview_report returned valid=true. 2. You showed the preview_rows to the user. 3. The user explicitly confirmed they want to save (e.g. "yes", "save it", "looks good"). If dashboard_id is unknown, call list_dashboards first and ask the user which dashboard they want the report placed on. If no dashboards exist, call create_dashboard to create one before calling this tool. AFTER CALLING: share the url from the response so the user can open the dashboard. dashboard_id: ID from list_dashboards name: Unique name within the dashboard — ask the user if they have not provided one dataset_id: ID from list_datasets query / chart / filters / timezone: use the exact same values as the validated preview
create_report
Create a sequence with any mix of node types. MANDATORY: call get_sequence_creation_guide first and follow all steps before calling this tool. Do not call this tool until all guide steps are complete and the user has approved the final plan.
create_sequence
Create a new task. due_date must be an ISO 8601 string, e.g. "2026-03-15" or "2026-03-15T09:00:00Z". Dates without time are treated as midnight UTC. WORKFLOW — follow these steps before calling: 1. Confirm person / company / deal context with the user if relevant. 2. Confirm the due date. 3. Show the user: "Create task '{title}' due {due_date}?" and wait for explicit approval before calling this tool. assignee_id defaults to the current user when not provided.
create_task
Create a new saved view for a specific list. MANDATORY: call get_view_creation_guide first for the required workflow and parameter reference.
create_view
Permanently delete a custom attribute and all its stored values across all records. System attributes (is_system=true) cannot be deleted. To hide a field without losing data, use update_attribute with is_archived=true instead. Ask the user to confirm before calling this tool: "Are you sure you want to permanently delete attribute {attribute_id}? This will remove all stored values for this field across all records." Only call once the user explicitly approves.
delete_attribute
Delete a call record permanently. Ask the user to confirm before calling this tool: "Are you sure you want to delete call {call_id}?" Only call once the user explicitly approves.
delete_call
Soft-delete a company from the workspace. The company is removed from all lists and marked as deleted. This action cannot be undone from the MCP interface — always confirm with the user before calling this tool.
delete_company
Soft-delete a deal from the workspace. The deal is removed from all lists and marked as deleted. This action cannot be undone from the MCP interface — always confirm with the user before calling this tool.
delete_deal
Delete a draft email permanently. Only draft emails can be deleted via this tool. This action cannot be undone — always confirm with the user before calling.
delete_draft
Delete a list (soft delete). This action cannot be undone via MCP.
delete_list
Delete a draft LinkedIn or WhatsApp message permanently. Only draft messages (status="draft") can be deleted via this tool. This action cannot be undone — always confirm with the user before calling. ## Parameters - **message_id**: ID of the draft message to delete (from send_linkedin_message or send_whatsapp_message with draft=True).
delete_message_draft
Delete a note permanently. Ask the user to confirm before calling this tool: "Are you sure you want to delete note {note_id}?" Only call once the user explicitly approves.
delete_note
Soft-delete a person from the workspace. The person is removed from all lists and marked as deleted. This action cannot be undone from the MCP interface — always confirm with the user before calling this tool.
delete_person
Delete a task permanently. Ask the user to confirm before calling this tool: "Are you sure you want to delete task {task_id}?" Only call once the user explicitly approves.
delete_task
Draft an email in the workspace. MANDATORY: call get_draft_email_guide first and follow every step exactly. Optionally link the draft to a CRM person by passing person_id. Returns the draft email ID and a url — share the url with the user after drafting.
draft_email
Find an email address for a person. Identifies the person using person_id, linkedin_url, or name (checked in that order). At least one must be provided. - person_id: uses the existing record directly. - linkedin_url: looks up the person in the workspace; if not found, automatically enriches their profile and creates the record first, then finds the email address. - first_name / last_name only: searches the workspace. If exactly one match is found the email lookup proceeds. If none are found, the tool asks for a LinkedIn URL. If multiple are found, it returns the candidates and asks for person_id. IMPORTANT — after this tool returns: - Always show the email address (or not-found result) to the user. - If the person did not previously exist and was created automatically (profile_task_id is present in the response), explicitly tell the user: "A new person record was created in toflow before finding the email." - Always confirm with the user that the record and contact data look correct. - If enriching emails for multiple people in a list, after finishing ALL calls suggest a focused filtered view — see the LISTS section of the server instructions for details. A LinkedIn URL must be resolvable (stored or provided) before email enrichment can run — it is required by the enrichment provider. Waits up to 80 s total (40 s per phase). If it times out, call get_person_enrichment_status(task_id) to check the result — but at most 3 times (waiting ~3 s between calls). Stop after 3 attempts and tell the user to retry manually later.
enrich_person_email
Find a phone number for a person. Identifies the person using person_id, linkedin_url, or name (checked in that order). At least one must be provided. - person_id: uses the existing record directly. - linkedin_url: looks up the person in the workspace; if not found, automatically enriches their profile and creates the record first, then finds the phone number. - first_name / last_name only: searches the workspace. If exactly one match is found the phone lookup proceeds. If none are found, the tool asks for a LinkedIn URL. If multiple are found, it returns the candidates and asks for person_id. A LinkedIn URL must be resolvable (stored or provided) before phone enrichment can run — it is required by the enrichment provider. Waits up to 80 s total (40 s per phase). If it times out, call get_person_enrichment_status(task_id) to check the result — but at most 3 times (waiting ~3 s between calls). Stop after 3 attempts and tell the user to retry manually later. IMPORTANT — after this tool returns: - Always show the phone number (or not-found result) to the user. - If the person did not previously exist and was created automatically (profile_task_id is present in the response), explicitly tell the user: "A new person record was created in toflow before finding the phone." - Always confirm with the user that the record and contact data look correct. - If enriching phones for multiple people in a list, after finishing ALL calls suggest a focused filtered view — see the LISTS section of the server instructions for details.
enrich_person_phone
Get or enrich a person's profile using their LinkedIn URL. Searches for an existing person in the workspace with that LinkedIn URL. - If found and already has job_title + description: returns the existing data immediately with status "already_enriched" — no Bitscale call made. - If found but missing job_title or description: enriches and updates the existing record. - If not found: runs enrichment and automatically creates a new person record from the returned data. Enriched fields include: job_title, description, location, linkedin_url, company_name, company_website, company_linkedin_url, company_description. Works with both regular LinkedIn profile URLs and Sales Navigator URLs. Providing first_name / last_name is optional but improves match accuracy. Waits up to 60 seconds for Bitscale to respond. If it times out, call get_person_enrichment_status(task_id) to check the result — but at most 3 times (waiting ~3 s between calls). Stop after 3 attempts and tell the user to retry manually later. IMPORTANT — after this tool returns: - Always show the enriched data to the user in a readable format. - If created_new_person is true, explicitly tell the user: "A new person record has been created in toflow with this data." - If status is "already_enriched", tell the user the person already exists and show their current profile data. - Otherwise confirm the existing record was updated with fresh data.
enrich_person_by_linkedin
Enroll a person in a sequence. MANDATORY: call get_enroll_in_sequence_guide first and follow every step exactly. Do not call this tool until all guide steps are complete.
enroll_in_sequence
Show the credit cost of bulk_enrich_list before it runs. MANDATORY — call this before bulk_enrich_list. Show the result to the user and get explicit confirmation before proceeding. enrichment_type: "email" (2 cr), "phone" (20 cr), or "profile" (1 cr).
estimate_bulk_enrich_list
Forward an email to new recipients. Forwards the original email as-is — no additional message or signature is added. The subject is prefixed with "Fwd:" automatically. Non-inline attachments from the original email are carried over. Call list_connected_accounts first to get available sending accounts if you don't know which from_email to use. Only call this tool once the user explicitly confirms they want to forward. After forwarding, share the url with the user as a clickable link.
forward_email
Get a single AI enrichment configuration by provider_id. Use this before update_ai_enrichment to fetch the full current config — especially the complete field_mappings list — so you can pass all mappings back with only the desired ones modified.
get_ai_enrichment
Get the guide for creating an AI enrichment — model options, template variables, and approval steps. Call this BEFORE create_ai_enrichment and follow every step exactly.
get_ai_enrichment_guide
Get current load stats for sending accounts. Extract the IDs from the list_connected_accounts response and pass them here: - email_account_ids: [a.id for a in list_connected_accounts_result.email] - linkedin_account_ids: [a.id for a in list_connected_accounts_result.linkedin] - whatsapp_account_ids: [a.id for a in list_connected_accounts_result.whatsapp] Pass an empty list [] for channels with no accounts. Do NOT omit the parameters or pass None — omitting them returns no stats for that channel. For each account it returns: - active_enrollments: how many people are currently active/queued in sequences that use this account at this channel's current step - today: enrollments whose next step for this account is scheduled today - tomorrow: enrollments scheduled tomorrow - this_week: enrollments scheduled within the next 7 days Use these stats to recommend less-loaded accounts to the user. An account with high active_enrollments or today count is already carrying significant load — prefer accounts with lower values when the user has not expressed a preference. When presenting to the user, look up the label or identifier from your list_connected_accounts results using account_id — never show a raw account_id.
get_account_load_stats
List all accessible lists in the workspace. Optionally filter by resource_type: "person" | "company" | "deal" Returns list IDs, names, resource types, and item counts.
get_all_lists
Retrieve a single attribute by its ID.
get_attribute
Check status of multiple enrichment tasks at once. Pass the task_ids returned by bulk_enrich_emails or bulk_enrich_phones. Returns current status for each task (pending / completed / failed). IMPORTANT — do NOT call this immediately after bulk_enrich_emails or bulk_enrich_phones. Only call this tool when the user explicitly asks for the results, and only after they have waited at least [N × 30] seconds where N is the number of people in the original batch.
get_bulk_enrichment_status
Retrieve a single call by its ID. Returns full call details including linked person, company, deal, phone number, outcome, duration, notes, and assignee.
get_call
Get a single company by ID with full profile. IMPORTANT: Use this tool for a SINGLE company only. If you need data for multiple companies, do NOT call this tool in a loop. Instead, call list_records(resource_type="company", ids=[id1, id2, ...]) once to fetch all of them in a single request.
get_company
Get a single deal by ID with full profile. IMPORTANT: Use this tool for a SINGLE deal only. If you need data for multiple deals, do NOT call this tool in a loop. Instead, call list_records(resource_type="deal", ids=[id1, id2, ...]) once to fetch all of them in a single request.
get_deal
Get the mandatory step-by-step guide for drafting an email. Call this BEFORE draft_email and follow every step exactly.
get_draft_email_guide
Get a single email by ID — returns subject, body, recipients, status, and thread info.
get_email
Get open tracking statistics for a sent email. Returns whether it was opened, total opens, and first/last open timestamps. Timestamps are returned in the member's configured timezone (UTC if not set). Use this to answer "did they open my email?" before deciding on follow-up.
get_email_tracking
Get the mandatory step-by-step guide for enrolling a person in a sequence. Call this BEFORE enroll_in_sequence and follow every step in the response exactly.
get_enroll_in_sequence_guide
Get details of a specific sequence enrollment. Returns status, current node, next execution time, and per-node personalizations. Use the enrollment_id returned from enroll_in_sequence.
get_enrollment
How do I improve a ChatGPT Plugin's 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 toflow.ai alternatives on ChatGPT?
As of 2026-09-13, toflow.ai competes with Reply.io, Outreach, Mixmax, Amplemarket, Instantly.ai, JobPhoning, Lightmeter, MimikFlow, OneUp Today, SalesBreaker GTM, Taverity, FirstTouch, LinkupAPI in ChatGPT Sales Engagement & Outreach Automation, ranked by public Discoverability Score.
Where does toflow.ai rank in Sales Engagement & Outreach Automation on ChatGPT?
As of 2026-09-13, toflow.ai ranks #12 of 14 in ChatGPT Sales Engagement & Outreach Automation with a Discoverability Score of 0/100 (Invisible).
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.