- Brand
- Double
- Category
- Finance
- Primary Subcategory
- Accounting & Bookkeeping
Integration details
Description
Double manages the month-end close. It replaces spreadsheets and scattered checklists with a single system connected to your GL or ERP: tasks, team assignments, and close status all in one place. Connect it to ChatGPT and you can act on your close without switching apps. Create and reassign tasks, turn meeting notes into action items, and draft status updates for your team or clients, with changes writing back to Double in real time. You control what ChatGPT can read or update in your account. Works with QuickBooks, Xero, NetSuite, and Sage Intacct. Built for bookkeepers, accountants, and finance teams running the month-end close.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Accounting & Bookkeeping
- Secondary Subcategories
- None listed
- Brand
- Double
- Access
- Account required
- First tracked
- 2026-05-28
- Tool count
- 151
- Market
- 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 Double
Get updates when Double’s Discoverability Score or category rank changes.
Competing in ChatGPT Accounting & Bookkeeping
View Category151 tools agents can invoke
Accept the one suggested match on pending bank feed transactions classified potential_matches, the match the bank feeds page shows under Potential matches. A Bill gets a bill payment, an Invoice a customer payment, and a journal entry line on receivables or payables a payment. Other ledger transactions are only linked. A row whose suggestion is another bank feed row becomes a transfer. If the user asked to match, call with confirm true, and do not ask them to confirm again. Call with confirm false only when they asked what would match, or when their intent is unclear. Nothing is written without confirm. Readiness: a row needs exactly one suggestion. A row with none is refused. A row with several is refused with its suggestions listed. To match the ones it pays, use match_bank_feed_transaction. Rows that are posted, matched, excluded, hidden or being processed are refused, and two rows that point at the same target refuse each other. A refused row never blocks the rest. Results: a confirmed call queues a job and returns its ID. The response lists what went to the job, not what reached the ledger. Get the final results, with the entries created, from get_bank_feed_suggested_match_status. Show each row by date, description and amount, and its match by type, date, payee and amount. Never show IDs to the user. Up to 100 transaction IDs per call.
accept_bank_feed_suggested_matches
Add a comment to one pending bank feed transaction, optionally tagging teammates. Use only when asked to leave a comment. Excluded, posted, matched, and currently posting or matching rows are refused. Use add_transaction_comment for ledger transactions. Returns the saved comment and thread IDs; use list_comments to read comments. Each successful call creates a comment: after an uncertain response, check list_comments before retrying.
add_bank_feed_transaction_comment
Ask the client a question about pending bank feed transactions, as "Add question" does on the bank feeds page: each row gets its own question, answered in the client portal. Use only when the user asks to ask the client something; use add_question for ledger transactions and update_question to reply on an existing question. Rows that cannot take a new question are refused with a reason, and the rest still go through.
add_bank_feed_transaction_questions
Creates a new folder in the file library for a client. Can be created at the root level or nested inside an existing folder (use list_file_library to find folder IDs). Throws an error if a folder with the same name already exists in the parent.
add_file_folder
Adds an uploaded file (from internal_upload_file / internal_confirm_upload) to a client's file library. Specify a folderId to place the file in a custom folder, or omit it to send to the Uploads Inbox (triggers automatic OCR scanning). Files are hidden from clients by default. Always call internal_upload_file first to obtain the fileKey and fileName.
add_file_to_client
Create a new question for a client. Only one question can exist per transaction. The question will be submitted on behalf of the current user. Optionally attach files (call internal_upload_file first).
add_question
Post a comment on a task (closing, firm, project, or custom), visible to the team and notifying thread subscribers. Only use when the user asks to comment; never use it to look something up (use list_comments to read a thread). A comment is NOT a footnote: when the user asks for a footnote or a note on the financial report, use create_footnote instead.
add_task_comment
Add a signer to one or more closing, custom or firm tasks, optionally recording the sign-off as already completed. A task without a sign-off gets one created; a user already in the chain is reported as unchanged, never duplicated. Signing on behalf of another user needs the "Override sign-offs" access level. list_tasks and get_task show each task's sign-off chain. Describe the change to the user first; when the app asks them to approve the call, do not ask again yourself. A task the user cannot edit is reported as failed with a reason and never blocks the rest.
add_task_sign_offs
Create a new time tracking entry. Supports creating timers for specific clients or as firm-level entries. You can specify a workstream by ID or name, and optionally create timers on behalf of other users. If no endTime is provided, the timer is created as an active/running timer.
add_timer
Post a comment on a transaction, visible to the team and notifying thread subscribers. Only use when the user asks to comment; never use it to look something up (use list_comments to read a thread). If a thread already exists on this transaction, the new comment is appended to it.
add_transaction_comment
Apply an organizer template to one or more clients: each client gets a new organizer copied from the template (slides, flags, and conditional logic included). By default the organizers are created as drafts; pass published: true to publish them to the client portal immediately, which notifies the client. Discover template ids with list_organizer_templates and client ids with list_clients. Only users the practice's template permissions setting allows can apply templates.
apply_organizer_template
Build a Double deep link for a supported entity by ID and type. Route-specific values go in params; the params shape depends on entityType. Use agent_run for a link to an agent run (the current run, this run, the run log); an agent's own `deepLink` opens its configuration, never a run. Use ai_chat for an Ask Double conversation that is not an agent run.
build_deep_link
Assign categories to pending bank feed transactions in one of two modes. Explicit mode: Use the default mode only when the user explicitly asks to assign one category by ID or name. Do not turn a broad request to apply suggestions into an explicit category assignment. Saved-suggestions mode: Use mode='saved_suggestions' for a broad request to apply saved suggestions. It can apply only an unambiguous high-confidence saved category proposal and, when present, one saved payee proposal. Rows with existing values that differ from the saved proposal require review. Medium- and low-confidence proposals also require that you first display the exact category and payee proposal for each row, then receive the user's confirmation. Only then pass reviewConfirmed=true with the exact displayed confirmedSuggestions. A review-only request authorizes no write. Never fabricate, alter, or reuse proposals that were not displayed, and never use reviewConfirmed as independent proof of consent. Class, location, and customer remain direct assignments only: include their IDs only when the user explicitly names those values. This tool never infers dimension suggestions, creates payees, or clears a payee because a proposal has payeeId=null. Clearing: In explicit mode, pass null for classId, locationId, or customerId, or clearPayee=true, only when the user explicitly asks to remove that value from one transaction. Clearing works on exactly one transaction per call. Omit categoryId and categoryName to keep the transaction's current category, whether or not it has one; the category itself cannot be cleared. Results: Every distinct requested transaction is reported once, in first-requested order; duplicate IDs are collapsed. A transaction can be updated, unchanged because it already has the requested values, or refused. Posted, matched, excluded, in-flight, hidden, transfer-conflicting, or foreign transactions are refused without changing the rest of the batch. Each change carries previousName and newName so the user can audit it at a glance: when you summarize updated rows, show the previous category next to the new one. Say "Unassigned" only when previousValue is null; when previousValue is set but previousName is null, say the previous name is unavailable rather than calling it unassigned.
categorize_bank_feed_transactions
Create an account reconciliation task for a specific ledger account within a monthly close period (EndClose). Requires an accountId (ledger account ID from QBO or Sage) and an endCloseId. Fails with an error if a reconciliation task for this account already exists in the given close.
create_account_reconciliation_task
Creates accruals from a ledger transaction - one accrual by selected transaction line, linked to the transaction and it leaves the New tab of the accrual account. Each amount is read from the ledger line, never passed. The account must already be tracked as an accrual account (create_accrual_account); its tracking task in the target close is reused or created.
create_accrual_from_transaction
Creates an accrued expense for a QuickBooks Online client: accrues the amount each month against the liability account, posts the journal entries, and schedules the reversal per the chosen method. Reuses the existing accrual tracking task for the account or creates one. Before asking the user for duration, reversal method, or expense account, call get_accrual_presets — a matching preset defaults those, so only ask for what it doesn't cover. The schedule is computed server-side — never compute it yourself. Confirm the details with the user before calling. Amounts are in dollars.
create_accrued_expense
Create a AI agent configuration for the current user in this practice. If no model is specified by the user, default to gpt-5.6-luna-high
create_agent_config
Create the vendors that the bank feeds page suggests in "For review: New vendors" (list_bank_feed_suggested_vendors), and give each one to the transactions with that suggested name. For each name, the tool creates the vendor in QuickBooks, reuses an active vendor with the exact name, or assigns an existing payee the user picked. New vendors use the client's base currency and no 1099 tracking. A refused or failed name never blocks the others. Its reason says what to tell or ask the user. When ledgerCacheGaps is not empty, say that an existing payee can be missed. The payee goes to every open transaction of the client with the suggested name, in every account, including excluded and hidden ones, as on the page. Report otherAccountRowCount and excludedOrHiddenRowCount when they are above zero. Use set_bank_feed_transaction_payee to change one transaction.
create_bank_feed_suggested_vendors
Create a new unconnected client. Specify a name and optionally a workflow type, close cadence (monthly or quarterly), assignees (preparer, reviewer, manager), and a branch. A branch is required when the practice has branches enabled. Tax workflows (tax_only, close_and_tax) are only available when the practice has Tax Suite enabled.
create_client
Create a new close period for a client. Optionally specify a monthDate in MM-YYYY format (e.g. "05-2026") — if omitted, the next logical close period is created based on the client's fiscal settings. The monthDate cannot be more than one month in the future (or one quarter for quarterly clients). For quarterly clients, the monthDate must also fall on a valid quarter-end month. Use list_clients to find client IDs.
create_end_close
Create a new task within a monthly close period (EndClose). Requires an endCloseId from list_tasks. Always call list_sections and use the exact type returned for the intended closing section. Manual task creation is determined by section type, not display name: a custom section returned by list_sections is valid even if its name matches a system-managed section. System-managed section types are omitted from list_sections and rejected by this tool. Closing tasks cannot have a recurrence schedule. For recurring or standalone tasks, use create_custom_task instead.
create_closing_task
Create a new portal contact. Validates that the contact does not already exist in the practice and that the user has access to the specified clients.
create_contact
Create client custom tasks outside monthly close. Default here for client tasks that look one-off unless told otherwise. For ad-hoc/recurring to-dos, reminders, requests, and client work; appears in "Custom tasks". Use create_firm_task for practice-level work; create_closing_task for close work.
create_custom_task
Create a practice-level firm task not tied to any specific client. Use this for internal to-dos, reminders, or work items that apply to the whole practice. These tasks appear in the "Firm tasks" section. For client-specific tasks, use create_custom_task instead. For monthly close tasks, use create_closing_task.
create_firm_task
Create a new footnote on a client's financial report. Footnotes are annotations attached to specific accounts or report sections (e.g. Profit & Loss, Balance Sheet) within a monthly close period. Use this, not add_task_comment, when the user asks for a footnote. Account footnotes also show on the close's account reconciliation tasks: to footnote such a task, use nodeType "account", the task's accountId as nodeId, and the task's endCloseId. When the account already has a footnote, create a new one rather than calling update_footnote, unless the user asked to change the existing note.
create_footnote
Creates a loan and its amortization schedule from terms, plus a loan task. Confirm the terms with the user before calling. Amounts are in dollars.
create_loan
Create a new tab on the Metrics page. When copying tabs between clients, create them sequentially in ascending orderIndex and pass each source orderIndex to preserve their positions. Fails with CONFLICT if a tab with the same name (or a report tab of the same type with identical filters) already exists — surface the conflict to the user instead of silently overwriting. The Metrics feature is only available for QuickBooks and Xero clients. Cash Flow tabs are QuickBooks only.
create_metrics_tab
Create a variable (row) on a custom Metrics tab. Fails with CONFLICT if a variable with the same name exists on the tab — when copying between clients, surface the conflict and ask the user whether to skip, rename, or overwrite (overwrite = update_metrics_variable) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_metrics_variable
Create ONE visual (chart) on the Metrics page. It appears alone on a new full-width row at the top of the grid. Creating more than one visual? Use create_metrics_visual_grid instead — it takes the visuals as rows and lays them out side by side in a single call. Repeated calls to this tool leave a column of full-width charts, which reads poorly. Fails with CONFLICT if a visual with the same name exists — when copying between clients, surface the conflict and ask the user whether to skip, rename, or create anyway (allowDuplicateName: true) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_metrics_visual
Create several visuals (charts) on the Metrics page in one call, laid out as a grid. Use this instead of repeated create_metrics_visual calls whenever you are creating more than one visual — create_metrics_visual puts every visual on its own full-width row, which reads poorly. Creates visuals only. Tabs and the variables a visual plots must already exist — use create_metrics_tab and create_metrics_variable first when building a Metrics page from scratch. Each entry in `rows` is one row of the grid, rendered top to bottom, left to right; visuals in a row split the width evenly. A layout where every row holds a single visual is almost never what the user wants. The new rows are added above the client's existing visuals, which keep their current layout. A new visual therefore cannot join a row that already holds an existing one — when the user wants them side by side, follow this call with reorder_metrics_visuals, using the `positions` grid in this response as the starting point. Layout conventions, unless the user asks for something else: - An explicit layout from the user, or the layout of a dashboard being copied, wins over these defaults. - Summary KPI cards go above charts. Order charts from high-level trends down to detailed breakdowns. - Never put a KPI card and a non-card chart on the same row. Cards are sized for 3-across and read badly stretched to half a row. - Group KPI cards 2–3 per row, avoiding an orphan: 2+2 for four cards, 3+2 for five. - Pair related non-card charts 2 per row. Keep a primary, dense, or unrelated chart on its own full-width row. All-or-nothing: nothing is created unless every visual validates. Errors name the offending row and column so you can fix that one spec and retry. Name collisions with existing visuals are reported together as a CONFLICT — surface them and ask the user whether to rename, skip, or create anyway (allowDuplicateName: true) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_metrics_visual_grid
Create a new note for a client. The note will be attributed to the current user. Pass fileKeys to attach uploaded files to the new note.
create_note
Create a new organizer for a client. The organizer starts as an empty draft with no slides — add slides with update_organizer, and publish it to the client portal with update_organizer status: "published" (publishing requires a name and at least one slide). If name is omitted, a name like "00 Organizer" is auto-generated; duplicate and empty names are allowed at creation. Use list_clients to find client IDs and list_organizers to see the client's existing organizers.
create_organizer
Create a task inside a tax project. Use this for work items tied to a specific client tax project (tax return, extension, etc.). These tasks appear under the project in the Tax Return view. For month-end bookkeeping tasks, use create_closing_task. For ad-hoc client tasks not tied to a project, use create_custom_task. For practice-level tasks, use create_firm_task.
create_project_task
Create a new property column (e.g. "Industry") for clients in the practice. Supports text, picker (dropdown), multiSelect, datePicker, userPicker, checkbox, amount, percentage, and attachment types. For "picker" and "multiSelect" types you must provide at least one option in pickerOptions. This tool only creates the column definition; it does not set values on individual clients. To set values on a client, use upsert_client_properties.
create_property_column
Set up a client question that repeats on a weekly or monthly schedule, posting a new question to the client portal on every occurrence. Use add_question instead for a one-off question. The question is created on behalf of the current user.
create_recurring_question
Create a new team member / user in the practice. Restricted to admins. Sends the standard invite email to the new user.
create_user
Delete bank feed rules of one client by rule ID, 1 to 10 per call, as listed by list_bank_feed_rules. Effect: a deleted rule is gone for good, like a rule deleted on the bank rules page. Transactions keep the values it set; nothing is reverted. The preview gives each rule's name and how many open transactions still show a value it set. Confirm: a preview (confirm false) is the default. Use it when the user asks what a delete would do, or when it is unclear whether they want to delete, and show the preview; once the user agrees, call again with confirm true and the same IDs. If the user asked to delete the rules, call with confirm true right away: do not ask the user to confirm a change they already asked for. An ID that isn't one of the client's rules is refused and never blocks the others. If a confirmed call fails or times out, call list_bank_feed_rules before calling again: an ID it no longer lists was deleted.
delete_bank_feed_rule
Delete a Metrics tab and its variables. This is destructive — before calling, list what will be deleted and confirm with the user. Fails with CONFLICT if visuals reference the tab's variables (retry with deleteReferencedVisuals: true after user confirmation) or if formulas on other tabs reference them (those must be fixed manually). Only available for QuickBooks and Xero clients.
delete_metrics_tab
Delete a variable from a custom Metrics tab. Fails with CONFLICT naming the visuals or formulas that reference it — those must be updated or deleted first. Confirm with the user before deleting. Only available for QuickBooks and Xero clients.
delete_metrics_variable
Delete a visual from the Metrics page. Remaining visuals keep their order. Confirm with the user before deleting. Only available for QuickBooks and Xero clients.
delete_metrics_visual
Remove one sign-off entry, or the whole chain, from one or more closing, custom or firm tasks. Removing the whole chain reopens a task that was completed through its sign-offs. A task with no matching entry is reported as unchanged. list_tasks and get_task show each task's sign-off chain. Describe the change to the user first; when the app asks them to approve the call, do not ask again yourself. A task the user cannot edit is reported as failed with a reason and never blocks the rest.
delete_task_sign_offs
Get the Accounts Payable (AP) Aging report for a client. Only supported for QBO clients.
get_ap_aging_report
Get the Accounts Receivable (AR) Aging report for a client. Only supported for QBO clients.
get_ar_aging_report
Resolves an accrual task (or a tracked ledger account) to its accrual account — type, tracked account and configured recognition accounts — and lists the transactions in its Accruals → New tab: posted transactions with a line on that account that are not accrued, linked or excluded yet. Call it FIRST when the user wants to accrue something from an accrual task (e.g. the task in visibleContext.selectedTask): the returned type is the accrualType and the returned rows are the candidate transactions, so neither needs to be asked. The rows are what the user sees on the task in Double, limited to the dates of the task (dateRange); pass startDate/endDate outside them only when the user asks for other dates. To narrow the candidates (only expenses, a vendor, a date range, a reference) call it again with transactionType, dimensions, startDate/endDate or search — never get_transactions, which also returns transactions that are already accrued.
get_accrual_new_transactions
Lists the client's accrual presets for a given accrual type.
get_accrual_presets
Computes the reversal entry for an accrued expense awaiting manual reversal, without booking anything. Use it to show the user the booked entries and the reversal entry before calling reverse_accrued_expense. The entry is computed server-side — never compute it yourself.
get_accrual_reversal_schedule
Lists the accrued expenses awaiting a manual reversal (created with the REV_MANUAL method and not reversed yet) on an accrued-expense account. Use it to find the accrual to reverse before calling get_accrual_reversal_schedule.
get_accruals_needing_review
Get the Balance Sheet report for a client. Supports date ranges, dimension filters, and summarization (Month, Quarter, FiscalQuarter, Classes, Departments, Total). Balance Sheet figures are balances as of each column's end date, not activity: never add date columns together. The balance for a multi-column period is its last column. On calls without dimension filters, each row includes metricsVariableId — the exact id to reference that row in metrics formulas/visuals (copy verbatim; never construct ids from account names). Filtered calls are not annotated: ids for filtered report tabs come from list_metrics_variables. Rows reflect activity in the requested period only — to enumerate every referenceable metrics row, use list_metrics_variables.
get_balance_sheet_report
Check a job that accept_bank_feed_suggested_matches or match_bank_feed_transaction started with confirm true, and get what it matched or refused, and each QuickBooks entry a match created. While the job is still working, wait a few seconds and call again, for up to about a minute. Report back to the user only when the job has finished or the minute has passed. If the job failed, give the user its error. Say if the match was a partial payment.
get_bank_feed_suggested_match_status
Check a job that post_bank_feed_transactions or split_bank_feed_transaction started with confirm true, and get which transactions it posted or refused. While the job is still working, wait a few seconds and call again, for up to about a minute. Report back to the user only when the job has finished or the minute has passed. If the job failed, give the user its error.
get_bank_feed_transaction_post_status
Double ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Double'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 Double alternatives on ChatGPT?
As of 2026-11-02, Double competes with Accountable, Agenix Invoice, AgentCollect, Aikount, Akaunting, AuntBird Practice Management, B2B.nu, Bankstatemently and 79 more in ChatGPT Accounting & Bookkeeping, 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.