Quickly implement professional Covid-19 screening for cheap

Jared Hasen-Klein
13 min readDec 24, 2021

--

This post contains affiliate links to certain products and services. When you use these links, I may earn a small commission if you buy the products or services I recommend. These commissions in no way impacted my recommendations, but by you using the link, you help support my work.

Integrating Cognito Forms, Microsoft Flow, Placid, and Twilio to screen for Covid-19 symptoms using QR codes and SMS messages

In July, I explained how we used Zapier and Typeform to build a digital screening system in just hours. That system worked nicely for us for a while. As our needs grew and we had more time to develop the system, I learned about some new tools to make the process even better (and cheaper!).

Anyone can implement this system with some patience in just a few hours. From start to finish, the system takes me about 45 minutes to implement having done it a few times now. It can cost as little as about $10/month, depending on the size of your operation and what your priorities are.

The Process

  1. Parents and employees fill out a form on their phone asking about symptoms, exposure, and other data as required by Public Health
  2. Individuals cleared to come to campus receive a QR code on their phone. (For students, parents generally get the QR code).
  3. Individuals arrive on campus, present their QR codes, and are granted entry to the campus.
  4. The scanned data is saved in a spreadsheet.

Our setup

First, I’ll walk you through our set up. Then, you can read on for more information on how to customize it below.

Step 1: Create the form (~30 minutes)

We now use Cognito Forms, an awesome web form provider with cool features like hidden fields and calculated values. The form contains a few basic questions like the name of the person, and some yes/no questions about symptoms and exposure.

We have it set so that each question appears when the previous one is filled it out correctly. For example, if someone answers “Have you had a fever in the past 24 hours?” with “No,” we’ll show them the next question. If they say “yes,” that’s the end of the form for them since they aren’t cleared to come to campus.

We have a hidden field called Approval which is calculated based on the answer to our final screening question. Since people won’t get to that last question unless they answered all of the others appropriately, it can be based only on their answer to that. The field reads = if Symptoms = “None of the above” then “Approved” else “Rejected” which does exactly what it sounds like. If the answer to the symptoms question is “None of the above” then the person is approved and the value of the field should read approved. If they select any other symptoms, it will read rejected.

Screening form. Note how fields appear after the previous question is answered. You can’t see the approval status field, but it’s there, working in the background.

Step 2: Set up a Twilio Account (~10 minutes)

We use Twilio for sending SMS and MMS text messages. Twilio is easy to use, integrates with our other software, and you pay per message (and a pretty reasonable amount, too).

Create a Twilio Account using my link and get $10 credit — that’ll last you for longer than you think! Once you create your account, be sure to get a phone number that works for Programmable Messaging (Twilio’s fancy way of saying texting). We picked a number with our local area code.

Step 3 (optional): Set up a Placid Account (~10 minutes)

A fancy QR code created with Placid, featuring my name, the date, and our logo. You can make this screen look however you want.

Rather than sending plain QR codes, we opt to send images which are customized with our logo, the name, and date. Placid is an awesome tool that lets you do just that.

The plan you’ll need for Placid is $19/month (prepay for the year and get two months free). If you’d rather not pay for it, you can still send QR codes without it, you’ll just miss out on some custom branding. Feel free to skip ahead to the next step if you don’t want the fancy branding or added cost.

Once you create your Placid account, you’ll need to create a template. You can customize this with as many fields as you want. Just make sure to put a large space for an image where the QR code will go. You can create as many other fields as you want which can be mapped to values from the form later.

Our Placid template.

Step 4: Putting it all together in Microsoft Flow (~20 minutes + time to test and troubleshoot)

Microsoft Flow is a service which integrates various web services without the need for coding. It’s similar to Zapier, but much cheaper (or free!) and a bit more flexible. If your workplace or school provides you with a Microsoft account, Flow is free for most cases. If not, it’s a modest $15/month. This is the most valuable piece of software for this project, and it’s well worth the investment. Check if you have flow for free before purchasing a subscription — you probably do!

4A. Create a new Automated Flow

4B. Set up the initial step

Name your flow something meaningful and select your trigger action. Assuming you’re using Cognito, type “cognito” in the search box and select “When a new entry is created” from the list.

4C. Initialize some variables

Variables are ways which you can take information provided in one step, transform if into another form, and use it later. For example, we’ll run into issues later with a full name because it has a space in it which is a special character. So, we’ll want to convert that space. For now, you don’t have to worry about the details.

Just add two “Initialize Variable” steps. One variable should be something along the lines of “full name” and the other “qr URL.” Make sure to set each as a String.

4D. Conditional logic

This step excites me. It’s where we finally get to start taking data from the form and do something meaningful with it. Now, add what Flow calls a Condition.

You’ll recall that, when creating the form, we made a hidden field called Approval which creates a status of either Approved or Rejected depending on the user’s answers. We’ll use that here to know whether or not we should send a QR code to the user. If our Cognito field called Approval is equal to Approved, we’ll send a QR code.

