Sync Adobe Sign agreement status into Salesforce opportunities
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.
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.
Additional information
What does this prompt do?
- Watches Adobe Acrobat Sign in real time and reacts every time an agreement changes state, not just when it is signed.
- Finds the right Salesforce opportunity by custom Agreement ID field or by the primary contact's email, and moves its stage to Contract Sent, Closed Won, or back to Negotiation.
- Adds a note on the opportunity explaining what happened, with a link to the signed PDF when there is one.
- Sends the opportunity owner a Slack DM so a stalled or declined contract never sits unnoticed.
- Skips cleanly and logs the reason when no matching opportunity can be found.
What do I need to use this?
- An Adobe Acrobat Sign account with permission to receive webhook events for agreement changes
- A Salesforce login with access to the Opportunity object (ideally with a custom Adobe Sign Agreement ID field on Opportunity)
- A Slack workspace where the bot can send direct messages to opportunity owners
- Opportunity owners' email addresses in Salesforce matching their Slack account emails
How can I customize it?
- Rename the pipeline stages the workflow moves opportunities into (Contract Sent, Closed Won, Negotiation) to match your own Salesforce stage names.
- Swap the matching rule: exact match on your Agreement ID custom field, primary contact email, or a different opportunity field entirely.
- Change who gets notified — DM the owner, ping a shared #contracts Slack channel, or copy in the deal team.
Frequently asked questions
Do I have to use a custom Adobe Sign Agreement ID field on the Salesforce opportunity?
What happens if a contract is declined or expires after being sent?
Will the signed PDF end up in Salesforce?
Does this replace Adobe Sign for Salesforce?
What if my sales team uses a Slack channel instead of DMs?
Related templates
Stop letting contracts and CRM drift apart.
Keep every Salesforce opportunity in lockstep with what's actually happening in Adobe Sign — sent, signed, declined, expired.