SignalWire fax: poll-and-retrieve vs. download-every-fax — looking for input

I’ve got the SignalWire service in the fax/SMS/Voice/Email module working for the community version. We can thank Sherwin @juggernautsei for the original contribution however we didn’t finish due to meeting ONC deadline. I’m making this effort because SignalWire built on the Twilio fax I originally had in first versions of the module. I really like this offering and think it will fit nicely for our smaller practices. I plan for upcoming 8.1.0 release and hope this will help many of you to decide to upgrade and please accept sending anonymous stats when asked. That data helped me decide to put effort into this.

Inbound faxes now list live from SignalWire’s Compatibility (LaML) Faxes API on a “check for faxes,” with status, sender, page count, and date.

(Aside for devs: the SignalWire PHP SDK doesn’t Composer-install cleanly into our tree, so rather than drag in its dependency weight I vendored a thin, Guzzle-backed shim covering only the fax surface we actually use — create/list/fetch/delete. Happy to write that up separately if there’s interest.)

Before I take this further, I’d like the community’s read on a design choice, because it affects storage, compliance, and long-term maintenance.

There are two models:

  • Download every inbound fax to the OpenEMR filesystem on arrival. This is essentially what etherFAX forced on us — you download it or you lose it.
  • Poll and retrieve on demand. Keep the fax on SignalWire, poll the list for status/metadata, and only download + store it as a patient document when a user actually files it — then delete the upstream copy. RingCentral and older Twilio allowed this; SignalWire does too.

I’m leaning toward the second — it’s closer to how RingCentral behaves and keeps PHI off our disk until someone commits to keeping it. But it has a genuine tradeoff: you depend on the provider’s retention window, and an unfiled fax could age out before anyone acts on it.

Rough pros and cons by practice size:

Poll & retrieve on demand Download every fax on arrival
Small practice Minimal local storage, little to maintain, no PHI piling up on disk. But relies on provider retention and being online to retrieve. Everything local and offline-capable, simple mental model. But disk grows, more backup/encryption to manage, and junk faxes get stored too.
Enterprise Lower storage cost at scale, provider handles primary retention. But provider retention windows may not satisfy legal-hold/compliance, and you must ensure faxes are filed before they purge. Full custody for strict retention and legal hold, no provider dependency. But real storage/backup/egress cost at scale, plus lifecycle and purge management.

Open questions for the group:

  1. Do you prefer inbound faxes pulled and stored locally on arrival, or kept upstream until a user files them?
  2. If deferred, what retention safety net would you want — e.g., a backstop that auto-files (or at least archives) anything older than N days so nothing ages out unhandled?
  3. For faxes that do get stored, how should we handle on-disk retention and purge?

Separately: once the retrieval model settles, I’m planning a follow-up to restructure this module toward current coding standards — PSR-12, service extraction, a dependency-light HTTP layer, PHPStan-clean, and isolated tests. I’ll open a separate topic for that so this thread stays focused on the retrieval question.

Interested to hear how others are running fax at both ends of the size spectrum. Thanks.

Hi @sjpadgett ,

I use freepbx for phone and fax

There is an option for local storage.
Here is the explanation for each option:
Max Pages: The maximum amount of pages a user is allowed to store locally.
Excess Faxes: How the system should respond when a new fax arrives for a user whose quota is full.

  • Reject: Reject the new fax and disconnect the call

  • Delete Oldest: Delete as many faxes as necessary to accommodate the incoming fax, starting from the oldest.

With either option, a fax larger than the quota will be deleted after it was received.

FYI, pdf files take little space 10kB to few MBs

1 Like

Hi @moussa Thanks much for taking the time. Always nice to hear from you!
The only time you need to worry about file system rentension is when you make a decision on the fax disposal.
You may download to local, view, chart to patient, forward by fax, email or both and send to other users via Messages.
No size limit I’m aware and transport is usually tiff or pdf with any conversions taking place by vendor.

So in the end a fax never lands in OpenEMR until the user decides how to dispose.
My goal is to save money by limiting disk storage in the cloud or AWS.
Thanks for input.

2 Likes

Hi @sjpadgett ,
One feature that would be nice to have is the ability to search the text within PDFs and faxes (via OCR).

We currently don’t have this feature in our fax system, but we built a workaround by installing Paperless-ngx https://demo.paperless-ngx.com/. Every night, all of our inbound and outbound faxes are automatically imported into Paperless-ngx (locally installed). There, the documents are OCR, stored in a database, and are searchable (not perfect but better than manually looking for docs).

We use this feature heavily. Over the years, we have accumulated nearly 14,000 documents, and being able to instantly search them for specific keywords has been a massive help for our workflow. I think having something like this would be great!

1 Like

Hi @moussa,

Thanks, this is helpful input and exactly the kind of feedback I am hoping for.

OCR/searchable fax content is definitely something I can see being useful, especially at the scale you mentioned. Once you get into thousands of inbound/outbound faxes, simple filename/date/status lookup only gets you so far. Being able to search the actual document text would be a big workflow improvement.

The approach you described with Paperless-ngx makes good sense. I’ve looked at similar document workflows before, and I like that it keeps the heavy OCR/indexing work outside the fax transport layer while still making the documents searchable. For OpenEMR, I could see this fitting either as:

  1. a local OCR/indexing option for stored fax documents, or
  2. an integration/export workflow where the fax module reliably hands documents off to another document-management/OCR system.

Some of this also overlaps with features I’ve dealt with around etherFAX workflows, where the service side has concepts around fax retrieval, document metadata, and managing received fax queues. etherFAX has a mode I integrated from design go where using a scoped DID number set to a trained scheme for parsing of recurring data areas in the fax e.g. birthday, names, org, keywords, phrases etc. With SignalWire I’m trying to decide how much should be handled as a polling/retrieval workflow versus immediately downloading and storing every fax as it arrives. Your use case argues strongly for making sure the stored document workflow is clean and reliable so OCR/indexing can be layered on later.

Funny timing too: just yesterday I had a call with a doctor asking about a similar “edit fax” type feature. I told the doctor that in over six years of the fax module, no one had ever asked me for an edit/fax workflow, then comes the the irony that you brought this up proving, never say never. :slightly_smiling_face:

I don’t want to over-promise OCR as part of the initial SignalWire restructuring, because I first want to get the receive/retrieve/store workflow right. But I do think your suggestion belongs on the roadmap. At minimum, I’d like the restructuring to avoid painting us into a corner so OCR/search, document indexing, and possibly external integrations like Paperless-ngx can be supported cleanly later.

Thanks again. Participation is so important to our project.

1 Like

Here’s RC Voice Client service that’s pretty cool. SignalWire will be next.

Another plus is you may have other accounts/services along with the RC widget. For example:

Along with normal user ACL, Admins can get more granular by assigning users to roles.
This is the type of stuff that will fall under my Context Manager.

I plan to do a training seminar soon. Perhaps a Saturday or a day most would want.

1 Like