Salesforce Fax Integration: Send Faxes From Your CRM

Salesforce has a Fax field on every Lead and Contact — but nothing that actually sends one. This guide compares the four real Salesforce fax integration routes with current AppExchange prices, then walks through wiring a fax API to Apex, including the multipart trap that breaks most builds.

Salesforce Fax Integration: Send Faxes From Your CRM

By Sarah Martinez · Published June 8, 2026 · Updated July 15, 2026 · 11 min read

Quick Answer: Salesforce cannot send a fax on its own — the standard Fax field only stores a number. A Salesforce fax integration means connecting an outside fax provider through one of four routes: an AppExchange package, a no-code automation, a fax API called from Apex, or email-to-fax.


Every Salesforce org already looks fax-ready. There is a Fax field on Lead, Contact, and Account, sitting right next to Phone, filled in by half your sales team. Then someone asks the obvious question — can we send the signed order form to that number? — and the answer turns out to be no.

That gap is what "Salesforce fax integration" actually means. The CRM holds the record, the document, and the fax number; something outside the CRM has to put the pages on a phone line. This guide covers the four routes that work, what each one really costs in 2026, and the two technical walls that stop most in-house builds on day one.

The Short Version

If you send a handful of faxes a week, an AppExchange package is the fastest path and you'll pay $50–$100/month for the convenience. If you send faxes as part of an automated workflow — or you're watching per-page cost — wire a fax API to Apex and pay for pages instead of a connector.

Does Salesforce Have a Built-In Fax Feature?

No. Salesforce has never shipped native fax sending, and it isn't a gap that closed quietly in a recent release. "Send a Fax from Salesforce" remains an open request on the Salesforce IdeaExchange, which is a reliable sign the platform team considers it partner territory.

What Salesforce gives you is storage, not transmission:

  • The Fax field on Lead, Contact, and Account — a phone-type field that holds the destination number.
  • Salesforce Files (ContentVersion) — where the PDF you want to send already lives, attached to the record.
  • Flow, Apex, and Named Credentials — the plumbing to hand both of those to somebody else's fax network.

Everything else is a third-party product. That's not a complaint; it's the design. The practical consequence is that choosing a Salesforce fax integration is really choosing a fax provider, and then choosing how much of the connection you want to own.

The Four Salesforce Fax Integration Routes

There are exactly four ways to get a document out of Salesforce and onto a fax number. They differ mostly in who maintains the connection and what you pay per page.

RouteWho builds itTypical costBest for
AppExchange packageThe vendor$50–$100/mo + per-page fees + a provider accountLow volume, no dev team, fax buttons on page layouts
No-code automationYour adminAutomation-tool plan + fax planEvent-driven faxes where a middleman tool already exists
Fax REST API + ApexYour developerFax plan only (~$0.04/page on mFax Business)Volume, custom workflows, tight cost control
Email-to-faxNobody, reallyCheapest, but no delivery data in SalesforceOccasional one-off sends from an email alert

1. Install an AppExchange fax package

This is the route most orgs take first, and it's the one with published prices. Two listings dominate:

PackagePublisherListed priceEditions
eFax ConnectorConsensus Cloud Solutions$100/month per tierSales Cloud, Health Cloud
Concord Cloud Fax (formerly Opero Fax)Concord Technologies$50/mo first fax number, $15/mo per extra line, ~$0.15/pageSales Cloud, Health Cloud, Government Cloud

Both prices sit on top of an account with the fax provider itself. That's the detail vendor pages tend to bury: the AppExchange listing is the connector, not the faxing.

What you get for it is real, though. A managed package drops a "Send Fax" quick action onto page layouts, logs sent and received faxes back onto the Contact or Case, and survives Salesforce release upgrades without anyone on your team thinking about it. For a clinic sending twenty referrals a week, that is a fair trade.

Where it stops being a fair trade is volume. At $0.15 per page plus a $50 line fee, a thousand pages a month costs roughly $200 before anyone opens Setup.

Check the Fine Print on 'Per Tier'

AppExchange pricing units are inconsistent — "per tier," "per user," and "per org" all appear on fax listings. Confirm with the publisher whether the fee scales with seats before you budget it, because a $100/month connector for a 30-person sales team is a very different number depending on the answer.

