Salesforce
When an opportunity reaches your contract stage, its contact roles are sent the agreement, and a task on it says when they sign. Zapier or Make until it is live.
Planned. Built, and not yet connectable. The native connection is written against Salesforce's documentation and tested against stand-ins: a button on the opportunity sends what you choose to its contact roles, or a stage you name does, one that is lost or deleted voids what nobody signed, and a completed task goes on the opportunity when they have signed. It has not run against a live org, and it cannot be connected until SignSealer's Salesforce app exists, as a package your admin installs. It needs an edition with API access: Enterprise, Unlimited, Performance or Developer, or Professional with the API added. Until then Zapier and Make carry both directions, and the guide has the exact steps.
Today, step by step
- In Zapier: trigger on Salesforce's Updated Field on Record for Opportunity, watching Stage, then SignSealer's Send a Form to Sign. In Make: Watch Records, then Send a Form to Sign.
- A second Zap or scenario: SignSealer's Document Completed, then a note or task created on the opportunity.
- Use the opportunity ID as your reference so each document leads back to its opportunity.
The signature coming back
A second Zap or scenario: SignSealer's Document Completed or Document Declined (or a SignSealer webhook) → a note or a task created on the opportunity, found by the opportunity ID you sent as the reference: Create Record in Zapier, Create a Record in Make. A declined document carries the signer's reason.
What the native connection does
It is built, and waits on SignSealer's Salesforce app: an External Client
App in a managed package, which your admin installs once, because Salesforce lets nobody in an org connect an app like
ours until it is installed there. Connecting will then be logging in to your org and allowing SignSealer, as somebody
who can see every opportunity that should send. Your admin then adds SignSealer's button to the opportunity: in
Setup, Object Manager, Opportunity, Buttons, Links, and Actions, a new Detail Page Button that opens in a new window
with the address the connection's page gives, added to the page layout. Pressing it opens SignSealer, signed in as you,
to choose what goes, any of your templates and forms, or what your rules say it needs, and whether to the primary contact or every contact role. An
opportunity also sends at a stage you name (by the name Salesforce shows; none until you name one), to its contact
roles, the primary contact first and up to twenty of them; an opportunity with no contact
roles sends nothing. One moved to Closed Lost, or deleted, voids what nobody has signed, unless you switch that off; a
won opportunity is left alone. When every document is signed, or one is declined, a completed task goes in the
opportunity's activity listing each document, who signed it, when, and a link to it, and when everything is signed each
signed PDF is added to the opportunity's files (a switch on the connection turns that off). It never changes an
opportunity's amount or close date. On the connection's page you can name a stage a signed opportunity moves to, such as
Closed Won (not one that sends or cancels), and a field by its API name, such as Signing_Status__c, a
text field your admin adds, that says Signed or Declined; both are off until you fill them in. A
validation rule that refuses either, such as one that wants a close date first, is said in the connection's activity,
and the task still goes. Disconnecting revokes SignSealer's access to the org.
Telling SignSealer the moment a stage changes
Salesforce has no webhook an app can register for you, so your admin adds two things, once, in Setup. The address they need is shown when you connect, and again whenever you give the connection a new address.
- An Outbound Message. In Setup, search for Outbound Messages and choose New. Object: Opportunity.
Name it SignSealer. Endpoint URL: the connection's address. Send as a user who can see the opportunities that send.
Fields to send:
IdandStageName. Save. - A record-triggered Flow. In Setup, open Flows and choose New Flow, then Record-Triggered Flow. Object: Opportunity. Trigger it when a record is created or updated, with no condition (SignSealer reads each opportunity's stage itself and leaves alone any that does not send), and optimize it for actions and related records. Add an action, choose the SignSealer Outbound Message, then save and activate the Flow.
Each message is taken only at the connection's own address, and only when it names your org; every opportunity it names is read back from Salesforce's API rather than trusting the message. Until the Flow is active, and for anything it misses, SignSealer looks every hour for opportunities changed since it last looked whose stage sends or cancels, so an agreement goes within the hour rather than within the minute. A new address for the connection means changing the Outbound Message's endpoint to it.
Which orgs
Any edition with API access: Enterprise, Unlimited, Performance and Developer include it, and Professional has it as an add-on. Professional has no outbound messages, so there SignSealer's hourly look is what finds a changed opportunity. Essentials and Professional without the add-on cannot be connected.
Once it can be connected, connecting it comes with the membership, like every system SignSealer connects to; Zapier, Make and the API work on Free today.
With the API directly
PUT https://api.signsealer.com/v1/subjects
Authorization: Bearer mk_live_…
{ "provider": "salesforce", "external_id": "…", "starts_on": "2026-10-10",
"participants": [{ "ref": "…", "full_name": "…", "email": "…", "is_primary": true }] }
POST https://api.signsealer.com/v1/packets/{packet_id}/start
Keyed on the Salesforce ID, so sending the same record twice is one reservation, and starting again sends nothing already sent. See Reservations and packets and Webhooks for the signature coming back.
Texting and consent
Signing links go by email. They also go by text only when SignSealer holds that guest's consent to
receive texts from your business, recorded with the exact words they agreed to — at your counter, on your
booking form through POST /v1/sms-consents, or on SignSealer's own opt-in. That check runs when
the link is queued (app.may_text), not in the integration.
No booking system can give SignSealer that consent, so none is treated as if it could. Each adapter
records what the provider's data said — VERIFIED_CONSENT, NO_CONSENT or
INSUFFICIENT_EVIDENCE — and only NO_CONSENT changes anything: the guest's number is
not written at all. Every provider built so far can only ever say INSUFFICIENT_EVIDENCE. The
connection's activity shows, for each guest with a number, whether the link was also texted and why not.
How to record consent you took yourself.
Ready to build? An API key takes a minute in the portal, and the free plan covers the first 10 agreements a month.
Get an API key