Salesforce Integration

There’s no DeckExtract package on the AppExchange — the integration is the DeckExtract API plus the Salesforce REST API. Convert the deck once, then store it as a File on the Opportunity and populate custom fields from the analysis.

The flow: deck link → DeckExtract API → PDF → ContentVersion → ContentDocumentLink to the Opportunity, plus custom fields from analysis.

1. Extract the deck

curl -X POST https://deckextract.com/api/v2/extract \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer dk_your_api_key" \
  -d '{ "url": "https://docsend.com/view/abc123", "analyze": true }'

Download the PDF from download.url and base64-encode it for the upload step. The analysis object (Pro-only) gives you the fields to map.

2. Store the file on the Opportunity

Salesforce Files use the ContentVersion → ContentDocument → ContentDocumentLink chain:

# 1) Upload the PDF as a Salesforce File (ContentVersion)
#    VersionData is the base64 of the PDF you downloaded from download.url
curl -X POST \
  https://YOUR_INSTANCE.my.salesforce.com/services/data/v60.0/sobjects/ContentVersion \
  -H "Authorization: Bearer SF_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "Title": "Pitch deck — Acme (seed)",
    "PathOnClient": "acme-deck.pdf",
    "VersionData": "<base64 of the PDF>"
  }'

# 2) Link the resulting ContentDocument to the Opportunity
curl -X POST \
  https://YOUR_INSTANCE.my.salesforce.com/services/data/v60.0/sobjects/ContentDocumentLink \
  -H "Authorization: Bearer SF_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ContentDocumentId": "CONTENT_DOCUMENT_ID",
    "LinkedEntityId": "OPPORTUNITY_ID",
    "ShareType": "V"
  }'

Then map the structured fields onto the Opportunity (create the custom fields once in Setup first):

# Set custom fields on the Opportunity from the analysis object
PATCH /services/data/v60.0/sobjects/Opportunity/OPPORTUNITY_ID
{
  "Round_Stage__c": "{{ analysis.round.stage }}",
  "Raise_Amount__c": {{ analysis.round.amount.value }},
  "ARR__c":          {{ analysis.metrics.arr.value }}
}

Custom field API names (__c) and the API version are specific to your org — adjust to match. For larger PDFs, use the multipart ContentVersion upload rather than inline base64.

The no-code path

Rather than calling the REST API yourself, wire it in an automation tool — each has a Salesforce connector for the write step:

  • n8n — HTTP Request to DeckExtract, then the Salesforce node
  • Zapier or Make — Webhooks/HTTP to DeckExtract, then the Salesforce app

Related

The same pattern applies to HubSpot, Attio, Affinity, and Notion. See the Integrations index and API docs.