2. Automate it without code

Some providers skip the AppExchange entirely and bridge to Salesforce through a general automation tool. Fax.Plus is the clearest example: its CRM page lists native Salesforce support as coming soon, and its own help center documents the integration as a Zapier recipe — Fax.Plus as trigger, Salesforce as action — available on the Enterprise plan.

That pattern works well for one specific job: reacting to an inbound fax. A fax arrives, the automation creates an Attachment on the matching record, done. No Apex, no deployment.

It works badly in the other direction. Sending means pushing a binary PDF through a middleman, and most no-code connectors either can't do it or require the file to be publicly reachable at a URL first — which is exactly what you don't want for a signed contract or a patient record.

Salesforce's own no-code option has the same ceiling. Flow's HTTP Callout action lets an admin call a REST API with no code at all, and it's genuinely useful — but you configure it by pasting a sample JSON response, and it offers no mechanism for attaching a file to the request body. Flow can start a fax and read its status. Flow cannot carry the document.

3. Call a fax API from Apex

This is the route with the best economics and the most control, and it's what the rest of this guide walks through. You keep the document inside Salesforce until the moment of send, you pay only for pages, and the workflow can be anything Apex can express — fax on approval, fax on stage change, fax a generated PDF from a Visualforce page.

The trade is that you own the code. Budget a day for a first working version and a few hours a year for maintenance.

Per-page cost is where this route pays for itself. The mFax API is included on every mFax Business plan, which is usage-based at $3 per seat plus $4 per 100 pages — about $0.04 a page, roughly a quarter of what a connector-plus-provider stack charges. Plans start from about $9/mo billed annually, and a signed BAA comes with them.

4. Fall back to email-to-fax

Every fax provider accepts documents at an address like 15551234567@fax.provider.com. Salesforce sends email natively, so an Email Alert on a Flow is technically a fax integration.

Use it for genuinely occasional sends. Its weakness is that the fax leaves the building through your email server, so Salesforce learns nothing about whether it arrived — no status, no receipt, no record on the Case. Our email-to-fax API guide covers when that trade is worth making.


How to Build a Salesforce Fax Integration With a REST API

Here's the working path, using the mFax API as the concrete example. The shape is the same for any provider that accepts a multipart upload.

1

Create a server-side API key

Generate a business API key in the mFax dashboard. It's a zk_live_… Bearer credential and it is server-side only — it must never reach a Lightning Web Component, because anything in the browser is readable by the user.

2

Store the key in a Named Credential — not a Custom Setting

Create an External Credential with the Custom authentication protocol, add a Principal holding the key as an authentication parameter, then add a custom header on it: Authorization = 'Bearer ' + {!$Credential.mFax.apiKey}. Turn off Generate Authorization Header on the Named Credential so Salesforce doesn't overwrite yours. Point the Named Credential at https://developers.mfax.to. Apex then calls callout:mFax/v1/faxes and never sees the secret.

3

Pull the PDF out of Salesforce Files

The document is a ContentVersion linked to your record through ContentDocumentLink. Query VersionData and you get the file as a Blob, ready to send. Attachments on older orgs work the same way through the Attachment object.

4

POST it as multipart/form-data

The mFax send endpoint takes exactly two fields — to in E.164 format and file — and answers 202 with a fax uuid and a status of queued. This is the step with a trap in it; see the next section.

5

Catch the outcome with a webhook

Faxing is asynchronous. Transmission takes 30–90 seconds, so the send response tells you the fax was accepted, not delivered. Configure a webhook in the dashboard and mFax posts fax.delivered or fax.failed — with a failure_reason such as user_busy — to a URL you expose from an Apex @RestResource on a Salesforce Site. Verify the X-Zelda-Signature header before you trust the payload.

The Apex callout itself is unremarkable:

