- Brand
- easySales
- Category
- Sales & CRM
- Primary Subcategory
- B2B Sales CRM Platforms
Integration details
Description
Connect ChatGPT to easySales CRM to find customers and contacts, manage follow-up tasks, and work with quotations and invoices within your account permissions. Requires an existing easySales account connected through OAuth. The integration manages business and payment records; it does not charge cards or transfer money.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- B2B Sales CRM Platforms
- Secondary Subcategories
- None listed
- Brand
- easySales
- Access
- Account required
- First tracked
- 2026-10-28
- Tool count
- 289
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Agent DiscoverabilityChatGPT Discoverability ScoreUpdated dailyThe first to track the ChatGPT, Claude, Muse, Grok & Google ecosystems, with the largest database on the core platforms. Tracked daily since .
0/100
Invisible#30of 73
in B2B Sales CRM Platforms- Picked
- 0.0/100
- Found
- 0.0/100
- Positioned
- –/100
Get alerts for easySales
Get updates when easySales’s Discoverability Score or category rank changes.
Competing in ChatGPT B2B Sales CRM Platforms
View Category289 tools agents can invoke
One record’s timeline, newest first: the activity threads linked to it that this user can see and, unless includeDocumentEvents is false, what happened to the record and its documents (created, issued, paid, …). object { type, id } is the record — type is account, contact, lead, opportunity, quotation, invoice, creditNote, receipt, refund or contract — and must be one this user may open, or the answer is not found. kinds limits the threads to note, task, event and call (call = a communication); subTypeIds to those sub-types (activity.sub_types; none for threads without one). rollup true (default) on an account or contact includes its quotations’, invoices’ and opportunities’ activities. limit is at most 50; pass nextCursor back as cursor. Each row has entry activity (the thread’s fields as activity.feed gives them) or entry documentEvent (eventId, at in UTC, verb, variant, objectType, objectId, objectLabel and who did it). Each record includes link, the URL of that record in the easySales web app.
activity.timeline
Close an open quotation as accepted (won true) or rejected (won false); a draft is refused — finalise it first. This is final: a closed quotation cannot be reopened or edited again. One exception: an accepted quotation with no invoice and no billing plan may still be rejected (won false), for example a duplicate accepted by mistake. Returns { dryRun, record: { id, status } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.close
Add and remove members of a space this user owns, or of any space when they may manage others’ activities. id is the space; add and remove are user ids (at most 200 each; activity.pick_user finds them). Never this user (they join or leave themselves with space.join and space.leave) and never the owner (hand the space over first with space.update). A removed member of a members-only space no longer sees its threads unless named in them, and an added one sees all of them, their history included: dryRun true answers audienceGains and audienceLosses, the people who would gain or lose them (none for a company space, whose threads everyone sees). Added people are told in their Updates, and the addition is shown in the space. Returns { dryRun, record: { spaceId }, addedUserIds, removedUserIds }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
space.set_members
Allocate the unapplied money of an existing receipt to issued invoices of the same account and currency — no new receipt and no new number. This reduces what the customer owes on each invoice at once; removing one of the payments it writes (invoice.delete_payment) reverses it. A security deposit is refused here. receiptId is required (receipt.search: a receipt with unapplied above zero). allocations is a list of { invoiceId, amount }, each invoice named once, each amount an exact decimal string no more than the invoice still owes, together no more than the receipt’s unapplied money. date is the day the money is allocated, yyyy-MM-dd, blank for today; not before the receipt’s or an invoice’s own date, and not in the future. Allocating may be switched off for this company, and the answer then says so. Returns { dryRun, record: { id, number, date, allocated, unapplied, invoices: [{ invoiceId, paymentId, amount, status, paidAmount, outstandingAmount, creditedAmount }] } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
receipt.apply
Use a security deposit a receipt holds as payment for issued invoices of the same account and currency — the Allocate deposit action. Each invoice owes that much less at once and the deposit held falls by the same amount, dated today; it is undone by removing the payment it wrote from the invoice (invoice.delete_payment). receiptId is a receipt whose nature is deposit (receipt.get: unapplied is what is held). allocations is a list of { invoiceId, amount }, each invoice named once, each amount an exact decimal string no more than the invoice still owes, together no more than is held. Needs access to all invoices, not only the user’s own; may be switched off for this company, and the answer then says so. Returns { dryRun, record: { id, number, date, held, invoices: [{ invoiceId, paymentId, amount, outstandingAmount, status }] } }, the amounts in the receipt’s currency. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
receipt.apply_deposit
Apply an issued credit note’s remaining credit to invoices of the same account and currency. This reduces what the customer owes on each invoice at once; creditNote.unapply reverses one allocation. creditNoteId is required. allocations is a list of { invoiceId, amount }, each invoice named once; amount is an exact decimal string in the note’s currency, such as "100.00", above zero. Each amount may not exceed what its invoice still owes, and together they may not exceed the note’s remaining credit (creditNote.get’s credit). allocationDate is yyyy-MM-dd, blank for today, and cannot be in the future. Applying credit may be switched off for this company, and the answer then says so. Returns { dryRun, record: { creditNoteId, allocations: [{ invoiceId, allocationId, amount, status, paidAmount, outstandingAmount, creditedAmount }], credit: { face, allocated, refunded, remaining } } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
creditNote.apply
Approve a credit note that is awaiting approval, and issue it in the same step: it takes the next credit note number and reduces what the customer owes on its invoice; afterwards it can only be cancelled. Issuing credit notes may be switched off for this company, and the answer then says so. It needs this user’s permission to approve credit notes and the credit note in their view; the issue’s own checks run again, and a refusal leaves the request pending. If someone else decided it first, the answer says who. id is the document; approvalId is required: the request shown in the get tool’s approval.requestId, so a request withdrawn and submitted again meanwhile is not decided unseen. Do this only on the user’s explicit decision about this request, never on your own judgement of the document, and only after showing them the preview. Returns { dryRun, record: { id, outcome }, approval (the request, now approved), issued (the credit note as issued) }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
creditNote.approve
Approve a quotation that is awaiting approval, and finalise it in the same step: it takes its quotation number (such as QN-10000124) and becomes Open, which cannot be undone. issueDate is the quotation date, yyyy-MM-dd, not later than today; left out, the date the submitter asked for (approval.requestedIssueDate in quotation.get), else today. It needs this user’s permission to approve quotations and the quotation in their view; the issue’s own checks run again, and a refusal leaves the request pending. If someone else decided it first, the answer says who. id is the document; approvalId is required: the request shown in the get tool’s approval.requestId, so a request withdrawn and submitted again meanwhile is not decided unseen. Do this only on the user’s explicit decision about this request, never on your own judgement of the document, and only after showing them the preview. Returns { dryRun, record: { id, outcome }, approval (the request, now approved), issued (the quotation as issued) }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.approve
Approve an invoice that is awaiting approval, and issue it in the same step: it takes its invoice number, the customer then owes it, and afterwards it can only be cancelled or credited. issueDate is the invoice date, yyyy-MM-dd, not later than today; left out, the date the submitter asked for (approval.requestedIssueDate in invoice.get), else today. undeterminedTax, left out, is the submitter’s choice for lines whose tax is None (approval.requestedUndeterminedTax); send one of SG.ZR, SG.ES33, SG.ESN33, SG.OS only to change it. It needs this user’s permission to approve invoices and the invoice in their view; the issue’s own checks run again, and a refusal leaves the request pending. If someone else decided it first, the answer says who. id is the document; approvalId is required: the request shown in the get tool’s approval.requestId, so a request withdrawn and submitted again meanwhile is not decided unseen. Do this only on the user’s explicit decision about this request, never on your own judgement of the document, and only after showing them the preview. Returns { dryRun, record: { id, outcome }, approval (the request, now approved), issued (the invoice as issued) }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
invoice.approve
Archive (Done) this user’s own Updates by id (at most 200, from notification.list): they leave the inbox and stay in the archived view. Returns { dryRun, record: { updated } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
notification.archive
Hand leads to another user: every lead of leadIds (1 to 200 lead IDs) goes to ownerId, a user of this company (user.pick). Leads this user may not edit, leads already with that owner and converted leads are left as they are: assigned is how many moved, of requested. Each lead that moves restarts its follow-up period and is announced to its new owner in easySales, and the previous owner may lose access to it. Returns { dryRun, record: { ownerId, requested, assigned } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
lead.assign
Attach a file of at most 5 MB to a quotation; larger files are attached from the web. recordId is the quotation; fileName is the file’s name; contentType its MIME type, such as application/pdf — a PDF, an image, a Word, Excel or PowerPoint file or a CSV, whose first bytes must match that type; dataBase64 the file’s bytes in base64. A quotation holds at most 20 files, and the company’s file storage has a limit by plan; a revision carries its files to the new version. The dry run only checks that this user can see the quotation: nothing is uploaded, and the type, the size, the limits and the right to change it are checked when the file is attached. Returns { dryRun, record: { id, recordId, fileName, contentType, size } }; a file is removed with quotation.remove_file. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.attach_file
Attach the supplier’s document — a file of at most 5 MB — to a supplier invoice recorded on a purchase order; larger files are attached from the web. purchaseBillId is the supplier invoice (purchaseOrder.bills); fileName is its name; contentType its MIME type, such as application/pdf — a PDF, an image, a Word, Excel or PowerPoint file or a CSV; dataBase64 the file’s bytes in base64. A supplier invoice holds at most 10 files, its order must be issued or closed, and a voided invoice takes none. The dry run only checks that this user can see the supplier invoice: nothing is uploaded, and the type, the size, the limit and the right to change the order are checked when the file is attached. Returns { dryRun, record: { id, purchaseBillId, fileName, contentType, size } }; a file is removed with purchaseOrder.remove_bill_file. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.attach_bill_file
Attach a file of at most 5 MB to an account; larger files are attached from the web. recordId is the account; fileName is the file’s name; contentType its MIME type, such as application/pdf — a PDF, an image, a Word, Excel or PowerPoint file or a CSV, whose first bytes must match that type; dataBase64 the file’s bytes in base64. An account holds at most 20 files, and the company’s file storage has a limit by plan. The dry run only checks that this user can see the account: nothing is uploaded, and the type, the size, the limits and the right to change it are checked when the file is attached. Returns { dryRun, record: { id, recordId, fileName, contentType, size } }; a file is removed with account.remove_file. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
account.attach_file
Attach a file of at most 5 MB to an activity this user may edit; larger files are attached from the web. activityId is the activity (a thread’s first activity or a reply); fileName is its name; contentType its MIME type, such as application/pdf; dataBase64 the file’s bytes in base64. inline true shows a PNG, JPEG, GIF or WebP image in the body (reference it as  in a later edit); no other type can be inline. An activity holds at most 20 files, and a thread in a closed space takes none. The dry run only checks that this user can see the activity: nothing is uploaded. Returns { dryRun, record: { id, activityId, fileName, contentType, size, inline } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
activity.attach_file
Attach a file of at most 5 MB to an invoice, issued or not; larger files are attached from the web. recordId is the invoice; fileName is the file’s name; contentType its MIME type, such as application/pdf — a PDF, an image, a Word, Excel or PowerPoint file or a CSV, whose first bytes must match that type; dataBase64 the file’s bytes in base64. A cancelled invoice takes no files; an invoice holds at most 20, and the company’s file storage has a limit by plan. The dry run only checks that this user can see the invoice: nothing is uploaded, and the type, the size, the limits, the status and the right to change it are checked when the file is attached. Returns { dryRun, record: { id, recordId, fileName, contentType, size } }; a file is removed with invoice.remove_file. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
invoice.attach_file
Attach the customer’s signed copy — a file of at most 5 MB — to a delivered delivery order; larger files are attached from the web. deliveryOrderId is the delivery order; fileName is the file’s name; contentType its MIME type, such as application/pdf — a PDF, an image, a Word, Excel or PowerPoint file or a CSV; dataBase64 the file’s bytes in base64. The delivery order must be delivered (mark it delivered first) and holds at most 10 files; a signed copy is optional. The dry run only checks that this user can see the delivery order: nothing is uploaded, and the type, the size, the limit, the status and the right to change it are checked when the file is attached. Returns { dryRun, record: { id, deliveryOrderId, fileName, contentType, size } }; a file is removed with deliveryOrder.remove_file. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
deliveryOrder.attach_file
The events, tasks with a due day and communications (kind call) between from and to (yyyy-MM-dd, both included, in this user’s own time zone; at most 62 days), as the web’s calendar shows them. scope is mine (default: items this user is involved in), team (this user and their team) or all (everything this user can see); userIds (at most 50) narrows to those people’s items; kinds is a list of event, task and call (call = a communication); subTypeIds narrows to those sub-types (activity.sub_types; none for items without one; busy blocks are never narrowed); spaceId shows one space’s items (space.search finds it; a space this user may not see is not found). Each row has the item’s fields as activity.my_work gives them, without group. busy (default true; not with scope mine) adds busy blocks: for a team colleague’s event this user cannot see, only who (userId, name) and when (startAt and endAt in UTC, or allDay with startDate and endDate) — never what, where or which space, and never for an event in a members-only space. documentDates (default false; not with spaceId) adds documents: the dated days (due, expiry, start and the like) of opportunities, quotations, invoices, contracts and other records this user may list, each as type, id, label, field (the date column) and day; in scope mine only records this user owns, in team those this user or their team own. tooMany true means more than 2000 items matched: narrow the range or the filters. Only items in threads this user can see are listed. Each record includes link, the URL of that record in the easySales web app.
calendar.range
Cancel an issued credit note. This is final: the note stays on record as Cancelled, every allocation of its credit is released, and each invoice it credited owes that amount again. A draft is refused (delete it with creditNote.delete), and so is a note that has had money refunded out of it. id is required; reason is optional and is added to the note’s remark. Returns { dryRun, record: { id, status, released: [{ id, status, outstandingAmount, creditedAmount }] } }, the invoices whose credit was released, in the note’s currency. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
creditNote.cancel
Cancel an issued or delivered delivery order. This is final: the order stays on record as Cancelled with its number, and the quantities it took go back to the invoice or quotation line. A draft is refused (delete it with deliveryOrder.delete). Refused while an invoice made from the order stands: void or change that invoice first. id is the order; reason, up to 200 characters, is required and recorded. Returns { dryRun, record: { id, status } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
deliveryOrder.cancel
Cancel an issued purchase order. This is final: the order stays on record as Cancelled with its number, counts as no cost, and cannot be reopened or changed again. A draft is refused (delete it with purchaseOrder.delete). It is also refused while a supplier invoice or a payment stands on the order: void them first with purchaseOrder.void_bill and purchaseOrder.void_payment, or close the order with purchaseOrder.close instead. id is the order; reason, up to 200 characters, is required and recorded. Returns { dryRun, record: { id, status } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.cancel
Cancel a quotation’s live billing plan. This is final for that plan: it stays on record as cancelled and cannot be brought back, though a new plan can be created afterwards; invoices already issued for its lines are untouched. Refused while a draft invoice bills one of its lines: issue or delete that draft first. planId is the plan’s id (quotation.billing_plan) and is required, except where invoicing is not part of the company’s plan and quotation.billing_plan shows no schedule: there leave it out and the quotation’s live plan is cancelled. reason is optional. Returns { dryRun, record: { id, status } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.cancel_billing_plan
Cancel an issued invoice — the Cancel invoice action. This is final: the invoice becomes Cancelled for good and a credit note for the whole invoice is issued at once, with the next credit note number. A draft is refused (delete it with invoice.delete). It is also refused while money or credit stands on the invoice — a payment, applied credit, a refund, a bad debt written off or another credit note in force — and the answer names what to reverse first; invoice.get’s voidBlockedReason says so in advance. id is required. dryRun true checks it without cancelling anything or taking a number. Returns { dryRun, record: { id, status, creditNote: { id, number, face } } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
invoice.void
Change a campaign — the campaign page’s Edit form. id is required. Only the fields sent change; every field left out keeps its current value (campaign.get shows them), and "" clears a field (Name cannot be cleared). Status is Planning, Active, Inactive, Completed, Aborted or blank; StartDate and EndDate are yyyy-MM-dd or blank, the start not after the end; Budget is an exact decimal string, in no stated currency, or blank. OwnerID hands the campaign to another user (user.pick), who must be a user of this company; this user may then no longer see it if their role reaches only their own campaigns. Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
campaign.update
Change a contact. id is required. Only the fields sent change; every field left out keeps its current value, and "" clears a field (Name cannot be cleared). AccountID, when sent, moves the contact to that account, which must be one this user may see and not a personal account — and takes the contact’s quotations and activities along; when the person changed employer use contact.change_company instead. Salutation is one of Mr., Ms., Mrs., Dr. or Mdm., or blank. The owner is not changed here: that is contact.change_owner. A personal account’s own contact is changed with its account in easySales, and is refused here. Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
contact.update
Hand a contact to another user. Only that contact moves — its account and documents keep their owners — and the previous owner may lose access to it; only another change of owner moves it back. With transferOpenActivities true (default false), the open tasks assigned to the previous owner and the future events they organise, on threads linked to the contact, move too (the author never changes). id is the contact ID; toUserId is the new owner’s user ID, and must be an active user whose role can view contacts. Only the contact’s owner, a manager above the owner, or a role allowed to transfer records may do this. A personal account’s own contact moves only with its account (account.change_owner). Returns { dryRun, record: { batchId, restricted, counts } }: counts is the number of each kind moved (account, contact, opportunity, quotation, invoice, creditNote, task, event), leaving out members-only items this user cannot see; restricted is how many open tasks and events stayed because the new owner is not in their members-only space - ask that space’s owner to add them, then change the owner again. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
contact.change_owner
Change a draft or issued delivery order’s header and lines. id is required. Every field left out stays as it is (read the order first with deliveryOrder.get). lines, when sent, is the whole new line set — a line with its id is kept and its quantity re-checked, a line without one is new, a line left out is removed and its quantity goes back to the source; leave lines out to keep the lines as they are. A delivered order keeps its lines and accepts only DriverName, VehicleNo, Remark and ReceivedByName; a cancelled one accepts nothing. contactId may change on a standalone draft only. DeliveryDate null clears the planned day. A quantity above what the source line has left is refused. Returns { dryRun, record: { id, name } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
deliveryOrder.update
Hand a delivery order to another user — the Change Owner action on the delivery order page. Only that order moves, in whatever state it is (draft, issued, delivered or cancelled); its account, contact, invoice or quotation and its signed copies stay where they are, and the previous owner may lose access to it; only another change of owner moves it back. id is the order; toUserId is the new owner’s user ID (deliveryOrder.get’s OwnerID and account.get’s OwnerID are user IDs in use), and must be an active user whose role can view delivery orders. Only the order’s owner, a manager above them, or a role allowed to transfer records may do this. Returns { dryRun, record: { batchId, restricted, counts: { account, contact, opportunity, quotation, invoice, creditNote, purchaseOrder, deliveryOrder, task, event } } }, the number of each moved. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
deliveryOrder.change_owner
Change a draft credit note; an issued or cancelled one is refused. id is required. Every header field left out is saved blank, so send the whole credit note as it should read afterwards — creditNote.get gives the current values. SalesID may be left out; a different one is refused. items, when sent, replaces every line, with the line rules of creditNote.create; leave items out to keep the lines. TaxRate is a fraction — 0.09 for 9%, at most 1 — and must be the invoice’s. A line may carry Discount, and the document Discount too: { type: "percent", value: "10" } (above 0, at most 100, two decimals) or { type: "amount", value: "25.00" } (an amount off the whole line or the whole subtotal, in the document currency, an exact decimal string). Both come off before tax; a line’s is at most that line and the document’s at most the lines after theirs; the server works out every discounted figure. A line sent without Discount has none; null removes the document Discount and leaving it out keeps the stored one. Returns { dryRun, record: { id, name, status, invoiceId } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
creditNote.update
Change a lead. id is required. Only the fields sent change; every field left out keeps its current value, and "" clears a field (Name cannot be cleared). Status is New, Contacted, Qualified or Disqualified; Disqualified needs DisqualifyReason, a code of option.sets with kinds ["LeadDisqualifyReason"], and any other status clears it. Source is a code of option.sets with kinds ["LeadSource"], or blank. CampaignID (campaign.list) and LeadPoolID (leadPool.list) take an id, or null to clear it. A value lead.get shows masked is one this user may not change: leave it out. A converted lead cannot be changed. The owner is changed with lead.assign. Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
lead.update
Change a payment recorded on a purchase order. id is the payment (purchaseOrder.bills lists the order’s payments). Every field is restated: PaymentDate (yyyy-MM-dd, not later than today) and Amount (an exact decimal string above zero in the order’s currency) are required, and Method, Reference, Remark and PurchaseBillID left out are saved blank — purchaseOrder.bills gives the current values. Method is one of the codes of purchaseOrder.payment_methods; PurchaseBillID, when it changes, must be a live supplier invoice of the same order. The order must be issued or closed, and a voided payment cannot be changed. The order’s paid state follows at once, and warnings reports a payment above the invoices or the order’s total. Returns { dryRun, record: { id, purchaseOrderId, replayed, payment }, warnings }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.update_payment
Change a personal account. Only the fields sent change — inside contact too — and "" clears one (Name cannot be cleared). A business account is refused (account.update), and the owner is not changed here (account.change_owner). Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
account.update_personal
Change a product. Only the fields sent change; "" clears a text field or a price, and null clears CategoryID, ManufacturerID or SalesTaxCode (a tax.menu key, document product). A new name that another active product already has is refused. Returns { dryRun, record: { id, ItemType, SalesTaxCode } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
product.update
Change a draft or issued purchase order; a cancelled one is refused, and on a closed one only OpportunityID may change (reopen it with purchaseOrder.reopen to edit). id is required. Every header field left out is saved blank or at its default — a TaxRate left out is saved as 0 — so send the whole order as it should read afterwards: purchaseOrder.get gives the current values. items, when sent, replaces every line, with the line rules of purchaseOrder.create; leave items out to keep the lines and totals as they are, and send [] only to remove every line. On an issued order the supplier account and contact cannot change (cancel it and raise a new one), and once a supplier invoice is recorded its lines, currency, tax rate and exchange rate are locked, and its currency once a payment is recorded — the answer says which. An order changed after it was marked as sent shows as amended after sent until it is marked again. TaxRate is a fraction — 0.09 for 9%, at most 1. exchangeRateOverride left out keeps the order’s rate, null returns it to the company’s own rate, and a string is a typed rate above zero. Amounts are exact decimal strings. The owner is not changed here: use purchaseOrder.change_owner. Returns { dryRun, record: { id, name } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.update
Hand a purchase order to another user — the Change Owner action on the purchase order page. Only that order moves; its supplier account, contact, opportunity, supplier invoices and payments stay where they are, and the previous owner may lose access to it; only another change of owner moves it back. id is the order; toUserId is the new owner’s user ID (purchaseOrder.get’s OwnerID and account.get’s OwnerID are user IDs in use), and must be an active user whose role can view purchase orders. Only the order’s owner, a manager above them, or a role allowed to transfer records may do this. Returns { dryRun, record: { batchId, restricted, counts: { account, contact, opportunity, quotation, invoice, creditNote, purchaseOrder, task, event } } }, the number of each moved. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.change_owner
Change a draft or open quotation; a closed one is refused. id is required. Every header field left out is saved blank, so send the whole quotation as it should read afterwards — quotation.get gives the current values. SalesID may be left out; sending a different one is refused, because changing the salesperson is not an edit. items, when sent, replaces every line, with the line rules of quotation.create; leave items out to keep the lines and totals as they are, and send [] only to remove every line. TaxRate is a fraction — 0.09 for 9%, at most 1. Amounts are exact decimal strings. A line may carry Discount, and the document Discount too: { type: "percent", value: "10" } (above 0, at most 100, two decimals) or { type: "amount", value: "25.00" } (an amount off the whole line or the whole subtotal, in the document currency, an exact decimal string). Both come off before tax; a line’s is at most that line and the document’s at most the lines after theirs; the server works out every discounted figure. A line sent without Discount has none; null removes the document Discount and leaving it out keeps the stored one. Returns { dryRun, record: { id, name, refNo, createdProducts } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.update
Hand a quotation to another salesperson — the Change Owner action on the quotation page. Only that quotation moves; its account, contact and invoices keep their owners, and the previous salesperson may lose access to it; only another change of owner moves it back. With transferOpenActivities true (default false), the open tasks assigned to the previous salesperson and the future events they organise, on threads linked to the quotation, move too (the author never changes). id is the quotation ID; toUserId is the new salesperson’s user ID, and must be an active user whose role can view quotations. Only the quotation’s salesperson, a manager above them, or a role allowed to transfer records may do this. Returns { dryRun, record: { batchId, restricted, counts } }: counts is the number of each kind moved (account, contact, opportunity, quotation, invoice, creditNote, task, event), leaving out members-only items this user cannot see; restricted is how many open tasks and events stayed because the new owner is not in their members-only space - ask that space’s owner to add them, then change the owner again. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
quotation.change_owner
Change a recurring invoice that is active or paused. Only the fields sent change: contactId, paymentTerm, recipientUserId, autoDraft (switching it on raises drafts automatically from today, never for periods already past), endDate (yyyy-MM-dd, or null to remove it; only on a recurring invoice with no fixed number of periods, and refused if it would cut off a period that is already invoiced or has a draft), ownerUserId (only for a user who may edit every invoice) and template, which replaces the tax, text and lines whole — its TaxRate is a fraction — 0.09 for 9% — and its items are as in recurringInvoice.create. A new template applies to drafts raised afterwards; invoices and drafts already raised keep their figures. The currency and the schedule’s frequency, interval and start date cannot change: end it and create another. id and version are required; version is the token recurringInvoice.get returned, and a recurring invoice someone else changed since is refused so their change is not lost — read it again and retry. A template line may carry Discount: { type: "percent", value: "10" } (above 0, at most 100, two decimals) or { type: "amount", value: "25.00" } (an amount off the whole line, in the plan currency, an exact decimal string), taken off before tax and at most that line; template.Discount, the same shape, comes off the lines’ total before tax. Every invoice the plan raises carries them. Returns { dryRun, record: { id, status, currencyCode, autoDraft, autoSince, periodAmount, version, periods: [{ id, seq, name, invoiceDate, status }] } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
recurringInvoice.update
Change a space this user owns, or any space when they may manage others’ activities: name, description (null clears it), status (open, or closed: a closed space takes no new threads), visibility (company or members; only a member may change it) and ownerUserId (hand it over to someone who is already a member; the old owner stays a member). Send only what changes. A visibility change moves who can see every thread in the space: dryRun true answers audienceGains (company: everyone who may see activities) and audienceLosses (the company audience a members-only space takes away); the other checks are made when the change is saved. Returns { dryRun, record: { id, changed } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
space.update
Change a supplier invoice recorded on a purchase order. id is the supplier invoice (purchaseOrder.bills). Every field is restated: SupplierInvoiceNo, SupplierInvoiceDate (yyyy-MM-dd), NetAmount and TaxAmount are required, and DueDate and Remark left out are saved blank — purchaseOrder.bills gives the current values. The amounts are exact decimal strings in the order’s currency, as the supplier printed them. exchangeRateOverride left out keeps the invoice’s rate, null takes the company’s current rate, and a string is a typed rate above zero. TaxTreatment left out keeps a treatment someone chose, with its reason; sending one that differs from the company’s tax rule needs TreatmentReason. The order must be issued or closed, and a voided invoice cannot be changed. The cost on the order and its opportunity follows at once, and warnings reports over-billing or a repeated invoice number. Returns { dryRun, record: { id, purchaseOrderId, replayed, bill }, warnings }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
purchaseOrder.update_bill
Change a business account. id is required. Only the fields sent change; every field left out keeps its current value, and "" clears a field (Name cannot be cleared). A change that makes it the same name, or the same registration number (RegNum), as another account in the same country (Billing_Country) is refused as a duplicate. The owner is not changed here: that is account.change_owner. A personal account is refused. Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
account.update
Hand an account to another user. The account moves with every contact under it and, unless options say otherwise, the previous owner’s open opportunities, open quotations, draft invoices and credit notes, and the open tasks assigned to them and future events they organise on the threads about what moves (never who wrote them); the previous owner may lose access to all of them, and only another change of owner moves them back. id is the account ID; toUserId is the new owner’s user ID, and must be an active user whose role can view what moves. Only the account’s owner, a manager above the owner, or a role allowed to transfer records may do this. options, all optional: openOpportunities, openQuotes, openDocuments and openActivities (default true), closedDocuments (default false; true also moves accepted or rejected quotations and issued invoices and credit notes), keepAccountTeam (default true; false removes the account team). Returns { dryRun, record: { batchId, restricted, counts } }: counts is the number of each kind moved (account, contact, opportunity, quotation, invoice, creditNote, task, event), leaving out members-only items this user cannot see; restricted is how many open tasks and events stayed because the new owner is not in their members-only space - ask that space’s owner to add them, then change the owner again. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
account.change_owner
Change an invoice. id is required. Every header field left out is saved blank, so send the whole invoice as it should read afterwards — invoice.get gives the current values. DueDate is one of them: an invoice that has a due date cannot have it blanked, so send it (yyyy-MM-dd) every time; only an old invoice that has none may stay blank. SalesID may be left out; a different one is refused. Once an invoice is issued its lines, amounts, contact, dates, currency and tax are locked and a change to any of them is refused; its reference, terms and remark stay editable. items, when sent, replaces every line: each line names ProductID (product.search), or ProductID 0 with newProduct to create one, Qty with at most two decimals and UnitPrice as an exact decimal string; leave items out to keep the lines as they are. TaxRate is a fraction — 0.09 for 9%, at most 1. exchangeRateOverride, when sent, is a rate above zero, and null returns the invoice to the automatic rate; leave it out to keep the current one. taxCurrencyRateOverride, on a draft, is the SGD rate for an SG tax invoice’s SGD figures when the base currency is not SGD (frozen at issue); null returns it to the table rate; leave it out to keep it. A line may carry Discount, and the document Discount too: { type: "percent", value: "10" } (above 0, at most 100, two decimals) or { type: "amount", value: "25.00" } (an amount off the whole line or the whole subtotal, in the document currency, an exact decimal string). Both come off before tax; a line’s is at most that line and the document’s at most the lines after theirs; the server works out every discounted figure. A line sent without Discount has none; null removes the document Discount and leaving it out keeps the stored one. Returns { dryRun, record: { id, name, refNo, status, paidAmount, outstandingAmount, creditedAmount, exchangeRate, exchangeRateSource, autoExchangeRate, exchangeRateAsOf, createdProducts } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
invoice.update
Hand an invoice to another salesperson — the Change Owner action on the invoice page. Only that invoice moves; its account, contact, quotation, payments and credit notes keep their owners, and the previous salesperson may lose access to it; only another change of owner moves it back. With transferOpenActivities true (default false), the open tasks assigned to the previous salesperson and the future events they organise, on threads linked to the invoice, move too (the author never changes). id is the invoice ID; toUserId is the new salesperson’s user ID, and must be an active user whose role can view invoices. Only the invoice’s salesperson, a manager above them, or a role allowed to transfer records may do this. Returns { dryRun, record: { batchId, restricted, counts } }: counts is the number of each kind moved (account, contact, opportunity, quotation, invoice, creditNote, task, event), leaving out members-only items this user cannot see; restricted is how many open tasks and events stayed because the new owner is not in their members-only space - ask that space’s owner to add them, then change the owner again. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
invoice.change_owner
Change an opportunity’s details. Only the fields sent change; "" clears SalesValue, TotalCost, CurrencyCode or Remark. Moving it to another account clears the primary contact unless PrimaryContactID is sent with it; null clears PrimaryContactID or OpportunityType. The stage is changed with opportunity.set_stage and the owner with opportunity.change_owner. Returns { dryRun, record: { id } }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
opportunity.update
Hand an opportunity to another user. Only that opportunity moves — its account, quotations and invoices keep their owners — and the previous owner may lose access to it. toUserId must be an active user whose role can view opportunities. With transferOpenActivities true, the previous owner’s open tasks and future events on threads linked to the opportunity move too. Returns { dryRun, record: { batchId, restricted, counts } }: counts is how many records of each kind moved, restricted how many tasks and events stayed because the new owner is not in their members-only space. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
opportunity.change_owner
Change the nature of a receipt’s unapplied money: overpayment, prepayment or deposit (a refundable security deposit held for the customer). Changing it into a deposit cannot be changed back: a deposit leaves only by refund, by being used as payment, or by voiding the receipt. Refused once any of that money was allocated on a later day or refunded, where the receipt pays invoices and a deposit is asked for, and where the tax profile does not admit the nature on the receipt’s date (receipt.nature_options tells in advance). id is the receipt ID. Needs access to all invoices. Returns { dryRun, record: { id, number, nature, previous } }; nature equal to previous means nothing changed. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
receipt.set_nature
Records that already match the account, contact or lead about to be created — call it before account.create, account.create_personal, contact.create, lead.create or lead.convert. module is account, contact or lead, one call each; name, regNum, email and phone are compared exactly (phone with a contact’s or a lead’s mobile number too), and excludeId leaves out the record being edited. Each match has the record ID, its name, its owner and team, and which value matched (reason); a match may be a record this user cannot open.
duplicate.check
Check the rows of a spreadsheet the user gave you before importing them as accounts, contacts, products or leads, and stage them for import.commit. Nothing is created. kind is accounts, contacts, products or leads; rows is at most 5,000, each { rowNo (the row number in the user’s file, the header being row 1, unique), values } where values maps field names to text, only fields of that kind: accounts — Name (required), RegNum, TaxRegNum, Industry, PhoneNumber, FaxNumber, Website, Billing_Street, Billing_City, Billing_State, Billing_PostCode, Billing_Country, Remark, CustomerCode, PaymentTerm (a code from option.sets), CurrencyCode, IsCustomer and IsSupplier (yes or no), Owner; contacts — Name and AccountName (required: an existing business account, by name), AccountCountry (when two accounts share the name), Salutation, Title, Email, PhoneNumber, MobileNumber, FaxNumber, Mailing_Street, Mailing_City, Mailing_State, Mailing_PostCode, Mailing_Country, Remark, Owner; products — Name (required), Code, Description, Unit, Category and Manufacturer (existing ones, by name; none is created), ListPrice and Cost (exact decimal strings such as 1234.50), CurrencyCode, ItemType (goods or service), TaxCode (the product’s default sales tax: one of tax.menu’s options for document product, by key, code, label or printed wording; one that is not, or that names several, is an error); leads — Name (required), CompanyName, Salutation, Title, Email, PhoneNumber, MobileNumber, FaxNumber, Website, Industry, Street, City, State, PostCode, Country, Status (New, Contacted, Qualified or Disqualified; blank is New; Converted is an error), Source and DisqualifyReason (an option of option.sets kinds LeadSource and LeadDisqualifyReason, by code or label; Disqualified needs a reason), Remark, Owner. A row of accounts or contacts may also carry customFields, mapping the company’s own fields — by key: CustomField1 to CustomField5, or a cf_ key — to text: yes or no for a yes/no field, an option’s code or name for a choice (several separated by commas), an exact decimal for a number, yyyy-MM-dd for a date; a record link the linked record’s name — an account’s or contract’s name, a quotation’s, invoice’s or credit note’s number, a contact’s e-mail or name, a user’s login, e-mail or name — matched among the records this user may list, never an id; each is judged as the form judges it, and a required one left out or blank is an error. Owner is a user’s login, e-mail or name, blank for this user; a user whose role imports only their own records may name only themselves. fileName is the file’s name, for the history. mode says what a row matching an existing record does: create (the default) — it is a duplicate, nothing is changed; upsert — the record it matches is updated and the other rows are created; update — the record it matches is updated, and a row matching none is skipped. Accounts, contacts and products only; a lead import is create only. A row matches by the duplicate rule (an account by name and country, or registration number and country; a contact by name under its account; a product by name), ignoring letter case, among the company’s records; one matching several is an error. An update writes only the row’s non-blank cells (a blank cell leaves the field as it is), never changes the owner (Owner must be blank or the current owner), and needs this user’s permission to edit that record and each field it changes — a record this user may not edit is reported as a duplicate. Every row is judged as the form would judge it: ready (a row that updates lists the fields it would change in changes, never their values), skipped (nothing to change, or no match in mode update), duplicate (it matches an existing record or an earlier row; never says which record) or error, with the field and the sentence. A lead row that only looks like an existing lead, contact or account is ready, with a warning naming which kind. It needs this user’s permission to import data and to add and edit records of that kind (mode update: to edit them). dryRun true checks the rows without staging them. Returns { dryRun, record (the import as import.history describes it; its id is what import.commit takes, null in a dry run), rows (every row that is not plainly ready) }. Two-step write: dryRun true changes nothing and returns a preview and a confirmationToken. The server applies the change only on a repeat with dryRun false, the same arguments and requestId, and that token, which stands for the user's later explicit confirmation of the preview, not the original request.
import.preview
Which natures (prepayment, deposit) the company’s tax profile admits for money received on receiptDate (yyyy-MM-dd, blank for today), before receipt.create or receipt.set_nature. refusals gives, per nature, the reason it is refused or null; invoiceOnReceipt says where recording it issues a deposit tax invoice, so receipt.create needs depositInvoice; taxOptions lists the taxes that invoice may be charged at (key, taxRateId, rate as a fraction, label, standard) and defaultTax the default’s key. Returns { found, record: { asOf, refusals, invoiceOnReceipt, taxOptions, defaultTax, taxName } }.
receipt.nature_options
easySales ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve easySales'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 easySales alternatives on ChatGPT?
As of 2026-11-02, easySales competes with HubSpot, Attio, Close, Zoho CRM, 33CRM, Agiled, Alaz, Anvil CRM and 64 more in ChatGPT B2B Sales CRM Platforms, ranked by public Discoverability Score.
Where does easySales rank in B2B Sales CRM Platforms on ChatGPT?
As of 2026-11-02, easySales ranks #30 of 73 in ChatGPT B2B Sales CRM Platforms 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.