If you don’t create this hidden field, you can still create a condition. For example, if you have three Yes or No questions, you could make it so that if Q1 equals No andQ2 equals No andQ3 equals No then go to the yes condition, otherwise go to the no condition. It’s really just about your preference of where you want the work to be done — on the form side or on the Flow side.

4E. Setting up the “Yes” action

Assuming that the person is approved, we want to send them a QR code. We’re going to do a few things to make that happen:

  1. Set full name variable.
    Choose the “Set variable” action
    Select “full name” as the name
    For the value, click inside the box, select expression, type replace, click dynamic, find the full name field, and replaced space with %20. When your done, it’ll look like replace([Full Name], ' ', '%20'). You’ll probably see something funky like replace(triggerOutputs()?['body/FullName'],' ','%20') which is totally fine.
  2. Generate the QR code.
    There are a ton of free QR code generators. I use Google’s QR code generator because it is free, has no limits, and I expect it to be around for a while.
    Choose the “Set variable” action
    Select “QR URL”
    For the value, start with the base URL of https://chart.googleapis.com/chart?cht=qr&chl. You’ll then want to add data from your form by piping in dynamic content. My QR code looks like https://chart.googleapis.com/chart?cht=qr&chl=name:{name}*positive:{answer1}*feelsick:{answer2}*symptoms:{answer3}*temp:{answer4}&t=&chs=500x500&choe=UTF-8 with each thing in {brackets} representing a dynamic field I inserted. Important: For name, be sure to use the name from the set variable step, not the name from the form. This way it will remove the space!
  3. Optional: generate the Placid image
    If you used Placid above, then you’ll need this step. Otherwise, you can skip it.
    Add the “HTTP” action
    Method: Post
    URI: You’ll need to get your template ID from Placid (this is an alphanumeric combo written next to your template). The URI should be https://placid.app/api/rest/TEMPLATE_UUID
    Body: Now, format a JSON. The way you format this will be dependent on how you set up your template. Here’s my example, using the QR code, a field called day and a field called name.
    {
    “create_now”: true,
    “fields”: {
    qr”: {
    “image”: {
    “imageSrc”: “link”,
    “imageUrl”: “{URL variable}
    }
    },
    day”: {
    “text”: “{Date from form}
    },
    name”: {
    “text”: “{Name from form}
    }
    }
    }
    The text in bold needs to be changed. These are the names of the fields on my Placid template. Yours may differ. The {bold text in brackets} represents variables from my form which I inserted as Dynamic content. Note that the URL is the variable I defined a few steps ago.
  4. Optional: get the link for the Placid image
    If you completed Step 3, you’ll need to complete this step. Otherwise, skip it.
    Add action “Parse JSON”
    Content: Select Body from the previous step
    Scheme: Enter the following JSON:
    {
    “type”: “object”,
    “properties”: {
    “id”: {
    “type”: “integer”
    },
    “status”: {
    “type”: “string”
    },
    “image_url”: {
    “type”: “string”
    },
    “transfer_url”: {},
    “polling_url”: {
    “type”: “string”
    }
    }
    }
  5. Send the text message
    Finally! We get to send the text message. This is pretty straightforward.
    Add Action: Twilio — Send Text Message
    From Phone Number: Select your Twilio number. If you didn’t claim a number yet, head over to Twilio and do that now.
    To Phone Number: Add dynamic content as the cell phone number entered on the form
    Text: Put whatever text you want in the message. We put Screening approved for {Name} on {Date}.
    Click “Show advanced options”
    If using Placid — Media URL 1: Select image_url from the Parse JSON step
    If not using Placid — Media URL 1: Select the QR URL variable you created earlier.
Receiving the QR code via text message. Handsome branding is thanks to Placid

4F. Setting up the “No” action

Okay. That was the difficult part. Everything you worked on in the past step is for what happens when someone is cleared to enter your property. But what if they’re not? Scroll back up and find the yes/no split. Now, we’re working on the “no” side.

You can do pretty much anything you want with people who are not approved. You can choose to send them nothing (cheapest and easiest), you can send them a text, you can email your medical professionals that someone was rejected, or whatever you want.

We send a text saying that someone was rejected, and in that text we include a phone number they can call if they have further questions. To do that:

