AI sales coaching tools integrate with Salesforce in one of three ways. They sync calls, scores and transcripts into the customer's org over the REST API, ship a managed package that adds coaching objects and screens inside Salesforce, or send recordings to Salesforce's own Einstein Conversation Insights through the Connect REST API. Most established vendors combine the first two. Gong describes its app as "a managed package app that enables you to access conversation data created by Gong, in Salesforce" in Gong's own install guide.
For a SaaS company that builds a coaching, call recording or conversation intelligence product, the route decides what enterprise buyers see during evaluation. It sets which Salesforce editions you can sell into, how much of each customer's API allocation you consume, and whether you pass a security review before listing. You build the package, pass review, publish the listing, then maintain a connection to every customer org you never get to log into. Appnigma's marketplace apps team builds that native app, with "marketplace listing preparation, and review support," and its done-for-you integrations team builds and maintains API integrations for each customer. If you are a sales leader choosing a coaching tool rather than building one, Salesforce's AI sales coaching page is the better starting point.
Updated October 2026. Checked against the Salesforce Connect REST API, Object Reference, Partner Telephony and ISVforce guides (Winter '27, API version 68.0) and the Einstein Conversation Insights Implementation Guide. This update rewrites the post for teams building a coaching product. It removes the earlier version's unsourced implementation findings, the claim that Agentforce maps fields automatically and an incorrect telephony partner list. It adds the Call Coaching API, what can and can't go in a managed package, and the API cost of one customer's sync.
Three ways a coaching product reaches a customer's org
The routes differ in what you build, what the customer installs and which Salesforce features you depend on. Many vendors start with API sync and add a package once enterprise deals ask for coaching inside the record page.
| Route | What you build | What lands in the customer org | Good fit when |
|---|---|---|---|
| API sync | OAuth app plus a sync service on your side | Tasks, notes, files and Opportunity field updates | Your coaching UI lives in your product and the CRM is the record |
| Managed package | 2GP package with custom objects, permission sets, Apex and Lightning components | Your own coaching objects, record page components, reports | Buyers want scores and transcripts on the Opportunity without leaving Salesforce |
| Einstein Conversation Insights feed | Call Coaching API client plus a media provider record in each org | Voice call records and audio that Salesforce analyzes | The customer already licenses ECI and wants your recordings in its analysis |
Avoma shows the first route in its own docs. It connects by OAuth, and notes, transcripts and insights "appear in the notes and activity feed sections of the related Salesforce records," per Avoma's Salesforce guide. Gong shows the second. Its package "creates objects in Salesforce that enable Gong to export data," including a Gong Conversation object, child objects and a canvas app for highlights and transcripts, per its install guide. The third route is the least known, and it is the only one that puts your recordings inside Salesforce's own coaching analysis.
What to write where, from call activity to coaching scores
Start with the record the rep already looks at. A call belongs on a Task with TaskSubtype set to Call, and the Task object reference notes that this field "can't be updated," so set it on create. The same object carries CallDurationInSeconds, CallType (a restricted picklist of Inbound, Internal and Outbound) and CallDisposition. Our post on whether each call belongs on Task or VoiceCall covers the logging side for dialer and calling products in depth.
Coaching output is different from call logging. A talk ratio, a methodology score or a list of missed questions doesn't fit Task fields, and stuffing it into the description makes it unreportable. Package a custom object for coaching results, one record per call, with a lookup to the Opportunity and an External ID that holds your call ID. The External ID lets you upsert, so a retried sync updates the record instead of creating a duplicate. Roll the two or three numbers a manager filters on (latest score, last coached date) up to fields on the Opportunity.
VoiceCall and VoiceCallRecording look like the obvious home for calls, but they belong to Salesforce's own calling products. The VoiceCall reference says "To edit voice call records, Sales Dialer or Salesforce Voice permissions are required," so a coaching product can't count on writing them in every customer org.
Transcripts and audio go in Salesforce Files as ContentVersion records. Over REST, "the maximum file size for uploads is 2 GB for ContentVersion objects," and a JSON body is "limited to 50 MB of text data or 37.5 MB of base64-encoded data," per Insert or Update Blob Data. Use multipart uploads for audio. For most coaching products, a link back to your own player beats copying audio into the customer's file storage.
How to send your calls into Einstein Conversation Insights
Einstein Conversation Insights (ECI) analyzes calls, but it doesn't capture them. The ECI Implementation Guide says "Conversation Insights doesn't record your calls," and it names an API for providers outside its built-in list. Salesforce's product page now calls the product Conversation Intelligence, while the API reference still uses the ECI name.
The Connect REST API has three Call Coaching resources, all available since API version 49.0. A GET on /callcoaching/{mediaProviderId} returns whether ECI is enabled and, per the status response, a "List of user information for every active Einstein Conversation Insights user." A POST to /voicecalls takes a "List of up to 200 voice calls," per the Voice Calls resource. Each result returns a voiceCallId, and a POST to /voicecalls/{voiceCallId}/audio_upload sends the audio.
POST /services/data/v68.0/connect/voicecalls
{
"calls": [{
"mediaProviderId": "0hnxxxxxxxxxxxx",
"externalId": "your-call-id-48213",
"userEmail": "[email protected]",
"callType": "Outbound",
"fromPhoneNumber": "+15105024190",
"toPhoneNumber": "+16315122409",
"startDateTime": "2026-10-29T15:02:11.000Z",
"endDateTime": "2026-10-29T15:21:40.000Z",
"recordingDuration": 1169,
"recordingFormat": "Mp3",
"consented": true,
"recordId": "003xxxxxxxxxxxx",
"vendorType": "Custom"
}]
}The Connectors Call Input reference lists the rules a payload has to follow. recordingFormat accepts Flac, Mp3 or Wav. recordId takes a "Salesforce account, case, contact, or lead ID." An Opportunity ID isn't on that list. You identify the rep by userId or userEmail, and consented records whether the other party agreed to recording. The audio upload takes a multipart file, or since API 57.0 a recordingURL plus a named credential, per Voice Call Audio Upload.
The step most vendors miss is the media provider record. mediaProviderId is the ID of a CallCoachingMediaProvider record that represents you in that customer's org. The Metadata Coverage Report shows the type supported by the Metadata API but not by first or second generation packages. You can't ship it in your managed package, so create it after install with an API call or an admin step. The metadata type page also says "You must be a Sales Engagement customer to access this metadata type," and isActive defaults to false. Check the customer's licenses before you promise this route in a deal.
Telephony vendors have a separate, packaged route. On Salesforce Voice with Partner Telephony, the vendor's package sets einsteinConversationInsightsSupported on its ConversationVendorInfo record and implements an Apex interface that returns signed recording URLs. Each signed URL must be "valid for at least five minutes," per the Partner Telephony ECI page. That page also lists ECI editions as "Performance and Unlimited Editions, and as an add-on in Enterprise Edition."
Does Agentforce Sales Coach replace a third-party coaching tool?
Not by itself, because the two products don't solve the same problem. Trailhead describes the agent as one that "gives sales reps personalized sales coaching for the opportunity they're working on," and its setup uses an add-on, permission sets and Data Cloud, per Enable and Set Up Sales Coach. Call analysis in Salesforce still needs a recording source, which is ECI's role. A customer that buys Salesforce's coaching can still need your recordings, scoring model or methodology in the same org.
For a vendor, the useful question is where your product sits next to Agentforce, not whether it competes. If your scores and transcripts live in packaged objects, an Agentforce action in your package can read them and answer a rep's question in the same agent conversation. Our post on shipping Agentforce actions in your managed package covers what you can package and what review checks.
What one customer's sync costs in API calls and storage
Every customer org has its own daily allocation. Enterprise Edition gets 100,000 requests per 24 hours plus 1,000 per Salesforce license. Unlimited and Performance get 5,000 per license, per API Request Limits and Allocations. That page counts "most Connect REST APIs" toward the same total, so plan as if the Call Coaching calls count too.
Here is a worked example from those limits, with the call volume as an assumption. Take an Enterprise customer with 100 Salesforce licenses, so 200,000 requests a day, and 100 reps logging 15 recorded calls each. That makes 1,500 calls a day.
| Per call | Written one record at a time | Batched with sObject Collections |
|---|---|---|
| Task create | 1,500 requests | 8 requests |
| Coaching result upsert | 1,500 requests | 8 requests |
| Opportunity score update | 1,500 requests | 8 requests |
| Transcript file upload | 1,500 requests | 1,500 requests |
| Daily total | 6,000 (3% of 200,000) | 1,524 (under 1%) |
Batching works because an sObject Collections request "counts as a single call toward your API limits," and an upsert handles "up to 200 records based on an external ID field." Files don't batch the same way, so they become the main cost once records are batched. The ECI route behaves the same way, eight metadata posts for 1,500 calls plus one audio upload per call. Skipping file copies is the biggest saving.
Storage follows the same logic. Gong's guide says one conversation creates "approximately 25-40 additional child records" and "Each record takes up to 2KB of data." At that rate, which is Gong's figure and not a Salesforce limit, 1,500 calls a day adds up to 120 MB of data storage daily. That is the kind of number a customer's admin will ask about during a security and architecture review, so have yours ready.
Packaging, OAuth and security review for a coaching app
New installs should authenticate through an External Client App. Salesforce says "Creating connected apps is restricted as of Spring '26" and recommends external client apps instead, per Authorization Through External Client Apps or Connected Apps. For a managed package, the packageable components list says to "define the External Client App in their PBO (Partner Business Org) Dev Hub." Our comparison of the External Client App instead of a new Connected App walks through the switch.
The same list covers everything else a coaching package needs. Custom objects, permission sets and Apex classes are all packageable. So are Lightning web components, named credentials with their external credentials, and platform event channels. To listen for Opportunity stage changes without polling, package a custom Change Data Capture channel. Selections made by an AppExchange package in a custom channel "don't count against your org's allocation," per Change Data Capture Allocations. Our guide to listening for Opportunity changes with Change Data Capture compares it with platform events.
A public listing requires review. Salesforce says managed packages and Platform API solutions on AgentExchange "must pass our security review," per How the AgentExchange Security Review Works. Review also matters for smaller customers. Professional Edition has no API access by default, and the Group and Professional Edition guide says that "after your app passes the security review, you're eligible to use some APIs." A coaching product sold to mid-market teams can't skip that step.
Mistakes that show up after customers install
A coaching integration that passes every test in your own org can still fail in a customer's. Each of these follows from a documented Salesforce rule.
- Mapping reps by name. The Call Coaching API identifies reps by Salesforce user ID or email, and the status call returns only active ECI users. Read that list first and skip calls for reps outside it, so they don't fail one by one.
- Linking calls to Opportunities through the ECI API.
recordIdaccepts account, case, contact and lead IDs only. Put the Opportunity link on your own coaching record instead. - Dropping consent. If your product captures recording consent, send it in
consented. Leaving it out leaves the customer's admin with no consent flag on calls your product sent. - Treating 404 like any other error. For signed recording URLs on the Partner Telephony route, "Salesforce will retry the voice call for all error codes except for error code 404," per the Partner Telephony Apex reference. Return 404 only when a recording is really gone.
- One integration user per rep. Run the sync as a dedicated integration user in each customer org, so a rep leaving the company doesn't break the connection. Our guide on keeping two-way sync from overwriting a rep's edits covers the loop and conflict rules that come next.
Frequently Asked Questions
Can you integrate AI sales coaching tools with Salesforce?
Yes. Vendors sync data over the REST API, ship a managed package with coaching objects and record page components, or feed Einstein Conversation Insights through the Connect REST Call Coaching resources.
Can a coaching vendor send its recordings to Einstein Conversation Insights?
Yes, through the /voicecalls and audio_upload Connect REST resources, up to 200 calls per request. The customer's org needs a CallCoachingMediaProvider record for you, which can't ship in a managed package.
Which Salesforce objects should coaching data go to?
Calls go on Task with TaskSubtype set to Call when created. Scores and insights go in a packaged custom object linked to the Opportunity, and transcripts go in Salesforce Files.
Which Salesforce editions include Einstein Conversation Insights?
The Partner Telephony guide says "ECI is available in Performance and Unlimited Editions, and as an add-on in Enterprise Edition." The ECI Implementation Guide adds that Enterprise Edition pays extra above 10 users, so check the customer's contract before you promise it.
Does Gong integrate with Salesforce?
Yes. Gong connects by OAuth and installs a managed package from AppExchange that adds Gong Conversation records, child objects and a canvas app, per Gong's install guide.
Can Appnigma build the Salesforce app for a coaching product?
Yes. Appnigma's marketplace apps service builds the managed package around your product and handles "marketplace listing preparation, and review support," and its done-for-you team builds and maintains API integrations per customer.
About the author
Sunny Chauhan is the co-founder and CEO of Appnigma AI, which builds and maintains customer integrations and native Salesforce and HubSpot apps for B2B SaaS teams. Before Appnigma, he was on Salesforce's AppExchange team, where he worked with more than 300 SaaS partners. He has spent close to a decade on the Salesforce platform, including work at Zennify, and holds Salesforce certifications including Platform Developer II, Platform App Builder, Administrator, Data Cloud Consultant, and AI Associate.
Related Articles
- Salesforce CTI Integration for Calling and Dialer SaaS Products
- Embed Agentforce in ISV Products
- What a Native Salesforce App Runs Inside the Customer Org
- Salesforce Integration Patterns and Best Practices
- Connected App vs External Client App
Sources
- Salesforce Developers, Connect REST API, Call Coaching Resources
- Salesforce Developers, Connect REST API, Voice Calls
- Salesforce Developers, Connect REST API, Connectors Call Input
- Salesforce Developers, Connect REST API, Voice Call Audio Upload
- Salesforce Developers, Connect REST API, Connectors Call Coaching Status
- Salesforce Developers, Metadata API, CallCoachingMediaProvider
- Salesforce Developers, Metadata Coverage Report
- Salesforce Developers, Partner Telephony, Einstein Conversation Insights
- Salesforce Developers, Partner Telephony, Apex Reference
- Salesforce Developers, Object Reference, Task
- Salesforce Developers, Object Reference, VoiceCall
- Salesforce Developers, REST API, Insert or Update Blob Data
- Salesforce Developers, API Request Limits and Allocations
- Salesforce Developers, REST API, sObject Collections
- Salesforce Developers, REST API, Upsert Records Using sObject Collections
- Salesforce Developers, Authorization Through External Client Apps or Connected Apps
- Salesforce Developers, Components Available in Second-Generation Managed Packages
- Salesforce Developers, Change Data Capture Allocations
- Salesforce Developers, How the AgentExchange Security Review Works
- Salesforce Developers, API Access in Group and Professional Editions
- Salesforce, Einstein Conversation Insights Implementation Guide (PDF)
- Trailhead, Enable and Set Up Sales Coach
- Gong Help, Install Gong for Salesforce