public with sharing class MFaxSender {

    @future(callout=true)
    public static void sendFax(Id contentVersionId, String toNumber) {
        ContentVersion cv = [
            SELECT PathOnClient, VersionData
            FROM ContentVersion
            WHERE Id = :contentVersionId
            LIMIT 1
        ];

        String boundary = '----mfax' + String.valueOf(Crypto.getRandomLong());

        HttpRequest req = new HttpRequest();
        req.setEndpoint('callout:mFax/v1/faxes');
        req.setMethod('POST');
        req.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
        req.setTimeout(120000);
        req.setBodyAsBlob(
            MultipartBuilder.build(boundary, toNumber, cv.PathOnClient, cv.VersionData)
        );

        HttpResponse res = new Http().send(req);
        // 202 -> {"uuid":"...","status":"queued","to":"+15417543010"}
        if (res.getStatusCode() != 202) {
            System.debug(LoggingLevel.ERROR, res.getStatusCode() + ' ' + res.getBody());
        }
    }
}

Note the @future(callout=true). Apex refuses to make a callout after a DML operation in the same transaction — the "uncommitted work pending" error — so a fax triggered from a record update has to run asynchronously, in a @future method or a Queueable. This catches almost everyone once.

MultipartBuilder is the part that isn't unremarkable.

The Two Walls Most Salesforce Fax Builds Hit

Apex has no native multipart/form-data support

HttpRequest will happily send JSON. It has no built-in way to compose a multipart body with a binary file in it, and that has been a standing request on the IdeaExchange for years. You have to build the body yourself, byte by byte.

The naive approach — concatenate the boundary text, the headers, and EncodingUtil.base64Encode(fileBlob), then decode the whole thing back to a Blob — produces a corrupted file. The reason is Base64 padding: when a segment's length isn't a multiple of three bytes, its encoding ends in one or two = characters, and Apex's decoder silently ignores padding that appears mid-string. Every character after that point shifts, and the PDF arrives as garbage.

The community fix, worked out by Enrico Murru and refined by Grant Wickman, is to pad the segments deliberately: adjust each part so its byte length lands on a multiple of three, borrowing the \r and \n characters that legitimately separate the file bytes from the closing boundary. Do that and the concatenated Base64 decodes cleanly.

Budget for This, or Route Around It

A working Apex multipart builder is 60–100 lines of fiddly encoding logic, and the failure mode is a fax that transmits as blank pages rather than an exception you can read in a debug log. If nobody on the team wants to own that, put a thin middleware service between Salesforce and the fax API — a small function that accepts the record ID and the file, then does the ordinary multipart/form-data POST in a language that has a library for it. Our send-fax API guide has that request in cURL, Node.js, Python, and PHP.

Flow HTTP Callout can't carry a file

The second wall usually appears in a planning meeting: can't an admin just do this in Flow?

Partly. Flow's HTTP Callout is a real integration tool — it generates a reusable action from a sample JSON response and needs no code. But that JSON-shaped design is the limit. There is no file input, no binary body, no way to say "attach this ContentVersion." A flow can decide that a fax should go, pass the record and file IDs to an invocable Apex method, and later read the delivery status back as JSON. The document itself always travels through code.

Plan the split that way from the start and the build stays clean: Flow owns the business logic, one Apex class owns the transmission.

Salesforce Limits That Cap Fax Volume

Salesforce's callout governor limits shape what a fax integration can do more than any fax provider's limits do.

LimitSynchronousAsynchronous
Callouts per transaction100100
Max callout request size6 MB12 MB
Apex heap size6 MB12 MB
Max callout timeout120 seconds120 seconds

Three consequences worth designing around:

  1. The request size limit is a page-count limit. A Base64-inflated multipart body is roughly a third larger than the raw PDF, so a 6 MB synchronous ceiling is closer to 4 MB of actual document. Run sends asynchronously to double the headroom, and compress the PDF before it goes near the callout.
  2. Bulk faxing needs batching. A hundred callouts per transaction sounds generous until a trigger fires on a 200-record import. Queue the work — a Queueable chain or Batch Apex — rather than looping callouts in a single transaction.
  3. A 120-second timeout is not a delivery window. The send request returns in under a second; the fax itself takes 30–90 seconds on the provider's side. Never hold a transaction open waiting for delivery, and never poll in a loop. Use the webhook.

mFax rate-limits with a 429 and a Retry-After header, so a Queueable that respects it will drain a backlog cleanly instead of hammering the endpoint. For a wider view of automating fax at this level, see our guide to fax automation.

HIPAA, Health Cloud, and the Second BAA

