- Published on
Salesforce direct mail workflows from campaign member to mailed piece
- Authors
- Name
- Direct Mail Growth
A Salesforce direct mail integration should turn an eligible Campaign Member into one traceable mail request, then write production and response events back to Salesforce. The CRM should decide who qualifies, who must be suppressed, which approved template applies, and which record owns the result. The mail platform should validate the address, produce the piece, and return its status.
Don't trigger print straight from a stage change. Put a durable send record between the business event and the vendor call. That record gives operations somewhere to approve, cancel, retry, and reconcile each piece without changing the meaning of a Campaign Member status.
What a Salesforce direct mail integration should own
Salesforce already has useful campaign plumbing. A Campaign groups the program. A Campaign Member joins that campaign to a Lead or Contact, or to an Account when Accounts as Campaign Members is enabled. Salesforce's current Campaign Member field reference includes address fields, Status, Responded, and First Responded Date.
Those standard fields aren't a complete fulfillment ledger. Create a custom Mail Send object, or use the vendor's equivalent, when you need one row per intended piece.
| Record | Keep here | Don't force into it |
|---|---|---|
| Campaign | Program name, channel, planned dates, audience rule version, vendor campaign or template reference | Per-piece failures and carrier events |
| Campaign Member | Membership, selection status, holdout assignment, approval state, suppression reason | A changing vendor event history |
| Lead or Contact | Recipient identity, source address, account relationship, owner, global do-not-mail field | Campaign-specific send state |
| Account | Account tier, account-wide exclusions, experiment group when several contacts share a company | The final recipient address without a named person |
| Mail Send | Recipient snapshot, template version, idempotency key, vendor send ID, timestamps, current production state, failure detail | General sales qualification |
If somebody edits a Contact address after submission, you still need to know what the vendor received. Store a recipient snapshot and the source record ID.
Connector architecture comes after the data model. Lob documents Salesforce connections through its dashboard and External Services, while Sendoso documents an OAuth sync. Sincerely supports Salesforce-triggered sends for postcards, first-class letters, handwritten notes, and gifts, with per-recipient CRM personalization, address verification and correction, a unique QR code and short URL on every piece, hosted landing pages, and account-level holdout measurement.
Ask the platform-selection questions with your Salesforce objects open. A connector that reads Contacts but can't write a vendor send ID to your chosen record will create a spreadsheet sooner or later.
Select campaign members before you call the vendor
Build the audience in Salesforce first. A report, list view, Flow, or marketing automation rule can add qualified Leads and Contacts to a Campaign. Give the campaign member statuses such as Candidate, Approved, Submitted, Mailed, Responded, Suppressed, and Failed.
Status names are workflow labels, not proof that every rule passed. Put the actual decisions in fields. I usually want Eligibility Result, Suppression Reason, Approval State, Holdout Group, Address Check Result, and Mail Send lookup visible on the Campaign Member page.
Define the unit of selection. Several Contacts at one Account may qualify, but an account-level package needs one named recipient. Otherwise each duplicate can look correct in isolation.
Don't use Email Opt Out as a postal consent field. It describes email. Create a direct-mail suppression field with a source, date, and scope, then apply any broader privacy or account exclusion your company maintains. The workflow must also check deceased contacts, prior hard returns, closed offices, country coverage, recent sends, and open account issues that make the message inappropriate.
Check the postal address, approval, and suppression in that order
Copy the proposed address into the Mail Send record, then pass it through the platform's address check. Keep the submitted value, corrected value, match result, and reason for rejection. USPS Publication 28 distinguishes a complete address from a standardized one, so a tidy address isn't automatically ready for production. The practical differences are covered in our address verification guide.
Postal validity doesn't prove that the named buyer works there. For a gift or executive note, confirm the company, person, suite, and receiving policy before approval.
Approval should freeze the recipient line, address, sender, template version, personalized copy, QR destination, and requested send date. If a rep can edit a note, set a character limit and show the rendered proof. Blank merge fields should block approval or use an approved fallback.
Then check suppression again at release. A Contact can opt out, an Opportunity can close, or an account owner can pause outreach while the piece waits in an approval queue. The last check belongs immediately before the vendor accepts the job.
A concrete workflow from member to mail
Consider this fictional win-back campaign. Priya Shah at Northstar Systems was attached to a closed-lost Opportunity, the recorded reason was timing, and the Account now meets the team's re-entry rule.
The selection Flow adds Priya to the Autumn enterprise win-back Campaign as Candidate. It confirms that she is the chosen recipient for the Account and assigns the Account to either Mail or Holdout. Holdout records stay in the campaign, but no Mail Send record goes to production.
For the Mail group, Salesforce creates a Mail Send in Draft. It copies the CRM IDs, postal address, owner, approved personalization, template version, and a deterministic idempotency key. A reviewer sees the rendered letter and changes Approval State to Approved.
An after-commit automation submits the request. Use the vendor's managed action when it fits. For a custom API route, Flow HTTP Callout or Apex can authenticate through a Named Credential. Keep credentials out of fields and Flow variables. More triggered direct mail patterns apply when the initiating event comes from Opportunity, renewal, or product data instead of campaign membership.
The vendor response writes its send ID to the Mail Send and moves the member to Submitted. Later events update production state. The sales task waits for Mailed or a supported delivery event, not API acceptance.
Write back facts without flattening the event history
Keep the latest production state on Mail Send, but retain the underlying events when available. Submitted, in production, mailed, returned, QR visit, and form response mean different things. A small program may keep milestone timestamps on Mail Send.
Map vendor terms before launch. "Processed" might mean the file passed validation, entered a print queue, or left a facility. Don't translate it to Mailed because the dashboard color looks final. Save the raw vendor status beside your normalized status.
Webhooks can arrive twice or out of order. Upsert them using the vendor event ID when one exists, and reject a state change that would move a piece backward without an operator's review. The original idempotency key protects the outbound request. The vendor event ID protects the return path.
Treat attribution as a separate decision
Marking a Campaign Member Responded can support campaign reporting, but decide which events deserve that label. A QR visit may be useful for sales follow-up without qualifying as a business response. A meeting booked or a reply usually carries more weight. Write the rule down.
Salesforce's Customizable Campaign Influence documentation contains an easy-to-miss detail: its models can associate active campaigns with open Opportunities through Campaign Members who are Opportunity Contact Roles, and the association considers every member regardless of member status. Clean Contact Roles and an intentional influence window matter more than a decorative "Mailed" status.
Influence still isn't incrementality. Keep the Mail and Holdout assignment on the Account when several people at one company could receive the piece. Compare the defined business outcome across the eligible groups, and use scans or visits as supporting signals. The direct mail ROI guide explains why raw response totals can't answer whether mail caused the result.
Test the ugly paths in a sandbox
Connect the vendor's test account to a Salesforce sandbox. Test a corrected address, a missing suite, suppression, a duplicate trigger, blank personalization, expired approval, and vendor rejection. Also test as the integration user. Administrator success can hide missing permissions.
Salesforce recommends testing flows in a sandbox. Record-triggered Flow debugging also has a narrower scope than a real transaction, so run end-to-end tests outside the debugger with the other active automation present. Confirm that the holdout path never creates a production request and that a repeated trigger produces no second piece.
Send physical proofs before activation. Check the longest name, the least populated record, the window or label position, the QR destination, and the reply route. Sandbox success proves the records moved. It says nothing about the object that reaches a desk.
Make failures visible and safe to retry
Every action that can fail needs a fault path. Write the error to Mail Send, set a retryable or terminal category, and alert the queue that owns the fix. Don't leave a Campaign Member at Approved after submission failed. That status hides the work.
Retry timeouts and temporary vendor errors with the same idempotency key. Don't retry an invalid address, blocked country, missing template, or suppressed recipient until somebody corrects the cause. If the vendor accepted the request but Salesforce missed the response, query by idempotency key before sending again.
Reconciliation catches what webhooks miss. A scheduled job should compare open Mail Send records with the vendor's current state, flag stale requests, and close gaps without creating new pieces. Cancellation needs the same care. Record the request, the vendor's answer, and whether the piece had already crossed the production cutoff.
Frequently asked questions
How do you integrate Salesforce with direct mail?
Use a vendor connector, a managed package, middleware, or a custom API call from Flow or Apex. The transport is the easy part. First define the Campaign Member rules, create a per-piece send record, map address and personalization fields, and decide where vendor IDs and events return. If that write-back is vague, the integration isn't ready.
Can Salesforce Flow send direct mail?
Yes, Flow can start the work through an installed vendor action or an HTTP callout, subject to your Salesforce edition and the vendor's setup. I wouldn't let the first Flow both choose the audience and blindly release print. Create a pending Mail Send, run approval and suppression, then submit it after commit.
Which Salesforce object should store direct mail status?
A custom Mail Send object is usually the cleanest home for per-piece status. Campaign Member still carries audience membership and the broad marketing state. The split may look fussy at first. It pays for itself the first time one Contact receives another piece, a webhook repeats, or operations needs to retry one failed request.
How do you track direct mail responses in Salesforce?
Write recipient-level visits, forms, replies, and booked meetings to the related Mail Send and Campaign Member. Decide which event changes Responded before launch. I don't treat every scan as a response. It's an alert, not a buyer asking to talk.