Sync Adobe Sign agreement status into Salesforce opportunities

By General Input

Every time an Adobe Sign agreement moves stage (sent, signed, cancelled, expired), the matching Salesforce opportunity flips, gets a note, and the owner is pinged in Slack.

Integrations

  • Adobe Acrobat Sign
  • Salesforce
  • Slack Bot

Type

Agentic Task

Categories

  • Sales
  • Operations

Trigger: an Adobe Acrobat Sign webhook that fires on every agreement state transition. Configure the webhook subscription so it delivers events for OUT_FOR_SIGNATURE, SIGNED, COMPLETED, CANCELLED, REJECTED, and EXPIRED. Each webhook payload contains the agreement ID.

When an event fires, use Adobe Sign's Get Agreement operation with the agreement ID from the webhook to pull the full agreement, including its current status, sender email, participant list (with signer emails), sent date, and signed date. Also grab the signer email(s) and the primary signer's email — you'll need that to match against Salesforce.

Then match the agreement to a Salesforce opportunity in this order:

1. Exact match on a custom Adobe_Sign_Agreement_Id__c field on Opportunity. Use Salesforce's Get Many Opportunities operation with a SOQL query like SELECT Id, Name, StageName, OwnerId FROM Opportunity WHERE Adobe_Sign_Agreement_Id__c = '<agreement id>' LIMIT 1. If exactly one hit, use that opportunity.

2. If no hit, fall back to primary signer email. Query Get Many Opportunities with SOQL joining through Contact and OpportunityContactRole, e.g. SELECT Id, Name, StageName, OwnerId FROM Opportunity WHERE Id IN (SELECT OpportunityId FROM OpportunityContactRole WHERE Contact.Email = '<signer email>') AND IsClosed = false ORDER BY LastModifiedDate DESC LIMIT 1. If exactly one open opportunity, use that.

3. If neither approach returns a single opportunity, skip this event. Log the agreement ID, the state, the signer email, and the reason (no match, or multiple ambiguous matches) so the team can reconcile manually. Do not update anything in Salesforce.

Once you have a matched opportunity, branch on the agreement state:

OUT_FOR_SIGNATURE (first-time send): Use Update Opportunity to set StageName to 'Contract Sent' (customer can rename this to whatever their stage is called) and set a custom Contract_Sent_Date__c to the agreement's sent date. Add Note to Opportunity summarizing that the contract has been sent for signature and listing the signer(s). No Slack notification for this state unless the customer asks for one.

SIGNED or COMPLETED: Use Update Opportunity to set StageName to 'Closed Won' and CloseDate to today. Use Adobe Sign's Download Combined Document (Signed PDF) URL (or the signed agreement view URL from Get Agreement) as the link in the note. Add Note to Opportunity with a short summary — agreement name, who signed, signed date — and the link to the signed PDF. Then DM the opportunity owner in Slack: use Look Up User by Email in Slack Bot with the OwnerId's email (fetch the User record from Salesforce to get the email), Open a Conversation to get a DM channel, and Send a Message with a short celebration note, opportunity name, opportunity link, and PDF link.

CANCELLED, REJECTED, or EXPIRED: Use Update Opportunity to move StageName back to 'Negotiation'. Add Note to Opportunity explaining what happened (cancelled by sender, rejected by signer, or expired), the timestamp, and any reason text present on the agreement. Then DM the opportunity owner in Slack via the same Look Up User by Email + Open a Conversation + Send a Message flow, with a message like 'Adobe Sign agreement <name> was <state> — the opportunity is back at Negotiation, worth chasing.' Include the opportunity link.

Idempotency: Adobe Sign can retry webhook deliveries. Before writing anything, check the current StageName on the opportunity — if it already matches the target stage for this event, skip the update but still log that the event was seen. Also skip duplicate notes with the same agreement ID + state combination if one already exists on the opportunity within the last day.

Never invent Salesforce field names. If the customer's Opportunity object doesn't have a custom Adobe_Sign_Agreement_Id__c or Contract_Sent_Date__c field, ask them once during setup whether to create the fields or skip that piece — do not silently drop the data.

Related prompts

Explore more prompts
A brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasonLiveChat coverage board for planning next week's shiftsPhone routing control panel for LiveKit voice agentsLinkedIn Ads budget pacing dashboard for every client accountGive your team Looker numbers without buying more seatsPause marketing emails to escalated customers, then restore them