Add Action: Twilio — Send Text Message
From Phone Number: Select your Twilio number. If you didn’t claim a number yet, head over to Twilio and do that now.
To Phone Number: Add dynamic content as the cell phone number entered on the form
Text: Put whatever text you want in the message. We put Screening rejected for {Name} on {Date. Call (###) ###-### for further guidance.

That’s it! Time to test your Flow!

Step 5: Scanning your QR codes

There are lots of choices for scanning QR codes. You might want to use an app like Scan2GoogleSheets which allows you to scan the codes and instantly upload them to a spreadsheet.

We were doing that for a while, and then when we needed to expand our number of screening points, we switched to using these barcode scanners and storing them in an Excel document run off of a Mac Mini.

There are lots of options for scanning so do whatever works!

Customizing The Components

Form

The form itself can exist on virtually any web location. There are lots of providers for forms, ranging dramatically in cost and features. I recommend using Cognito Forms. Cognito Forms lets you create hidden fields, conditionally appearing fields, and integrates nicely with other services. It’s also cheap — like $9 month for 5,000 responses cheap.

Our current screening form in action, using Cognito Forms.

Another option is Typeform which we were using in version 1 of the form. It is aesthetically pleasing, but much more expensive and limited in its functionality under the hood.

An earlier version of the form created using Typeform.

There are some free options out there like Google Forms and Microsoft Forms. Those are great, but they may not allow you all of the conditional questions you want for your application.

This page details all of the natively supported form applications in Microsoft Flow. YMMV with some other providers not mentioned here.

If you have a website with forms built in, that may work, too. You should find out if your form provider makes their data available through an API. If so, you can integrate it with Flow.

QR Code

I’ve been searching for something like Placid for a long time — a service which lets you take data from a source and dynamically generate images based on the content. It’s reasonably priced and does the job quite nicely. The customer service is also amazing. You can definitely consider other providers, though you’ll need to read up on their API documentation.

For generating the QR code itself, I use the Google Charts API since it’s free. There are lots of others — you can pick your favorite. Just be cognizant of any limits (e.g. number of codes that can be generated per period of time per user).

Text Messages

Twilio has served us well in the sixth months we’ve been using it. Running if almost continuously five days a week for sixth months, I can only think of one or two days where there were any kinds of issues and, one of those days was a major carrier outage out of Twilio’s control.

There are other SMS providers, though none of them integrate nicely with Flow. There are a few other providers that say they integrate, but upon actually trying to implement the integration, I failed every time. If you find something else that works, let me know in the comments!

Integrators

I use Microsoft Flow. You should, too. I once used Zapier to integrate services and then I learned. Flow is way cheaper, more customizable, and is a better tool to know. If you’re really sold on using Zapier, check out my previous article.

There are other integrators out there if you want to play around, but Flow is usually free — and cheap if it’s not — and I documented those steps here.

Frequently asked questions

This is hard. Can you do it for me?
Absolutely. I put out these instructions with the hope that they are helpful and clear enough that people can implement the system on their own. If you don’t have the know-how or the time, I am available to help with custom development. If you essentially want the system I described, I can implement it for your organization for $150. If you have more basic needs, we can reach an agreement for something cheaper. If you have more complicated needs, let’s talk about the time it will take and I’ll see what I can offer you. In most cases, I can roll out this system in 1–3 days. Please email me for more information.

Should we implement a QR code system?
Maybe…It depends on your needs. If you want a record of everyone who is entering your property, QR codes help you do that. If you just want to make sure that people filled out a form, you can simply check a database of names when they arrive or send a generic image (like a green checkmark with your logo) rather than a QR code to indicate approval

Who is this system for?
I have successfully used this system in both a day camp and school environment. In both cases, we had hundreds of unique users using the system each day. Any business or organization which needs to conduct screening could benefit from this system.

How much will it cost?
That’s largely dependent on your preferences. Many of the costs (like text messages sent and number of form submissions received) scale based on your usage. In other words, you pay for what you need. Other costs, like Placid and Flow, are fixed. You can get a bare bones version of this system going for about $10/month with about 200 daily users.

Is there a cheaper or better way to do this?
Possibly. Back in July, I said probably. Since then, I’ve been exploring ways to make it cheaper and better. I encourage you to do the same and share your success!

Does this system comply with Public Health guidance?
It can! Check with your Public Health department for specific guidelines or orders for conducting screening. It’s important to note that the specific questions on your form should line up with the criteria that your local Public Health officer has requested be included. Most areas do not require a specific format for the screening, meaning this should be in compliance in most cases.

What questions should I ask on the form?
This depends on your local public health guidance. The questions asked in various screenshots in this article are in no way meant as recommendations. Please consult public health officials for the latest symptoms and risk factors associated with Covid-19.

Can I use this for something non-Covid related?
You sure can! Follow these instructions any time you want to collect data, encode that data in a QR code, and text it out to people.

Is this system HIPAA compliant?
Maybe. Most of the services involved have HIPAA options. However, these options often come with added fees. For example, Cognito Forms requires you to have their $99 business plan to enter into an agreement regarding HIPAA. That said, there are other safeguards you can implement. For example, you can send a response submission number/unique ID in the QR code rather than encode all of the actual data to help protect privacy. I do not claim any HIPAA compliance on this system, and you should check with the individual vendors if that is a concern for you.

--

--

Jared Hasen-Klein

Senior Political Science major at Cal Poly Pomona and Programs Director at Sierra Canyon Day Camp.