Customizing paperwork

Ottehr allows patients to book appointments and complete any necessary paperwork for those appointments. Without having to touch the code, Ottehr allows you to customize what questions you ask patients, and on which pages you ask those questions.

How it works

A patient information page including name, birthday, address, and ID upload questions

Ottehr uses a FHIR Questionnaire Resource (opens in a new tab) to store information about paperwork questions and how they should appear to patients. Then, Ottehr Intake uses that Questionnaire to generate frontend pages for patients to fill out. The result is a patient intake process that is completely customizable without having to write any additional code.

Question examples

{
  "linkId": "patient-street-address",
  "text": "Street address",
  "type": "string",
  "required": true
}
Text question

Interactive demo

The following demonstration allows you to comprise a basic questionnaire using Text, Date, and Select questions.

Select one of the following examples, or edit the JSON

Questionnaire:


Form:





Finding the correct Questionnaire

You customize the paperwork that patients fill out when they book an appointment by going to the Oystehr Developer Console (opens in a new tab) and searching for "Questionnaire" (opens in a new tab). The Questionnaire for Ottehr Scheduled In-Person Intake (opens in a new tab) has the name "paperwork", while that for Ottehr Unscheduled Telemedicine Intake (opens in a new tab) has the name "telemed". Customization works the same for both of these cases, and for any other Questionnaires you create.

Customizing the Questionnaire

At the most basic level, every page of paperwork is represented by an item on the Questionnaire with type "group". Then, every question on a page of paperwork is represented by an item on the page. Thus, Questionnaire.item (opens in a new tab) represents a page of paperwork, and every Questionnaire.item.item (opens in a new tab) represents a question on that page. Therefore, to add a page to the paperwork, you add an item to the Questionnaire (opens in a new tab), and to add a question to that page, you add an item to its Questionnaire.item (opens in a new tab).

Below is an explanation of how to customize the paperwork:


Page title

Set the page title using Questionnaire.item.text.


Page type

Questionnaire.item.type must be set to "group" for every page in your questionnaire.


Page review text

Review text is the name used for this page at the end of the booking process, when a patient is shown an overview of which paperwork pages they have completed.

To set the review text, create a Questionnaire.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/review-text" and set its valueString to the name of your choice.

"extension": [
  {
    "url": "https://fhir.zapehr.com/r4/StructureDefinitions/review-text",
    "valueString": "your_review_text"
  }
],

Page ID

A unique identifier for the paperwork page.

Set the id of a paperwork page using Questionnaire.item.linkId.


Question ID

A unique identifier for a question of paperwork on a page. This will be used for enableWhen and requireWhen.

Set the id of a question using Questionnaire.item.item.linkId.


Question text

Question text is used to communicate to the user what information they should be giving in a given question. Depending on the question, question text will appear in different places. Some examples: First Name, Address, Do you want to opt in?

Set the text of a question using Questionnaire.item.item.text.


Question type

Otter supports multiple types of page question: Text, Select, Radio, Radio List, Header, Description, Date, File, Checkbox. Examples are earlier on this page:

Question Type
What is it?
How to set it
TextThe patient inputs textSet Questionnaire.item.item.type to "string". To set a minimum number of rows to display, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/input-multiline-minimum-rows" and set its valuePositiveInt to the desired number of rows.
SelectThe patient selects one of a list of options from a dropdownSet Questionnaire.item.item.type to "choice". Then, for each option, add a { "valueString": "your_option" } to the list of Questionnaire.item.item.answerOption.
RadioThe patient selects one of a list of options that are all on the page, not in a dropdownSet Questionnaire.item.item.type to "choice". Then, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/select-type" and set its valueString to "Radio". Finally, for each option, add a { "valueString": "your_option" } to the list of Questionnaire.item.item.answerOption
Radio ListThe patient selects one of a list of options that are all on the page, not in a dropdown. The difference between this and Radio is designSet Questionnaire.item.item.type to "choice" . Then, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/select-type" and set its valueString to "Radio" . Finally, for each option, add a { "valueString": "your_option" } to the list of Questionnaire.item.item.answerOption
HeaderHeader text that is displayed to the patient, the patient does not input anythingSet Questionnare.item.item.type to "display". Then, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/text-type" and set its valueString to "h3". Finally, set Questionnaire.item.text to your desired text.
DescriptionBody text that is displayed to the patient, the patient does not input anythingSet Questionnare.item.item.type to "display". Then, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/text-type" and set its valueString to "p". Finally, set Questionnaire.item.text to your desired text.
DateThe patient chooses a dateSet Questionnaire.item.item.type to "date". To prompt the user for only a year, and not a day or month, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/date-type" and set its valueString to "year"
FileThe patient uploads a fileSet Questionnaire.item.item.type to "attachment". To add text to the center of the upload box, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/attachment-text" and set its valueString to the text you would like displayed. To specify the LOINC Code that identifies the type of document that the patient is uploading, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/document-type" and set its valueString to the LOINC Code.
CheckboxThe patient decides weather to check or uncheck a checkboxSet Questionnaire.item.item.type to "boolean". Then, set Questionnaire.item.item.text to the text for the checkbox.

Question required

To make a question mandatory, set Questionnaire.item.item.required to true.


Question text width

Text Width determines how much of the horizontal space in a page a question will consume. By default, this is set to 12, the maximum value. So, for example, if you want First Name and Last Name to appear in the same line, then you would set the text-width to 6 for each of those items.

To set text-width, create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/text-width" and set its valuePositiveInt to the text width you want, between 1 and 12.

"extension": [
  {
    "url": "https://fhir.zapehr.com/r4/StructureDefinitions/text-width",
    "valuePositiveInt": 6
  }
]

Question input format

Ottehr comes with common input formats built-in, so adding them to your form is easy. If you are adding a Phone Number, Email, US State, ZIP Code, or Signature input question, you can create a Questionnaire.item.item.extension with url "https://fhir.zapehr.com/r4/StructureDefinitions/input-format" and set its valueString to "Phone Number", "Email", "State", "ZIP", or "Signature".

"extension": [
  {
    "url": "https://fhir.zapehr.com/r4/StructureDefinitions/input-format",
    "valueString": "ZIP"
  }
]

Question enableWhen

enableWhen (opens in a new tab) allows you to dynamically show questions to the patient based on their responses to other questions. enableWhen takes three inputs: question (opens in a new tab), operator (opens in a new tab), and answer (opens in a new tab). The input to question is the question ID for the question that determines this questions visibility. The input for operator is exists, =, !=, >, <, >=, or <=. And the input for answer is the value that operator compares againsed. For example, if you have the following for Questionnnaire.item.item.enableWhen:

"enableWhen": [
  {
    "question": "current-medications-yes-no",
    "operator": "=",
    "answerString": "Patient takes medication currently"
  }
]

Then this question would only appear if the patient answered "Patient takes medication currently" to the question with ID "current-medications-yes-no".


Question requireWhen

requireWhen works exactly like enableWhen, except it determines if a given question is required for patients, as opposed to visible by patients. You can have both requireWhen and enableWhen on a given question.