Healthcare orgs are the largest group searching for Salesforce fax integration, because referrals, prior authorizations, and lab results still move by fax. The compliance detail that trips people up is simple:

Your Salesforce agreement does not cover your fax vendor. The moment a PDF leaves the org and enters a fax network, the provider is handling PHI and becomes a business associate in its own right. You need a second signed BAA, from them.

Before PHI moves, confirm:

  • A signed BAA from the fax provider, not a marketing page that says "HIPAA-compliant."
  • Encryption in transit and at rest for the document while the provider holds it.
  • An audit trail you can produce — who sent what, to which number, and when it was confirmed.
  • A number-verification step in the workflow, because misdialed faxes are a genuine, reportable breach category.

The AppExchange packages built for this market clear that bar — Concord lists Health Cloud and Government Cloud support, and the eFax Connector targets healthcare and financial services. So does mFax Business, which includes a signed BAA, AES-256 at rest, and TLS 1.2+ in transit on every plan alongside the API. Our HIPAA-compliant fax API guide covers the full checklist, and BAA for fax services explains what the document itself has to say.

Which Route Should You Choose?

Match the route to your volume and your appetite for maintenance, not to the feature list:

Buy the connector if…

  • • You send under ~300 pages a month
  • • You have no Apex developer
  • • Users need a fax button on a page layout tomorrow
  • • Inbound faxes must land on records automatically

Build on the API if…

  • • Volume makes $0.15/page hurt
  • • Faxing is a step in an automated workflow
  • • You already build Salesforce integrations
  • • You want the same API serving non-Salesforce systems

One more option deserves naming, because it quietly fits a lot of orgs: don't integrate at all. If faxing is occasional and nobody needs it logged against a Contact, a team fax app running next to Salesforce beats a connector subscription and a maintenance burden. mFax runs on the web, iPhone, Android, Mac, and Windows under one account with shared history — copy the number out of the Fax field, drop the PDF in, send. Zero build, zero governor limits.

The same reasoning applies to other business tools that lack native fax; we covered the equivalent question for Microsoft Teams.

Start Building

Salesforce fax integration has no native shortcut, but it has a clear cheapest path: keep the connector out of the stack and call a fax API directly, so you're paying for pages instead of plumbing.

Create an API key in the mFax dashboard and read the reference at developers.mfax.to — send is one POST /v1/faxes with to and file. API access is included on every mFax Business plan, along with a signed BAA and usage-based pricing you can size with the live calculator.

Want to see what the request looks like before you write a line of Apex? Our send-fax API guide has it as a single cURL command, and fax API pricing compares per-page and subscription models across providers.

Frequently Asked Questions

Can you send a fax from Salesforce?
Yes, but not with stock Salesforce. The platform stores fax numbers in the standard `Fax` field on Lead, Contact, and Account and stops there. To actually transmit a page you add an AppExchange fax package, a no-code automation, or a [fax API](/blog/fax-api/) called from Apex.
Does Salesforce have a built-in fax feature?
No. Salesforce has never shipped native fax sending — "Send a Fax from Salesforce" has been an open IdeaExchange request for years. Every working Salesforce fax integration routes the document to an outside fax provider.
How much does Salesforce fax integration cost?
AppExchange packages are the expensive route: the eFax Connector lists at $100/month per tier, and Concord Cloud Fax charges $50/month for the first fax number, $15/month per extra line, and about $0.15 per page — on top of a separate provider account. Building against a fax API instead costs whatever the API costs; mFax Business works out to about $0.04 per page with API access included.
Can a Salesforce Flow send a fax without code?
Not the document itself. Flow's HTTP Callout action is built around JSON — you configure it by pasting a sample JSON response — and it has no way to attach a binary PDF to the request. Flow can trigger a fax and read its status, but an Apex class or an outside automation tool has to carry the file.
Is Salesforce fax integration HIPAA compliant?
Only if the fax vendor signs its own BAA. Your Salesforce agreement covers Salesforce; the moment a PDF leaves your org for a fax network, the provider becomes a business associate too. See our [HIPAA fax API guide](/blog/hipaa-fax-api/) for what to check before you send PHI.
Home Business Fax API Document Converter Support Company Blog
Terms of Service Privacy Policy