# What is Epicollect5

Free and easy-to-use mobile data-gathering platform.

[**Epicollect5**](https://five.epicollect.net/) is a mobile & web application for free and easy data collection developed by the [**CGPS Team**](https://www.pathogensurveillance.net/our-software/) based at the [**Oxford University Big Data Institute**](https://www.bdi.ox.ac.uk/)**.**

It provides both web and mobile applications for the generation of forms (questionnaires) and freely hosted project websites for data collection.

Projects are created by using the web application at [**five.epicollect.net**](https://five.epicollect.net) ([**see how to create a project**](/web-application/create-a-project)) and then downloaded to the device to perform the data collection ([**see how to add a project to the mobile app**](/mobile-application/add-projects)).

Data are collected (including GPS and media) using multiple devices and all data can be viewed on a central server (via map, tables, and charts).

Data can be exported in CSV and JSON format

The mobile app is currently available for both Android (10+) and iOS (15+)

{% hint style="info" %}
Please note that the supported versions of our application may change over time due to requirements imposed by Google and Apple. These requirements may include updates to the minimum API levels for Android or iOS versions supported by Apple devices.

As a result, older versions of our application may become incompatible with the latest operating systems or may no longer receive updates and support. To ensure the best experience and access to the latest features and security enhancements, we recommend regularly updating to the latest version of the application available on the respective app stores.
{% endhint %}

**Epicollect5 is 100% free to use without any limits(\*)**. You can create as many projects and upload as many entries as you wish.

Epicollect5 is financially supported by the [**Centre for Genomic Pathogen Surveillance**](https://www.pathogensurveillance.net/) and we implement open-source technologies to provide the service for free.

{% hint style="warning" %}
Please note that Epicollect5 is developed by a small team of Oxford University researchers, not by a commercial tech company, and is provided as a free service on an “as-is” basis, without any guarantees.\
For mission-critical projects where occasional disruptions, bugs, performance limitations, or missing features could pose significant challenges, we recommend considering alternatives such as [KoboToolbox](https://www.kobotoolbox.org/), [ODK](https://getodk.org/), or [Google Forms](https://workspace.google.com/products/forms/), which may better suit your needs.
{% endhint %}

{% hint style="warning" %}
(\*) We kindly remind you of our fair usage policy, which remains in effect.

For instance, uploading 500 videos, each at 500MB, would consume a total of 250GB of storage space.

While there are no restrictions preventing you from doing so, it's essential to note that our resources are finite, and Epicollect5 is not designed as a free storage solution
{% endhint %}

## Ready? Go ahead and [create your first project!](/web-application/create-a-project)

{% embed url="<https://www.youtube.com/watch?v=QCbkEoP5dvg>" %}


# Projects and Entries Syncing

Learn about manual project selection, device data storage, manual uploads, and referencing downloaded entries to maintain data integrity when using the Epicollect5 platform.

### Project Management and Syncing with Devices

Epicollect5 web app and mobile apps do not auto-sync projects automatically.&#x20;

{% hint style="warning" %}
When you log in to the web app and create your projects, **those projects do not appear automatically on the mobile app after you authenticate**. Instead, projects to be used on the mobile apps can be cherry-picked according to the user's needs. For more information, refer to the [Add Projects](/mobile-application/add-projects) section.
{% endhint %}

**Advantages**:

* **Clutter-Free Mobile Apps**: By not auto-syncing, your mobile apps remain uncluttered with numerous projects. You only see the projects you choose to add, keeping the interface clean and manageable.
* **Customized Project Selection**: Users can select specific projects that are relevant to their current tasks, making it easier to focus on what’s important without the distraction of unrelated projects.
* **Efficient Use of Multiple Devices**: If you use different devices for different projects, you can manage and access only the necessary projects on each device. This allows for a streamlined workflow and better organization.
* **Data Management Flexibility**: The server acts as an aggregator, collecting data from various devices. This ensures that data can be reviewed and managed in a centralized manner, without the need for constant syncing across devices.

### Uploading Content from Mobile Apps to the Server

When it comes to the entries collected via the apps, the same principle applies.&#x20;

{% hint style="warning" %}
Entries and related media are collected and saved locally, even offline, and **must be manually uploaded to the server**. This process ensures flexibility and control over the data transfer.
{% endhint %}

**Key Features**:

* **Local Storage and Offline Capability**: All entries and media are saved on the device, allowing users to collect data even when they are offline. This ensures that no data is lost due to connectivity issues.
* **Manual Uploading**: Users need to manually upload their collected entries to the server. This feature gives users the autonomy to decide the best time to upload their data based on their convenience, data plans, and network availability.
* **Granular Data Management**: Entries are categorized and uploaded based on their type, such as data (text entries), photos, audio, and video. This granularity allows for more efficient data management and prevents unnecessary data usage.
* **User Control**: By requiring manual uploads, users can ensure that their device’s storage isn’t overwhelmed by unnecessary auto-syncing. They can upload data when it is most suitable for them, making the process more user-friendly and practical.

**Advantages**:

* **Efficiency**: Users can manage their data uploads based on their specific needs and schedules.
* **Control**: Prevents unwanted use of mobile data or battery drain by allowing users to upload only when they choose.
* **Flexibility**: Supports offline data collection, which is crucial in remote or low-connectivity areas.
* **Organization**: Separates data into different types for easier management and more organized uploads.

This approach ensures that data collection is as seamless and efficient as possible, providing users with the control and flexibility they need to manage their entries effectively. For more info see the section about [Uploading ](/mobile-application/upload-entries)[Entries](/mobile-application/upload-entries).

### Downloading Entries to Other Devices as References

Entries can be downloaded from the server to the mobile app when needed.&#x20;

{% hint style="warning" %}
While these downloaded entries are not editable by design, they serve as valuable references for adding related child entries or branch entries. This approach ensures data consistency and integrity across the system. Moreover, media files and branch entries do not get downloaded since they are not needed.
{% endhint %}

**Key Points**:

* **Download Capability**: Entries can be downloaded from the server to the mobile app for reference purposes.
* **Non-Editable**: Downloaded entries are intentionally non-editable to maintain the integrity of the original data.
* **Reference Use**: These entries can be used to add related child entries or branch entries, facilitating better data linkage and context.
* **Download Only What is Needed**: Media files and branch entries are not required and are excluded from the download process. By doing so, we ensure that only the most pertinent data is retrieved, which not only increases download speeds but also helps to reduce data usage and associated costs.

**Why Auto-Syncing is Unnecessary**:

* **Server as Aggregator**: The server acts as a central aggregator, collecting and managing data from various devices. This centralization helps in maintaining a coherent and consistent dataset.
* **Avoiding Inconsistencies**: Editing entries directly on the mobile app can lead to inconsistencies across the dataset. By keeping downloaded entries non-editable, we prevent potential conflicts and ensure that the data remains reliable.
* **Manual Download for Specific Needs**: Users can manually download entries when needed, providing flexibility and control over the data transfer process.

**Advantages**:

* **Consistent Data Management**: Ensures data integrity and consistency by preventing unauthorized edits on mobile devices.
* **Enhanced Data Reference**: Allows users to reference existing data when adding new entries, improving the accuracy and relevance of the collected data.
* **Efficient Use of Resources**: By not auto-syncing, the system avoids unnecessary data transfers, saving bandwidth and ensuring that mobile apps remain responsive and uncluttered.

For more detailed information, please refer to the section about [Downloading Entries.](/mobile-application/download-entries)\
\
\
\ <br>


# Our Community

Need help or have a question? Join our vibrant community! Whether you're looking for assistance, seeking advice, or just want to connect with others, our community is here for you.

Share your experiences, ask questions, and find the support you need from fellow members.

We're excited to have you with us!

[**Join our growing community at community.epicollect.net**](https://community.epicollect.net)**!**

![](/files/irdREBpT37LPh7zWqWPW)


# Privacy Policy

This statement explains how the [**Centre for Genomic Pathogen Surveillance**](https://www.pathogensurveillance.net/) (**CGPS**) uses the personal information we collect from you when you visit the Epicollect5 website.

By visiting the Epicollect5 website, you are consenting to our use of your information in this way.

We may make changes to this statement so please check from time to time for any updates.

#### User Accounts

Users can log in to Epicollect5 using:

* Google Account
* Apple Account
* Email

The only piece of information kept in the system is the user's email for basic project user management.

Whether you want to use your personal email or another email just for Epicollect5 is up to you.

The mobile application is verified by [**Exodus Privacy Project**](https://reports.exodus-privacy.eu.org/en/reports/uk.ac.imperial.epicollect.five/latest/)**.**

<figure><img src="/files/oUnmIJtSUvvApHiD9cJu" alt=""><figcaption></figcaption></figure>

Starting from version 6.0.0, our mobile applications now include a feature to collect **anonymous** error information. This data collection helps the Epicollect5 Team identify and address bugs effectively, ensuring a smoother user experience for everyone. Please note that **no personal details are collected during this process**. Additionally, we respect your privacy, and users have the option to opt-out at any time from the Settings page if they prefer not to participate.

{% hint style="success" %}
Your feedback and participation in improving our platform are greatly appreciated.
{% endhint %}

#### User Data

Project managers retain ownership of the data. We will never share or access your data unless granted permission by you, to provide you with technical assistance.

Technically speaking, each user owns all of the content added to Epicollect5; therefore, they could copyright it. However, by uploading data to Epicollect5 a user gives direct access to that material to whoever has access to that project.

#### Personal Data and Your Responsibilities

CGPS is based in the UK and operates under the UK General Data Protection Regulation (“UK GDPR”). You may be in a different legal jurisdiction, so you must ensure that you follow UK GDPR as well as your own local laws. For more information on UK GDPR please see [Information Commissioner's Office (ICO)](https://ico.org.uk/).

When you use Epicollect5, CGPS is the Data Processor and you are the Data Controller, as you have control over the data you collect and CGPS only acts on your instructions.

\
**Publication of Data**

If you make a project public, ALL project data you have collected will be visible to anyone on the internet. Please ensure that you are not breaking any Data Protection laws that may apply. CGPS cannot be held responsible for data published by users.

#### R**easonable Use and Data Retention**

Epicollect5 is provided at no cost to users; however, we incur costs for managing and processing data which are currently covered by grants from NIHR and Gates Foundation. We monitor our systems automatically, and projects that generate unusually high activity may be flagged. When this occurs, we may contact the project managers to request clarification. **No project data is accessed by us during this process.**

#### Protecting Your Data

Epicollect5 is part of the Big Data Institute at Oxford University ([**https://www.bdi.ox.ac.uk**](https://www.bdi.ox.ac.uk/)) and hosted on the world-class cloud hosting provider, **Digital Ocean:** [**https://www.digitalocean.com**](https://www.digitalocean.com)**,** in their **UK** data centre.

You can read about Digital Ocean data security here:

[**https://www.digitalocean.com/legal**](https://www.digitalocean.com/legal/)

Digital Ocean services fully comply with GDPR:

[**https://www.digitalocean.com/legal/gdpr**](https://www.digitalocean.com/legal/gdpr/)

Epicollect5 embraces industry-standard best practices to protect against unauthorised access to your data, including:

1. **Authentication and Authorization**: Secure authentication mechanisms such as OAuth and JWT tokens, ensuring that users only have access to the resources they are authorized to access.
2. **Input Validation**: Validating all inputs from users to prevent injection attacks and other malicious actions. Using parameterized queries for database interactions to prevent SQL injection.
3. **Data Encryption**: Data are sent over [**HTTPS**](https://en.wikipedia.org/wiki/HTTPS) and its TLS certificate uses SHA-256 with RSA encryption as a signature algorithm.
4. **Security Headers**: Implementing security headers to mitigate various types of attacks like CSRF attacks, cross-site scripting (XSS), clickjacking, and MIME sniffing.
5. **Secure Coding Practices**: Follow secure coding practices such as input validation, output encoding, error handling, and proper session management to minimize the risk of security vulnerabilities.
6. **Patch Management**: Keep all software components up to date with the latest security patches and updates to address known vulnerabilities.
7. **Least Privilege Principle**: Follow the principle of least privilege, where users and processes are granted only the minimum level of access or permissions necessary to perform their tasks.
8. **Monitoring and Logging**: Robust logging and monitoring mechanisms to detect and respond to security incidents in real time.
9. **Backups**: Daily backups of the server are run in case of a system fault.

**Privacy and Data Storage in Epicollect5 Mobile Application(s)**

Regarding the storage of data within the Epicollect5 mobile application, it's important to note that the app's data resides in the device's private application folder. This folder is exclusively accessible to the Epicollect5 application and is not accessible to other apps.

By default, data stored within the Epicollect5 app is not encrypted. However, for users requiring an additional layer of security, most modern Android and iOS devices offer the option of system-wide encryption. Activating this system-level encryption on the device can provide enhanced security for all stored data, including that within the Epicollect5 app. [**Read how to do it**](https://gizmodo.com/why-you-should-be-encrypting-your-devices-and-how-to-ea-1798698901).

#### Account and Data Deletion

In accordance with Google and Apple account deletion policies, we have implemented a process for data deletion.

Users can initiate an account deletion request by clicking on the designated button available both in the app and on the web, specifically on the user profile page. It is important to note that personal data, which includes only email addresses, will always be deleted.

Regarding user contributions (entries) to projects, the deletion process varies depending on the project role.

For projects where the user has a CREATOR role, all projects (both private and public) created by the user will be deleted, along with all associated entries.

For contributions made to private projects using the roles of MANAGER, CURATOR, or COLLECTOR, the entries will not be deleted but will be anonymized instead. Additionally, the user's access to these projects will be revoked.

Contributions to public projects are already anonymized by default when using mobile apps, but entries added via the web will also undergo anonymization.

Furthermore, users with a VIEWER role will be removed from any project. Since VIEWER role users cannot add entries to private projects, there won't be any entries to delete.

Finally, users have the option to delete contributions to private projects before proceeding with their account deletion. However, it's important to note that this process is manual, and each entry must be deleted individually. This is a deliberate choice to prevent unintended data loss and mistakes. By taking this approach, users have better control over their data and can carefully manage their contributions before proceeding with the account deletion.

{% hint style="danger" %}
We understand the importance of the data you collected. However, please note that account deletions are **automated and final**. Once a deletion request is submitted and processed, **all associated data is permanently removed** under data protection laws and our privacy policy.\
By law, we are **not permitted to retain or recover user data** after such a request has been completed.​
{% endhint %}

#### Contact Us

Our primary point of contact for all matters is the Epicollect5 Community at [community.epicollect.net](http://community.epicollect.net/)

If there is a need to discuss a particular request privately, we will provide users with a support email address to facilitate this private conversation. Subsequently, the public topic related to the request will be closed to ensure the confidentiality of the discussion.


# Cookie Policy

## Epicollect5 uses a limited number of cookies.

| Owned by five.epicollect.net |                                                                                                                                                                                                                                  |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| XSRF-TOKEN                   | This token is used to verify that the authenticated user is the one actually making the requests to the application. It protects against [cross site forgery attacks](https://en.wikipedia.org/wiki/Cross-site_request_forgery). |
| epicollect5                  | It is a secure cookie to keep you logged in, it expires after 72 hours since you logged in.                                                                                                                                      |

## Third-party cookies

| Google Analytics   |                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| \_ga, \_gat, \_gid | These cookies are used to collect information about how visitors use our site. We use the information to help us improve the web application. The cookies collect information in an anonymous form, including the number of visitors to the website, where visitors have come to the site from and the pages they visited. [Overview of Google Analytics policy.](https://about.google/) |

| cookieconsent.insites.com |                                                                                                                    |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| cookieconsent\_dismissed  | Saved when the user dismiss the cookie consent banner[. About cookies](https://cookies.insites.com/about-cookies/) |

[Our privacy policy](/about/privacy-policy)


# News & Papers

A collection of articles and papers showcasing the diverse applications of Epicollect5. This compilation highlights the versatility and impact of our platform across various fields and industries

Whether it's in the realm of healthcare, environmental research, social sciences, or beyond, Epicollect5 continues to be a powerful tool for data collection and analysis.

Each article and paper included in this collection provides valuable insights into how researchers and organisations leverage Epicollect5 to address real-world challenges, innovate solutions, and drive meaningful change. From large-scale epidemiological studies to community-driven conservation efforts, the breadth and depth of projects featured here underscore the adaptability and effectiveness of Epicollect5 in diverse contexts.

We invite you to explore this collection to discover the breadth of applications and the depth of impact that Epicollect5 has made in research, academia, and beyond.

Whether you're a seasoned researcher, a curious student, or a passionate advocate for data-driven decision-making, you'll find inspiration and knowledge within these pages.

{% embed url="<https://www.canal13sanjuan.com/san-juan/las-cotorras-bajo-la-lupa--san-juan-busca-frenar-los-danos-que-generan-en-los-cultivos_a6a69201e6808699935cbd8f8>" %}

{% embed url="<https://www.ouest-france.fr/pays-de-la-loire/mesquer-44420/mesquer-paysage-et-patrimoine-un-inventaire-participatif-05504088-87cc-4f2b-b928-b33fcd8e8ee2>" %}

{% embed url="<https://www.waingapu.com/bagian-11-ringkasan-laporan-penyelenggaraan-pemerintahan-daerah-kabupaten-sumba-timur-tahun-anggaran-2025/>" %}

{% embed url="<https://www.antenalivre.pt/noticias/campanha-nacional-desafia-cidadaos-a-ajudar-no-combate-a-acacia-de-espigas>" %}

{% embed url="<https://www.laestrella.com.pa/amp/vida-y-cultura/planeta/investigan-expansion-de-rana-introducida-en-panama-por-riesgo-ecologico-JF23402319>" %}

{% embed url="<https://azertag.az/xeber/tebiet_erazilerinde_epizootoloji_monitorinqler_kechirilecek-4264887>" %}

{% embed url="<https://www.argentina.gob.ar/noticias/primera-campana-de-monitoreo-para-la-deteccion-temprana-del-picudo-rojo-de-las-palmeras>" %}

{% embed url="<https://invasoras.pt/pt/1%C2%AA-maratona-nacional-de-monitoriza%C3%A7%C3%A3o-de-%E2%80%9Ctrichi%E2%80%9D>" %}

{% embed url="<https://www.facebook.com/ReladesTV/videos/proyecto-espacios-de-paz-transformar-acapulco-desde-la-comunidad/973751345349688/>" %}

{% embed url="<https://sisanjuan.gob.ar/23-ambiente/2026-04-29/67275-en-san-juan-proteger-a-los-animales-tambien-es-cuidar-la-vida-y-el-ambiente>" %}

{% embed url="<https://oberaonline.com.ar/2026/04/se-lanzo-la-5-edicion-de-plantemos-futuro-en-obera/>" %}

{% embed url="<https://www.linkedin.com/posts/dr-soumik-ghosh-2901141a5_research-epicollect5-dataentry-activity-7432782293158641665-9T42>" %}

{% embed url="<https://www.etvbharat.com/amp/hi/state/bandhavgarh-national-park-vulture-census-resumes-many-spotted-on-first-day-madhya-pradesh-news-mps26022004620>" %}

{% embed url="<https://www.instagram.com/reel/DUs5YEuEvTN/>" %}

{% embed url="<https://vestnik.svet24.si/novice/kmetijstvo/cmrlji-monitoring-1879995>" %}

{% embed url="<https://www.patrika.com/en/bhopal-news/mp-to-count-vultures-through-mobile-app-for-first-time-focus-on-seven-species-20355662>" %}

{% embed url="<https://sisanjuan.gob.ar/23-ambiente/2026-01-17/65850-ambiente-solicita-bajar-la-velocidad-en-rutas-para-proteger-la-fauna-silvestre>" %}

{% embed url="<https://agroempresario.com/publicacion/80359/mas-de-un-millon-de-litros-de-agua-se-entregaron-en-comunidades-originarias-del-norte-provincial/>" %}

{% embed url="<https://kupang.tribunnews.com/provinsi-ntt/943741/pemkab-sumba-timur-raih-pos-kupang-award-2025-berkat-inovasi-gas-vektoria-lawan-malaria>" %}

{% embed url="<https://oxu.az/cemiyyet/azerbaycanda-qus-qripi-ile-bagli-monitorinq-aparilacaq-tarix-aciqlandi>" %}

{% embed url="<https://news.milli.az/health/1302014.html>" %}

{% embed url="<https://www.kompasiana.com/muthia6849/69031c66c925c45e8b7de0d2/ketika-data-berubah-jadi-peta-inovasi-digital-dinas-kesehatan-banjarnegara-untuk-memantau-tuberkulosis>" %}

{% embed url="<https://teleqraf.az/news/toplum/496701.html>" %}

{% embed url="<https://indianexpress.com/article/cities/pune/pune-environment-conscious-residents-map-water-levels-simple-device-phone-10201319/>" %}

{% embed url="<https://bvsms.saude.gov.br/guias-alimentares-praticas-alimentares-saudaveis-dieta-saudavel-inqueritos-alimentares-consumo-alimentar/>" %}

{% embed url="<https://www.diariohuarpe.com/nota/como-registrar-atropellamientos-de-fauna-silvestre-en-san-juan-con-epicollect5-202571111390>" %}

{% embed url="<https://bakivaxti.az/ru/posts/detail/azerbaycanin-64-rayonunda-seroloji-monitorinq-kecirilecek-1752061488>" %}

{% embed url="<https://anglingtrust.net/get-involved/anglers-against-pollution/wqmn-estuaries/>" %}

{% embed url="<https://www.radio-odeon.com/novice/bela-krajina-v-akciji-pru-cmru-skupaj-za-cmrlje/>" %}

{% embed url="<https://asianews.network/bhutans-white-bellied-heron-population-ticks-up-offering-hope/>" %}

{% embed url="<https://media.az/society/v-nahchyvane-proveli-ocherednoj-monitoring-po-profilaktike-ptichego-grippa>" %}

{% embed url="<https://www.batconservationresearchlab.co.uk/north-somerset-bat-survey>" %}

{% embed url="<https://azertag.az/xeber/naxchivanda_qus_qripi_ile_bagli_epizootoloji_monitorinqler_kechirilib-3448187?__cf_chl_tk=Ie4ZefruJ4wu83nVkjN8klBdEZoA_O6EEH4c2pKX8Dw-1741274262-1.0.1.1-S.VCkJsOpZXtanVZNyrCrtlIahmCPIdS0RFrURv8CHk>" %}

{% embed url="<https://fa7.naxapi.com/nd.go.th/dnm_file/project/1738204952825_6262_center.pdf>" %}

{% embed url="<https://azertag.az/xeber/naxchivanda_qus_qripine_qarsi_epizootoloji_monitorinqler_aparilir-3417127>" %}

{% embed url="<https://www.eluniverso.com/noticias/informes/ecu-polinizadores-la-campana-para-recopilar-datos-sobre-muertes-de-abejas-en-ecuador-nota/>" %}

{% embed url="<https://gualeguaychu.gov.ar/noticia/25834-la-municipalidad-realizo-un-relevamiento-socioeconomico-en-el-barrio-los-espinillos>" %}

{% embed url="<https://noticiascoopercom.co/alcaldia-de-soledad-lanza-la-app-epicollect5-para-combatir-el-dengue/>" %}

{% embed url="<https://azertag.az/ru/xeber/nachinayutsya_ocherednye_epizootologicheskie_monitoringi_po_ptichemu_grippu-3369475>" %}

{% embed url="<https://notasdeactualidad.com/epicollect5-app-que-se-implementa-en-soledad-para-erradicar-el-dengue/>" %}

{% embed url="<https://canal12web.com/sociedad/ambiente/lanzan-una-app-para-recopilar-encuentros-con-delfines-y-ballenas-en-peninsula-valdes/>" %}

{% embed url="<https://azertag.az/xeber/dekabrin_16_dan_20_dek_qus_qripi_xesteliyine_qarsi_epizootoloji_monitorinqler_kechirilecek-3322767>" %}

{% embed url="<https://geoconfluences.ens-lyon.fr/informations-scientifiques/a-la-une/carte-a-la-une/epicollect>" %}

{% embed url="<https://report.az/sehiyye-xeberler/baliqciliq-sahesindeki-muessiselerde-epizootoloji-monitorinqler-kecirilecek/>" %}

{% embed url="<https://goolband.com/picsart-android-application-free-download-6675>" %}

{% embed url="<https://radarpalembang.disway.id/read/651562/pkm-dosen-fk-muhammadiyah-palembang-penggunaan-teknologi-pemetaan-mencegah-dbd-di-kelurahan-payaraman-timur>" %}

{% embed url="<https://azertag.az/xeber/iri_ve_xirdabuynuzlu_heyvanlarin_saxlandigi_teserrufatlarda_monitorinqler_kechirilecek-3145954>" %}

{% embed url="<https://ecozen.gr/2024/08/erevna-tis-ellinikis-ornithologikis-etaireias-mipos-eidate-mavropetriti/>" %}

{% embed url="<https://www.bbc.com/news/articles/c87rpdp61g4o>" %}

{% embed url="<https://m.farms.com/news/scouting-and-reporting-tar-spot-of-corn-in-pennsylvania-212846.aspx>" %}

{% embed url="<https://www.sciencedirect.com/book/9780443156656/open-electronic-data-capture-tools-for-medical-and-biomedical-research-and-medical-allied-professionals>" %}

{% embed url="<https://report.az/sehiyye-xeberler/muxtelif-nov-heyvanlar-arasinda-epizootoloji-monitorinqler-kecirilecek/>" %}

{% embed url="<https://azertag.az/xeber/qus_qripine_qarsi_epizootoloji_monitorinqler_aparilacaq-2987278>" %}

{% embed url="<https://www.noticiasnet.com.ar/noticias/2024/04/01/151370-patagones-se-toma-en-serio-el-problema-de-la-predacion>" %}

{% embed url="<https://www.agricultura.sp.gov.br/pt/b/febre-aftosa-defesa-agropecuaria-inicia-inquerito-para-comprovar-ausencia-de-circulacao-viral-da-doenca>" %}

{% embed url="<https://kuenselonline.com/rspn-conducts-annual-wbh-population-survey/>" %}

{% embed url="<https://azertag.az/xeber/vehsi_quslar_arasinda_qus_qripi_xesteliyi_ile_elaqedar_epizootoloji_monitorinqler_aparilacaq-2914762>" %}

{% embed url="<https://www.thehindu.com/news/national/kerala/synchronised-survey-records-268-bird-species-in-wayanad/article67796879.ece>" %}

{% embed url="<https://keepwalestidy.cymru/caru-cymru/report-your-progress/>" %}

{% embed url="<https://medium.com/@tjt28165/collecting-real-world-data-from-the-field-with-epicollect5-and-python-f488b8f554e0>" %}

{% embed url="<https://www.jpmer.com/abstractArticleContentBrowse/JPMER/22564/JPJ/fullText>" %}

{% embed url="<https://himjournals.com/article/articleID=519>" %}

{% embed url="<https://oprasevalci.si/pru-cmru/>" %}

{% embed url="<https://kaltura.uconn.edu/playlist/dedicated/1_14lpwsw0/1_fmj06huc>" %}


# Epicollect5 Citation

Proper citation is crucial for acknowledging the sources of your information and giving credit to the original authors.

**Web Citation:**

When citing EpiCollect from the web, use the following format:

{% code overflow="wrap" fullWidth="true" %}

```
Centre for Genomic Pathogen Surveillance. [insert current year]. Epicollect5. Available at: https://five.epicollect.net. Last accessed: [insert date here]Copy
```

{% endcode %}

Replace `[insert current year]` with the current year and `[insert date here]` with the date you last accessed the site.

**Original Paper:**

If you’re citing the original paper, use this citation:

{% code overflow="wrap" %}

```
Aanensen DM, Huntley D, Feil EJ, al-Own F, Spratt BG (2009) EpiCollect: linking smartphones to web applications for epidemiology, ecology and community data collection. PLoS ONE Sep 16;4(9):e6968Copy
```

{% endcode %}

**Secondary Paper:**

For the secondary paper, use this citation:

{% code overflow="wrap" %}

```
Aanensen DM, Huntley DM, Menegazzo M, Powell CI, Spratt BG. (2014) EpiCollect+: linking smartphones to web applications for complex data collection projects. F1000Res. Aug 20;3:199. doi: 10.12688/f1000research.4702.1Copy
```

{% endcode %}

{% hint style="warning" %}
Please adhere to the recommended style guide as per your institution's guidelines.
{% endhint %}


# Intro

Epicollect5 web application is hosted at [**five.epicollect.net**](https://five.epicollect.net/).

Projects are created using the web application then users will manually add each project to their Android or iOS device(s).

([**How to add a project to the mobile app?**](/mobile-application/add-projects))

It is developed and maintained by [**Oxford Big Data Institute**](https://www.bdi.ox.ac.uk/) and it is completely free to use.

### English video instructions

{% embed url="<https://www.youtube.com/watch?v=M6Dj_KxQPKk>" %}
See the video for a quick tour
{% endembed %}

### Spanish video instructions

{% embed url="<https://youtu.be/pHt0wsoVgUY>" %}
Vea el video para un recorrido rápido
{% endembed %}

## Main features

* Drag & drop form builder
* Single form or multi forms survey (up to 5 hierarchy forms) [**More info**](/formbuilder/multiple-forms)
* Photo, video and audio recording [**More info**](/mobile-application/mobile-application)
* Barcode scanner
* GPS location
* Branches (Dynamic lists) [**More info**](/formbuilder/branches)
* Groups (More questions on the same page) [**More info**](/formbuilder/groups)
* Conditional logic (jump questions) [**More info**](/formbuilder/jumps)
* View data on a table or map [**More info**](/web-application/viewing-data)
* Download data (csv or json) [**More info**](/web-application/downloading-data)
* Project cloning and sharing [**More info**](/web-application/clone-project)
* Public or private (authentication required) projects
* Data mapping to fit existing third party systems [**More info**](/web-application/mapping-data)
* Export data via API [**More info**](/developers/api)
* User roles management


# Create a Project

In Epicollect5, a project refers to a structured and organized collection of data that revolves around a specific goal, task, or study. It’s a fundamental concept within the Epicollect5 platform, which is designed for data collection and management.

A project in Epicollect5 typically includes the following components:

1. **Form(s)**: A form defines the data fields and structure for collecting information. You design the form to capture specific types of data relevant to your project, such as text, numbers, dates, images, and more.
2. **Entries**: Entries are the individual records or instances of data collected using the form. Each time you gather data, it results in a new entry within the project.
3. **Project Settings**: These settings allow you to configure various aspects of the project, such as its name, description, access permissions, and more.
4. **Data Visualization**: Epicollect5 provides tools for visualizing and analyzing the collected data.
5. **Collaboration**: Users are able to collaborate with other users on the same project, enabling multiple people to contribute data.
6. **Data Export**: The ability to export the collected data for further analysis is a crucial feature. Epicollect5 projects usually allow you to export data in various formats, such as CSV or JSON.

Epicollect5 is often used for research, fieldwork, surveys, environmental monitoring, and other data collection tasks. The concept of a project helps you organize and manage the data you collect, making it easier to focus on your specific data collection objectives.

Projects can be created by using the web application hosted at [five.epicollect.net](https://five.epicollect.net)

{% hint style="warning" %}
Users must log in to be able to create a project
{% endhint %}

To start, click the Create Project button at the top

![](/files/48S5lgZ1Bm1QexiD3kYL)

You will presented with a form to fill in:

![](/files/PyByedA1sfmqtSaf8WZA)

## Pick a name for your project

Once you have decided on the kind of project you wish to undertake, the first step is to give your project a name.

Your project name will be used within the web address assigned to your project so should be relatively short, with a maximum length of 50 chars.

{% hint style="warning" %}
Project names must be unique, so you cannot use a name if someone else already took it. Think of it like a domain or URL you register to yourself.

Project names can contain only letters, numbers, underscores (\_), dashes (-), and spaces. No special symbols. You can use both uppercase and lowercase. Maximum length is 50 chars, minimum length is 3 chars.

We recommend a project name around 20 chars.
{% endhint %}

The project name will be used to create a friendly URL to your project (called a slug) using only lowercase and dashes

Have a look at the examples below:

| Project name       | Slug (friendly url) |
| ------------------ | ------------------- |
| My Awesome Project | my-awesome-project  |
| Survey 2016        | survey-2016         |
| ABC Analysis 1234  | abc-analysis-1234   |

## Type in a small description

This is a short description of what your project is all about. It is basically a summary.

You will be able to add a longer full description later on if you wish.

## Enter your form name

A project must have at least one form to work with. It is the name you give to your questionnaire. You can add other nested forms later if you need them.

{% hint style="info" %}
A form name can contain only letters, numbers, underscores (\_), dashes (-) and spaces. No special symbols.

You can use both uppercase and lowercase.

The form name's maximum length is 50 chars.
{% endhint %}

## Set the type of access

A project can be **private** (accessible only to users you specify) or **public** (accessible to everyone). You can fine-tune the type of access control on your data and project settings later.

The private option is set as the default. That means you are the only one who can access the project (It requires login on both the server and the mobile app to be accessed).

{% hint style="info" %}
We recommend you leave the project **private** as long as you are building and testing it, and setting it to **public** later when your form(s) is finalised, if you wish, or keep it private and [**add users to it**](/web-application/manage-users)**.**
{% endhint %}

Once you have done this, click the **Create** button to create a project.

See below for some useful video tutorials created by our community.

{% embed url="<https://www.youtube.com/watch?v=9NlfySzLdPY>" %}

{% embed url="<https://www.youtube.com/playlist?list=PLceB21nD040q3wmOzS4dHdnH22032NJOM>" %}


# Project Info & Privacy

The project details section enables users to conveniently add or modify essential information regarding their project details and effectively manage access control.

After creating the project, you will be sent to the project details page. Here you can manage all the settings of your project.

<figure><img src="/files/invt6XhswOPnzh2fxka2" alt=""><figcaption></figcaption></figure>

### Project Logo and Description

Clicking the edit button (pen icon) will show the panel below, giving you the chance to edit the small description, write a full one, also upload a logo for your project.

If you make any changes, confirm them by clicking "update", otherwise close the edit panel with the X button.

{% hint style="info" %}
**Project Description Requirements:**

* **Description:** Must be between 3 and 1000 character limits.
* **Small Description:** Must be between 15 and 100 character limits.

**Project Logo Requirements:**

* **Maximum Resolution:** 4096 x 4096 pixels
* **Maximum File Size:** 5MB
* **Accepted Formats:** PNG, JPG, or GIF
  {% endhint %}

![The Project Details panel when open](/files/MNDVQBTFyJEfac9wd3mu)

### Project Settings

The "Settings panel" (see below image) gives you access to other project settings:

### Project Access

PRIVATE or PUBLIC, define whether the users need to be added to the project as members to view & collect entries.

* **Public**: anyone will be able to view the collected entries, add new entries, or download all the entries. API endpoints are open.
* **Private**: only members of the project can access it. API endpoints require authentication

{% hint style="info" %}
On PUBLIC projects, users still need to log in to add entries via the web. On the mobile app, authentication is not a requirement.

Moreover, users must log in to download entries as `csv` or `json` files.
{% endhint %}

### Project Status

* **ACTIVE**: The project can be viewed, and data can be collected and uploaded.
* **TRASH**: The project cannot be viewed or receive data, but it can be restored. To delete it permanently, when a project is trashed a "delete" button appears.
* **LOCK**: The project can be viewed, but it does not accept any new entries.

### Project Visibility

* **LISTED**: This setting makes your project publicly discoverable through the website's search feature.
* **HIDDEN**: When set to "HIDDEN," the project is accessible only to users who have the project's direct URL. This option provides increased privacy.

{% hint style="warning" %}
Visibility settings are primarily relevant to PUBLIC projects.

PRIVATE projects are already hidden from web searches on the Epicollect5 site.

On the mobile app, all projects are visible when searching. However, PRIVATE projects are marked with a "lock" icon, indicating that they require authentication for downloading. This ensures secure access to those projects.
{% endhint %}

### Project Category

A label is attached to projects to group them into categories.

"**GENERAL**" is the default one. You can choose from:

* General
* Social
* Art
* Humanities
* Biology
* Economics
* Science

![The Project Settings panel](/files/Q6H9bvi0PfZQNUqePIj0)

### My Projects Page

To access the project details page, click on "**My Projects**" and then the "**Details**" button for the project you wish to edit.

<figure><img src="/files/aYVSZAzANJSGhIbheEuS" alt=""><figcaption></figcaption></figure>


# Delete Projects (Web)

Deleting a project will permanently remove it from the system along with all its associated data. Please proceed with caution.&#x20;

{% hint style="danger" %}
Be careful as this action cannot be undone! Be sure to back up your data first!
{% endhint %}

To delete a project, you must first set its status as **TRASH**.

<figure><img src="/files/ym0nRgTeIVnZ1eCEv6EJ" alt=""><figcaption><p>Set project status as TRASH</p></figcaption></figure>

Then click on "**DELETE**".

{% hint style="warning" %}
Only the user with the role of **CREATOR** has the right to perform the delete action.
{% endhint %}

<figure><img src="/files/JkpWyaLpAF3URzt7AlJu" alt=""><figcaption><p>Click the DELETE button to proceed</p></figcaption></figure>

To confirm the deletion, you will be asked to enter the project name.

Once the project name matches exactly, the delete button on the right will be enabled, allowing you to proceed with the final deletion.

<figure><img src="/files/Y0pOeyXPVcn4ZcZMI0Dz" alt=""><figcaption><p>Type the project name to enable the DELETE button</p></figcaption></figure>


# View Projects

After you create a project, you are redirected to the project "details" page, containing all the information about your project.

Your project home page URL will be at the top:

![](/files/sCuYmzMt9caEwNFieAX6)

It is usually like <https://five.epicollect.net/project/my-awesome-project>

The last part `/my-awesome-project` is your project slug. A project slug is a web-friendly version of your project name, where all the spaces are converted to dashes (`-`) and the letters are all lowercase. This is a convention for URLs all over the web. Since each project gets its own URL, **your project name cannot be the same** as any other projects on Epicollect5.

{% hint style="danger" %}
Projects with the **EC5** prefix are projects created by the Epicollect5 Team only therefore the prefix **EC5** is reserved.
{% endhint %}

Going to your project homepage, this is how it would look like:

![](/files/SlqjY4qOBMKUd574RcSp)

At a glance, you can see:

* Your project logo
* Your project's small description
* Approximated total of entries collected\*
* Date of last entry uploaded
* Your project's full description

{% hint style="warning" %}
The "**≈" (tilde) sign** shown on the project homepage indicates that the entry count is **approximate**. This is intentional, as showing an exact number on the homepage for every project would place unnecessary load on the system.&#x20;

For the **precise count of entries**, please check the **Data Viewer**, which always displays the actual number of records uploaded at the top right.
{% endhint %}

To view your data, click on "View Data". [More on viewing data.](/web-application/viewing-data)


# Search Projects

Projects can be searched on the web & the mobile app

### Search projects on the web

**PUBLIC** and **LISTED** projects are shown on the Epicollect5 projects page at [**https://five.epicollect.net/projects**](https://five.epicollect.net/projects) (Click on any "Find Project" button)**.**

Projects are split into categories, each category has its own tab.

<figure><img src="/files/zzVIoQlGHbucUmbvQOLZ" alt=""><figcaption></figcaption></figure>

To find a particular project regardless of its category, the search tab will feature a search box to find projects by name and some controls to sort the list of projects according to personal preferences.

<figure><img src="/files/Dj154Ijpj60HZZxENvdQ" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
TRASHED projects do not get listed, regardless of access and visibility settings.
{% endhint %}

### Search projects on the mobile app

On the mobile app, all the projects are shown when searching (otherwise it would be impossible to download them) but **PRIVATE** projects show a lock instead of the logo and can be downloaded only after successful authentication by project members.

{% hint style="warning" %}
TRASHED projects do not get listed, regardless of access and visibility settings.
{% endhint %}

<figure><img src="/files/0FfwyT5sAUGedb4EJATJ" alt=""><figcaption></figcaption></figure>


# Viewing Entries

## Viewing entries

Entries collected for a project can be view in tabular format or on a map (only if there are any locations for that form or branch).

From the project home page click on "View Data".

![](/files/5bCfAV4r5f5Rf0VGerlK)

Data are visualized as a table or a map:

<figure><img src="/files/lRy1gBOuYOBmZcQ766B5" alt=""><figcaption></figcaption></figure>

## Viewing entries with media files

{% hint style="warning" %}
For **PHOTO** questions, if there is a placeholder thumbnail that looks like the Epicollect5 logo in black and white colours, it means **PHOTO** files were not synced.

Syncing data is a two steps process, please read [**how to upload entries.**](/mobile-application/upload-entries)
{% endhint %}

<figure><img src="/files/ZHj5vxFSwvDnzQRVn27k" alt=""><figcaption></figcaption></figure>

Audio and Video questions will show a button to play the media, but if the media file is not synced, an error message will be displayed when trying to play the file.

![File not synced yet](/files/C3qIcZz7yspsSxDHG9Ba)

You can view **a single entry as a table** by clicking on the "eye" icon on the left of each data row:

![](/files/oCXAKbxyGlTzmdHeHkwb)

![](/files/O09DZyiogAhl9IF2KIEF)

If there are any locations for the selected form, view them on a map:

![](/files/A07dpEZKthiTwzFKG4Br)

You can change the map style according to your needs:

* Carto
* Contrast
* Terrain and
* Satellite
* OpenStreetMap

![](/files/ucLGeKvKLo6HI2oJ8BSB)

Open the left panel to get some view options:

![](/files/g73DzV3S0zH2lBuieept)

You can filter your data set by dates, select a different location **question** to view, and select a multiple-choice question (like dropdown, radio. or checkbox) to trigger the pie chart distribution clusters.

![](/files/6xfnsPDgQspz6UM809QA)

For example, let's see the distribution for the question "*What is your favourite colour?*" of the **EC5 Demo Project.**

![](/files/RgibkkIVOLGCIhaFyzlo)

To view a single entry on the map, zoom in and click on a single marker:

![](/files/lY2Tyeq6PZgVroybbp9f)

If the project contains **multiple forms**, use the dropdown at the top left to select the form you want:

![](/files/XywULiF8tbMlJPFlMxtc)

## Viewing branch entries

If the project has got any branches, click on the branches total number (on the form entry row) on the table to list the branch entries per each single branch question:

![](/files/2mIsvwUbmf9G8LpvTsZU)

Clicking on "List your family members":

![](/files/M7Z9BX4BwqwF8Qdb8FjY)

## Viewing child entries

If your project has got more than one form, on the table view you will get an extra column with the immediate child form of the current form. For example, our [EC5 HIERARCHY PROJECT](https://five.epicollect.net/myprojects/ec5-hierarchy-project) has got a three forms hierarchy structure **CLASS > PUPIL > TEST**.

When viewing the entries for **CLASS**, you will get a column called **PUPIL** (which is the next form down the hierarchy, or the immediate child form):

![](/files/i8BixOItaCmEMsJ2mbVV)

To view the PUPIL for a CLASS entry, just click on the total number. In the example above, we have 2 PUPIL entries for the "Media" CLASS. Let's click on that number:

![](/files/iMC6W1VFlVAvLKnLLHhK)

As you can see, we are one level down the hierarchy, so the TEST column is displayed. We can go back to the CLASS entries with the back button at the top left, or go down further. Let's click on the number "2" to view the TEST entries for "MARCUS 11" PUPIL:

As you can see, we are at the bottom of the hierarchy. There is not any more child form, so no extra column is shown.

![](/files/eK8Ud7WBX164HYMZLCrs)

We are currently viewing the **TEST** entries for "Marcus 11" **PUPIL** of the "Media" **CLASS**.

You can go back to the CLASS entries by clicking on the "CLASS entries" back button in the primary navbar (white background), or go back to the PUPIL entries for the "Media" CLASS by clicking on the "Pupil for Media" back button in the secondary navbar (purple background).

## Viewing location questions on the map

On Epicollect5 you can have multiple location questions.

{% hint style="warning" %}
By default, the Epicollect5 dataviewer will plot the locations for your **first form and first location** question found in that form, from top to bottom.

You can choose to view whatever locations you like though.
{% endhint %}

Have a look at our example project [EC5 Locations Example](https://five.epicollect.net/project/ec5-locations-example)

Upon opening the dataviewer, the first form ("First Form") and first location question answers are shown by default:

![](/files/yLRXAs7wJwc0WA9tUUf3)

Click on the dropdown menu next to the project name and select "Second Form" to view the locations for your second form:

![](/files/OeYBOMQTTt16Jg243Gfv)

Both forms contain a branch, each with a location question. To view the locations for the branch question, click on the drawer button at the top left:

![](/files/tJI1zuxqF5S4vuxbzuG6)

On the panel, select "Second form branch location" from the "Location" dropdown menu:

![](/files/NtQju31eoyqylincola2)

The map will now show the "Second form branch location" locations:

![](/files/XzwdO4gAYSwgo3PwfWDT)

As you can see above, the dataviewer is displaying the locations for a branch question nested within a child form.


# Print Entries

Sometimes you might want to print some entries as a report. You can easily do that using the dataviewer "View" option and your browser print function (we recommend [Google Chrome](https://www.google.com/chrome/)).

{% hint style="info" %}
You can print one entry at a time.
{% endhint %}

Find the row with entry you would like to print and press the "View" button:

![](/files/ftgiUoCx5wc6boN5L8bc)

A table view for that entry will appear:

![](/files/OKjHu8rBpx5AE9MIRhMB)

We use Chrome for Mac; click on File > Print (if you are using a different browser just search for the print function)

![](/files/Nq57Iimri1dapBbTEXG0)

Just adjust the print settings to your preferences:

![](/files/XzUfCjvkORRxSjQYKqO2)

{% hint style="warning" %}
When printing, line breaks can appear in the middle of a row.

Due to the dynamic nature of Epicollect5 forms, the number of rows and each row length will often be different so what works for one form will break on another one.

We highly recommend to print as a PDF and tweak the printing settings to fit each use case. If that is not enough, a proper third party tool like Adobe Acrobat can be used for advanced editing in the exported PDF.
{% endhint %}


# Add & Edit Entries - Web

Entries can be added by using the Epicollect5 web app accessible from any browser.

### Add or edit entries for single-form projects

Let's have a look at our [**EC5 DEMO PROJECT**](https://five.epicollect.net/project/ec5-demo-project/data)**.** The project is **public**, so anyone can add entries via the web **as long as they are logged in**.

{% hint style="warning" %}
**Login Required**: Users must log in to add entries via the web. This requirement ensures accountability and security by verifying the identity of the person making the entry. It helps maintain data integrity by preventing anonymous or malicious entries.

**Reason for Login**: Authentication via the web is essential because it allows the system to track who is adding data, providing a layer of security and control over the entries. This is crucial for maintaining the reliability and accuracy of the collected data.
{% endhint %}

The project has a single form called **Form 1**.

**(**[**More on project roles**](/web-application/set-project-details)**)**

A public project accepts entries from users who are not involved in the project closely i.e they do not have any **role** in the project:

![](/files/jfWpYzIiJ0c2lUbl67LI)

Any public logged in user can add an entry using the "*Add Form 1*" button on the top right.

As the EC5 Demo Project is created by Oxford University staff, a public user CANNOT edit or delete other users' entries though.

{% hint style="warning" %}
Notice the delete and edit buttons are disabled.

If the user **OWNS** the entry though, those buttons will be enabled for that entry. More on this later.
{% endhint %}

Let's add an entry by clicking the "Add Form 1" button on the top right. It will open the Epicollect5 web app to add an entry:

![](/files/O6RN2I8jt642bet4HwMl)

Like the mobile app, you fill in the questions until you reach the end of the form. You then save the entry and click on either "Exit" or the project logo to go back to the data viewer:

![](/files/MT2GziQ7TKCjPD27UGHZ)

Now you can see the entry just added. Notice the edit and delete buttons are now enabled: **the user owns the entry**, so he has the right to delete it or make amendments.

If you were either a creator, manager, or curator for a project, you would see this:

![](/files/zgru1qrT1npOD0tbwPde)

The edit and delete buttons are enabled for **ALL** the entries as you have permission to perform those actions.

For a **private** project, the same rules apply, but users who do not have access to the project will not be able to access it.

### Add or edit entries for multiple-forms projects

If your project consists of many linked forms, you can add entries to the first form exactly as above.

For child forms, things are a bit different. Epicollect5 links the forms in a hierarchy structure ([**how to link forms**](/formbuilder/multiple-forms)). This means when adding a child form you have to select a parent entry first.

On our EC5 Hierarchy project, we have a structure like CLASS > PUPIL > TEST.

Adding a CLASS entry is exactly as explained above for a single-form project. To add a PUPIL entry you have to select a CLASS entry first. Just find the CLASS entry you want to add a PUPIL for and click on the "+" button on that entry row. (Remember, you need to be logged in to see that button)

The data editor will open the PUPIL form to add an entry.

![](/files/i8BixOItaCmEMsJ2mbVV)

If you are viewing some PUPIL entries, you can add an entry via the "Add Pupil" button on the top right:

![](/files/mxv8HbPg3L1LsJDhMbGX)

This is possible because the selected CLASS entry is "Media" so any PUPIL you add from this view will belong to that entry.

Using the same approach, you can add child entries further down the hierarchy. For example, TEST entries.

### Add or edit branch entries

Adding a branch entry is exactly like adding a child entry: find the row with the entry you want to add a branch for and on the branch column, click on the "+" button. Looking at our [EC5 BRANCHES PROJECT:](https://five.epicollect.net/project/ec5-branches-project/)

To edit the branch, you can either edit the entry the branch belongs to or when viewing the branch entries, click on the edit button on the table row.

![](/files/zznN2MUPpMTCrVOmi9Ci)

### Edit entries from the map view

You can also edit an entry from the map view. Click on a marker to open the left sidebar and click on the edit button at the top left to edit the selected entry:

![](/files/C1vPMFHAwhXqPubufKuT)


# Manage Entries

Epicollect5 empowers you to handle your project data efficiently with intuitive controls. \
You can manage entry limits to control the volume of data collected, perform bulk deletions to quickly clear out all entries when testing out projects, and utilize bulk uploads to seamlessly import data into your project.&#x20;

These features are designed to give you flexibility, whether you’re clearing up space, organizing entries, or integrating additional data sources into your project.<br>

* Entries Limits
* Entries Bulk Deletion
* [**Entries Bulk Uploads**](/web-application/manage-entries/bulk-uploads)


# Entries Limits

Coming soon...


# Entries Bulk Deletion

Permanently delete all project entries. Only Creators can perform this action. The project must be locked, and deletion applies to one project at a time. Data is not recoverable—backup first!

{% hint style="danger" %}
Deleting project entries in bulk is permanent—**data cannot be recovered** once deleted.&#x20;

It is strongly recommended that a backup be performed before proceeding.
{% endhint %}

#### Requirements

1. The project must be set as **locked;** To maintain data integrity and avoid race conditions, the project must first be set to **locked** status before deletion can begin. This ensures that no new entries are added or modified during the process.
2. Only users with the **Creator** role can execute this operation. Additionally, deletion is restricted to **one project at a time** to prevent excessive server load.

<figure><img src="/files/ok6aJlwq5fCik5SVoQ8m" alt=""><figcaption><p>Manage Entries > Deletion > Delete</p></figcaption></figure>


# Entries Bulk Uploads

Upload entries from CSV files.

### Intro

On Epicollect5, it is possible to add entries to a project by uploading a `csv` file where each row is a valid entry for that project. This is particularly handy for those projects where the collection of data could be done by filling in a spreadsheet, for example.

Other use cases might be performing a bulk edit of existing entries or copying some entries from a master project to a cloned one.

{% hint style="danger" %}
To avoid any abuse of the bulk upload feature, `csv` files are limited to **1MB** in size, and bulk uploads are cut to **150 rows per file**. This is done to avoid the creation of any redundant data on our systems.\
\
Epicollect5 is primarily a platform to collect, aggregate, and export data. **Bulk upload via CSV is intended for completing datasets**, for example, when data was collected on paper or in Excel, and contributors want to add it to the platform.&#x20;

However, uploading tens of thousands of CSV entries that are already available on your side is unusual and will be flagged by our monitoring system.
{% endhint %}

{% hint style="danger" %}
Bulk uploads are available only for some question types; check the table below.
{% endhint %}

{% hint style="danger" %}
**Media files cannot be uploaded in bulk.**
{% endhint %}

### Question types compatibility

| Question Type | Bulk Uploads                                           |
| ------------- | ------------------------------------------------------ |
| Text          | Yes                                                    |
| Numeric       | Yes                                                    |
| Phone         | Yes                                                    |
| Date          | Yes                                                    |
| Time          | Yes                                                    |
| Dropdown      | Yes                                                    |
| Radio         | Yes                                                    |
| Checkbox      | Yes                                                    |
| Search        | Yes                                                    |
| TextBox       | Yes                                                    |
| Readme        | **No, since it does not require an answer.**           |
| Location      | Party, only signed decimal degrees format              |
| Photo         | **No, media files cannot be uploaded in bulk.**        |
| Audio         | **No, media files cannot be uploaded in bulk.**        |
| Video         | **No, media files cannot be uploaded in bulk.**        |
| Barcode       | Yes                                                    |
| Branch        | Yes (not directly but its nested compatible questions) |
| Group         | Yes (not directly but its nested compatible questions) |

### Enable bulk uploads

By default, the bulk upload feature is disabled for a project. To enable it, go to your project details page and from there, *Manage Entries > Bulk Uploads.*

![](/files/Cobo6sOLj7qYxQ6A65GI)

Three options are available:

* NOBODY: basically the bulk upload feature is disabled for all the users.
* MEMBERS: only project members (aside from VIEWER roles) can bulk upload entries.
* EVERYBODY: anyone logged in to Epicollect5.

{% hint style="warning" %}
For **private** projects, choosing either MEMBERS or EVERYBODY does not make any difference since only project members can access the project.

Moreover, VIEWER roles are **never** allowed to perform bulk uploads.
{% endhint %}

If bulk uploads are enabled and the user has permissions, a bulk upload button is shown at the bottom right when viewing the entries.

![](/files/QzlTJDte64MIFDSDgOLL)

{% hint style="warning" %}
The bulk upload button **can be disabled**.

That means the user does not have the permissions to perform a bulk upload.

The button is also disabled when the currently selected view cannot accept bulk uploads directly, for example, a child form without any parent entry selected.

See *Child form bulk upload* for more info.
{% endhint %}

### Parent forms bulk upload

A parent form is the first form of a project (often the only one) and therefore it sits at the top of the hierarchy structure (see [**linking forms**](/formbuilder/multiple-forms)).

When viewing a parent form, press the upload button to open the bulk upload drawer.

![](/files/UGqygqnr0R8sQaCHDvx3)

The default mapping is automatically selected. The `csv` file headers must match the selected mapping (see [**mapping data**](/web-application/mapping-data) for more info).

Picking a valid file will trigger the upload, one row at a time. A valid`csv`file must have the proper columns to match the selected mapping. It is possible to download a blank template by clicking the download button of the "Current View Template" section in the upload drawer.

{% hint style="warning" %}
The csv file **MUST** have an extra\*\*`ec5_uuid`\*\*column, which is used as an internal control flag for entries.

For new entries, this column should remain empty, as only the header is necessary. However, for edits, please ensure that this column contains the UUID of the entry being edited.
{% endhint %}

![EC5 Demo Project csv file example](/files/KdvnHdfBEIdqNcMa4R6T)

Feedback is given on each row like so:

![](/files/cnxikFXhbBXUq3lV62PM)

You can expand a row to see the details about any errors by clicking the down arrow on each row that contains errors.

![](/files/W5dkI22M1XpqlQwa6kmx)

It is possible to filter out uploaded entries to view only the failed one and download a `csv` file of only failed entries.

![](/files/weyw29hEVLZzRsa8NnOO)

### Child forms bulk upload

Complex projects with more than one single form consist of a hierarchy structure with a parent > child relationship across forms.

{% hint style="warning" %}
To upload entries for a child form, a parent entry must be chosen first.
{% endhint %}

On the example project [**UK Education**](https://five.epicollect.net/project/uk-education) there is a hierarchy structure of three forms, UNIVERSITY > COURSE > STUDENT. To bulk upload COURSE entries, a UNIVERSITY entry **must** be selected first.

When viewing UNIVERSITY entries, click on one of the numbers of the COURSE column, (the total number of child entries acts as a button) to view all the child entries for that UNIVERSITY entry.

![](/files/zDi0B4hDei0aqj7Lfzf1)

All the entries uploaded will be linked to the parent "UCL" University entry.

![](/files/iHmyDt8k11l3ITrUQUxN)

![All COURSE entries uploaded successfully](/files/IwNSSmjv2RAi6etx4C7Y)

![There are now 3 COURSE entries for "UCL"](/files/5ECqM34qbmFf2tsMUbSe)

### Branches bulk upload

The procedure to upload entries to a branch is very similar to uploading entries to a child form. The user needs to select what entry the uploaded branch entries will be linked to.

On the example project [**Football Teams and Players**](https://five.epicollect.net/project/football-teams-and-players)**,** there is a single form TEAM and a branch PLAYER.

{% hint style="warning" %}
The csv file **MUST** have an extra\*\*`ec5_branch_uuid`\*\*column, which is used as an internal control flag for **branch** entries.
{% endhint %}

![Add "Player" branch entries to "Juventus"](/files/8NzxGhdIwGZdXQlhCEUL)

![Open drawer and pick file](/files/8NxNvxk1pwXp5azqVFfK)

![Csv file for branch entries](/files/XLzQVgUctYmRCPGxTT1F)

![All branch entries uploaded](/files/NAah5stkIm62bUpTH1ip)

!["Juventus" has now 4 "Player" branch entries](/files/Mbx8e4sPn386gCnu6sFG)

### Parent forms bulk edits

By using the bulk upload feature it is possible to perform bulk edits on the entries already uploaded. This can be done by downloading the entries which need to be amended, perform the edits with your favorite text editor (like Excel or Google Sheets), then re-upload the entries.

Each entry created on the Epicollect5 platform is given a universal identifier, a [**uuid**](https://en.wikipedia.org/wiki/Universally_unique_identifier), like `87dc71ea-1323-47ae-8acb-6002c66f08fd`. When entries are downloaded, all the identifiers are added to the exported dataset along with other metadata (See [**metadata**](/web-application/metadata)). When uploading entries in bulk, by providing these identifiers in the`csv`file, the system will look for a match. If a match is found and the user has the permissions to edit that entry, the existing entry will be updated.

For example, we have a project called People, with a single form PERSON asking just for the person's name. We have just a few entries and we would like to replace all the "Johnny" with "John".

![Both "Johnny" must become "John"](/files/gGncaWOMO1GkpnphjfrH)

We open the bulk upload drawer and we click on the "Current View Subset" download button to download all the entries in view.

![Get all the entries in view](/files/ZPaxrDGUYpebnKuRG3hy)

The downloaded file will look like below. Please note the **ec5\_uuid** column has all system identifiers of those entries.

![](/files/15A5EMCzUVRtrDbLUWOf)

After the edits, it will look like below. **We have not touched any of the metadata columns.**

![Changed only data in the "1\_name" column](/files/vuTszpfAf6rhRjgYJAOJ)

Uploading the edited file will update the existing entries. **Please note the double tick icon to indicate an edit**. (A new entry would get only a single tick).

![](/files/SPon52zZevpQNIBakLP2)

Entries to be edited in bulk can be filtered beforehand by using the dataviewer filter controls. For example, we can filter entries by name, like "Richard".

![We have only one entry matching the title "Richard"](/files/hWTD81NhoClbFsh0NZMk)

If we get the "Current View Subset" `csv` file, it will contain only one entry, "Richard".

![](/files/jqmP6y8yMRgQOorTzxIe)

![](/files/hnm1xEpvur68w4mGmD0d)

We can change "Richard" to "Rick" and upload the same file to perform the edit. We leave the metadata columns as they are.

![](/files/jgoFsbESWPpwnNrhiG4v)

![](/files/qtOafZswuGm0BvYGdN2y)

![Entries updated](/files/mlc6k91iBudXmNJHDVgL)

### Child forms bulk edits

The procedure to bulk edit entries of a child form is almost identical to the one used to edit entries of a parent form. The only extra step is selecting the correct parent entry.

On the [**UK Education Project**](https://five.epicollect.net/project/uk-education)**,** we want to edit the COURSE child entries of "Kingston University" UNIVERSITY entry. (The hierarchy structure is UNIVERSITY > COURSE).

![Select "Kingston University" child entries](/files/huNLu96djmSnxlPpgNtj)

![Download entries in view](/files/qwkP64AGYnLz1GgJy3n1)

![Entries before the edits](/files/bupf7MBmH3a2mHGvhsbI)

![Entries after the edits, changed all "2\_Code" values](/files/SAqmyndEMcr5ZaiVTJnn)

![COURSE child entries updated](/files/NWhky41ikpmNemPNvBS8)

{% hint style="warning" %}
**Selecting the correct parent entry is crucial**.

If we try to upload the same file to another UNIVERSITY entry, like "Oxford University", an error will be shown because the child entries **are linked** to the "Kingston University" entry, see below.
{% endhint %}

![Selecting the wrong parent entry, the hierarchy relationship is incorrect](/files/Vbz4ukNlQeTS23vWhvcS)

### Branches bulk edits

The procedure to bulk edit entries of a branch is almost identical to the one used to edit entries of a parent or child form. The only extra step is selecting the correct entry which contains the branch entries that need to be amended.

On the example project [**Football Teams and Players**](https://five.epicollect.net/project/football-teams-and-players)**,** there is a single form TEAM and a branch PLAYER. We will change the PLAYER branch entries of "Juventus", the players need to be listed by surname.

![Get "Juventus" branch entries](/files/3ko1JWca7ldSBiS3CPQG)

![Download branch entries in view](/files/H8YIGrMWpC6oztQy99cJ)

![Branch entries before the edits](/files/vO9arDSL9M0FGIKV9Ig4)

![Branch entries after the edit](/files/FhsfqWW5I4pW4iSAOYda)

{% hint style="warning" %}
**Selecting the correct entry is crucial**.

If we try to upload the same file to another TEAM entry, like "Barcelona", an error will be shown because the branch entries **are linked** to the "Juventus" entry, see below.
{% endhint %}

![Selecting the wrong entry, the branch relationship is incorrect](/files/3e7iTXbcjGWNX6UtoVcq)

### Current View Template file

The Current View Template file is an empty csv file with the correct headers for the currently selected form or branch. Useful for collecting new entries from scratch.

### Current View Subset file

The Current View Subset file is a csv file that contains all the entries and their metadata (like`uuid`system identifiers) for the currently selected form, child form, or branch. Useful for editing entries in bulk.

{% hint style="success" %}
It is possible to use the dataviewer to filter out entries by title and creation date. The downloaded subset file will contain only the matching entries.
{% endhint %}

### Location questions bulk upload

Answers to LOCATION questions can be uploaded in bulk only in **signed degrees format.** Epicollect5 splits answers to LOCATION question on both the mobile and the web app in three separate columns:

* altitude (prefixed `lat_`)
* longitude (prefixed `long_`)
* and accuracy (prefixed `accuracy_`)

The uploaded `csv`file must have valid data in each of those three columns, see below example taken from [**EC5 Demo Project**](https://five.epicollect.net/project/ec5-demo-project).

{% hint style="success" %}
If location data are not available, those columns can be left empty. It will still be a valid entry as LOCATION questions **cannot be required.** [**More on LOCATION questions**](/mobile-application/location-questions)**.**
{% endhint %}

![](/files/jREJRZqtZqAqIbktVKzm)

### Copy entries across projects

Using the bulk upload feature it is possible to copy some entries from an original project to its clone.

{% hint style="warning" %}
It is not possible to copy media files, only text-based data

Moreover, entries can be copied up to **150 at a time** given the file limitations of bulk uploads. These limitations are in place to avoid any abuse of our systems and the creation of redundant data.
{% endhint %}

When entries get downloaded from Epicollect5, the `csv` file will contain the `uuid` identifiers of those entries,

* **`ec5_uuid`** for entries
* **`ec5_branch_uuid`** for branch entries

![Entries downloaded have uuid identifiers](/files/N9osEz2sDq7prmAWaBw9)

To upload those entries to a cloned project as new entries, the identifiers need to be cleared otherwise they will clash with the existing entries already in the system.

![Empty ec5\_uuid column for new entries](/files/zFZLE97L3aTqWuUn3qtd)

![Empty ec5\_branch\_uuid column for new branch entries](/files/2BhhxF3MHLbWHN5HcEEJ)

Once the identifiers are cleared the entries can be uploaded to the cloned project.

{% hint style="danger" %}
Trying to bulk upload entries with identifiers (`uuid`) already on the system will give an error.
{% endhint %}

### Import errors

Sometimes, depending on the mapping you are using, you might find issues when importing entries with valid values.

We highly recommend the use of a simple mapping for exporting and importing. Values that can cause troubles usually contains commas, double quotes or special symbols.


# Entries Ownership & Metadata

In Epicollect5, understanding the metadata associated with entries, especially the email field, is important when managing ownership and privacy settings.

**1. Metadata for Private Projects**

* **Private Projects**:\
  When a project is set to **private**, the system collects the email address used by the contributor to authenticate when submitting data, per each entry submitted.
  * This feature provides a layer of accountability and traceability for entries in private projects, allowing project managers to identify who submitted the data.
  * The email metadata is included in **entry exports and downloads**, enabling project managers to track ownership and verify submissions effectively.&#x20;

***

#### **2. Metadata for Public Projects**

* **Public Projects**:\
  In contrast, for public projects, the **email field is not collected or exposed** in the metadata.
  * The absence of email information ensures that contributors' privacy is maintained, as public project data are accessible to anyone.
  * This means that entries from public projects cannot be linked to specific users or email addresses.

***

#### **3. Transition from Public to Private**

* **Impact on Metadata During Transition**:\
  If a project starts as public and is later switched to private, the email information will not be available for entries submitted while the project was public.
  * This is because, during the public phase, email data was not collected, aligning with the platform's design for public project privacy.
  * Any new entries submitted after the project becomes private will include the email metadata, but older entries will remain without this information.

***

#### **Practical Implications**

1. **Data Ownership and Accountability**:\
   For private projects, the inclusion of the email field allows project managers to ensure data integrity and accountability, as they can trace entries back to authenticated contributors.
2. **Privacy Considerations**:\
   Public projects prioritize user privacy by not collecting personal identifiers like email addresses, making them suitable for use cases where anonymity is preferred.
3. **Project Configuration**:\
   It is important to carefully plan whether a project should be private or public at its inception. Transitioning a project from public to private may create a gap in metadata consistency, as older entries will lack email data.

#### [**More info about metadata**](/web-application/metadata)


# Manage Users

Epicollect5 offers granular access control to projects and their data.

The granular access control enables users' roles and responsibilities to be set so that individuals are given access only to relevant areas or functions of the system.

## Sign Up Options

### Google Account

We DO NOT store any users' credentials, only the name, email, and profile picture (if available) after a user is successfully authenticated with Google.

{% hint style="info" %}
A Google account accepts any type of email, not only Gmail. You can link an existing email to a Google Account. [**Here is how.**](https://support.google.com/accounts/answer/176347?co=GENIE.Platform%3DDesktop\&hl=en) **Unfortunately, with multiple emails, Google will always log you in with the Gmail one**. The best approach would be to create a new Google Account with your **non-Gmail** email, add that account to your project as a MANAGER user, and then transfer the ownership to that account.

**Please make sure you can log in with both accounts before transferring the ownership.**
{% endhint %}

### **Apple Account**

On supported iOS devices (running iOS 13+), users have the option to sign in with Apple.

{% hint style="info" %}
Available since version 4.0.0
{% endhint %}

{% hint style="warning" %}
Please be careful when signing in for the first time. The user email is the unique identifier within the Epicollect5 platform; therefore, it is usually recommended that you share your personal email when logging in instead of using the one provided by Apple.
{% endhint %}

### Email

There is also the option to log in by providing an email.

&#x20;A one-off six-digit code is sent to that email's inbox.

{% hint style="success" %}
Any email can be used, not only Google or Apple accounts
{% endhint %}

{% hint style="warning" %}
The one-off code **expires** **after 30 minutes** and can be **used only once.**

Once authenticated, each session will last 14 days.\
When the session expires, a new one-off code must be requested.
{% endhint %}

{% hint style="warning" %}
To prevent abuse of our services, a rate limit is implemented.

A single IP address is restricted to sending a maximum of 10 authentication requests every 30 minutes when the email authentication flow is used.

This approach helps to control the load on the system, prevent denial of service (DoS) attacks, and ensure fair usage across all users.

This limit does not apply to the Google and Apple authentication flows.
{% endhint %}

## Account Verification

When using multiple providers with the same email, users will be asked to confirm their identity. A six-digit code will be sent to their inbox the first time they try to use the same email with a different provider. (e.g., first with an email-only login and then with Google).

## Profile Page

Users can view which email they are currently logged in with and which account providers they have verified on their profile page. To access the profile page, users need to click on their name on the top navigation bar.

![](/files/oNpQQatOe50i1UL4Y774)

## Project roles

There are 5 roles available:

| Role      | Description                                                                                                                                                                                                                                                                      |
| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| CREATOR   | A project creator originally created the project and has full access to the project, including viewing, editing, deleting and uploading data via the mobile client/web. A creator can add/remove any other type of users to the project, except for other creators.              |
| MANAGER   | A project manager has full access to the project, including viewing, editing, deleting and uploading data via the mobile client/web. A manager can add/remove curators and collectors to the project, but not managers. A manager can alter the project setting, even the forms. |
| CURATOR   | A project curator has high access to the project, including viewing, editing and uploading data via the mobile client/web. A curator CANNOT alter the project settings or the forms. A curator cannot add other users to the project.                                            |
| COLLECTOR | A project collector has basic access to the project, including viewing and uploading only their own data via the mobile client/web. This means COLLECTOR A cannot access entries uploaded by COLLECTOR B, and vice versa. A collector cannot make any changes to the project.    |
| VIEWER    | A project viewer gets ***READ ONLY*** access to a project. Viewers can view all the data collected by any other user but they cannot make any changes to the data or access any of the project settings.                                                                         |

## Project Access

If a project has access type '**private**', user access will be based on their roles, as described above, provided they have been successfully authenticated by the server. Viewing, editing, and deleting a project, and deleting entries on the server, will be based on the above roles and require authentication.

If a project has access type '**public**', then any user can view and upload data to that project via the mobile client, without any authentication, but editing and deleting a project (or entries) on the server will be based on the above roles and still requires authentication.

## Adding Users to a Project

Users can be added to a project for collaboration.

Users can add other users (with different roles) to a project depending on their user role, see the table below:

![Only higher roles can add or remove lower roles](/files/bpTZf0EeJrf1wLqCpkZN)

To add a user to a project, on the project details page, click on "Manage Users". Users are divided by roles, and to add one, just click on "Add User" on the right.

![](/files/6tAM89WaXVkKTCh0i5FO)

Enter an email of an existing Epicollect5 user and select the role you would like to set the new user to:

![](/files/YtVpHkFLNmHyuqadjirV)

{% hint style="info" %}
When you add a user to a project, the system does not send any notification email to that user. However, once the user logs into Epicollect5, access to the project will be granted based on the role specified **if the email address matches.**
{% endhint %}

### Add users in bulk

It is possible to add users in bulk by uploading a `csv` file of user emails, like the one below.

![](/files/JTWluGz9Sv3KvUx0TlnZ)

Click on the arrow to show the context menu and click on "Import Users csv".

![](/files/DT5ktTXnp0eSg7UjcPyg)

Pick your `csv` file

![](/files/Ve2S9CkwoWlAVXy7t77l)

Pick the column which contains the email addresses, select the role to be applied to your new users, and then click on import.

![](/files/j47SqCnuljJwswL7Gsig)

Your users are now imported.

![](/files/L4tQhKNjU4hYhAVUVN1C)

### Switch user roles

At any time, you can upgrade or downgrade user roles and capabilities.

Find the user you would like to upgrade, for example, from COLLECTOR to CURATOR and click the "Switch Role" button.

![](/files/1UA0ZeVogUqbLw5eC8Ew)

The user is now a CURATOR

![](/files/10m6Jcl4dIOURmxQiWrC)

### Remove users in bulk

Users can be removed in bulk by role.

For example, to remove all the COLLECTOR users, go to the "Collectors" tab and open the context menu on the right.

![](/files/y7XF4SwTDdnTswBSaKQU)

### Export users

Users can be exported as a `zip` file containing the user emails as one `csv`file for each role and a global one with all the users, regardless of the role.

![](/files/ew9G3OEzumdHzOdLV7Rb)

![](/files/aScWzs0dhyWZ2BgjOk1O)


# Transfer Ownership

Transfer the ownership of projects to other users

A project CREATOR **can transfer the ownership of a project** to one of its MANAGER(s) and become a MANAGER himself.

The newly assigned CREATOR can then remove the old one (now a MANAGER) at any time.

Go to the project details page and click on "Manage Users":

![](/files/iCEEwvAWzmtgSfIxRXDU)

If you have a CREATOR role, click on the "TRANSFER OWNERSHIP" button:

![](/files/b2byoFDrPwu7V6Q7cjtK)

Select a MANAGER from the list and click on "CONFIRM":

{% hint style="warning" %}
Remember you MUST have at least one MANAGER.
{% endhint %}

![](/files/F6ztcvQEXYi3ivOw90ma)

You are now a MANAGER.


# Manage Entries

### Limits

Per each project is possible to set a fixed limit of entries per each form or branch. To access this feature, go to your project details page and click on "Manage Entries". [More on edit project](/web-application/set-project-details).

![](/files/RvcI33cp084ji0RC7zcT)

We set up an example project called [EC5 limit entries](https://five.epicollect.net/project/ec5-limit-entries). The project has a two forms hierarchy, PERSON > PHONE NUMBER.

We added a branch called "Pets" to the PERSON form. As you can see from the screenshot above, we limit the total number of entries of PERSON to 2 ("Set Limit" checkbox **ticked** and "Limit To" set to **2**). We already uploaded those 2 entries to the server (have a look) so the system will not accept any more entries for the PERSON form.

We did not set any limits to the PHONE NUMBER form. To do that, just **DO NOT** tick the "Set Limit" checkbox

On the PERSON form, we set a limit to 2 branch entries. This means each PERSON entry can have a maximum of 2 "Pets" branch entries.

If we set a limit on the PHONE NUMBER form, let's say to 5, the system would accept 5 PHONE NUMBER entries per each PERSON, as **it validates the total against the hierarchy structure**, as usual on Epicollect5.

This is all you need to do. If you set a limit and you already have more entries than the limit set, you will get an error prompt. To see how many entries you have per each form, [view the data for that project](/web-application/viewing-data).

{% hint style="info" %}
If you set a limit, the maximum can be 50.000 entries. This is to force people to get the project organized by splitting it in smaller projects if needed. If you need more than 50.000 entries per project, do not set any limit. If you would like to stop the data collection when you reach for example 80.000 entries, you can lock a project **(**[**More info**](/web-application/set-project-details)**)**
{% endhint %}

To see how the mobile app behaves when limits are reached, [have a read here](/mobile-application/entries-limits).

### Deletion

Entries for a project can be deleted at once.

{% hint style="warning" %}
This action cannot be undone so proceed carefully.

Always do a backup of your data!
{% endhint %}

![](/files/jEGEscu498IoxWL4TNYi)


# Data Mapping

Data Mapping is an exclusive Epicollect5 feature where you can assign a **short identifier** to each question or to each possible answer. You will have access to this functionality if your role is either **CREATOR** or **MANAGER**.

This is particularly useful when you want to download your data in CSV format and you need the column name to match an existing identifier or some possible answer to be mapped against a number or a code. It is also possible to exclude (**hide**) some questions.

For example, a question like *"What is your name"* can be mapped against just *"name"*

For possible answers, if the options are like "Red", "Blue" and "Green", they could be mapped against "R", "B", "G".

{% hint style="info" %}
Each short identifier (the 'Mapping To" field) for **questions** must be from 1 to 20 chars in length and can contain only alphanumeric and underscores `"_"`

For **possible answers**, up to 150 chars and any char is accepted aside from `'<'` and `'>'`
{% endhint %}

You can create up to **3 custom mappings** and set one as the default, the one that will be used when downloading or accessing data via the API for any user who has got access to your data.

{% hint style="info" %}
The default mapping, called "**EC5\_AUTO**", is generated automatically by the system and cannot be modified.
{% endhint %}

See the following screenshot, showing a custom data mapping named "Map Test" we created for our [EC5 Demo Project](https://five.epicollect.net/project/ec5-demo-project)

![](/files/Ec9lADOsRvRzLNjZ02N5)

The tabs at the top allow you to navigate across your mapping or create a new one.

Below the tabs on the right-hand side, there is a selection dropdown to select the form to make the edits to.

Below the tabs on the right-hand side there are four action buttons:

1. **Delete**: deletes the currently selected mapping
2. **Rename**: renames the currently selected mapping
3. **Make default**: set the currently selected mapping as the default one (it will be "pinned") so it is loaded by default when you reload the page, and it is selected by default when downloading the data
4. **Update**: saves all the changes you make to a mapping

Here is the downloaded data set `csv` selecting "Map Test":

![](/files/582hGfpxHKwmXphfOrfD)

## Mapping child forms

By default, the first form of your questionnaire is shown. To switch to a child form, click on the dropdown button at the top left and pick the form you want:

![](/files/NkU6ukGs4Oatt3VWGxah)


# Downloading Data

Download project data as csv or json files

{% hint style="warning" %}
Users must be logged in to download data, even if the project is public.
{% endhint %}

To download data for a project, go to the project home page and click on "View Data":

![](/files/QPcXHbcC2wZzXLXCmAu8)

On the navigation bar at the top, click on "download" to open a left side panel with the download settings:

![](/files/30GRsqKcYp3yuZzJqaj5)

A panel will slide in from the left:

![](/files/v6vJCz0R8OJo7yYrgide)

### Select the mapping

(The default mapping is always pre-selected). [**More on mapping data**](/web-application/mapping-data)

{% hint style="success" %}
if you do not know what mapping is, just ignore it.
{% endhint %}

Pick `JSON` or `CSV` format.

### Select date range

You can also select which timeframe you are interested in.The default is "LIFETIME" to get all the data since the project was created.

![](/files/TWbI0WImZedMFIbdqx9X)

If you need a custom timeframe, select "CUSTOM" and pick the start and end date.

![](/files/q7pdG8aAsFK0BETrLLgI)

Click on the project zip file to download it.

{% hint style="info" %}
If you have more than one single form and branches, you will get separate files: one file per each form and one file per each branch.

How to merge the data (if needed) il left to the user. For example, using Excel, there are several ways to merge tables based on common columns (in Epicollect5, look at **ec5\_uuid**, **ec5\_parent\_uuid** for child forms and **ec5\_branch\_owner\_uuid** for branch forms), [**have a look at this link.**](https://www.extendoffice.com/product/kutools-for-excel/excel-merge-tables-by-column.html)

An example using Google Sheet can be found [**here**](/common-use-cases/consolidate-data)**.**
{% endhint %}

{% embed url="<https://www.youtube.com/watch?v=UvPw9l54P14>" %}

### Split data into multiple columns

Checkbox questions can have multiple answers. Epicollect5 saves the answers to a question in a single column in`csv`format like "one, two, three". If you need a column per each answer, It can be easily done in Google Sheets ([**see how**](https://support.google.com/docs/answer/6325535?co=GENIE.Platform%3DDesktop\&hl=en)) or Excel ([**see how**](https://support.microsoft.com/en-us/office/split-text-into-different-columns-with-the-convert-text-to-columns-wizard-30b14928-5550-41f5-97ca-7a3e9c363ed7)).


# Downloading Media

If your project is **public**, a direct URL for each media file is included in the `csv` or `JSON` file generated when data are exported, enabling easy download and access.  [**See Downloading Data**](/web-application/downloading-data)\
However, if your project is **private**, only the file name is provided, as there are no public URLs available for privacy reasons.

To **view media files** from a private project, log in to the **Dataviewer**. You can browse, preview, and download individual media files (photos, audio, videos) using your web browser. [**See Viewing entries**](/web-application/viewing-data)

{% hint style="warning" %}
We are aware that bulk downloading can streamline workflows and have added this feature to our development roadmap for future updates.
{% endhint %}

**For developers:** If you're comfortable with coding, you can **automate media retrieval** using our official API. Detailed documentation on fetching media files is available here:  [**Epicollect API - Get Media**](https://developers.epicollect.net/media/get-media)

**Why no direct URLs for private media?**\
Private project media files are secured behind authentication protocols. Attempting to access them via a direct URL will result in a **404 Not Found** error because the files are not publicly exposed to the internet. This ensures that sensitive data remains protected, aligning with our commitment to user privacy and data security.

### Export media files from the device

You can export media files directly from the device and sync them with a cloud service of your choice. [**Learn more**](/mobile-application/export-entries-mobile).


# Metadata

Per each entry collected, Epicollect5 add some metadata automatically.

| name                     | description                                                                                                                                                                         |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ec5\_uuid                | The unique identifier of the row of data.                                                                                                                                           |
| ec5\_parent\_uuid        | For child forms only, the unique identifier of the parent row of data.                                                                                                              |
| ec5\_branch\_owner\_uuid | For branch forms only, the unique identifier of the form entry that owns the branch row of data.                                                                                    |
| ec5\_branch\_ref         | The name of the column in your main form that lists how many branches you have for each entry.                                                                                      |
| updated\_at              | UTC timestamp when the entry is uploaded to the server. Subsequent uploads, due to editing for example, will update this value.                                                     |
| created\_at              | UTC timestamp when the entry was created.                                                                                                                                           |
| created\_by              | **Private projects only**, the email of the user who created the entry (if available, if a project was initially set as public, those public entries will not have any user linked. |

## Location questions

Each location question is split into six parts, with the prefixes:

* **lat\_** (latitude)
* **long\_** (longitude)
* **accuracy\_** (accuracy)
* **UTM\_Northing\_** (UTM Northing)
* **UTM\_Easting\_** (UTM Easting)
* **UTM\_zone\_** (UTM Zone)

{% hint style="success" %}
The location data are provided in both [**decimal degrees**](https://en.wikipedia.org/wiki/Decimal_degrees) (to 6 decimal places precision) and [**UTM**](https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system) format.
{% endhint %}


# Clone Project

Easily create duplicates of project structures

Sometimes you have a project you would like to copy and just do some tweaking instead of creating a new one from scratch.

{% hint style="warning" %}
Cloning will perform a copy of the project definition, the mapping, and (optional) the users of a project.

**Data are not copied**.
{% endhint %}

On the project details page, just click on "Clone"

![](/files/CAQSNJtq0n2NQzkTKSQe)

Type a name for the cloned project and click clone.

There is also the option to clone all the users of the original project.

{% hint style="info" %}
Please be aware cloned projects are always assigned to the original CREATOR(s) of a project.

If you would like to use someone else's project as a template please have a look at [**how to export and import projects.**](/web-application/import-and-export-projects)
{% endhint %}


# Rename Projects

Unfortunately, a project cannot be renamed directly.

You could [**clone your project** ](/web-application/clone-project)and give the cloned one a different name, then delete the old one.

{% hint style="danger" %}
**Be aware: data will NOT be ported over.**

Make a backup of your data before deleting a project.
{% endhint %}


# Import & Export Projects

Export just the project definition

Sometimes you might want to share a project with someone not part of your organization, or just use a project as a template, and so on. In that case, [**cloning**](/web-application/clone-project) is not an option since that will always assign it to the original **CREATOR** of the project.

{% hint style="warning" %}
**Exporting a project** does not export its [**mapping**](/web-application/mapping-data) or its [**users**](/web-application/manage-users). If you need that, look at project [**cloning**](/web-application/clone-project) and at [**how to transfer project ownership**](/web-application/transfer-ownership).
{% endhint %}

## Export a project

Go to your project details page and click on API:

![](/files/6BzbU2mOMumEfJqVoGZy)

Scroll at the bottom of the page and click on "Download Project Definition". Save the file in a handy location.

![](/files/SQsJAIhQyy5mfWGRJyz8)

## Import a project

To import a project, log in to Epicollect5 and click on "Create Project":

![](/files/LnVpilf6LsAEmTF159Jw)

Then click on the "Import Project" tab:

![](/files/XEjU406kxmzO9EBp7nCs)

Give your imported project a name, pick your Epicollect5 project file and click on "Import Project".

{% embed url="<https://www.youtube.com/watch?v=Z6g_1D2oHmk>" %}


# Web Link to Add Entries

You might want to send an email link to your collaborators to add entries from their device (even a laptop or desktop) by using the web application, without having them to download the mobile app and search for your project.

{% hint style="warning" %}
Adding entries using the web application requires the users to **login** beforehand.

**Epicollect5 does not support anonymous data collection from the web**.
{% endhint %}

The link will be always in the form of`https://five.epicollect.net/project/{project-slug}/add-entry`

To link your project you just need to replace the *{project-slug}* with your own project slug (which is your project name in a URL friendly version, i.e. all lowercase and with dashes (-) instead of spaces). Just have a look at your project home URL.

For example, to add entries for the **EC5 Demo Project**, click on:

[**https://five.epicollect.net/project/ec5-demo-project/add-entry**](https://five.epicollect.net/project/ec5-demo-project/add-entry?form_ref=b963c3867b1441b89cb552b982f04bc8_5784e0609397d\&amp;parent_form_ref=\&amp;branch=\&amp;branch_ref=\&amp;branch_owner_uuid=\&amp;parent_uuid=\&amp;uuid=\&amp;input_ref=\&amp;per_page=50\&amp;sort_by=created_at\&amp;sort_order=DESC\&amp;map_index=0\&amp;filter_by=\&amp;filter_from=\&amp;filter_to=\&amp;format=json\&amp;headers=true\&amp;title=\&amp;page=1)

After you are logged in, you can add an entry straight away.

![](/files/yuYaYxUFq9UU62y3uRT9)


# Projects as App Links

### Projects App Links

An **App Link (or Universal Link)** is a special type of web link (**URL**) that directly opens a specific page or content within a mobile app, rather than just opening a website in a browser. It is designed to provide a seamless user experience by deep-linking into an app if it is installed on the device. If the app is not installed, the link may redirect to the app store or a web version of the content.

In the context of **Epicollect5**, the App Link provided per each project like

`https://five.epicollect.net/open/project/ec5-demo-project`

is configured to open the Epicollect5 app and load the specified project directly, saving you the effort of manually searching for or importing the project. This is especially useful for quickly accessing and working with projects on mobile devices.

For App Links to work the device must have the app installed. If the app is not installed, the link may open in a browser instead.

### App Link Visibility

Project creators in Epicollect5 have the flexibility to control whether the **App Link** is visible on the project's home page. If they choose to enable this feature, an additional button will appear on the project page. When users click (or tap, if accessing via a mobile device) this button, it will display two convenient options:

1. **A link to tap**: This is a direct App Link that, when tapped, opens the Epicollect5 app on the Android or iOS device and automatically loads the project.
2. **A QR code to scan**: This QR code can be scanned using the device's camera or a QR code scanner, which will also open the Epicollect5 app and load the project seamlessly.

This feature is designed to make it easier for users to access and work with projects on their mobile devices, while giving project creators control over how the App Link is shared and displayed.

### App Links & Project Privacy Settings

App Links in Epicollect5 are always **publicly accessible**, meaning the link itself can be shared or accessed by anyone. However, the **privacy settings of the project** still apply, ensuring control over who can actually load and interact with the project in the mobile app.

* **Public Projects**: If a project is set to public, anyone with the App Link or QR code can load the project into the Epicollect5 app and access its content.
* **Private Projects**: If a project is private, only members of the project (those with the appropriate permissions) will be able to load and access it via the App Link or QR code. Non-members will be unable to view or interact with the project.

{% hint style="warning" %}
**Why are App Links public?**

App Links must be publicly accessible to function properly. If they were private, attempting to open the link for a private project would likely result in a **404 error** (page not found). By making the App Link public, it ensures the link works seamlessly while still enforcing the project's privacy settings.

**What information is exposed?**\
Only the **project name** is exposed through the App Link. No other project details, data, or metadata are shared, ensuring the privacy and security of the data.\
\
**Alignment with Mobile App Project Search**

This is not a new change—project names have always been visible through the Epicollect5 mobile app’s search feature where private projects still appear in search results, but only the project name is shown. Any attempt by a non-member to load a private project—whether through an App Link, QR code, or search—will fail, maintaining the privacy and security of the project.

The App Link simply provides a more convenient way to access projects without manual searching. Even if someone guesses or reconstructs an App Link, they still need the correct permissions to load and access the project.
{% endhint %}


# Intro

Epicollect5 provides an intuitive and easy to use drag & drop form builder.

{% hint style="warning" %}
The formbuilder requires a mouse or trackpad so touch device like iPads or Android tablets are not supported yet. We therefore recommend to build your form(s) on a desktop or laptop.

A minimum screen width of **1024 px** is also required to be able to show all the user interface controls.
{% endhint %}

Currently, Epicollect5 allows a maximum of **300** questions per a single form, and a maximum number of **5** linked (hierarchy) forms.

The form builder features a three columns layout:

* Left column: the available inputs
* Middle column: the inputs added to each form
* Right column: the currently selected input settings

![](/files/FIrDWL1IvpaM3U32ZTnL)

By default, each input is shown on a single screen on the mobile app. This allows space for the popup keyboard and the question at the same time. You might want to have more than one question on a page, in that case just use a [**group**](/formbuilder/groups).

{% hint style="warning" %}
Remember, **you cannot set jumps on inputs within a group**, just on the group input. [**More on jumps.**](/formbuilder/jumps)
{% endhint %}

### Video Tutorials

{% embed url="<https://www.youtube.com/watch?v=w3s9j8_Die8&ab_channel=GuidovanHofwegen>" %}

{% embed url="<https://youtu.be/IWWJRD4yfTk>" %}


# Languages and Translations

#### Forms and Data Collection

You are welcome to use any UTF-8 language for your forms. This flexibility allows you to create and manage forms in a wide range of languages.

#### Mobile App User Interface

The user interface (UI) of the mobile app has been translated into the following languages:

* **English**
* **Italian**
* **French**
* **Spanish**
* **Polish**
* **Portuguese**
* **Catalan**

If you are using a language other than the ones listed above, please note the following:

* **Form Questions**: The questions and content within your forms will be displayed in the language you have selected.
* **UI Elements**: Despite the form translations, the buttons, labels, and other UI elements of the mobile app will still appear in English.

{% hint style="warning" %}
The app's language is not manually set. If your phone uses a language other than English and a translation is available, the app's UI will automatically display in that language. Please note that only the app's buttons and labels will be translated; your forms and questions will remain in the language you originally wrote them in.&#x20;
{% endhint %}

#### Contributing Translations

If you notice that your preferred language is not yet supported in the mobile app or if you would like to contribute translations for a missing language, we welcome your contributions!

#### Where to Find Language Files

To access and translate the language files for the mobile app, [**please visit this repository**](https://github.com/epicollect5/epicollect5-language-files). The files are organized and available for you to translate into your desired language, and instructions are provided.&#x20;

### Translation errors

Please report any translation errors to our Community page at [https://community.epicollect.net](https://community.epicollect.net/)


# Question Types

There are several question types available to use

### Text

A simple text question. It accepts answers up to 255 chars.

### Numeric

A question that allows only numbers (integer or decimal).

It will use a numeric keyboard layout on the mobile device. Integer by default, decimal can be selected in the formbuilder "Advanced" tab for that question. On some devices, the full keyboard is shown for decimal questions. It accepts answers up to 255 chars.

### Phone

A question that allows only numbers, will use a phone keyboard layout on the mobile device. It accepts answers up to 255 chars.

### Date

A question to enter a date, it will use a date picker on the mobile device. The value stored is timezone-independent. [More info](#more-on-date-and-time-questions).

### Time

A question to enter the time, it will use a date picker on the mobile device. The value stored is timezone-independent. [More info](#more-on-date-and-time-questions).

### Radio

Multiple-choice question, it will list all the possible answers immediately. Only one answer can be chosen. Maximum number of possible answers is 300, max length per possible answer is 150 chars.

### Dropdown

Multiple-choice question, it will show all the possible answers on a popup. Maximum number of possible answers is 300, max length per possible answer is 150 chars.

### Checkbox

Multiple-choice question, it will list all the possible answers immediately. Multiple answers can be chosen. Maximum number of possible answers is 300, max length per possible answer is 150 chars.

### Search

Show matching possible answers by typing. Maximum number of possible answers is 1000, max length per possible answer is 150 chars. Maximum 5 Search questions per project. [**More info.**](/formbuilder/search)

### Text Box

A big box to enter text on multiple lines. It accepts answers up to 1000 chars

### Readme

A question that does not require any answer, is useful to show hints or tips to users while completing the questionnaire or at the beginning of it as an introductory text. Maximum 1000 characters.

### Location

For geographic data, the answer will be the latitude and longitude provided by the device hardware in Decimal Degrees (DD) format, like the ones you find on Google Maps. Accuracy is also captured (the best value is usually 4/5 meters depending on the device). Both latitude and longitude values are rounded to 6 decimal places, providing a precision of up to 11.1 cm. UTM values are also generated when exporting the data.

[**More info on LOCATION questions.**](/mobile-application/location-questions)

### Photo

An image taken with the camera, or an image file picked by the one stored on the device.

### Audio

An audio recording using the device microphone.

### Video

A video recording using the device camera.

### Barcode

Uses a barcode scanner to get the answer ([**Supported barcodes**](/common-use-cases/barcodes)**)**.

### Branch

A dynamic list of entries, is useful for questions like "List your family members". [**More info.**](/formbuilder/branches)

### Group

Questions within a group will be displayed on the same device screen. [**More info.**](/formbuilder/groups)

## More on Date & Time questions

When users interact with "TIME" questions in a form or application, they are prompted to select a specific time using a time picker. The time that is captured is exactly what the user selects, such as 17:34 (or 5:34 PM). It's important to note that this time is saved as-is, without any reference to the user's current timezone. For instance:

* If a user in New York selects 17:34, it will be recorded as 17:34.
* If another user in Tokyo selects 17:34, it will also be recorded as 17:34.

The lack of timezone data means the time is treated as a simple point in the day, without context about where the user is geographically. This design is intentional. It ensures that the recorded time is consistent and unaffected by any timezone differences or changes, such as Daylight Saving Time. The time recorded is purely the time the user interacted with, with no assumptions or adjustments made for their location.

**Timezone-Dependent Timestamp**

To accommodate scenarios where knowing the exact moment of data entry is critical (including the user's timezone), the system automatically adds a "Created At" timestamp to each entry. This timestamp is captured in UTC (Coordinated Universal Time), also known as Zulu time, which is a standard time format unaffected by time zones. For example:

* If a user in New York saves an entry at 12:34 PM local time, it will be recorded with a "Created At" timestamp of 16:34 UTC.
* A user in Tokyo saving an entry at 12:34 PM local time will have a "Created At" timestamp of 03:34 UTC on the following day.

This "Created At" timestamp ensures that, regardless of where or when the user is, there is a precise, universally comparable record of when the entry was made. This is crucial for data consistency, especially when aggregating data from multiple users across different time zones.

These "Created At" timestamps get downloaded with the rest of the data from the web application. [**More on downloading data.**](/web-application/downloading-data)

DATE questions behave exactly like TIME questions. When a user selects a date, that date is saved exactly as chosen, without any timezone data attached. For instance, selecting March 12 will be recorded as March 12, regardless of whether the user is in New York, Tokyo, or any other location. Just like with time entries, the absence of timezone data means the date is consistent and remains unchanged regardless of where the user is when they make the selection.\
\
In essence, "TIME" and "DATE" questions are designed to capture user input as a direct and unmodified point in time or a specific day. Meanwhile, the "Created At" timestamp, saved in UTC, provides the precise moment of data entry, ensuring that all entries can be accurately compared and analyzed across different time zones. This dual system maintains both user-specific time/date information and a standardized timestamp for comprehensive data analysis.

**Constraints on DATE and TIME Questions**

Currently, the date and time picker does not provide a way to set constraints on the selected date or time. However, the system automatically generates a `created_at` timestamp when an entry is initially saved on the device. Additionally, a `uploaded_at` timestamp is set when the entry is uploaded or updated at any time. This is because updates function as a re-upload, overriding the existing entry.&#x20;

These timestamps help track the creation and modification history of each entry accurately, even without manual date and time constraints.

`created_at` and `uploaded_at` timestamps are always available when downloading your dataset or exporting your entries using the Epicollect5 API.

## Angle brackets and other symbols

For security reasons, we do not accept the `<` and `>` keyboard symbols as part of a question or answer. In the formbuilder, they are replaced by their identical Unicode symbols.

* **Security Risks**: Angle brackets are often used in HTML tags, which can introduce security vulnerabilities such as Cross-Site Scripting (XSS). XSS occurs when malicious scripts are injected into web pages, allowing attackers to steal data, manipulate content, or perform other malicious actions.
* **Unicode Substitution**: To prevent these risks, any `<` and `>` symbols inputted by users are automatically replaced with their equivalent Unicode representations. This ensures that these characters are treated as plain text rather than executable code. The Unicode representations look identical to the original symbols but are handled differently by the system, preventing them from being interpreted as HTML or other code.
  * For example, `<` is replaced with `\u003C` and `>` with `\u003E`.

We also do not accept [**emojis.**](https://en.wikipedia.org/wiki/Emoji)

* **Data Integrity**: Emojis, while popular and widely used in informal communication, can cause issues in data processing and storage, especially if the system is not configured to handle Unicode characters properly. Emojis can also lead to inconsistent display across different platforms and devices.
* **Standardization**: To maintain consistency and avoid potential encoding problems, emojis are not accepted as input. Instead, users are encouraged to use plain text that the system can reliably process.

By enforcing these rules on special characters and emojis, the form builder maintains a secure and stable environment for data collection and processing. While this may limit some expressive input options, the trade-off is a safer, more reliable system that can effectively handle user data across various platforms and devices.


# Add Questions

Questions can be dragged from the left column into the middle one. A preview overlay will show you where the question will be placed.

Questions in the middle column can be re-ordered dragging them above or below other questions.

Notice some indicator icon on the right of each question:

* A green check: the question is **valid**
* A yellow warning sign: the question is **invalid**
* A down arrow: the question has some **jumps** set

![](/files/DVxxwtDy7PZHxCDLALtb)

Once a question gets selected (clicking on it, it also gets a purple colour), its settings panel appear on the right, divided in:

* Properties
* Advanced
* Jumps

## Properties

![](/files/LvCYEgI5bbv3L31tOcme)

Here is where the basic properties for a question get set.

### Question Text

The **question** text is always set here.

Just type your question and you are good to go. You **MUST** have some text set for each question, or the question will be invalid.

{% hint style="warning" %}
A project can be saved only when **ALL** its questions are valid.
{% endhint %}

On this panel you also have the option to set a question as:

### Required

The answer is required by the user to proceed with the form.

### Title

the answer will be used to identify a single entry when viewing the entries on a device or on the server **(**[**Read title section for more info**](/formbuilder/title)**)**

{% hint style="info" %}
If the question is of type README\_,\_ you can only specify some text to be shown, and basic formatting is available
{% endhint %}

{% hint style="info" %}
If the question is of type RADIO\_,\_ DROPDOWN\_,\_ or CHECKBOX, you can list all the possible answers here as well. Just click on "Add Answer" and modify the placeholder text with anything you want. You **MUST** have at least one possible answer set.
{% endhint %}

{% hint style="info" %}
For LOCATION, PHOTO, AUDIO, VIDEO, BRANCH, and GROUP you can only specify the question text.
{% endhint %}

## Advanced

![](/files/GVDdzH9a79dw00Nwao43)

Advanced settings depend on the question types. If the question does not have any advanced setting the tab will be disabled.

### Initial Answer (default answer)

The input field on the device will be pre-filled with the value set here, think of it as a default answer.

### Regex

The answer MUST match a regular expression. A regular expression (regex) is a special text string for describing a search pattern. You can think of regular expressions as wildcards.\
You are probably familiar with wildcard notations such as `*.txt` to find all text files in a file manager. The regex equivalent is `.*\.txt` **(**[**What is a regex?**](https://en.wikipedia.org/wiki/Regular_expression)**)**

### Double Entry

**Require double entry verification:** two identical answers must be provided to proceed. It is useful for confirmation, like a code or an email.

### Uniqueness

**Make answer unique (form OR hierarchy):** the answer must be unique. You can select if you like to have it unique for any entries belonging to a form or just for the children of a particular entry (hierarchy). More on [**uniqueness.**](/formbuilder/uniqueness)

### **Date & Time**

For DATE and TIME questions, **a selection of date or time format is available**. You also have the option to set the current date or time when the question is shown on the screen ("*Set initial answer to current date*" checkbox).

![](/files/XPwNNUcYoN7wPUI8yl52)

### Numeric (Integer or Decimal)

NUMERIC questions: a **min** and **max** value can be set. Also, there is the option for the question to be **decimal** (float) or **integer.**\\

![](/files/vQjqQbekVroR5qbCXhLD)

## Jumps

![](/files/WP6ZxQyUo7xStXiwFnh5)

Jumps are a way to set up conditional logic on your questionnaire.

Jumps allow you to define that, based on the choice made by a user, they will 'jump' **forward** in a form to a question further along in the questionnaire or carry on to the next question. For example, if for question one in a form, the user selects choice one in the dropdown, jump them forward to question five, else continue on to question two.

Single or multiple jumps can be defined for a particular form input and can jump forward to any kind of form field (text or media) or to the end of a form. [**More on jumps**](/formbuilder/jumps)**.**


# Edit Questions

To edit a question, select it from the middle column by clicking on it. If you want to re-arrange the order of the questions instead, just click and drag the input where you want it.

### Edit question details

On the right column, the settings panel for the selected question is activated when clicking on a question. Perform your edits here.

![](/files/9wj1Ny286JVXfqNCE0aL)

The formbuilder validates questions automatically most of the time, just by interacting with it.

If you would like to **force validation** on the selected question, click the validate button on the top right of the settings panel:

![](/files/Od6ZPwZL47z4dnNROtGp)

### Copy questions

A **valid** question can be copied to the bottom of your question list by clicking on the copy button:

![](/files/OkN8UopGrCkTcm3K4b5F)

{% hint style="warning" %}
**Title** and **jumps** will not be copied.

**Existing data** belonging to a previous question will not be copied.
{% endhint %}

### Delete questions

A question can be deleted by clicking on the delete button:

![](/files/aEKDvbjgN1A31Xvcg16l)

{% hint style="danger" %}
**Warning:** Deleting a question in Epicollect5 is a *destructive* action. This means that **any data associated with that question will also be permanently deleted**.

A question in Epicollect5 acts as a **container for answers**. When you delete a question, all the answers to that question are also removed from the project database.
{% endhint %}

Here is a table design that illustrates the **"before" and "after"** effect of deleting a question in **Epicollect5**.

#### ✅ **Before deleting the Question "Sex", the project data looks like the following:**

| Name    | Age | Date of Birth | Country | **Sex**    |
| ------- | --- | ------------- | ------- | ---------- |
| Alice   | 30  | 1995-02-10    | UK      | **Female** |
| Bob     | 28  | 1997-06-12    | USA     | **Male**   |
| Charlie | 35  | 1989-09-01    | Canada  | **N/A**    |
|         |     |               |         |            |

📝 The column **"Sex"** contains answer data collected from users. It references the "**Sex**" question of the form.

#### ❌ **After Deleting the Question "Sex"**

| Name    | Age | Date of Birth | Country |
| ------- | --- | ------------- | ------- |
| Alice   | 30  | 1995-02-10    | UK      |
| Bob     | 28  | 1997-06-12    | USA     |
| Charlie | 35  | 1989-09-01    | Canada  |

⚠️ **All data related to the deleted "Sex" question is permanently removed**, including the column itself. Before deleting any question in **Epicollect5**, especially one that may contain valuable data, it's highly recommended to back up your entries.

### Undo Changes

If it happens you make changes by mistake, do not worry. Just do **NOT** save, but click on the **UNDO** button instead:

![](/files/3IFaLiCAo7FujPgaqeHW)

{% hint style="info" %}
Remember: a project can be saved only when ALL its questions are valid.
{% endhint %}

### Delete questions in bulk

All the questions for a form can be deleted at once, without deleting the enclosing form.

Select the form and click on the "Delete all questions" button in its context menu.

![](/files/d1BA5XYVfrRm9ihAXjxq)


# Linking Forms

Use multiple forms on the same project in Epicollect5

Sometimes a single form may not be adequate for the kind of project you wish to undertake, and we provide the ability to link multiple forms together within a single project in two ways; **hierarchy** or [branches](/formbuilder/branches).

## Forms hierarchy

For example, on a *Schools* project, we might define a set of questions that allow us to gather certain kinds of information about a particular school. However, maybe, as we carry out our project, we realise that it would also be useful to capture information about all the teachers within a particular school. In this instance, we would like to ask a series of questions to each teacher, within each school.

We could simply define a second project with a 'Teacher' form and carry out a second survey but data for each school would not be linked to each teacher. What would be more convenient would be for us to add multiple instances of a teacher form, to a particular school, all within the same project. Furthermore, what if we decided that as we are undertaking the project, we would also like to collect information about pupils linked to each teacher?

This expanded schools project would consist of three single forms - one for a school, one for a teacher and one for a pupil. Data gathering would occur in what can be envisioned as a hierarchical fashion (or one to many). For each school, there will be many teachers, and for each teacher, there will be many pupils.

These relationships can be visualised as in the following diagram:

![](/files/srvHenP9UNDQ45CQ3Fzi)

This hierarchy is top to bottom and allows data gathering in a 'one to many' fashion. For example, each Form A entry (a school) can have many Form B entries (each teacher in the school), which in turn can have many Form C entries (each pupil of each teacher in the school).

The hierarchy (parent -> child) relationship across the entries is set automatically by the system.

To add a form, just click on the formbuilder page:

![](/files/54puqNgGH6H9uOE4J8wI)

A popup will appear. Just enter the form name and click "SAVE CHANGES":

![](/files/nNWkCLGZcCDoTxAhY56k)

The form will be available as a new tab:

![](/files/KdpyoVRDrW34SASTBacM)

By default, the new form is set as invalid (you see the warning icon) as it does not have any questions.

{% hint style="warning" %}
You cannot save a project if a form does not have at least one question!

The maximum number of forms you can link is 5. If you feel the need of having more forms, have a look at [**branches**](/formbuilder/branches) (i.e. subforms).
{% endhint %}

## Add entries to child forms

Please see [**this page**](/mobile-application/add-child-entries)**.**


# Rename Forms

Once you created a form, you can rename it at any time. Just click on the "Edit" icon at the top right of your form:

![](/files/1tFOBMOUq1xjE2hDmyXn)

A popup will open:

![](/files/sAdkH2WjA3axETe80aWa)

Just type the new name and click on "Save Changes".

![](/files/TM7EIRFxopJAwvpYoZxl)

Your form is now renamed.

![](/files/LclsmhNosEEKL90dwSA0)


# Print Forms

Get a paper or pdf version of your forms for quick reference

Epicollect5 forms are printer-friendly. There are some use cases where there is the need to have a paper version of a form as a backup or just as a reference, maybe in PDF format. Let's see how to print a form using the most popular browsers(\*)

{% hint style="info" %}
(\*) The following examples are from a Mac. If you are using Windows or Linux the procedure might differ.
{% endhint %}

## Google Chrome

Go to your project and open the formbuilder. Click on the dropdown menu at the top right of the middle column, the one that contains the list of questions.

![](/files/J3VBgf6FaQSmwXz2Yjj4)

On the menu, click in print form

![](/files/vfJBR2AqtO3p0GkL3V6E)

The print dialog will open.

{% hint style="info" %}
We recommend saving the form as a PDF first and tweak the pagination using something like [**Acrobat Pro**](https://acrobat.adobe.com/us/en/acrobat/acrobat-pro.html). Since each project is different, sometimes page breaks are not where you would like them to be, therefore the need to edit the PDF before printing or distributing.
{% endhint %}

![](/files/mevJenZdomUUWyHK2UlK)

## Firefox

The same steps apply to Firefox, just the printing dialog is different. If you like to see a preview of the printout, there is a dropdown menu at the bottom right.

![](/files/HVIboZnAvGzGVQI5zQHO)

If you click on "Open in Preview" you will see the form in a printer friendly format and you can then print it.

## ![](/files/zASO7Q3TvSPgAtN2weOo)

## Safari

Safari print dialog is similar to Firefox. The options to save as a pdf are at the bottom right.

![](/files/tRTtKKrltFViav6hea7H)


# Remove Forms

By design, a project must have at least one form, so the first form cannot be removed.

A child form can be deleted by selecting it and clicking the trash icon in the form context menu. **However, forms can only be deleted in reverse order, starting from the last one.** This restriction ensures that the hierarchy remains intact, as removing a form in the middle of the structure would disrupt its integrity.

<figure><img src="/files/7y6NR6KjoogBTU7kz8RB" alt=""><figcaption></figcaption></figure>


# Search

The SEARCH question type behaves like an autocomplete search bar.

When using the SEARCH question type, the users filling in the form will get a list of matching possible answers as soon as they start typing.

{% hint style="success" %}
Try our [**EC5 SEARCH QUESTION TYPE**](https://five.epicollect.net/project/ec5-search-question-type) project to see the SEARCH questions in action!
{% endhint %}

It is possible to accept a single answer only (like RADIO and DROPDOWN) or multiple answers (like CHECKBOX).

![](/files/PIKAVzr8MYjdInlULKbd)

{% hint style="warning" %}
SEARCH questions can have up to **1000** possible answers per each question, but there is a limit of **5 SEARCH questions per project.**

This is done to avoid overuse of this question type instead of the more common RADIO, CHECKBOX, and DROPDOWN question types. Common use cases could be a list of world countries, animal or plant species, and so on.
{% endhint %}

### Mobile app (available from version 2.0.5)

{% hint style="danger" %}
Please update your mobile app if the version is older than 2.0.5.\
Check your current version under Menu > Settings.

Older versions **will not work** with the SEARCH question type causing the app to crash.
{% endhint %}


# Jumps (If-Else)

Conditional logic on your form(s).

{% hint style="info" %}
For practical implementation details, see [**Jumps 101**](/common-use-cases/jumps-101) and [**Other, please specify**](#other-please-specify) example&#x73;**.**
{% endhint %}

Jumps allow a questionnaire to follow a conditional flow based on the user's answers.

{% hint style="warning" %}
**It is possible to only jump forward**, to one of the next questions, not backward.&#x20;

Moreover, **at least one question must be jumped.**
{% endhint %}

<figure><img src="/files/mzTJoiHl3awfVqHZeqtq" alt=""><figcaption><p>Select the question and click on the jumps (IF - ELSE) tab</p></figcaption></figure>

## When

One out of four conditions can be set

<figure><img src="/files/Q36T9G5FUHKSvXFUl3jX" alt=""><figcaption></figcaption></figure>

* *no answer given -* When no answer is given by the user
* *answer is* -  When the answer matches
* answer is NOT - When the answer does not match
* always - Jump regardless of user choice

## Answer

Pick the answer that will trigger the jump from the list of possible answers.

<figure><img src="/files/tj0BZhzlPsCigayumcxz" alt=""><figcaption></figcaption></figure>

## Go To

Select the jump destination i.e. the question to go to when the condition is met.

<figure><img src="/files/B3ryeRgorm3BfJWXtGOH" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
By design, you cannot jump to the immediate next question (it would not be a jump, technically), you need to jump at least one question.

In Epicollect5, the design principles dictate that you cannot set a jump to the immediate next question. This is because a jump, by definition, implies skipping over at least one question to reach a subsequent one. To ensure clarity and proper functionality within your survey or data collection form, any jump must bypass at least one question in between the origin and the destination.

This design choice helps maintain the logical flow and structure of your questionnaire, preventing potential confusion or redundancy that could arise from setting a jump to the very next question.

By adhering to this rule, you can create more coherent and efficiently navigable surveys.
{% endhint %}

So if you have questions A, B, C, etc, setting a jump on A will list the next questions starting from C. Question B will not be listed, as it is just next to A.

To reach the end of the questionnaire, just select "*End of form*".

For practical implementation details, see the [**Jumps 101 example**](/common-use-cases/jumps-101)**.**

## **Multiple jumps**

You can of course add more than one jump clause. However, **please be careful not to add conflicting jump clauses to a field**. If that is the case, the jumps will follow the order from top to bottom i.e. **in the case of more than one condition met, the first jump from the top will win.**

For example, you may have a drop-down with five items, and you would like to specify that if a user selects item one, they jump to question five, but if they select item three they jump to question ten. All other choices would proceed normally within the form.

{% hint style="info" %}
**In every case, you cannot add more jumps than the total number of possible answers you have.**
{% endhint %}

Jumps can be used in many circumstances to give great flexibility when defining a single form. In many cases, multiple forms that may normally be given to a user can be combined into a single form with logic defined by jumps.

## Questions without possible answers to choose from

The logic described above is for RADIO, DROPDOWN, and CHECKBOX.

For all other question types, only a single, straightforward "always" jump can be applied if needed.

![](/files/e5d0bgFLA9F2tsGk8k2w)

This design ensures that jumps remain functional regardless of user input.

It is particularly useful when a question serves as the destination of a jump, while subsequent questions are linked to other jumps the user might have skipped.

Such scenarios commonly occur when multiple jumps are configured, helping maintain the intended questionnaire flow while avoiding interruptions in the user experience.

## Jumps and Groups

By design, when using [Groups](/formbuilder/groups), it is possible to apply only a jump "always" on the whole group, not any jumps on any questions nested in that group. This makes a lot of sense. A group is a set of related questions displayed at the same time as they would appear on a paper-based form. Jumps are a tool to hide questions from the users when they are not supposed to answer them.

If there is a need to have conditional questions within a group, the paper-based approach will work. Something like: "If you answered B to the previous question, tap on Next to go to the next section." Also, you could use README question types to offer even more instructions to the user.

{% hint style="info" %}
If your logic is more complex, try to restructure your form so you will not need to use a jump within a group.
{% endhint %}

### Other, please specify

Jumps can handle scenarios where additional input from the user is required.&#x20;

A common example is offering an "Other" option in a multiple-choice question. When the user selects "Other," they can be prompted to provide a specific answer by typing it in a text or numeric field.

This approach enhances flexibility by allowing users to provide custom responses that might not fit predefined options, ensuring more comprehensive data collection.

For practical implementation details, see the examples -> [**Other, please specify**](/common-use-cases/specify-answer-with-jump)&#x20;

### Jumps and Branches

Coming soon...


# Branches

Branches can be seen as dynamic lists, or sub-forms.

There may be cases when data you wish to collect within a form does not fall into the hierarchical structure previously described.\
EpiCollect5 provides another method of adding flexibility that we describe as **branches**.\
Briefly, a branch question is a container for nested questions you want to ask more times for a single hierarchy entry.\
For example you might have a form Person, and add a branch question called "Family members". The "Family members" branch will contain sub-questions like "Name?", "Age?" and "Relationship?".

On a paper based form, you usually see something like:

| Name  | Age | Relationship |
| ----- | --- | ------------ |
| Mirko | 39  | brother      |
| John  | 67  | father       |
| Lucy  | 12  | sister       |
| ...   | ... | ...          |

It is dynamic in the way users answering could add none, one or more family members, depending on how many family members they have.

In our previous Schools project example ([see Linking forms](/formbuilder/multiple-forms)) we may wish to collect data on each teacher's absences during the year due to sickness.

In this case we would have a question on the teacher form asking the number of episodes of absence due to sickness. Some teachers may answer ‘none’ and some may answer 1, 2, 3 etc.\
Branch forms allow us to define a new form (in this case about sickness (form D)), outside the hierarchical structure, that appears once or more times in response to a the answer in another form.

![](/files/ajlwMHzFl78DIAsmcKai)

Branches can be added like any other question, just drag the branch question into your form:![](/files/3cvXp71RaiDXKoWPORNp)

Once dropped, type the branch header (required) and click "Edit Branch" to enter the branch editing mode:

![](/files/jESI1QMdYDfnZAeYEftd)

{% hint style="warning" %}
You MUST type a header to enable the edit button!

In branch edit mode, just drag any input as usual.

You CANNOT have a branch within a branch. Also, a branch MUST have at least one question to be valid.
{% endhint %}

To exit the branch edit mode, click the left arrow on the top left, to go back to the usual hierarchy form editing.

![](/files/m0aHX8QfxfcmkCi03pnp)


# Groups

Groups is a way to display more questions on the same page on the mobile device.

Groups can be added like any other question, just drag the group question into your form:

![](/files/lBjxFGw9suY8UOtFzOI4)

Once dropped, type the group header (required) and click "Edit Group" to enter the group editing mode:

![](/files/8gUjQmApvvUvxN3cN03s)

{% hint style="warning" %}
**You MUST type a header to enable the edit button!**
{% endhint %}

In group edit mode, just drag any input as usual. You **CANNOT** have a group within a group. You can have branches though.

{% hint style="warning" %}
A group MUST have at least one question to be valid.
{% endhint %}

{% hint style="warning" %}
Moreover, you **CANNOT** have JUMP(s) within a GROUP.
{% endhint %}

To exit the group edit mode, click the left arrow on the top left, to go back to the usual hierarchy form editing:

![](/files/pfSvbuoemtcEwqqBi70O)

Using GROUP(s) it is possible to add matrix style questions to your form(s). [**See how**](/common-use-cases/matrix)**.**


# Title

Enhancing Entry Visibility with Titles on Epicollect5

When adding entries on Epicollect5, it's beneficial to assign a title to each entry.

If you omit to set a title, the system generates a unique identifier for the entry, such as `"149da8d4-2807-11e6-b67b-9e71128cae77"`. However, this identifier isn't very informative or user-friendly. To improve readability and organization, it's strongly recommended to designate relevant questions as titles for entries.

To identify each entry, you can set some of your question answers to be part of the entry title (**up to a maximum of 3 for either a form or a branch**)

For example, let's say you have 3 questions:

* What is your name?
* What is your age?
* What is your date of birth?

If you set all these questions to be a title, you will end up with a list of entries like:

* Mirko 30 22/05/1977
* John 18 24/01/1990

{% hint style="info" %}
Remember, when titles are not set, the entry unique identifier generated by the system will be shown instead:

**`149da8d4-2807-11e6-b67b-9e71128cae77`**
{% endhint %}

Titles serve multiple purposes, including enhancing entry visibility when viewing entries on the server.

<figure><img src="/files/oY4cN4DyRcQTsOmMdJxA" alt=""><figcaption></figcaption></figure>

![](/files/HSHE54vMqjRFcWpDsFkX)

In the provided screenshots, the project "Bestpint" demonstrates how the question "What is the beer name?" has been chosen as the title. For an entry where the answer was "La Blanche" (a renowned French beer), this title appears prominently in the entry popup and in the left sidebar as a header.

To designate a question as the title for your entries, simply select the desired question in the form builder and enable the corresponding option in the right panel. This straightforward process ensures that your entries are easily identifiable and organized, improving the overall user experience when navigating through entries on Epicollect5.

![](/files/GgijwzWjfTuOLTW3AFKV)

### Title values on existing entries

{% hint style="warning" %}
Titles for entries already collected before the title gets set will not automatically update to reflect the new title configuration.

Instead, these entries retain their original, auto-generated unique identifier as their title. As a result, any changes made to the title setting do not propagate retroactively to previously entered data.

To force an existing entry to get the new TITLE value, each existing entry need to be edited and saved individually.
{% endhint %}


# Uniqueness

Many times on a survey the answer to a question needs to be unique. For example a class code, a student ID, a patient NHS number, and so on.

In Epicollect5 there are **two** distinct types of uniqueness:

* **Form**: uniqueness is across all the entries of a form
* **Hierarchy**: uniqueness is across all the child entries of a form (the parent entry is considered)

If your project has got a single form only, the uniqueness is always set to **form**. This means if you set a question like "What is your name" as unique, you cannot have the same name more than once.

{% hint style="info" %}
The comparison is case insensitive i.e. "John" and "john" are the same, despite the capital letter of "John".
{% endhint %}

If you have multiple forms, for each child form you have the option to decide if you want the answer to the question unique form wide or hierarchy wide. On a project featuring UNIVERSITY as the parent form, and DEPARTMENT as the child form, let's imagine you enter "*Imperial College"* as a UNIVERSITY entry and then you add DEPARTMENT entries to it, like *Biology*, *History*, *Media* etc.

If you would like to avoid having the same department entered more than once for a single UNIVERSITY entry, you might set the uniqueness on the DEPARTMENT name. If you set DEPARTMENT name to be unique as **form** though, you could enter "*Biology*" only once, regardless of the UNIVERSITY being Imperial College or another one, like Stanford. This would not work as "*Biology*" is a common department across universities in the world.

**Form uniqueness:**

![](/files/QmFeFUfFpckHfl1exTz2)

The solution is to set the uniqueness as **hierarchy**, to have the parent entry considered. This way the "*Biology*" DEPARTMENT can be entered only once but for each UNIVERSITY entry.

**Hierarchy uniqueness:**

![](/files/7njnUBXLCtYvfEDGzXyU)

To set the uniqueness for a question, select the question and go to the "Advanced" tab:

![](/files/pCHj6QBERaajlolfmhVO)

The first option is the **form** uniqueness, and the second option is the **hierarchy** uniqueness as described.

{% hint style="info" %}
The form(s) names will differ based on your project form names.
{% endhint %}

**The uniqueness constraint is available for the following question types:**

* TEXT
* NUMERIC
* PHONE
* DATE
* TIME
* TEXTBOX
* BARCODE

### Date & Time uniqueness

The uniqueness of DATE and TIME questions is based on the format selected.

DATE answers are saved in ISO 8601 format, without timezone and with the time set to midnight, i.e \``2022-01-15T00:00:00.000`\` therefore the comparison is done only on the date part.

<table data-header-hidden><thead><tr><th></th><th width="372"></th><th></th></tr></thead><tbody><tr><td>dd/MM/YYY</td><td>same day, month and year</td><td></td></tr><tr><td>MM/dd/YYYY</td><td>same day, month and year</td><td></td></tr><tr><td>YYYY/MM/dd</td><td>same day, month and year</td><td></td></tr><tr><td>MM/YYYY</td><td>same month and year, day not considered</td><td></td></tr><tr><td>dd/MM</td><td>same day and month, year not considered</td><td></td></tr></tbody></table>

TIME answers are saved in ISO 8601 format i.e `2022-05-12T12:34:45.000`but the date part is not considered for the uniqueness.

<table><thead><tr><th></th><th width="377"></th><th></th></tr></thead><tbody><tr><td>HH:mm:ss</td><td>same hours, minutes and seconds</td><td></td></tr><tr><td>hh:mm:ss</td><td>same hours, minutes and seconds</td><td></td></tr><tr><td>HH:mm</td><td>same hours and minutes, any seconds</td><td></td></tr><tr><td>hh:mm</td><td>same hours and minutes, any seconds</td><td></td></tr><tr><td>mm:ss</td><td>same minutes and seconds, any hour</td><td></td></tr></tbody></table>


# Double-entry Verification

To increase the data accuracy of some critical questions, Epicollect5 provides the advanced option called "Double entry verification".

The options is available as an advanced option for the following question types:

* TEXT
* NUMERIC
* PHONE
* TEXTBOX

![](/files/QNT5jk8bIShLL1yStX6F)

When this option is enabled, the users will have to answer the same question twice and **both responses MUST match**. A common use case could be the user email address, social security number and so on. This validation is performed on the device directly therefore it will work both online and **offline** reducing the chances of collecting wrong data.

{% hint style="warning" %}
The comparison is case sensitive, i.e "John" and "john" do NOT match.
{% endhint %}

Let's see it in action: on the form below we enabled the option for a *"What is your email?"* question

When the users answer this question they will have to enter the email address twice to proceed.

![](/files/5uIPpJqV2NysxPqlyOVI)

### Web application

| <img src="/files/2Ph4BuYaUofoyRlH9n6K" alt="" data-size="original"> | <img src="/files/GLyOnRc1dcD0bVmtOtCh" alt="" data-size="original"> |
| ------------------------------------------------------------------- | ------------------------------------------------------------------- |

### Mobile application

| <img src="/files/3piX8q8LrusPvocf5JZw" alt="" data-size="original"> | <img src="/files/qmcw6oFzkp4eshQrphEe" alt="" data-size="original"> |
| ------------------------------------------------------------------- | ------------------------------------------------------------------- |
|                                                                     |                                                                     |

Have a look at the example project [**EC5 Double Entry Example.**](https://five.epicollect.net/project/ec5-double-entry-example)


# Import & Export Forms

Share your forms with other Epicollect5 users.

Single forms can be exported and imported within the same project (as child forms) or to other projects. You could for example export a child form from an old project and use it as the first form on your new one.

## Export a form

To export a form, select the form you would like to export and open the context menu by clicking on the arrow at the top right:

{% hint style="warning" %}
Please remember the form MUST be valid.
{% endhint %}

![](/files/JblyeHJutTQfCFoDxf8K)

Save the file where you prefer. It will be a `.json` file

## Import a form

To import a form first create a [new project](/web-application/create-a-project) and open the formbuilder or create [a new child form](/formbuilder/multiple-forms) on an existing project.

Click on the "IMPORT" button:

![](/files/reHkQ5FaMwsv5f7JLtpQ)

Select an EC5 form file i.e. a form file you previously exported (`.json`) and the form will be imported.

![](/files/WPpm9NAzml5vHD2ifTxz)

![](/files/ZpqxIhZslb1BfoSbpn3g)

Save your project and you are ready to go!


# Import & Export Possible Answers

Import and export possible answers using csv files.

For the question types where a list of possible answers must be provided (*RADIO*, *CHECKBOX, DROPDOWN & SEARCH*) you can import/export your list of possible answers from/to a CSV file.

{% hint style="warning" %}
The maximum number of possible answers for a single question is **300**. Once that limit is reached, additional possible answers will be ignored.

SEARCH question types have an upper limit of **1000**, but it is possible to have **up to 5 SEARCH questions per project.**

Empty values will be skipped.

Invalid symbols like "<" and ">" will be removed.
{% endhint %}

## Import possible answers

To import the list, click on the arrow next to the "Add answer button" to open the context menu:

![](/files/YtLfPCBPCvFHXKJ17Erv)

Then click on "Import CSV". The file browser of your machine will open. Pick the `csv` file with the list you would like to import.

For this example, we are importing a list of world countries found [here](https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes/blob/master/all/all.csv).

![](/files/zBd4tRn4qIreqmObqEW2)

Once you import the file, a dialogue with some options will open up:

![](/files/jyQl0ZPDsuuYjL8crkf5)

Here you need to pick which column in your `csv` file contains the list of data.

You can also specify if the first row contains headers or not and whether to append the list to the existing possible answers already on that input or to replace them with the newly imported list.

In this example, we are going to import the column "name" and replace all the existing possible answers. Our file has got the headers in the first row so we will leave the "First row contains headers" checkbox checked:

![](/files/ezFI6m3TOX5zgHCyguym)

After a column is selected, click on IMPORT to proceed.

{% hint style="warning" %}
The import button is disabled until you select a column.
{% endhint %}

![](/files/tlJSxTYC7r1UK06XtXFO)

The list is imported successfully!

### Replace vs Append

{% hint style="danger" %}
When a list of possible answers is **replaced**, all previous references to that list are **removed** since they no longer exist.
{% endhint %}

Behind the scenes, each possible answer is associated with a unique identifier (`answer_ref`). For example, the original list might look like this:

```
[
    {
        "answer": "yes",
        "answer_ref": "58d92c2b50435"
    },
    {
        "answer": "no",
        "answer_ref": "58d92c2b50436"
    },
    {
        "answer": "n/a",
        "answer_ref": "58d92c2b50437"
    }
]
```

When the list is replaced, it might change to:

```
[
    {
        "answer": "yes",
        "answer_ref": "58d92c2b50439"
    },
    {
        "answer": "no",
        "answer_ref": "58d92c2b50438"
    },
    {
        "answer": "n/a",
        "answer_ref": "58d92c2b50432"
    },
    {
        "answer": "Another option",
        "answer_ref": "5ad92c2b50432"
    }
]

```

Even though the possible answers may look the same to the user, the unique identifiers (`answer_ref`) are different. This means there is no longer any reference linking the previous "**yes**" response to the new "**yes**" response. The system considers those to be two completely different responses when looking at the `anwers_ref` identifiers (`58d92c2b50435`, `58d92c2b50439`). The `answer_ref` `58d92c2b50435` cannot be found anymore, so all those responses are gone.

{% hint style="info" %}
This principle applies to any software in general. For example, if you replaced a folder with another folder of the same name on your PC, you wouldn't expect to find the previous content in the new folder, despite the folder having the same name.
{% endhint %}

To correctly add possible answers to an existing list, and therefore preserve existing responses, Epicollect5 provides the option to **append** possible answers to an existing list when importing the possible answers from a csv file.

<figure><img src="/files/doKJkzkOKBKDXrrKaDK0" alt=""><figcaption><p>Replace vs append possible answers</p></figcaption></figure>

As a rule of thumb, we highly recommend taking a backup of your data before making changes to an existing project.

{% hint style="info" %}
Backing up your data ensures that you have a safety net in case anything goes wrong during the update process. This is particularly important when dealing with complex forms and datasets, as even small changes can sometimes lead to unexpected issues or data loss.
{% endhint %}

## Export possible answers

If you have a question with a list of possible answers you need to export, for example, to re-use it across multiple projects, click on the "Export CSV" option in the context menu:

For example, we had a simple list of colours to export:

![](/files/3bxsKH1C6j6gVCacTZpH)

Save the file where it suits you best and presto! Please note the question text will be used as the column header on the exported file:

![](/files/qbBBuIX3cNi6Ej2AUpzu)


# Edit Possible Answers

{% hint style="info" %}
The following applies to RADIO, CHECKBOX, DROPDOWN, and SEARCH question types only.
{% endhint %}

### Amending possible answers' text

You can amend the possible answers text at any time by typing on the input field and saving the project.

Changing the possible answers text will propagate the change to your existing entries if any.

For example, if you have a question with YES and NO as possible answers, you collected some data and later you decided to change NO to NOPE, all your previous NO responses will become NOPE.

### Deleting possible answers

If you delete a possible answer and you have some entries already collected, you will lose only the responses matching the possible answer you are deleting.

For example, if you have a question with YES and NO as possible answers, you collected some data and later you decided to delete the NO possible answer, all your previous NO responses will be empty but you still have all your YES responses.

### Restoring Deleted Possible Answers

It is **not possible** to restore responses tied to a deleted possible answer. When you delete a possible answer in Epicollect5, all responses linked to that answer are permanently lost. Adding a new possible answer with the same text will not recover the lost responses.

**Why Does This Happen?**&#x20;

Behind the scenes, each possible answer is associated with a unique identifier (`answer_ref`). For example, your original list might look like this:

```json
[
    {
        "answer": "yes",
        "answer_ref": "58d92c2b50435"
    },
    {
        "answer": "no",
        "answer_ref": "58d92c2b50436"
    },
    {
        "answer": "n/a",
        "answer_ref": "58d92c2b50437"
    }
]
```

When you remove the "yes" possible answer, and re-add it again, the list will look like this:

```json
[
    {
        "answer": "yes",
        "answer_ref": "58d92c2b50439"
    },
    {
        "answer": "no",
        "answer_ref": "58d92c2b50436"
    },
    {
        "answer": "n/a",
        "answer_ref": "58d92c2b50437"
    }
]

```

Even though the possible answers may look the same to the user, the unique identifiers (`answer_ref`) are different. This means there is no longer any reference linking the previous “**yes**” response to the new “**yes**” response. The system considers those to be two completely different responses when looking at the `anwers_ref` identifiers (`58d92c2b50435` vs `58d92c2b50439`).\
The `answer_ref` `58d92c2b50435` cannot be found anymore, so all those responses are gone.

This principle applies to any software in general. For example, if you delete a folder and then later create a new one with the same name on your PC, you wouldn’t expect to find the previous content in the new folder, despite the folder having the same name.

### Sorting possible answers

You can re-order the possible answers by drag and drop using the handle next to each one of them.

![](/files/Kjjv1ksYcra780MTKlHD)

You can sort in bulk by using the presets provided: ascending, descending, shuffle. Epicollect5 will sort the possible answers alphabetically with numeric collation (such as "1" < "2" < "10").

![](/files/C6C2aKmC5Dh3JZdbuzQY)

### Adding possible answers

Adding possible answers to a project does not affect your existing entries. For example, on a question like "What if your favorite color?" of type RADIO, you could have "Red", "Green", "Blue" as possible answers.

After collecting some entries, you decide to add "Yellow" to the list of possible answers. Your existing "Red", "Green" or "Blue" responses will not be affected, as expected.

{% hint style="warning" %}
If the questions you modify are set as TITLE, the TITLE for your existing entries **will not be affected**.
{% endhint %}


# Intro

{% embed url="<https://www.youtube.com/watch?v=2W4vyWk796w>" %}

{% embed url="<https://www.youtube.com/watch?v=CQ5GYaPjgRI>" %}


# Platforms and Media

Epicollect5 mobile app is available for Android and iOS.

{% hint style="info" %}
Please note that the supported versions of our application may change over time due to requirements imposed by Google and Apple. These requirements may include updates to the minimum API levels for Android or iOS versions supported by Apple devices.

As a result, older versions of our application may become incompatible with the latest operating systems or may no longer receive updates and support. To ensure the best experience and access to the latest features and security enhancements, we recommend regularly updating to the latest version of the application available on the respective app stores.
{% endhint %}

{% hint style="warning" %}
**The mobile app is currently available for both Android (10+) and iOS (16+).**
{% endhint %}

### Android

We support phones and tablets on Android 10 and onwards.

[Download it from the Play Store.](https://play.google.com/store/apps/details?id=uk.ac.imperial.epicollect.five\&hl=en_GB)\
\
If Epicollect5 does not work for you and gets stuck at the splash screen, you can try to update Chrome and the WebView as explained [**at this link**](https://supportcommunity.zebra.com/s/article/000021792?language=en_US)**.**

You could also try to install an older version [**from this link.**](https://epicollect5-data-collection.en.aptoide.com/versions)

{% hint style="danger" %}
We do not support older versions of our app, apps sideloaded or running on rooted devices.
{% endhint %}

### iOS

We support iPhones and iPads with iOS 16+.

[Download it from the App Store.](https://itunes.apple.com/us/app/epicollect5/id1183858199?mt=8)

## Media files

### Photos

Photos taken/imported to Epicollect5 will be resized to a resolution of **1024 x 768 px** (landscape or portrait, **aspect ratio 4:3**). They will be saved in `.jpg` format.

When using the web application, the accepted formats are `jpeg,jpg,png` , but the resulting image will be resized and saved as `jpg.`

We found this size to be reasonable for data collection purposes; it is stable across devices with low memory/specs and easily viewable via the web application. Due to modern devices taking pictures at crazy resolutions and with file sizes up to 20MB, we had to come up with a consistent solution.

{% hint style="info" %}
If you want the original, full-size image, we recommend taking the photos outside of Epicollect5 and then importing them into Epicollect5 using the image picker when adding an entry. That way, the original photo is saved in the device gallery app.
{% endhint %}

As a side note, the popular app [Instagram](https://www.instagram.com/?hl=en) does use a similar approach.

As technology evolves, we might raise the resolution limits at some point in the future.

### Audio

Audio files are recorded as MP4, mono channel at \~64Kbs.

They are coded as **AAC** with **44100hz** audio sampling.

The maximum file size is 100MB.

{% hint style="warning" %}
Currently, **.wav** files are accepted but not encoded when uploading audio files via the web uploader.
{% endhint %}

### Video

Video files are stored as MP4.

They are coded as **AAC** and capped at **720p** resolutio&#x6E;**.**

The maximum file size is 500MB.

{% embed url="<https://www.youtube.com/watch?v=LuUxflsMn1E>" %}

### Media Storage and Privacy

#### Private Internal Storage

To ensure data integrity and security, Epicollect5 does not store media in public directories. Instead, all media files are saved directly into the app’s private internal storage.

* Data Integrity: This prevents third-party apps (such as automated gallery cleaners or cloud-sync tools) from moving, renaming, or deleting your files before they are successfully uploaded to the server.
* Privacy & Security: By utilising private folders, your collected media remains inaccessible to other apps on the device, adhering to mobile development best practices for data protection.

#### Manual File Access

Under standard operating conditions, these files are not visible via default file explorers or gallery apps.

> Note on Rooted Devices: While media could theoretically be accessed manually on "rooted" (Android) or "jailbroken" (iOS) devices, we strongly discourage this practice. Modifying device permissions in this manner can compromise the security of your data, void device warranties, and may lead to stability issues within the Epicollect5 framework.


# Mobile App Authentication

Mobile App Security: Single-Device Authentication with Continuous Web Access

For enhanced security within our mobile app, only one device can be authenticated at a time. This means that if you log in to the app on one mobile device, and then log in on another mobile device, the first device will be automatically logged out.

For example, if you log in to the app on your smartphone (Device A) while at home, and then later log in on your tablet (Device B), the app on your smartphone will be logged out to ensure that only one mobile device remains authenticated.

However, web access is not affected by this restriction. You can still access your account through the web on your computer or other devices simultaneously, even if you're logged in to the mobile app on one device. This allows you to maintain access to your account on both your mobile app and the web without interruption.


# Mobile App Permissions

To deliver a smooth and efficient user experience, Epicollect5 requests several permissions on your device. Here's why these permissions are essential.

1. **Camera Access**: Epicollect5 requires access to your device's camera to capture photos directly within the app. This is crucial for users who need to document their observations or collect visual data as part of their project.
2. **Location Access**: To accurately record the coordinates of your device, Epicollect5 requests location permissions. This ensures that the geographic data collected is precise, enabling users to map data points effectively in their research or fieldwork.
3. **Microphone Access**: The app uses the microphone to record audio, which is vital for capturing voice notes or other audio data as part of your project. This functionality is particularly useful in scenarios where verbal descriptions or interviews need to be documented.
4. **Storage and Media Access**: Epicollect5 needs access to your device's storage to save photos and videos or to allow you to select media files from your existing library. This ensures that your visual data is easily accessible and can be incorporated into your data collection efforts seamlessly.
5. **Notifications**: To enhance user experience and ensure smooth operation, Epicollect5 sends notifications when you take a photo or scan a barcode. This is particularly important on devices with aggressive Android ROMs or battery optimization settings that might otherwise kill the app. The notification acts as a safeguard, keeping the app running in the background while you continue your data collection tasks uninterrupted.

**Important Settings Recommendations**

To ensure that Epicollect5 operates smoothly and reliably, we recommend that you:

* **Disable Auto-Removal of Permissions**: Some devices have a setting that automatically removes permissions if an app hasn’t been used for a certain period. Please ensure this setting is turned off for Epicollect5. This will prevent the app from losing necessary permissions unexpectedly, ensuring that it remains fully functional whenever you need it.
* **Disable Battery Optimization**: Many devices have battery optimization settings that can restrict the background activity of apps. For Epicollect5 to function correctly, especially during tasks like photo-taking or barcode scanning, make sure to disable any battery optimization settings that could interfere with its operation. This will help maintain the app's performance and prevent it from being closed or restricted by the system.

More info:

{% embed url="<https://dontkillmyapp.com/>" %}

These permissions and settings are crucial for Epicollect5 to function as a comprehensive data collection tool, offering you the flexibility and reliability needed for successful field research. Rest assured, each permission is used solely to enhance the app's performance and to support your data collection activities.

<figure><img src="/files/fRDHPam8gaoIp4VnEdLv" alt="" width="375"><figcaption><p>Epicollect5 app permissions on a Samsung Galaxy A33, Android 14.</p></figcaption></figure>


# Add Projects

{% hint style="warning" %}
**Projects must be created beforehand using our web application.**

[**Learn More**](/web-application/create-a-project)
{% endhint %}

After creating projects in the web application and preparing to collect entries, you must manually add them to the Epicollect5 mobile application.

Here's what this process entails:

1. **Manual Project Addition**: Users must add projects to the mobile app manually. This way, users can choose which projects they want to participate in.
2. **Project Structure Only**: When a user adds a project to the app, only the empty structure of the project is added. This structure includes the project's design, such as the forms and questions that participants will fill out. The app does not sync any existing entries from the project.
3. **No Project or Entries Syncing**: The app does not automatically sync project data or entries from the server. This means that users will not receive any existing entries or updates from the server when they add a project to the app. However, if a project is updated and the user is still using an old version, a prompt will be shown when trying to upload entries.
4. **User Authentication Not Required For Public Projects**: Users can add public projects to the mobile app whether they are logged in or not. This provides flexibility for users who may not have a registered account or want to remain anonymous.
5. **Focus on Data Collection**: By focusing on adding the project structure rather than syncing data, the app aims to provide a simple and efficient way for users to collect data on the go.

#### Key Considerations:

* **User-Controlled Project Participation**: Since users must manually add projects to the app, they have control over which projects they want to join and contribute data to.
* **No Data Sharing**: The lack of project and entry syncing means that each user works with their own local copy of the project's empty structure. Users will not see each other's data or entries.
* **Privacy and Security**: By not requiring user authentication or syncing project data, the app maintains a higher level of privacy and security for users.

Overall, this approach provides users with a clear and controlled experience when participating in projects using the Epicollect5 app. It allows users to focus on data collection while maintaining their privacy and autonomy in choosing projects.

To add a project, tap the **+ ADD PROJECT** button at the top right corner of the **PROJECTS** page.

{% hint style="info" %}
An internet connection is required to be able to search and add projects.
{% endhint %}

<div align="left"><figure><img src="/files/ruHLJakzSwzIGNAOwlAS" alt=""><figcaption></figcaption></figure></div>

You will be presented with the **ADD PROJECT** page, where you can search for a project by typing its name.

<figure><img src="/files/s9Kmx2Tg5AqroxTtIznx" alt=""><figcaption></figcaption></figure>

The search will begin once you enter 3 or more characters.

You will be presented with a list of matches.

Tap the desired project to download it.

<figure><img src="/files/dzQtFrSTlceW13YMIEHU" alt=""><figcaption></figcaption></figure>

If the project is private, you will be prompted to log in.

{% hint style="warning" %}
**You must be a member of a private project to download it.**
{% endhint %}

<figure><img src="/files/LSWYlQixMhhnJTFLV0kU" alt=""><figcaption></figcaption></figure>

Once successfully authenticated, just tap the project you wish to add and it will be downloaded to the device.

<figure><img src="/files/j01Hwx3oHX143hArPXzV" alt=""><figcaption></figcaption></figure>

The project will be added to your **PROJECTS** home page.

<figure><img src="/files/cuwAJ0uVo5IHj65yftGm" alt=""><figcaption></figcaption></figure>

{% embed url="<https://www.youtube.com/watch?v=lwmpSxGpCo8&ab_channel=KarenJoyce>" %}


# Add Entries - Mobile (Single Form)

Add entries to a project that consists of a single form using the mobile app

To begin adding entries, tap on your project on the **PROJECTS** list home page.

<figure><img src="/files/K2Nw7wpAxynVWaVklWb2" alt=""><figcaption></figcaption></figure>

Next, tap the **+ADD ENTRY** button at the top right to start adding an entry to the first form.

In this example, the form is called simply *'FORM 1'*.

<figure><img src="/files/16JZ1WsmsnWmLHHeix6H" alt=""><figcaption></figcaption></figure>

This will begin the process of adding an entry, by answering each question on the form.

<figure><img src="/files/1DXxfq3Fr1IZy6YTU8Gv" alt=""><figcaption></figcaption></figure>

A progress indicator at the top show you how far through each form you are.

You can use the **NEXT** and **PREVIOUS** buttons to navigate back and forth.

<figure><img src="/files/dSzcrtCQcjeZMqGf2ny0" alt=""><figcaption></figcaption></figure>

If you decide to quit your entry early, you can choose to save your incomplete entry.

<figure><img src="/files/tqntPVlo4ujXxolsxBbX" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Incomplete entries cannot be uploaded.

Only fully completed entries can be synced with the server.

In order to complete an entry, you must reach the end of the form.
{% endhint %}

Once you have reached the end of the form, you can save your entry.

<figure><img src="/files/Wv3SempHU9Su6JNB0mB7" alt=""><figcaption></figcaption></figure>

After the entry is saved locally, you will be taken back to the form home page where you can add more entries, view your entries or upload your entries to the server.

<figure><img src="/files/FxRgJQgWZMNXJ2Qcfewu" alt=""><figcaption></figcaption></figure>

{% embed url="<https://www.youtube.com/watch?v=Z4VMccxwljY>" %}


# Add Entries - Mobile (Multiple Forms)

Add entries to a project that consists of multiple forms using the mobile app

On multiple forms projects, like our [**EC5 HIERARCHY PROJECT**](https://five.epicollect.net/project/ec5-hierarchy-project), the data collection follows a hierarchy structure. It is exactly like using folders on your computer. We usually create a parent folder and inside it one or more subfolders and so on. A parent folder can contain multiple subfolders. It is not possible to create a subfolder without a parent folder.

In the sample project, we set up three linked forms: **CLASS > PUPIL > TEST**.

**(**[**See linking forms**](/formbuilder/multiple-forms)**).**

The main idea is to add a list of **CLASS** entries and add **PUPIL** entries to each **CLASS** entry. Afterwards\*\*,\*\* we want to add **TEST** entries to each **PUPIL** entry.

Look below, we added a **CLASS** entry named "*History*" to the **EC5 HIERARCHY PROJECT**.

**(**[**More on adding an entry**](/mobile-application/add-an-entry)**).**

When an entry for a form is added, and there is a linked form, an arrow button appears next to the entry when viewing the list of entries. We added a CLASS entry named "History".

<figure><img src="/files/gP9pMCK0KyVufHnoTQEx" alt=""><figcaption></figcaption></figure>

On larger screens like a tablet, or when the device is in landscape mode, the name of the linked form also appears. Our child/linked form is named PUPIL.

<figure><img src="/files/KnRBqLZDMlu4XfuLUOaO" alt=""><figcaption></figcaption></figure>

Tapping the PUPIL button takes you to the PUPIL form, where we can add child entries to the "History" CLASS entry. Tap the **+ADD ENTRY** button on the top right to add an entry.

<figure><img src="/files/YCrbMhnqh9tyZ5wTacMI" alt=""><figcaption></figcaption></figure>

We added a PUPIL entry named "Mirko" and that appears as a child entry of "History". At this point, following the same steps, we can either add another PUPIL entry or go a level further down the forms hierarchy to add a TEST entry to a PUPIL. The back button at the top left indicates "CLASS", our starting form.

<figure><img src="/files/pYlWnoDre5pSFBzf6LTI" alt=""><figcaption></figcaption></figure>

On larger screens or in landscape mode, the name of the linked TEST form appears.

<figure><img src="/files/ykKvazA5KlozAbA0Z1Ie" alt=""><figcaption></figcaption></figure>


# Edit Entries

To edit an entry, tap the entry you wish to edit, from the list of project entries.

<figure><img src="/files/ZNh10VzdpxwowLpk9T87" alt=""><figcaption></figcaption></figure>

On the View Entry page, tap the edit button of a question you wish to edit the answer for.

{% hint style="info" %}
You can also delete the whole entry by tapping **DELETE.**
{% endhint %}

<figure><img src="/files/ZkgC3wGDLOkfOBFvXF6E" alt=""><figcaption></figcaption></figure>

Edit the existing answer, for example adding a family name

<figure><img src="/files/uBPYrvDlvpuPMpIcfe8N" alt=""><figcaption></figcaption></figure>

It is possible to quit and save at any time, or to reach the end of the form and then save.

<figure><img src="/files/CsvMPYI5sxioodJJ6c4D" alt=""><figcaption></figcaption></figure>

Once saved, you will be taken back to the View Entry page.\
Please note the warning about the entry now unsynced, since the changes were applied only locally.

<figure><img src="/files/sGZUdUrz51eYhrvbBle0" alt=""><figcaption></figcaption></figure>


# Re-use answers

TEXT and TEXTBOX question types feature a look-up on previously entered answers to save time when collecting entries.

In the following example, we are collecting road names using a TEXT question. To avoid typing the same road names over and over, you can re-use the answers you saved already on the device.

<figure><img src="/files/fsw2TNiWq81OwlrLbfey" alt=""><figcaption></figcaption></figure>

When entering a new entry, tap the lens icon to open the search panel.\\

<figure><img src="/files/ui5pl28MMeXUnSAD1HMT" alt=""><figcaption></figcaption></figure>

Pick a saved answer from the list and tap CLOSE.

<figure><img src="/files/4OtcdGdOZxzHANZDemR2" alt=""><figcaption></figcaption></figure>

The selected answer will be used.

<figure><img src="/files/xgW6uh5zOqRzwJ9DftoL" alt=""><figcaption></figcaption></figure>


# Save & Resume Entries

When collecting data, you can save an entry as incomplete and resume it later.

This is useful when certain information is not immediately available, the device is running out of battery or there is just not enough time to complete the questionnaire.

To save the entry, tap QUIT at the top right.

<figure><img src="/files/csKtGqYGdBOn7xoRWNAy" alt=""><figcaption></figcaption></figure>

Tap SAVE on the confirmation dialog.

<figure><img src="/files/aVH03WmVWxaUjDDjJuX2" alt=""><figcaption></figcaption></figure>

Please note the warning about the entry being incomplete, and only the answers up to the saving point are shown.

{% hint style="warning" %}
**Incomplete entries cannot be uploaded**.

To complete an entry, it must be saved at the end of the form.
{% endhint %}

<figure><img src="/files/hFU0b9sH2GT8xmOHjTCJ" alt=""><figcaption></figcaption></figure>


# Upload Entries

Entries must be uploaded manually by the users as there is not any automatic syncing feature in Epicollect5.

To upload your entries, tap on the project from the **PROJECTS** list.

{% hint style="warning" %}
An internet connection is required
{% endhint %}

<figure><img src="/files/Z6IivYwy46Il5CcWlHpl" alt=""><figcaption></figcaption></figure>

Next, tap the cloud icon at the top right corner (or tap **UPLOAD** on the warning banner).

Please note your local entries have an empty cloud icon next to them, to flag them as not synced.

<figure><img src="/files/wdclEmj8jDHk9AB5IsBy" alt=""><figcaption></figcaption></figure>

Tap UPLOAD DATA, if there are entries to upload the button will be enabled.

{% hint style="info" %}
If this is a private project, and users are not already logged in, they will be prompted to authenticate before they can upload any entries.
{% endhint %}

<figure><img src="/files/GHneIq6UEnL77X9wC7wC" alt=""><figcaption></figcaption></figure>

A progress indicator is shown while the data is being uploaded and once the upload is completed, feedback is shown.

<figure><img src="/files/LZuaMILQDpzRBZIW6tTl" alt=""><figcaption></figcaption></figure>

Synced entries get a green-checked cloud icon to flag them as synced

<figure><img src="/files/43h2Bb6x7WiGlhheGF1f" alt=""><figcaption></figcaption></figure>

## Uploading media files

{% hint style="warning" %}
If there are media files (photo, audio, and video questions) they need to be uploaded separately.
{% endhint %}

If there are media files to upload (photos, videos, and audio), it is possible to do it only once all the data has been uploaded successfully.

<figure><img src="/files/ElVgwzlK50nnQ2nTl6Wg" alt=""><figcaption></figcaption></figure>

### Why **Media Files Are Uploaded Separately?**

1. **User Choice & Flexibility**
   * Users may have **slow or unstable internet**, making it inefficient to upload large media files alongside form data.
   * In some cases, **mobile data is expensive**—users may prefer uploading media later on Wi-Fi.
   * Separating media uploads allows users to **submit critical data first** and add media when convenient.
2. **System Consistency & Validation**
   * Media files (photos, audio, video) always require the **existing entry (container)** to link to.
   * The **text/data portion must be validated first** (e.g., uniqueness, min or max, location values) before associating media.
   * Prevents orphaned media files (uploaded files with no linked entry).
3. **Technical & Performance Reasons**
   * Media files are **larger and slower to upload** compared to text/data.
   * Uploading them separately **reduces server load** and avoids timeouts.
   * Easier **error handling**—if media upload fails, the main data remains intact.

#### **Workflow Example**

1. **Users submit entries** (text, selections).
2. **The server validates and saves** the entry, generating a unique ID (e.g., `entry_123`).
3. **Users upload media**, which gets attached to `entry_123`.
4. **System confirms** all uploads are complete.

#### **Edge Cases & Considerations**

* **Weak Internet**: Users can retry media uploads without resubmitting the entire form.
* **Cost Sensitivity**: Users with limited data can skip or defer large uploads.
* **Validation Dependency**: Media require a validated entry on the server.

{% hint style="warning" %}
By separating media uploads, the system balances **user experience**, **reliability**, and **efficiency**.
{% endhint %}


# Upload Errors

Sometimes entries uploaded are invalid therefore they will generate an error when trying to upload them. For example missing required questions or answers not being unique.

If for any reason, there has been an error, you will be notified.

<figure><img src="/files/PnOzPnSgOKULZpN24XMo" alt=""><figcaption></figcaption></figure>

Tap the red button **CHECK ENTRIES** if available, otherwise, go back to the list of entries

<figure><img src="/files/fu40VMwAheHx5QlRKeq1" alt=""><figcaption></figcaption></figure>

Entries with errors are flagged with a red cloud icon next to them.

<figure><img src="/files/uyLncyqcbR6nLwQIpsrG" alt=""><figcaption></figcaption></figure>

Tap the entry with the error to view the error detailed message. For example, below there is an error about an answer not being unique.

<figure><img src="/files/gv6hC8j8RapiaDa2OvJg" alt=""><figcaption></figcaption></figure>

Edit the answer to fix the error and try to upload again. (See [**Edit Entries**](/mobile-application/edit-entries))

<figure><img src="/files/2j0YbAGgp3z6N55sx8qF" alt=""><figcaption></figcaption></figure>


# Incomplete Entries

For consistency, each entry must be completed by answering all its questions. An entry flagged as incomplete cannot be uploaded.

If an entry is saved halfway through the form (to be completed later) the entry is marked as **INCOMPLETE** and flagged with a yellow minus sign icon. ([**See save & Resume Entries**](/mobile-application/saveresume-entry))

<figure><img src="/files/gMATW0lu3mx9ZMt9NLLa" alt=""><figcaption></figcaption></figure>

When the entry is viewed, it will only show the answers up to the saving point.

<figure><img src="/files/TMeWpsjx5MRgUCOSUjKT" alt=""><figcaption></figcaption></figure>


# Missing required aswers

Entries with required questions not answered cannot be uploaded.

Errors about missing required answers usually happen when a question gets set as required at a later stage. The form gets updated on the app correctly but the user already has some entries on the device he cannot upload anymore, as they are missing the answer to the now required question.

The user needs to amend the old entries and fix the errors. Let's see an example:

<figure><img src="/files/DAN52ZKyGHjz3OlZ0DY9" alt=""><figcaption></figcaption></figure>

The project above is a simple two questions form asking for names and sex. As you notice, the "Sex?" question is not required. Let's add it to the device and add an entry:

<figure><img src="/files/6SSH5zQ2bNjjYsUvraCP" alt=""><figcaption><p>We enter the name</p></figcaption></figure>

<figure><img src="/files/k7BOJ3dWlvr8Isp1KeNe" alt=""><figcaption><p>We skip this question</p></figcaption></figure>

<figure><img src="/files/kKOgPG76HH0bKnwcUjWV" alt=""><figcaption></figcaption></figure>

Before uploading, we make a change to our form and set the "Sex?" question as required:

<figure><img src="/files/WJKQ3qfSI4XJwCxGYKEF" alt=""><figcaption></figcaption></figure>

If we try to upload, a message is shown asking us to update our form. Let's tap **OK**.

<figure><img src="/files/VudFd3GhaaQ9I21YmpgO" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8UM5QAayzKzeEEWlnfYV" alt=""><figcaption></figcaption></figure>

If we try to upload after updating the form, we will get an error as some existing entries on the device do not meet the requirements anymore. In our case, the "Sex?" question is now required therefore it must be filled in.

<figure><img src="/files/iBxybi9QdUKvq2ZA2cRD" alt=""><figcaption></figcaption></figure>

We answer the question, save it and upload it again, this time successfully.

<figure><img src="/files/xh2cOMyVPIP7brLNccuU" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/XoS1XJMiPASY25encxHK" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/zZVHOAZtNF7BNvpalQ2v" alt=""><figcaption></figcaption></figure>


# Unsync entries

In cases where upload errors persist after updating a project, it is possible to efficiently resolve the issue by unsyncing all entries and re-uploading them in bulk. This proves particularly helpful when existing entries on the device are aligned with an outdated version of the project.

To unsync all entries currently stored on the device, kindly navigate to the entries list and access the right drawer menu.

<figure><img src="/files/iq5QEhJPuNAkWzRoZY6z" alt=""><figcaption></figcaption></figure>

Tap on **Unsync All Entries**

<figure><img src="/files/A9ZlTEELC6jfmrjYwOhn" alt=""><figcaption></figcaption></figure>

Now that all entries have been successfully unsynced, you have the opportunity to re-upload them from scratch. This ensures a clean and error-free submission of the entries to the updated version of the project.


# Export Entries - Mobile

Export your project data and media directly from the mobile app, without relying on external integrations or APIs.

These built-in options (available since version **88.9.6**) give you flexible workflows for both automated syncing and one-off data sharing.

#### 1. Send to Device

This option allows you to **export your project entries and media directly to your device**.

* On **Android**, exported files are saved to the **Documents** folder.
* On **iOS**, exported files are saved to **My Phone**.
* The export includes:
  * CSV files of all your entries
  * Copies of all associated media (images, audio, video)

**Use case:** Ideal if you want to **set up a third-party app** (like [FolderSync](https://foldersync.io/)) to automatically sync your exported data to your cloud service of choice.

#### 2. Share Archive

This option creates an **archive of your entries and media**, packaged as a **ZIP file**, and opens the **share panel** so you can send it wherever you like.

* Includes the same CSV files and media as **Send to Device**.

**Use case:** Best for a **one-off export** when you want a single package of your data to share, backup, or send via email, cloud storage, or other apps.

#### Why Two Options?

Having both options lets you choose the workflow that fits your needs:

* **Send to Device** → For ongoing syncing with cloud services or automated workflows.
* **Share Archive** → For one-time exports or sharing with others in a single ZIP file.

<figure><img src="/files/oVIRkgJ122AwP07ZtkcM" alt=""><figcaption></figcaption></figure>

### How to Use

1. Open the project in the Epicollect5 mobile app.
2. Tap the **menu** (⋮) and select **Send to Device** or **Share Archive**.
3. Wait for the export process to complete.
4. Check the target folder (Documents/My Phone) or use the share panel to access your ZIP file.

<figure><img src="/files/LeGOps0y1VlhdBxOj2GH" alt=""><figcaption></figcaption></figure>


# Entries Limits

If you are collecting data for a project where the manager(s) set entry limits, you might get some errors when trying to upload entries. [More on setting entries limits](/mobile-application/entries-limits)**.**

For example, let's have a look at our example project [EC5 Limit entries.](https://five.epicollect.net/project/ec5-limit-entries)

<figure><img src="/files/SIz20cR34yrSS3ZK7pPd" alt=""><figcaption><p>A limit of 2 entries is set on the PERSON form</p></figcaption></figure>

On the [EC5 Limit entries](https://five.epicollect.net/project/ec5-limit-entries) project, we set the limits of the PERSON form to 2.

We already uploaded 2 entries to the server for the PERSON form, so let's see what happens if you try to add an extra entry.

<figure><img src="/files/hdbrbIq4nF9zCTMqyiOZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eLOOIwITfgeyYx0gsHxf" alt=""><figcaption></figcaption></figure>

The upload attempt failed, as the entries limit on the server is reached.

<figure><img src="/files/G2cyEa4k8MaX2hsqIYrH" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/sVIUlZLE3jFh3eEnVaDW" alt=""><figcaption></figcaption></figure>

If you download the entries from the server, they count towards the entries limit therefore the **+ADD ENTRY** button gets disabled.

<figure><img src="/files/JlGXAlnZaMHdcbJFbarg" alt=""><figcaption></figcaption></figure>


# Download Entries

Within Epicollect5, users have the capability to download remote entries for each form onto their device.

This functionality enables the addition of entries from one device and later retrieval on another.

When downloading entries, users obtain a snapshot of the current data collection status, encompassing form entries exclusively, but **excluding branch entries, and media files.**

{% hint style="warning" %}
**Please note that when utilizing the mobile native apps, it's intentionally not feasible to directly edit downloaded remote entries and subsequently re-upload them.**
{% endhint %}

By design, direct editing of downloaded remote entries on the device is not possible. However, users can augment these entries by adding **child entries or branches.** This restriction ensures that server-side entries consistently supersede local modifications, **upholding the server as the definitive data source**.

{% hint style="warning" %}
**This approach maintains data synchronisation and integrity across devices, with the server acting as the singular source of truth.**
{% endhint %}

Entries can be edited on the server by CREATOR, MANAGER and CURATOR roles via the web application. ([**See how**](/web-application/adding-data))

The responsive nature of the web application facilitates seamless access from mobile devices and tablets, contingent upon an internet connection.

{% hint style="success" %}
**For editing entries on mobile devices, utilising the web application stands as the sole viable option instead of the mobile app.**
{% endhint %}

### How entries are updated on the device

* **New remote entries** — Entries on the server that have no match on the device are added as remote entries. These entries are read-only and cannot be edited on the device.
* **Matching synced entries** — Entries that exist on the device, are synced, and match a remote entry are replaced with their remote version. After replacement, the entry becomes read-only, and editability on the device is lost.
* **Unsynced local entries** — Entries that have not yet been synced to the server are left untouched. The download will not overwrite unsynced changes.

#### Before you download

Project versions must match between the device and the server. Before downloading entries, the app will force a **project update** to ensure you have the latest project form definitions.

When a project is updated, any remote entries previously downloaded for that project are cleared, as they may be outdated with the new form structure.

## Add child entries to downloaded entries

Let's use our [EC5 Hierarchy project ](https://five.epicollect.net/project/ec5-hierarchy-project)to show how everything works. Load that project and select it from the project list.

<figure><img src="/files/GnTZgEqmOhkaBiZqS07B" alt=""><figcaption></figcaption></figure>

On the entries page, open the menu and tap "**Download Entries".**

<figure><img src="/files/guRFNYGOjlWF1ngMlVD9" alt=""><figcaption></figcaption></figure>

On the next screen, you see the list of your form buttons, from top to bottom following your hierarchy structure ([More on linking forms](/formbuilder/multiple-forms)). Only the form at the top is enabled, as you need to download entries following the project hierarchy structure, in this case, it is CLASS > PUPIL >TEST. Tap the "**CLASS**" button to download **ALL** the class entries from the server.

<figure><img src="/files/CWJNA4feMAzEDuPeeLlY" alt=""><figcaption></figcaption></figure>

You will be prompted to confirm the download. This is to remove any remote entries you already have on the device, as you always get the latest entries snapshot from the server. Press "**OK**" to proceed.

<figure><img src="/files/DZHfIp31JG1ChOS5APQt" alt=""><figcaption></figcaption></figure>

After all the CLASS entries are downloaded, the PUPIL button is then enabled.

Tap PUPIL to download all the entries for the PUPIL form.

<figure><img src="/files/yKJ0vQGHnzRMsM9ghsru" alt=""><figcaption></figcaption></figure>

Finally, tap TEST to download all the TEST entries.

<figure><img src="/files/msobutY7HXny0G3UP5BP" alt=""><figcaption></figcaption></figure>

When all the entries for all the forms are downloaded, the forms buttons are all disabled and you can go back to the entries list.

<figure><img src="/files/PYXRgfEvWIZOxbyM1m6r" alt=""><figcaption></figcaption></figure>

The remote entries are now all listed, with a desktop icon next to each of them to indicate they are "**remote**" i.e. **not directly editable**. Now you can add child entries or branches to existing entries (See [Add an entry](/mobile-application/add-an-entry) and [Add a child entry](/mobile-application/add-child-entries)).

<figure><img src="/files/AXh6WNgs6Mj5B3LfyeeX" alt=""><figcaption></figcaption></figure>

## Add branch entries to downloaded entries

Let's download some entries and add brach entries to them. For this example, we will use the [EC5 Branches Project.](https://five.epicollect.net/project/ec5-branches-project)

<figure><img src="/files/w3DQhIHw6zfY7Lq6wf4F" alt=""><figcaption></figcaption></figure>

Select one of the entries downloaded, in this case "Mirko"

<figure><img src="/files/eqyVIG1Nm5MEMM4pI0Q9" alt=""><figcaption></figcaption></figure>

As you can see there are not edit buttons, but next to the branch question the view button is enabled. Tap it once to go to the add branch screen.

<figure><img src="/files/lPl13QMVz9o38f9zQ4m7" alt=""><figcaption></figcaption></figure>

Tap the add branch button to add a branch entry.

<figure><img src="/files/R9KkhkShNxA6ZrS4cyMs" alt=""><figcaption></figcaption></figure>

After you add a branch entry, you need to SAVE it before you can upload it. Obviously, you might add more branch entries and then save all of them at once.

<figure><img src="/files/u9oMTX6kU5fS6DHVG6sB" alt=""><figcaption></figcaption></figure>

After you save the branch entry, you can upload it.

Notice the total of branch entries changed to "1 Entry"

<figure><img src="/files/R3uWNP3qCJ959tWmLumA" alt=""><figcaption></figcaption></figure>

### Why downloaded entries are read-only

This design eliminates an entire class of synchronization and conflict-resolution problems by making the **server the single source of truth**.&#x20;

#### Examples of issues avoided by this approach

* **Conflicting edits from multiple devices**
  * User A downloads an entry onto their tablet and goes offline.
  * Meanwhile, User B edits the same entry on the server.
  * If User A were allowed to edit the downloaded copy offline, reconnecting would create two different versions of the same entry. The system would need conflict detection, merging, or ask users which version to keep.
  * By keeping downloaded entries read-only, the device simply downloads the latest server version, avoiding conflicts entirely.
* **Outdated data overwriting newer information**
  * A field worker downloads project data before leaving for the day.
  * During the day, managers correct several entries through the web application.
  * If the field worker could later upload edits made from the stale copy, those outdated values could overwrite the more recent corrections made on the server.
  * With read-only downloaded entries, the latest server changes are always preserved.
* **Inconsistent data across team members**
  * Two users download the same entry.
  * Each edits their local copy while offline.
  * Since neither modification is propagated immediately, every device now displays different information for the same record.
  * Restricting edits to the server ensures every user eventually receives the same authoritative version.
* **Broken parent-child relationships**
  * A downloaded parent entry is modified locally while new child entries are being created by other users on the server.
  * When the local changes are eventually uploaded, they may no longer be consistent with the current hierarchy or related records.
  * Treating downloaded entries as immutable avoids introducing inconsistencies into the project structure while still allowing users to add new child entries and branches.
* **Complex conflict resolution logic**
  * Supporting editable downloaded entries would require detecting concurrent edits, comparing field-by-field changes, handling deleted entries, resolving media conflicts, and deciding which version should prevail.
  * The current approach avoids all of this complexity, making synchronization predictable and reliable.
* **Audit and data integrity issues**
  * Entries may be reviewed, corrected, or validated by project managers on the server.
  * Allowing older downloaded copies to be edited and later uploaded could unintentionally revert approved changes or invalidate audit trails.
  * By ensuring all edits occur through the server, every client always converges to the same verified dataset.

#### Summary

The read-only nature of downloaded entries is a deliberate design choice that:

* prevents conflicting edits across multiple devices;
* avoids stale data overwriting newer server changes;
* guarantees all users converge on the same dataset;
* preserves the integrity of entry hierarchies;
* eliminates the need for complex conflict resolution and merge algorithms;
* keeps the server as the single, authoritative source of project data.


# Delete Entries (App)

Select the project you would like to delete entries for on the project list.

<figure><img src="/files/7nZaguipC468HidRSBSo" alt=""><figcaption></figcaption></figure>

Open the right drawer menu by tapping on the "Menu" button, the three vertical dots at the top right. From the list of options tap on "Delete entries" to delete all the entries for a project.

<figure><img src="/files/ACEGWIOncb6mbIinBdiN" alt=""><figcaption></figcaption></figure>

A confirmation prompt is shown. Tap **OK** to confirm or **CANCEL** to dismiss the popup.

{% hint style="danger" %}
**Be careful to sync your entries first!**

You will not lose data from the main server/database if you delete entries from your mobile device, provided that:

* The entries were uploaded successfully without any errors.
* You have double-checked that the entries are all uploaded on the server (in the web interface).
* (Optional, but extra safe!) You have downloaded a CSV backup from the server to keep a local copy.

If you have confirmed your data is on the server, you can safely delete the entries from your phone. The server and the app are independent once the upload is complete and confirmed.
{% endhint %}

<figure><img src="/files/XUxTrtOAc7JNSKGUMshl" alt=""><figcaption></figcaption></figure>

All the entries get deleted, and a "**No Entries Found**" message is displayed.

<figure><img src="/files/bAeEMzlF6QKDNCG0YotT" alt=""><figcaption></figcaption></figure>

To delete a single entry, tap on the entry to view it and use the **DELETE** button at the top right.

<figure><img src="/files/UIq8wMATaDOsLJfOqEsp" alt=""><figcaption></figcaption></figure>


# Delete Projects (App)

Select the project you would like to delete from the list of projects.

<figure><img src="/files/tBCbadz0VBbVYn9FGJ7q" alt=""><figcaption></figcaption></figure>

Open the right menu by tapping on the 3 dots icon at the top right and tap on "Delete Project"

<figure><img src="/files/h8Kp2gmR2iWuNtdjYx9F" alt=""><figcaption></figcaption></figure>

When the confirmation dialogue appears, tap on "Ok" to confirm.

{% hint style="danger" %}
Please be aware all the entries and related media files will be deleted!
{% endhint %}

<figure><img src="/files/SAdGKqKzlkTUcyJsDs0n" alt=""><figcaption></figcaption></figure>


# Location Questions

Location of the user device can be acquired adding a LOCATION question.

### Device Location

The user needs to tap on the "Update Location" button to get the location data stored (see below).

<figure><img src="/files/oVpv4BY5OTs41yNp8zSz" alt=""><figcaption></figcaption></figure>

By tapping that button, you are giving the app your consent to store your location.

### Manual Location

It is possible to enter the latitude and longitude values manually by tapping the menu icon and then Edit.

<figure><img src="/files/EDBoXWPiXL2xxE4f4Ntw" alt=""><figcaption></figcaption></figure>

The format must be `latitude, longitude`in decimal degrees format.

This feature is useful when copying coordinates from third-party apps, like [**Organic Maps**](https://organicmaps.app/).

<figure><img src="/files/XkbCNpwxBdjWfwzX95kR" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
For privacy reasons, device location tracking cannot be done automatically.

If you have used Facebook or Instagram, you might have noticed a similar approach; when adding a post, the location needs to be added manually.
{% endhint %}

### Required Location

{% hint style="danger" %}
**A location question cannot be set as required**, as users might choose not to provide that information, or the device might lack GPS capabilities (e.g., a low-cost Android tablet). Additionally, obtaining a GPS lock can be challenging for various reasons. In such cases, if the location question is mandatory, the user would be unable to complete the form.

As a workaround, consider creating a GROUP containing both a LOCATION question and a required TEXT question. The TEXT question can prompt users to manually copy and paste the location values (latitude and longitude) from the LOCATION question.
{% endhint %}

<figure><img src="/files/ZAgH4rmNAPPh01nxPsBH" alt=""><figcaption><p>Forcing users to provide location details</p></figcaption></figure>

You can use the following **regex** pattern to validate the TEXT answers:

```regex
^[-+]?([1-8]?\d(\.\d{1,6})?|90(\.0{1,6})?),\s*[-+]?(180(\.0{1,6})?|((1[0-7]\d)|(\d{1,2}))(\.\d{1,6})?)$
```

This pattern ensures the following:

1. Latitude ranges from -90 to 90 with up to six decimal places.
2. Longitude ranges from -180 to 180 with up to six decimal places.
3. The latitude and longitude are separated by a comma and optional whitespace.

#### Explanation:

* `^` and `$` assert the position at the start and end of the string, respectively.
* `[-+]?` optionally matches a leading `-` or `+` sign.
* `([1-8]?\d(\.\d{1,6})?|90(\.0{1,6})?)` matches latitude:
  * `[1-8]?\d` matches numbers from 0 to 89.
  * `(\.\d{1,6})?` optionally matches up to six decimal places.
  * `90(\.0{1,6})?` matches the special case of 90 degrees with up to six decimal places.
* `,\s*` matches a comma followed by optional whitespace.
* `[-+]?` optionally matches a leading `-` or `+` sign.
* `(180(\.0{1,6})?|((1[0-7]\d)|(\d{1,2}))(\.\d{1,6})?)` matches longitude:
  * `180(\.0{1,6})?` matches the special case of 180 degrees with up to six decimal places.
  * `((1[0-7]\d)|(\d{1,2}))` matches numbers from 0 to 179.
  * `(\.\d{1,6})?` optionally matches up to six decimal places.

#### Examples:

* Valid: `45.123456, -93.123456`
* Valid: `90, 180`
* Invalid: `91, 180` (latitude out of range)
* Invalid: `45.1234567, -93.123456` (more than six decimal places)

This regex should work well for validating latitude and longitude in decimal degrees with up to six decimal places.

### Mobile app

On the mobile app, the interface will show:

| Data                   | Format                                                                                                                                                                               |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Latitude and Longitude | **Signed degrees format**, with 6 decimal places to pinpoint a location within 11cm.                                                                                                 |
| Accuracy               | **Meters**, refers to how close the device's calculated position is from the truth, expressed as a radius. Consumer smartphones devices can get a maximum accuracy of 3 or 4 meters. |

{% hint style="info" %}
The interface and features are kept to a minimum so that they can work both online and **offline.**
{% endhint %}

### **Third-party Offline Maps Integrations**

Starting from version **6.0.0**, our mobile applications now offer seamless integration with popular mapping apps such as Google Maps, Organic Maps, and Here WeGo. This integration allows users to view locations directly within these apps and conveniently copy latitude and longitude values (in decimal degrees) for use in Epicollect5.

With this new feature, users can leverage the familiar interfaces and robust functionalities of these mapping applications to enhance their experience with Epicollect5. Whether you're navigating through remote areas or pinpointing specific locations, our integration with these offline maps ensures flexibility and accuracy in capturing geographic data.

We're committed to providing our users with intuitive tools and versatile features, and we believe that this integration will streamline your data collection process while maintaining the highest standards of usability and convenience.

<figure><img src="/files/HkF7Xwk72DnJcnXKZCmU" alt=""><figcaption></figcaption></figure>

### Web Application

When adding or editing data via the web application ([**See how**](https://app.gitbook.com/adding-data.md)), more features are available since the application will always be **online**.

![](/files/k87cEKn3mIDdVl9h3Q5t)

You could:

* Enter the coordinates manually.
* Find a location based on an address (it is called [**geocoding**](https://en.wikipedia.org/wiki/Geocoding)).
* Find your current location and drag the marker where you want.
* Change map tiles to your preferences.

![](/files/c3tVgT4IiitoDxOrsISp)

Latitude and longitude values are shown as **signed degrees format**, with 6 decimal places to pinpoint a location within 11cm.

### Exported location data

When exporting your datasets, by downloading a `csv` or `json` file and by using the API endpoints, location data are provided in both signed degrees format and UTM.

### Reverse Geocoding

Epicollect5 does not feature any way to automatically pick up an address based on latitude and longitude. Such a feature would require a reverse geocoding service (usually not free) and an internet connection thus it would not work offline.

For projects requiring it, latitude and longitude values can be converted to addresses in the post-processing of the data by using a third-party service like [**What3Words**](https://what3words.com/products/batch-converter/) or [**Geocodio**](https://www.geocod.io/upload/).

### Offline Location

A GPS lock can be obtained even when offline. Epicollect5 will try to read the location data from the GPS receiver of the device, not the wifi or the network.

If the device is offline, the satellite lock is slower and will not work indoors. Therefore, be sure to place the device outdoors, under a clear sky, and not close to any magnetic fields. Buildings, mountains and trees can stop satellite signals. Then try again until you get a lock.

To diagnose problems with your device’s GPS, we recommend the app [**GPS Status and Toolbox**](https://mobiwia.com/gpsstatus/), available for both Android and iOS.

### About Location and Bearing Data in Epicollect5

When using a **Location** question in Epicollect5, the app records **latitude**, **longitude**, and **accuracy** using the device's GPS. However, **bearing (or heading/direction)** is **not included**, even if the device provides it.

This is because bearing data from mobile devices is often **inconsistent**, **unavailable when stationary**, or affected by **sensor limitations** and **privacy restrictions**. Some platforms (like iOS) may return `null` or unreliable values unless the device is actively moving and equipped with the necessary sensors. To maintain data quality and consistency, **Epicollect5 does not include bearing in the location data collected**.


# Add Bookmarks

Bookmarks are shortcuts to a specific form of a project. It is beneficial when the project has multiple linked forms and the user task is to always collect data for a form/entry deep down the hierarchy structure.

It can be tedious to select the project > select the first form entry > then the second form entry and so on to reach the form you are interested in.

With bookmarks, you can get there with two (two!) taps.

For example, on our EC5 Hierarchy Projects, we set a three-forms hierarchy like CLASS > PUPIL > TEST.

We added a **History** entry to CLASS, then **Marcus** as PUPIL for that CLASS. We would like to quickly add SCORE entry for **History** > **Marcus** but we would like to avoid having to select **History>Marcus** each time. **Marcus** could be our favourite History student and we want a quick way to add SCORE entries to him.

Start with selecting the project from the home page projects list.

<figure><img src="/files/XyyYclgNYC57SMHTFE13" alt=""><figcaption></figcaption></figure>

On the History CLASS entry from the list, tap on the green right arrow button

<figure><img src="/files/Yd0CiA63xpJmhIXmtRri" alt=""><figcaption></figcaption></figure>

On the "History" PUPIL entries list, for the "Marcus" entry, tap on the green right arrow button.

<figure><img src="/files/Ve8tkR3Odj0KvL7vZmsr" alt=""><figcaption></figcaption></figure>

Now we are on "Marcus" TEST entries. We would like to bookmark this screen to get back here quickly to add SCORE entries for "Marcus".

Tap the top right menu button (the three vertical dots).

<figure><img src="/files/RWB8P2aXm7bglOn0uhFn" alt=""><figcaption></figcaption></figure>

From the right drawer menu, tap on "Bookmark Page".

<figure><img src="/files/MJu27mDLjZ3dqzLNURVt" alt=""><figcaption></figcaption></figure>

Give a meaningful name to the bookmark and tap on "Add bookmark".

<figure><img src="/files/E3SWB5LkrI4J5tWBLv3h" alt=""><figcaption></figcaption></figure>

From now on, your bookmark is available by opening the left drawer menu (tap the hamburger icon at the top left to open it).

Tap on the bookmark to navigate to the page you just bookmarked.

<figure><img src="/files/wBgKYyxivKMsmxwCZV6R" alt=""><figcaption></figcaption></figure>

To remove a bookmark, go to the bookmarked page and tap the top right menu button (the three vertical dots) to open the right drawer menu. Tap on "Remove bookmark".

<figure><img src="/files/sunukL8JWv2MdOE8HSFg" alt=""><figcaption></figcaption></figure>


# Project Info

You can view more information about the project you are working on directly from the Epicollect5 mobile app.

{% hint style="warning" %}
This feature requires an internet connection.
{% endhint %}

Pick your project from the project list.

<figure><img src="/files/rqtLpyxAwXFNXiOpI3Kg" alt=""><figcaption></figcaption></figure>

Tap on the three dots button at the top right to open the right sidebar menu.

<figure><img src="/files/c3DPMMHPrdZlYmVXgvoN" alt=""><figcaption></figcaption></figure>

Tap on "Project Info" from the list of options.

<figure><img src="/files/h2WMck9nFhaveuw2QDhX" alt=""><figcaption></figcaption></figure>

Project information is displayed.

To go to the project home page, tap on the "arrow" icon at the top right

<figure><img src="/files/zPQ4e8XR7cINdkzh8vkh" alt=""><figcaption></figcaption></figure>

The default browser on your device will open and go to the project home page.

<figure><img src="/files/gPhtLPL4t2ifBJ66QeAi" alt=""><figcaption></figcaption></figure>

To view your project data, scroll down and tap on "View Data".

<figure><img src="/files/l5tzr9XFPHfz6x6cUA9I" alt=""><figcaption></figcaption></figure>

The table view is shown. To switch to the map (if any), tap on the menu button at the top right.

<figure><img src="/files/Ii3evH1cq7b1sfR2ifSC" alt=""><figcaption></figcaption></figure>

Tap on "Map" from the list of options.

<figure><img src="/files/kvkpexmni3OGcS8l15Nd" alt=""><figcaption></figcaption></figure>

The map view loads.

<figure><img src="/files/cMMLjSs8Trbci0QPIBAX" alt=""><figcaption></figcaption></figure>


# Share Media Files

For security, privacy and consistency, third-party apps like your gallery or video player cannot access Epicollect5 data and media.

However, you can share a copy of the media files created using the Epicollect5 app with other apps on your device, if you wish to do so.

Select the entry from the list of your project entries.

<figure><img src="/files/JUr4DMIUuZLnhV0ZWSF2" alt=""><figcaption></figcaption></figure>

On the view entry screen, find any media file question and tap on the "Edit" button next to it.

<figure><img src="/files/z8iR5PwBzjrSSgmrPD3R" alt=""><figcaption></figcaption></figure>

Tap on the context menu button (3 vertical dots).

<figure><img src="/files/0dFkOEB8B7wI7a2QQVC7" alt=""><figcaption></figcaption></figure>

Tap on the share button to share the image. Please be aware the interface will be different based on the device platform and version (Android or iOS). The image below is from a Samsung device running Android 13.

<figure><img src="/files/YX816fla4niFUZffifar" alt=""><figcaption></figcaption></figure>


# Adjust Font Size

When using Epicollect5 on a tablet or on phones with a really high screen resolution, you might find the font size to be a little too small and therefore difficult to read.

It is very easy to adjust the font size to your liking. From the home screen (your list of projects), tap on the menu button at the top left to open the drawer menu.

<figure><img src="/files/4sUQEw9tXMnxQaVRkfmA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4AcNKj4el7M9WKQ19hEz" alt=""><figcaption></figcaption></figure>

On the settings screen, drag the slider to the right to increase the font size or to the left to decrease it. Tap **SAVE** to apply the changes.

<figure><img src="/files/emzZxJfoGXCJO8K2Vc7S" alt=""><figcaption></figcaption></figure>


# Filter Entries

Entries saved to the device can be filtered: it is possible to search by title or filter by date or status.

On the entries list page, tap the filter icon to open the filter panel.

<figure><img src="/files/z4HozxrAnpJnFPvx0P5l" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/LIW9nKf5F2JkaTdaRROm" alt=""><figcaption></figcaption></figure>

The **SHOW (N) ENTRIES** button at the top will update based on the parameters specified. For example, tapping **INCOMPLETE** will show only incomplete entries.

<figure><img src="/files/tbNrrsfodH6RETYyyYzv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/PBT6rSOhuAkSlge5yUsL" alt=""><figcaption></figcaption></figure>


# Beta Updates

We’ve added **two new options** to the Epicollect5 mobile app, currently available in **public beta releases** for both Android and iOS. These features give you more flexibility in managing and exporting your project data and media.&#x20;

App version is currently **88.9.6**

### Joining the Beta

#### Android

1. Open the [Google Play Store](https://play.google.com/) on your device.
2. Search for **Epicollect5**.
3. Scroll down to the **“Join the Beta”** section and tap **Join**.
4. Wait a few minutes for your device to update to the beta version.

#### iOS

1. Install the **TestFlight** app from the App Store.
2. Use the [beta invitation link](https://testflight.apple.com/join/6gW71eIy) provided to join the beta program.
3. Open TestFlight and update the app to the beta version.

> Note: Beta versions are periodically updated with new features and fixes. You can leave the beta program at any time to return to the stable release.

### New Features

#### 1. Send to Device

This option allows you to **export your project entries and media directly to your device**.

* On **Android**, exported files are saved to the **Documents** folder.
* On **iOS**, exported files are saved to **My Phone**.
* The export includes:
  * CSV files of all your entries
  * Copies of all associated media (images, audio, video)

**Use case:** Ideal if you want to **set up a third-party app** (like [FolderSync](https://foldersync.io/)) to automatically sync your exported data to your cloud service of choice.

#### 2. Share Archive

This option creates an **archive of your entries and media**, packaged as a **ZIP file**, and opens the **share panel** so you can send it wherever you like.

* Includes the same CSV files and media as **Send to Device**.

**Use case:** Best for a **one-off export** when you want a single package of your data to share, backup, or send via email, cloud storage, or other apps.

#### Why Two Options?

Having both options lets you choose the workflow that fits your needs:

* **Send to Device** → For ongoing syncing with cloud services or automated workflows.
* **Share Archive** → For one-time exports or sharing with others in a single ZIP file.

<figure><img src="/files/oVIRkgJ122AwP07ZtkcM" alt=""><figcaption></figcaption></figure>

### How to Use

1. Open the project in the Epicollect5 mobile app.
2. Tap the **menu** (⋮) and select **Send to Device** or **Share Archive**.
3. Wait for the export process to complete.
4. Check the target folder (Documents/My Phone) or use the share panel to access your ZIP file.

<figure><img src="/files/LeGOps0y1VlhdBxOj2GH" alt=""><figcaption></figcaption></figure>


# Xiaomi Troubleshooting

There have been some reports of the Epicollect5 app having issues on Xiaomi devices.

{% hint style="danger" %}
Sometimes when the users take a photo, the Epicollect5 app restarts.
{% endhint %}

Apparently, [**MIUI**](https://en.miui.com/) (the Xiaomi customised version of Android powering almost all Xiaomi devices) has a very aggressive memory management implementation causing any app in the background to be killed when the system finds that is using too much memory.

The Epicollect5 app goes in the background when taking photos because the stock camera app installed on the users' device will be in the foreground. After taking the photo, if the Epicollect5 app was killed while being in the background, the users will experience an app restart.

**This is a known issue which is unfortunately outside of our control**. The following steps can be taken to mitigate the problem until we are able to implement a definitive fix.

### **MIUI 10:** follow[ **this guide**](https://dontkillmyapp.com/xiaomi) and apply it to Epicollect5.

### **MIUI 11**: follow the steps below.

![Open settings](/files/uMYVoGLT3Z5JtvaFQOG2)

![Tap on Apps](/files/o6QtZEFcEb0F5eMXepHe)

![Tap on Manage Apps](/files/4XTghfZn7S1Ax53VETZm)

![Select the Epicollect5 app](/files/S591tmUBMqFCrxcXa0IA)

![Set Autostart On](/files/6uGUo6irW1pIhjhw67S8)

![Tap on Other Permissions](/files/0lyUVUxIZOxIAwIJAtyL)

![Enable all](/files/FgkV1YivSpbtZuJI7aiV)

![Select Battery Saver](/files/1tj2bOn3WLI3MIgquSlF)

![Whitelist Epicollect5](/files/tMPds0D13WMrKyabZcfb)

### Install Open Camera

If Epicollect5 restarts despite having followed all the steps above, we would suggest installing the camera application called [**Open Camera**](https://play.google.com/store/apps/details?id=net.sourceforge.opencamera\&amp;hl=en_GB) (by Mark Harman) to be used as the default camera app for Epicollect5.

![Download Open Camera](/files/2PBv7l37GLs116fyhbxS)

![Set as default](/files/nQgrJndFMev1eTWE5UF0)

{% hint style="success" %}
After downloading Open Camera from the Play Store, the next time the users will try to take a photo using Epicollect5, the app chooser will appear.

Selecting Open Camera with "Remember my choice" checked will replace the stock camera app with Open Camera each time Epicollect5 is used to take a photo.
{% endhint %}


# Intro

Epicollect5 provides an API to fetch data programmatically using some simple GET requests.

Responses are in `JSON` (default) or `CSV` format.

For simple uses, we provide you with the parameters and some pre-made endpoints to view in your browser (**public projects only**). [**More info**](/developers/api)**.**

{% hint style="warning" %}
For private projects, you'll need to register your app before getting started.

A registered app is assigned a unique Client ID and Client Secret which will be used in the OAuth flow.

**The Client Secret must not be shared!**
{% endhint %}

For advanced users, [**read our comprehensive guide here.**](https://developers.epicollect.net/)


# API

Get data out of Epicollect5 programmatically

{% hint style="info" %}
A fully-fledged Developer Guide can be found at [**https://developers.epicollect.net**](https://developers.epicollect.net/)
{% endhint %}

To access the API page go to your project details **(**[**show me how**](/web-application/set-project-details)**)** then on the left sidebar click on API under the Developers section:

![](/files/D0IsmDw0AvTD3uj186f3)

You will get to a page with two tabs: parameters and endpoints.

The following screenshots are based on our [**EC5 API TEST project.**](https://five.epicollect.net/project/ec5-api-test)

## Parameters

You can see the main parameters of your project and the `map_index` which is the unique identifier per each of your custom mappings:

![](/files/kEXirEt5nPl8OK3jvqzL)

## Endpoints

We list the most common endpoints to get the data for the selected project. If the project is public, you can view them directly via the browser. If the project is private you will have to [register your app](/developers/apps).

![](/files/XJM1LHxCertmGgKlrYpB)

[**More info about Epicollect5 API.**](https://developers.epicollect.net/)


# Apps

If you want to use the Epicollect5 API to get data for a **private project**, you will have to register your "app" to get authentication details to exchange with the Epicollect5 server.

{% hint style="info" %}
A fully-fledged Developer Guide can be found at [**https://developers.epicollect.net**](https://developers.epicollect.net/)
{% endhint %}

Go to your Apps page under the Developers section:

![](/files/K1r1gzWxeIW87Rh9HotQ)

Click on the "Create New App" button

![](/files/2oSCDnqnep7PvGRIvfjS)

Give a name to your App and click on "Create"![](/files/YnzZ5j9mRcT7uJt0s2Jk)"

Now you can use the generated Client ID and client Secret in your script. [Show me how.](https://epicollect5.gitbooks.io/epicollect5-api/content/client-credentials-grant/retrieve-token.html)

![](/files/H3nu6i1puom23ryWiRi6)

**Notice you need to register your app only once for a project** and reuse the Client ID and Client Secret on your applications.


# Google Maps

It is pretty easy to import Epicollect5 data into Google Maps (by using [My Maps](https://www.google.com/mymaps))

Go to <https://www.google.com/mymaps> and log in with your Google Account.

Click on "+ CREATE A NEW MAP".

<figure><img src="/files/xKBSuCT8LxXX4Grsu47v" alt=""><figcaption></figcaption></figure>

On the new map, click on the import button.

![](/files/fP0xmuFpQq9rwhKDBVco)

Pick the `.csv` file with your downloaded data. ([How to download data?](/web-application/downloading-data)). Wait for the upload to complete.

![](/files/NpR0xHxu6hfG5cmrAB8a)

You will be asked to pick the latitude and longitude from your data set. Epicollect5 prepends "**lat\_**" and "**long\_**" to latitude and longitude columns respectively.

![](/files/J31rLPwhwN6X6j9q3ASw)

We are using the EC5 Demo Project for this example so we will pick "**lat\_3\_Where\_are\_you**" as the latitude and "**long\_3\_Where\_are\_you**" as the longitude.

|                                  |                                  |
| -------------------------------- | -------------------------------- |
| ![](/files/7pEvaTNENmBe7X3yAtoC) | ![](/files/cywsVnBMFwrIkE43hh6B) |

Now you will be asked to pick a column of your data set to be used as the title for the placemark. Epicollect5 conveniently has a "**title**" column assigned to each of your entries ([learn more about entry title](/formbuilder/title)) therefore that is an obvious choice.

![](/files/kYdaFp0IQaKNdtf4oUiS)After clicking on "Finish" your map will load. Isn't that awesome? [Learn more about My Maps.](https://support.google.com/mymaps/?hl=en#topic=)

![](/files/8e9dER5oxc18BVVtNfCZ)


# Google Earth

How to view your Data on Google Earth

{% embed url="<https://www.youtube.com/watch?v=04HpK844g54>" %}


# Microreact

Microreact is a tool for open data visualization and sharing for genomic epidemiology.

It is possible to integrate Epicollect5 with Microreact using [Google Spreadsheet](https://www.google.co.uk/sheets/about/) as a bridge between the two platforms.

We are going to use the [EC5 Demo Project](https://five.epicollect.net/project/ec5-demo-project) as an example. **The project must be public.**

Using the Epicollect5 API endpoints, we can get all the entries (500 at a time) for that project using the following URL: ([Open in browser](https://five.epicollect.net/api/export/entries/ec5-demo-project?format=csv\&headers=false\&per_page=1000))

`https://five.epicollect.net/api/export/entries/ec5-demo-project?format=csv&headers=false&per_page=500`

We are passing a few parameters:

`format=csv`as we need the entries in csv format.

`headers=false` as we do not want the column headers. We are going to use custom headers to fit [Microreact requirements](https://microreact.org/instructions).

`per_page=500` to get the maximum number of entries on a single request (500)as export responses are paginated. Google Sheets could give an error if requesting too many entries though.

If your project has more than 500 entries, multiple requests need to be made adding an incremental `page` parameter specifying the next page on each request (`page=1`, `page=2`, `page=3` and so on).

A single Google Sheets spreadsheet can have up to 50 `IMPORTDATA()` calls ([**more info**](https://support.google.com/docs/answer/3093335?hl=en)) therefore the integration will work with projects up to 50.000 entries.

We created a public viewable spreadsheet [here](https://docs.google.com/spreadsheets/d/1akzXZRR-aQYwv12d0TMKtWGeWPrOajFGp3QzLQttZwE/edit#gid=0).

[Learn more about how to create a Google Sheet to use with Microreact.](https://microreact.org/tutorials/google-sheets)

The first thing to do is to leave the first row empty for the time being, and click on cell A2.

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-b200fd6b44e31c34404bf8040eaa3dd7f76fa6e5%252Fmicroreact-1.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=c41aa367&#x26;sv=2" alt="" height="417" width="1050">

We are going to use the following formula in that cell:

`=IMPORTDATA("https://five.epicollect.net/api/export/entries/ec5-demo-project?format=csv&headers=false&per_page=500")`

passing the URL described above. \\

The URL to get the entries for a public project is always the same, just the project slug will be different. For another project, we would just need to replace the`ec5-demo-project`slug with the new one. You can find each project slug in the [API section](https://docs.epicollect.net/developers/api) of your project details page, or by just looking at the URL in your browser on your project home page.

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-b0f4c2279b9368ad77c5a002c4055c93b9fb65c0%252Fmicroreact-2.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=6fffb74&#x26;sv=2" alt="" height="623" width="1119">

Now it is time to add the custom headers. Microreact requires a column `id` to uniquely identify each row. With data coming from Epicollect5, that will always be the most left column.

We also need to specify `latitude` and `longitude` columns if we want to view the data on a map. [More info on Microreact headers](https://microreact.org/instructions)

You can use a downloaded csv from Epicollect5 as a reference if you do not remember your headers. After adding them manually, we have:

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-b34672c245f9a0cc7f7d0972bdd55dbcb9581559%252Fmicroreact-3.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=f1f547f2&#x26;sv=2" alt="" height="644" width="1116">

**Important: if you have Date or Time questions, you have to set the format for those columns, otherwise by default they get converted to numbers (Google trying to be smart here).**

To do that, select the Date or Time columns, click on Format > Number and pick Date or Time.

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-3434435b128f2e0322ae27c1867aec93cc3907ab%252FScreen%2520Shot%25202017-07-07%2520at%252014.35.42.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=700e0136&#x26;sv=2" alt="" height="545" width="1371">

Now the sheet is ready to be published. Go to File > Publish to the web...

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-f8928431bd0df0e71d08b31b9c35d2233f50d4dc%252FScreen%2520Shot%25202017-07-07%2520at%252011.20.31.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=f01accb7&#x26;sv=2" alt="" height="605" width="719">

It needs to be published as comma-separated values (csv) and we need to grab the generated link to use on Microreact

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-8276abb466728eeba6bd56e235dd1405a3adad87%252FScreen%2520Shot%25202017-07-07%2520at%252011.21.41.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=b96eb400&#x26;sv=2" alt="" height="597" width="572">

To refresh the data set automatically (so when new entries are added to Epicollect5, they appear on the sheet) we can set an auto refresh to one minute or one hour. Go to File > Spreadsheet settings

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-96c19354f614ad484ad4e82d5fac550339edcf9e%252FScreen%2520Shot%25202017-07-07%2520at%252011.23.31.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=6e68c036&#x26;sv=2" alt="" height="618" width="561">

On the calculation tab, select "On change and every minute" (or hour)

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-59b90516ccba96d69a7e3a457c72798e6676bd29%252FScreen%2520Shot%25202017-07-07%2520at%252011.23.53.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=d2ac1bc0&#x26;sv=2" alt="" height="393" width="589">

We are ready to head off to Microreact with the url we just generated:

`https://docs.google.com/spreadsheets/d/1akzXZRR-aQYwv12d0TMKtWGeWPrOajFGp3QzLQttZwE/pub?output=csv`

Please notice the "output=csv". If your url does not have that, check your publish settings.

On the [Microreact home page](https://microreact.org/showcase), click Upload:

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-54971200c6dd7df3d8e061c8d6f193ee5892453d%252Fmicroreact-4.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=8b0e473d&#x26;sv=2" alt="" height="610" width="1184">

Paste the project url where it says CSV file and click on "Continue (without tree)"

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-475cf874ca5888f9475f5f2853e4437567735c01%252Fmicroreact-5.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=37c318ee&#x26;sv=2" alt="" height="441" width="1198">

Enter some basic project details and click on "Create Project"

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-1193d8f535cb99206b816ed4c9f7a4e7090e211b%252Fmicroreact-6.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=52f57b7c&#x26;sv=2" alt="" height="581" width="1215">

The project is generated!

<img src="https://docs.epicollect.net/~gitbook/image?url=https%3A%2F%2F3293478884-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F32OIF30CgrNUuRY6IjkW%252Fuploads%252Fgit-blob-f57a05421fe75296e4ae93b0c422998ea050b436%252Fmicroreact-7.png%3Falt%3Dmedia&#x26;width=768&#x26;dpr=3&#x26;quality=100&#x26;sign=6440436&#x26;sv=2" alt="" height="1017" width="1212">

The project is currently hosted at <https://microreact.org/project/xsnGcExikXbEDGTMtsFdkC-ec5-demo-project>


# Survey Toolkit

Energy access organizations do a lot of surveying: of potential customers, sites, and marketplaces. Finding the best platform to manage this data can be hard. Devergy's solution, the [**Survey Toolkit**](https://enaccess.org/surveytoolkit/)**,** provides a simple approach to collecting, analyzing, and presenting field survey data.

The toolkit combines three off-the-shelf applications — EpiCollect5, GoogleSheets, and Google My Maps — and works like this:

1. Users use EpiCollect5 to create a custom survey form or data entry template;
2. Users use the EpiCollect5 mobile app to collect geo-tagged survey data, with options for collecting data in text, photo, video, or audio formats;
3. Users enter a script into Google Sheets to allow data to be sent fromEpiCollect5 to Google Sheets, where it can be cleaned and analyzed;
4. Users use the data in Google Sheets to create a custom Map (i.e. on Google My Maps) which presents insights in a visual format.

We like this toolkit because it’s free, highly configurable, and easy to use.

We love that it’s been field-proven for a year or more, and we’d recommend this asa great option for teams that are just getting started with surveying, or otherwise finding issues with their existing surveying platform.

**Learn more at**

[**https://enaccess.org/wp-content/uploads/2019/07/Survey\_Toolkit\_Instruction\_Devergy.pdf**](https://enaccess.org/wp-content/uploads/2019/07/Survey_Toolkit_Instruction_Devergy.pdf)\
\
**Source Code** [**https://github.com/EnAccess/Survey-Toolkit?tab=readme-ov-file**](https://github.com/EnAccess/Survey-Toolkit?tab=readme-ov-file)


# Google Sheets

Connect a Google spreadsheet to an Epicollect5 public project

Using the Epicollect5 API, it is possible to export entries in `csv` format.

{% hint style="warning" %}
The project must be **public** to work with Google Sheets.

If you have a private project, have a look at the Survey Toolkit code [**here**](https://github.com/EnAccess/Survey-Toolkit/blob/main/Epicollect_5-Sheets_Integration.gs)**.**
{% endhint %}

### Import Data

Google Sheets features the `=IMPORTDATA()` function to import data from a given URL in .csv (comma-separated value).

{% hint style="info" %}
IMPORTDATA() Official Docs -> <https://support.google.com/docs/answer/3093335?hl=en>
{% endhint %}

Create a new sheet and click on the first cell. Paste the following in:

`=IMPORTDATA("`[`https://five.epicollect.net/api/export/entries/ec5-demo-project?form_ref=b963c3867b1441b89cb552b982f04bc8_5784e0609397d&format=csv&per_page=500&page=1`](https://five.epicollect.net/api/export/entries/ec5-demo-project?form_ref=b963c3867b1441b89cb552b982f04bc8_5784e0609397d\&format=csv\&per_page=1000\&page=1)`")`

After the entries are loaded, it will look like this.

{% hint style="success" %}
For this example, the public [**EC5 Demo Project**](https://five.epicollect.net/project/ec5-demo-project) was used.
{% endhint %}

![Entries loaded in Google Sheets](/files/BsgqqtSznPizYUnGTyC5)

The URL passed in the `IMPORTDATA()` function will load the latest 1000 entries as we pass the parameter `per_page=500` and `page=1`

To get more entries (if any), we need to add more `IMPORTDATA`() calls and tweak the URL to get a different page, i.e., 2, 3, 4 and so on.

{% hint style="warning" %}
It is possible to have up to **50** `IMPORTDATA()`calls on a single spreadsheet in Google Sheets.
{% endhint %}

One way to do that would be to create another sheet on the same file and repeat the procedure above, this time using a parameter`page=2`in the URL.

![Loading entries in separate sheets](/files/easj1265UqdqiCJz2JCD)

Another option is to load the first 500 entries and the headers on the first cell, then on row 502, load the next 500 entries, omitting the headers in the request by passing the parameter `headers=false.` This way 1000 entries will be loaded on the same sheet.

![Loading entries in the same sheet](/files/eFa5PtOQM0LYGnKUIdZE)

### Lazy Load Images

Google Sheets `=IMAGE()` formulas can request many images at once.&#x20;

For large Epicollect5 exports, this may trigger rate limiting, resulting in broken images.

To avoid this, keep media URLs as plain text and use Apps Script to insert `=IMAGE()` formulas gradually.

Import your entries first:

```excel
=IMPORTDATA("https://five.epicollect.net/api/export/entries/YOUR_PROJECT?format=csv&per_page=250&page=1")
```

Then open:

```
Extensions → Apps Script
```

Paste this script:

```javascript
const CONFIG = {
  spreadsheetId: 'PASTE_YOUR_SPREADSHEET_ID',
  sheetName: 'Sheet1',
  firstDataRow: 2,

  // Columns containing image URLs.
  // Example: [8] = column H
  // Example: [8, 9] = columns H and I
  urlColumns: [8],

  // Column where images will be rendered.
  // Example: 20 = column T
  firstImageColumn: 20,

  // Number of rows loaded every minute.
  batchSize: 10
};

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Images')
    .addItem('Start automatic image loading', 'startAutomaticImageLoading')
    .addItem('Stop automatic image loading', 'stopAutomaticImageLoading')
    .addItem('Load next batch now', 'loadNextImageBatch')
    .addItem('Clear loaded images', 'clearLoadedImages')
    .addItem('Reset progress', 'resetProgress')
    .addToUi();
}

function startAutomaticImageLoading() {
  stopAutomaticImageLoading();

  ScriptApp.newTrigger('loadNextImageBatch')
    .timeBased()
    .everyMinutes(1)
    .create();

  console.log('Automatic image loading started.');

  loadNextImageBatch();
}

function stopAutomaticImageLoading() {
  ScriptApp.getProjectTriggers().forEach(trigger => {
    if (trigger.getHandlerFunction() === 'loadNextImageBatch') {
      ScriptApp.deleteTrigger(trigger);
    }
  });

  console.log('Automatic image loading stopped.');
}

function loadNextImageBatch() {
  const sheet = SpreadsheetApp
    .openById(CONFIG.spreadsheetId)
    .getSheetByName(CONFIG.sheetName);

  if (!sheet) {
    console.log(`Sheet not found: ${CONFIG.sheetName}`);
    stopAutomaticImageLoading();
    return;
  }

  const props = PropertiesService.getScriptProperties();
  let startRow = Number(props.getProperty('lastLoadedRow')) || CONFIG.firstDataRow;

  const lastRow = getLastRowWithAnyUrl(sheet);

  console.log(`startRow=${startRow}, lastRow=${lastRow}`);

  if (startRow > lastRow) {
    console.log('All image rows loaded.');
    stopAutomaticImageLoading();
    return;
  }

  const rowsToLoad = Math.min(CONFIG.batchSize, lastRow - startRow + 1);

  console.log(`Loading rows ${startRow} to ${startRow + rowsToLoad - 1}`);

  loadImageBatch(sheet, startRow, rowsToLoad);

  SpreadsheetApp.flush();

  startRow += rowsToLoad;
  props.setProperty('lastLoadedRow', String(startRow));

  console.log(`Next batch will start from row ${startRow}`);
}

function loadImageBatch(sheet, startRow, rowsToLoad) {
  CONFIG.urlColumns.forEach((urlColumn, index) => {
    const imageColumn = CONFIG.firstImageColumn + index;

    const urls = sheet
      .getRange(startRow, urlColumn, rowsToLoad, 1)
      .getValues();

    const formulas = urls.map(([url], rowIndex) => {
      const row = startRow + rowIndex;
      const value = String(url || '').trim();

      if (!value) {
        return [''];
      }

      if (!value.startsWith('https://')) {
        console.log(`Row ${row}: invalid image URL in ${columnLetter(urlColumn)}${row}`);
        return [`Invalid image URL`];
      }

      return [`=IMAGE(${columnLetter(urlColumn)}${row})`];
    });

    sheet
      .getRange(startRow, imageColumn, formulas.length, 1)
      .setValues(formulas);
  });
}

function clearLoadedImages() {
  const sheet = SpreadsheetApp
    .openById(CONFIG.spreadsheetId)
    .getSheetByName(CONFIG.sheetName);

  const lastRow = getLastRowWithAnyUrl(sheet);

  if (lastRow < CONFIG.firstDataRow) {
    return;
  }

  const rows = lastRow - CONFIG.firstDataRow + 1;

  sheet
    .getRange(CONFIG.firstDataRow, CONFIG.firstImageColumn, rows, CONFIG.urlColumns.length)
    .clearContent();

  console.log('Loaded image formulas cleared.');
}

function resetProgress() {
  PropertiesService
    .getScriptProperties()
    .deleteProperty('lastLoadedRow');

  clearLoadedImages();

  console.log('Progress reset.');
}

function getLastRowWithAnyUrl(sheet) {
  const sheetLastRow = sheet.getLastRow();

  if (sheetLastRow < CONFIG.firstDataRow) {
    return CONFIG.firstDataRow - 1;
  }

  const rows = sheetLastRow - CONFIG.firstDataRow + 1;

  const valuesByColumn = CONFIG.urlColumns.map(column => {
    return sheet
      .getRange(CONFIG.firstDataRow, column, rows, 1)
      .getValues();
  });

  for (let i = rows - 1; i >= 0; i--) {
    const hasUrl = valuesByColumn.some(values => {
      const value = String(values[i][0] || '').trim();
      return value.startsWith('https://');
    });

    if (hasUrl) {
      return CONFIG.firstDataRow + i;
    }
  }

  return CONFIG.firstDataRow - 1;
}

function columnLetter(columnNumber) {
  let letter = '';

  while (columnNumber > 0) {
    const remainder = (columnNumber - 1) % 26;
    letter = String.fromCharCode(65 + remainder) + letter;
    columnNumber = Math.floor((columnNumber - 1) / 26);
  }

  return letter;
}
```

#### Configure the script

Update these values:

```javascript
spreadsheetId: 'PASTE_YOUR_SPREADSHEET_ID'
urlColumns: [8]
firstImageColumn: 20
batchSize: 10
```

The spreadsheet ID is in the URL:

```
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit
```

Column numbers:

```
A = 1
B = 2
H = 8
T = 20
```

#### Usage

Reload the spreadsheet, then use:

```
Images → Start automatic image loading
```

The script will:

```
1. Load the first batch immediately
2. Continue loading another batch every minute
3. Stop automatically when all image URLs have been processed
```

You can also use:

```
Images → Load next batch now
```

to test one batch manually.

#### Notes

* `batchSize` controls how many rows are loaded per minute.
* `urlColumns` controls which CSV columns contain media URLs.
* `firstImageColumn` controls where rendered images are written.
* Invalid or non-HTTPS URLs are skipped and marked as `Invalid image URL`.
* If you want to restart from the beginning, use `Images → Reset progress`.

Epicollect5 images are cached for 24 hours, so once an image has loaded, it is normally served from cache on later spreadsheet reloads.

### IMPORTDATA() Errors&#x20;

{% hint style="danger" %}
If IMPORTDATA() throws an error, reduce the number of entries using a lower `per_page` value.
{% endhint %}

![](/files/xxyq3kep9AeGhmxIhnVw)


# Matrix Style Questions

Sometimes you might want to convert some "matrix" style questions to Epicollect5.

Like the following:

![](/files/y6Y6ZM0psXHaifqNSilM)

This type of layout is very common on desktop applications but it would be very tricky and clumsy to use on a mobile device due to the limited screen size. **The horizontal formatting of matrix questions is not ideal for smartphones**.

A common way to create this on Epicollect5 is using a combination of GROUP(s) and multiple-choice questions, like RADIO, DROPDOWN or CHECKBOX. Let's see how to do it!

1 - Create a new project ([how?](/web-application/create-a-project))

2 - Drag a **GROUP** question type to your form:

![](/files/SJeVohlWMJf5dMHFqkhE)

3 - Give your GROUP a header and then tap on edit:

![](/files/aBzo1uEioplBNQcbWlK2)

4 - Now drag either a RADIO or a DROPDOWN question type. RADIO question types look better on tablets while DROPDOWN save space on mobile devices with a small screen. Just pick one according to your needs.

{% hint style="info" %}
If you would like the user to pick more than one answer, use a CHECKBOX.
{% endhint %}

5 - Add the question text and the possible answers to the question you just added:

![](/files/1fBVJvyzNFXlHdMrUUZS)

6 - The next questions are all similar since only the question text will change. The possible answers are always the same. To save time, we just validate the question we already have (to make it valid so we can copy it) and we copy it multiple times as we please:

![](/files/VOclJkiWWALLjBEBFNLb)

7 - After we copied the questions, we just need to amend the question text on each one and we are done.

![](/files/7BgcozP09MI0edut5ldi)

Let's save the project and see how it looks like on the web: ([How to add entries from the web?](/web-application/adding-data))

![](/files/ArLBiRweBwZQwlD6ZLhK)

**The form above is also available as a** `json` **file for you to play with** ([see import & export forms](/formbuilder/importexport-forms)).

## [**Download it here**](https://drive.google.com/file/d/1lh1Vr_GIRSC5bGcZS-dLKYlYfz3WrOre/view?usp=sharing)**.**


# Consolidate data

When retrieving data from Epicollect5, individual files are generated for each form and branch. To facilitate data linkage, Epicollect5 assigns unique identifiers, integrated into the dataset.

{% hint style="info" %}
Considering the unique requirements of each project, we believe in empowering users to tailor their data consolidation according to their specific needs during the post-processing phase.

This approach not only fosters flexibility but also ensures that the resulting data aligns perfectly with the project's objectives and intricacies.
{% endhint %}

## Epicollect5 identifiers

Each hierarchy form data set will have a column called "**ec5\_uuid**" with a unique identifier per each row. Any child form down the hierarchy will also have a column called "**ec5\_parent\_uuid"** to reference data from its parent form\*\*.\*\*

Each branch data set will have a column "**ec5\_branch\_owner\_uuid**" which will reference each "**ec5\_uuid**" of a hierarchy form.

The values (which look like `d559da55-0df3-4121-8db0-5870d4faf038`) are system-generated identifiers used to keep the relationships on the data.

These identifiers are always present on any downloaded data sets and API responses.

## Consolidate data using Google Sheets

We will use [Google Sheets](https://www.google.com/sheets/about/) for this example, but the same concept can be applied to [Excel](https://products.office.com/en/excel), [Apple Numbers](https://www.apple.com/lae/numbers/) and similar.

{% hint style="info" %}
An Excel example using the **VLOOKUP** function is shown below.
{% endhint %}

What follows is just a simple example of how to merge data coming from three files (one hierarchy form and two branches) based on our [EC5 Branches Project ](https://five.epicollect.net/project/ec5-branches-project)example project.

First of all, let's download the data in CSV format for that project and save it somewhere handy. The downloaded .zip will contain 3 CSV files:

* `form-1__form-1.csv`
* `branch-1__list-your-family-members.csv`
* `branch-2__list-your-pets.csv`

We created a new spreadsheet and imported the above-mentioned files, one per each sheet tab, doing FILE > IMPORT

![](/files/3DIItjoXYg7gLpl8RJAe)

We use the following settings per each file:

![](/files/g03KA0sWw1JJHJ00upEi)

Please make sure you add each file in its own tab sheet. To create a new tab sheet, just click on the "+" button at the bottom left:

We also called our tab sheets "form\_1", "branch\_family\_members", "branch\_pets". This is to make it easier to reference them in our formulas.

![](/files/5Wshp6Gt5oJ5OIRVqg1e)

On the "form\_1" tab sheet, create a new column called "Family Members" where we will fetch the data from the "branch\_family\_members" tab sheet. Click on the fist empty cell of that column to select it:

![](/files/WlW2gVFRuKZNJPk9wH5M)

On that cell we add this formula: (*if you like to know more about Google Sheets and available formulas, the docs are* [*here*](https://support.google.com/docs/topic/9054603?hl=en\&ref_topic=1382883))

```
=iferror(JOIN(", ", QUERY( branch_family_members!$A:$F , "select E where A = '"&$A$2:$A&"'")))
```

We wrap everything in `iferror()` to fetch data only if there are some branches for that row, otherwise leave the cell empty.

We use `JOIN("," {QUERY(...)})` to concatenate the family members' data found with a comma.

In the QUERY statement, we first reference the "branch\_family\_members" from column A to F, basically all the columns in the "branch\_family\_members" sheet. On the right side of the QUERY statement, we search for data on column E on that tab sheet (**3\_Family\_member\_name**) where column A (**ec5\_branch\_owner\_uuid**) matches column A on the form\_1 tab sheet (**ec5\_uuid**)

**The values of "ec5\_branch\_owner\_uuid" and "ec5\_uuid" are the relationship link between the data sets.**

The result is this:

![](/files/OYH5Hu0RxRYe5dzZDHgQ)

After the formula gets copied to all the cells, it will look like this:

![](/files/N7NRa4JdQGp6WRfZbTDM)

Using the same steps as above, we can fetch the data from our "branch\_pets" tab sheet.

The formula gets updated to

`=iferror(JOIN(", ", QUERY( branch_pets!$A:$F , "select F where A = '"&$A$2:$A&"'")))`

The final result will be like below:

![](/files/urZd7aIPKAULWZ7IcYAD)

Awesome!

The final spreadsheet is available [here](https://docs.google.com/spreadsheets/d/1U-x3PmLlxMUAwcbNkx8FRQTpY0-_8w1799BFBi7qr-8/edit?usp=sharing) for you to view.

The project used in this example is [here](https://five.epicollect.net/project/ec5-branches-project).

## Consolidate data in Excel using the VLOOKUP function

VLOOKUP is an Excel function to lookup and retrieve data from a specific column in a table. VLOOKUP supports approximate and exact matching, and wildcards (\* ?) for partial matches. The "V" stands for "vertical". Lookup values must appear in the first column of the table, with lookup columns to the right. [**More info.**](https://support.office.com/en-us/article/vlookup-function-0bbc8083-26fe-4963-8ab8-93a18ad188a1)

We are going to use the project EC5 VLOOKUP in EXCEL for this example. Download its data (2 files, `form-1__class.csv` and `form-1__student.csv`)

The project is really simple, there is CLASS > STUDENT hierarchy, one parent form and one child form. We just want to add CLASS entries and all the STUDENT entries attending each class. Obviously, a student can attend more classes.

Let's import the data into Excel, one file per sheet: ([**See how to do it**](https://support.office.com/en-us/article/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba))

![](/files/khomMSVLNF2yzUA3R2JJ)

Select the STUDENT sheet. Create a new column called *Class* and select its first empty cell:

![](/files/eod4LyHm4O1VQLnJJ6Os)

Let's add the VLOOKUP formula. We would like to show the class name next to each student. The class name can be found on the CLASS sheet.

The formula will look like:

`=VLOOKUP(B2,CLASS!A$2:E$4,5,FALSE)`

More info on the formula and its arguments can be found [**here**](https://support.office.com/en-ie/article/video-vlookup-when-and-how-to-use-it-9a86157a-5542-4148-a536-724823014785)**.**

For this example, it is basically saying:

* `B2`: look for the B2 value (`ec5_parent_uuid`)
* `CLASS!A$2:E$4`: the whole CLASS sheet, all cells
* `5`: return value of column 5 from the CLASS sheet when found (*1\_Class\_name* column)
* `FALSE`: look for an exact match

The value of "Maths" is returned:

![](/files/79vq5ZxjoMg3t6GFz4TU)

Copying the formula down to the whole column, all class names are returned:

![](/files/TLs0HVD3drfODgNQk2wh)

Another simple tutorial about Excel VLOOKUP is [**here**](https://medium.com/import2/join-multiple-data-sheets-in-excel-using-vlookup-function-24e3a27d80cd). See below for further options.

### Using Python

To merge CSV files based on an identifier, you can use Python with libraries like pandas. Assuming you have two CSV files with a common identifier, you can follow these steps:

1. Install pandas if you haven't already:

```bash
pip install pandas
```

2. Create a Python script or Jupyter Notebook and import the required libraries:

```python
import pandas as pd
```

3. Read the CSV files into pandas DataFrames:

```python
df1 = pd.read_csv('file1.csv')
df2 = pd.read_csv('file2.csv')
```

4. Merge the DataFrames based on the common identifier column:

```python
merged_df = pd.merge(df1, df2, on='identifier')
```

Here, `identifier` should be replaced with the actual column name that serves as the common identifier in both CSV files.

5. Optionally, you can specify the type of merge (inner, outer, left, or right) based on your requirements. The default is an inner join:

```python
# For an inner join (only rows with matching identifiers in both files)
merged_df = pd.merge(df1, df2, on='identifier', how='inner')

# For an outer join (all rows from both files, NaN for non-matching identifiers)
merged_df = pd.merge(df1, df2, on='identifier', how='outer')

# For a left join (all rows from the left file, NaN for non-matching identifiers in the right file)
merged_df = pd.merge(df1, df2, on='identifier', how='left')

# For a right join (all rows from the right file, NaN for non-matching identifiers in the left file)
merged_df = pd.merge(df1, df2, on='identifier', how='right')
```

6. Save the merged DataFrame back to a CSV file if needed:

```python
merged_df.to_csv('merged_file.csv', index=False)
```

Remember to adjust the column names and file paths accordingly to match your data.

By following these steps, you can merge two CSV files based on a common identifier using Python and pandas.

### Using a bash script

If you prefer to use a bash script to merge CSV files based on a common identifier, you can use `awk` to accomplish this task. Here's a simple bash script to do that:

```bash
#!/bin/bash

# Define the filenames of the CSV files
file1="file1.csv"
file2="file2.csv"

# Define the common identifier column (replace 'identifier' with the actual column name)
identifier_column="identifier"

# Merge the CSV files based on the common identifier using awk
awk -F',' '
    NR == FNR {
        if (NR == 1) { header = $0; next }
        data[$'$identifier_column'] = $0
        next
    }
    {
        if (FNR == 1) { print $0; next }
        if ($'$identifier_column' in data) {
            print data[$'$identifier_column'], $0
        }
    }
' "$file1" "$file2" > merged_file.csv
```

Copy and paste the above code into a text editor and save it with a `.sh` extension, e.g., `merge_csv.sh`. Then, make the script executable using the following command:

```bash
chmod +x merge_csv.sh
```

Finally, run the script:

```bash
./merge_csv.sh
```

Please make sure that the CSV files (`file1.csv` and `file2.csv`) are in the same directory as the script or provide the correct file paths if they are located elsewhere. The merged data will be saved in `merged_file.csv` in the same directory as the script.

Note that this script assumes that the first row in both CSV files contains the header, and it will use the column names in the first CSV file for the merged output. Additionally, the script performs an inner join, meaning it will only include rows with matching identifiers in both files. If you need a different type of join, you may need to modify the script accordingly.

### Google Sheets alternative to VLOOKUP

If you want to merge CSV files in Google Sheets without using `VLOOKUP`, you can achieve this using the `QUERY` function combined with `IMPORTRANGE`. The `QUERY` function allows you to perform SQL-like queries on your data, and `IMPORTRANGE` lets you import data from another sheet or another Google Sheets document.

Here's how you can do it:

1. Upload the CSV files to Google Drive and import them into separate sheets in your Google Sheets document, similar to the steps mentioned earlier.
2. In your new sheet (Sheet3), use the following formula in cell A1:

```excel
=QUERY({IMPORTRANGE("URL_OF_YOUR_SHEET1", "Sheet1!A:B"), IMPORTRANGE("URL_OF_YOUR_SHEET2", "Sheet2!B:B")}, "SELECT Col1, Col2, Col4 WHERE Col1 IS NOT NULL")
```

Replace `"URL_OF_YOUR_SHEET1"` and `"URL_OF_YOUR_SHEET2"` with the URLs of the respective Google Sheets containing your data from Sheet1 and Sheet2. You can find the URL in your browser's address bar when you have the corresponding sheet open.

Explanation:

* `{}`: This constructs an array containing data from both Sheet1 and Sheet2.
* `IMPORTRANGE`: This function imports data from the specified sheets. We are importing columns A:B from Sheet1 and column B from Sheet2.
* `QUERY`: We use the `QUERY` function to perform a SQL-like query on the imported data.
* `SELECT Col1, Col2, Col4`: This selects columns 1, 2, and 4 from the imported data. In this case, Col1 is the identifier column from Sheet1, Col2 is the second column from Sheet1, and Col4 is the data from the second column of Sheet2.
* `WHERE Col1 IS NOT NULL`: This filters out any rows where the identifier in Sheet1 is empty.

This formula will merge data from Sheet1 and Sheet2 into Sheet3 based on the matching identifiers in column A of Sheet1.

After applying the formula, Sheet3 will contain the merged data. If you need to download the merged data as a CSV file, click on "File" > "Download" > "Comma-separated values (.csv)".

### Excel alternative to VLOOKUP

To merge CSV files in Excel without using `VLOOKUP`, you can use the `INDEX` and `MATCH` functions instead. The `INDEX` and `MATCH` functions work together to look up values in a table based on a specified row or column header. Here's how you can do it:

Assuming you have the two CSV files imported into separate sheets in your Excel workbook (e.g., Sheet1 and Sheet2) and the common identifier column is named "identifier" in both sheets, you can use the following formula in cell C2 of a new sheet (Sheet3):

```excel
=IFERROR(INDEX(Sheet2!$B$2:$B$100, MATCH(A2, Sheet2!$A$2:$A$100, 0)), "")
```

Explanation:

* `INDEX(Sheet2!$B$2:$B$100, MATCH(A2, Sheet2!$A$2:$A$100, 0))`: This part of the formula performs the lookup. It searches for the value in cell A2 (the identifier in Sheet1) in the range A2:A100 of Sheet2 and returns the corresponding value from column B of Sheet2 (the merged data).
* `MATCH(A2, Sheet2!$A$2:$A$100, 0)`: The `MATCH` function searches for the value in cell A2 in the range A2:A100 of Sheet2 and returns the position (row number) of the match. The `0` as the last argument specifies an exact match.
* `INDEX(Sheet2!$B$2:$B$100, MATCH(A2, Sheet2!$A$2:$A$100, 0))`: The `INDEX` function uses the position returned by `MATCH` to retrieve the corresponding value from the range B2:B100 of Sheet2.

Drag the formula down to apply it to the rest of the rows in column C. This will populate column C with the merged data from Sheet2 based on the common identifier from Sheet1.

The formula will return an empty string (""), represented as a blank cell, if there is no match found in Sheet2 for a particular identifier from Sheet1. The `IFERROR` function is used to handle such cases and avoid showing error values.

Please make sure to adjust the ranges (`$B$2:$B$100`, `$A$2:$A$100`, etc.) in the formula based on the actual range of data in your sheets. Also, ensure that the two sheets contain the common identifier column (named "identifier" in this example) and the data you want to merge.

### Power BI

In Power BI, you can merge CSV files based on a common identifier using Power Query, which is the data transformation engine in Power BI. Here's how you can do it:

1. Open Power BI Desktop and create a new report.
2. Go to the "Home" tab in the Power Query Editor.
3. Click on "Combine Queries" and then select "Merge."
4. In the "Merge" dialogue box, choose the first CSV file as the primary table and the second CSV file as the related table.
5. Select the common identifier column in both tables as the key column.
6. Choose the type of join you want (e.g., inner join, left outer join, etc.).
7. Click "OK" to perform the merge.
8. The merged data will be displayed in the Power Query Editor.
9. Optionally, you can perform any additional data transformations or cleanups as needed.
10. Click "Close & Apply" to load the merged data into your Power BI report.

Here's a step-by-step guide with more details:

1. In Power BI Desktop, click on "Home" in the ribbon and then select "Get Data."
2. Choose "Text/CSV" as the data source and select the first CSV file (file1.csv).
3. Follow the prompts to import the data, and it will be loaded into Power Query Editor.
4. Click on "Home" in the Power Query Editor to return to the main Power Query Editor view.
5. Click on "Combine Queries" in the Home tab and select "Merge."
6. In the "Merge" dialogue box, select the first table (usually the one imported from file1.csv) as the primary table.
7. Choose the second table (imported from file2.csv) as the related table.
8. Select the common identifier column in both tables as the key column.
9. Choose the type of join you want (e.g., inner join, left outer join, etc.).
10. Click "OK" to perform the merge.
11. The merged data will be displayed in the Power Query Editor.
12. Optionally, perform any additional data transformations or cleanups as needed.
13. Click "Close & Apply" to load the merged data into your Power BI report.

Now, the merged data will be available in your Power BI report, and you can use it to create visualizations and build your dashboards. Power Query will handle the data merge based on the common identifier column you specified, and you won't need to write any code or formulas manually.

### Using Apple Numbers

In Apple Numbers, you can merge CSV files by importing them into separate sheets and then using the VLOOKUP function to combine the data based on a common identifier. Here's a step-by-step guide:

1. Open Numbers and create a new blank spreadsheet.
2. Click on the "Table" button in the top toolbar and select "Import CSV" from the drop-down menu.
3. Choose the first CSV file (file1.csv) to import. The CSV data will be loaded into a new sheet (e.g., Sheet1).
4. Repeat step 2 and import the second CSV file (file2.csv) into another new sheet (e.g., Sheet2).
5. Now you have the data from both CSV files imported into separate sheets in the same Numbers document.
6. In a new sheet (e.g., Sheet3), where you want to merge the data, use the VLOOKUP function to retrieve the data from the second sheet based on the common identifier.

Assuming the common identifier column is named "identifier" in both Sheet1 and Sheet2, and you want to merge data from Sheet1 and Sheet2 into Sheet3:

In cell B2 of Sheet3, use the following formula and drag it down to apply it to the rest of the rows:

```excel
=VLOOKUP(A2, Sheet2::A2:B100, 2, FALSE)
```

Explanation:

* `VLOOKUP`: Looks up the identifier in cell A2 (the common identifier in Sheet1) and retrieves the corresponding value from the range A2:B100 in Sheet2 (the merged data).
* `Sheet2::A2:B100`: The double colon (::) indicates that we are using a range from Sheet2.
* `2`: We want to retrieve the second column's value from the matched row in Sheet2 (column B).
* `FALSE`: We use an exact match for VLOOKUP.

This formula will merge data from the second column of Sheet2 into Sheet3 based on the matching identifiers in column A of Sheet1.

Remember to adjust the formula, sheet names, and cell ranges if your data is in different columns or sheets.

After applying the formula, Sheet3 will contain the merged data. You can customize the sheet further, create visualizations, and perform additional data analysis as needed in Apple Numbers.

### Using R

To merge CSV files in R based on a common column called `ec5_uuid`, you can use the `merge()` function or the `dplyr` package. Here's how you can do it with both methods:

**Method 1: Using `merge()` function**

```R
# Load the data from CSV files
data1 <- read.csv("file1.csv")
data2 <- read.csv("file2.csv")

# Merge the data frames based on the common column 'ec5_uuid'
merged_data <- merge(data1, data2, by = "ec5_uuid", all = TRUE)
```

In this example, `file1.csv` and `file2.csv` should contain your data, and `merged_data` will be the merged data frame.

**Method 2: Using `dplyr` package**

```R
# Load the dplyr package
library(dplyr)

# Load the data from CSV files
data1 <- read.csv("file1.csv")
data2 <- read.csv("file2.csv")

# Merge the data frames based on the common column 'ec5_uuid'
merged_data <- full_join(data1, data2, by = "ec5_uuid")
```

This method uses the `full_join()` function from the `dplyr` package to perform a full outer join on the common column, which includes all rows from both data frames.

Choose the method that best suits your needs and data structures. After merging the data, you can save it to a new CSV file using the `write.csv()` function:

```R
# Save the merged data to a new CSV file
write.csv(merged_data, "merged_data.csv", row.names = FALSE)
```

Make sure to replace the file names and column names with your actual data and column names.

### Using PHP

To merge CSV files in PHP based on a common column called `ec5_uuid`, you can use the `fgetcsv()` function to read and process each CSV file, and then write the merged data into a new CSV file. Here's a basic example:

```php
<?php
// Open the first CSV file
$file1 = fopen('file1.csv', 'r');

// Open the second CSV file
$file2 = fopen('file2.csv', 'r');

// Create an output CSV file
$outputFile = fopen('merged_data.csv', 'w');

// Read the headers from the first CSV file
$headers1 = fgetcsv($file1);

// Read the headers from the second CSV file
$headers2 = fgetcsv($file2);

// Write the merged headers to the output file
fputcsv($outputFile, array_merge($headers1, $headers2));

// Create an array to store data based on the 'ec5_uuid' column
$data = array();

// Read and process data from the first CSV file
while ($row = fgetcsv($file1)) {
    $data[$row[0]] = array_merge($row, array_fill(0, count($headers2), ''));
}

// Read and process data from the second CSV file
while ($row = fgetcsv($file2)) {
    if (isset($data[$row[0]])) {
        $data[$row[0]] = array_merge($data[$row[0]], $row);
    } else {
        $data[$row[0]] = array_merge(array_fill(0, count($headers1), ''), $row);
    }
}

// Write the merged data to the output file
foreach ($data as $row) {
    fputcsv($outputFile, $row);
}

// Close the files
fclose($file1);
fclose($file2);
fclose($outputFile);

echo "Merged data saved to merged_data.csv";
?>
```

This PHP script reads two CSV files, combines them based on the 'ec5\_uuid' column, and saves the merged data to a new CSV file. Make sure to replace the file names and column names with your actual data and column names.

### Using Javascript (ES6)

To merge CSV files in ES6 JavaScript based on a common column called`ec5_uuid`, you can use the `fs` module for file operations. You'll also need to use a CSV parsing library like `csv-parser` to handle CSV data. Here's a basic example:

1. First, you need to install the `csv-parser` library if you haven't already. You can do this using npm:

```bash
npm install csv-parser
```

2. Now you can create a JavaScript script to merge the CSV files:

```javascript
const fs = require('fs');
const csv = require('csv-parser');

// Create an array to store data based on the 'ec5_uuid' column
const data = {};

// Read and process data from the first CSV file
fs.createReadStream('file1.csv')
  .pipe(csv())
  .on('data', (row) => {
    data[row.ec5_uuid] = { ...row };
  })
  .on('end', () => {
    // Read and process data from the second CSV file
    fs.createReadStream('file2.csv')
      .pipe(csv())
      .on('data', (row) => {
        if (data[row.ec5_uuid]) {
          data[row.ec5_uuid] = { ...data[row.ec5_uuid], ...row };
        } else {
          data[row.ec5_uuid] = { ...row };
        }
      })
      .on('end', () => {
        // Convert the merged data back to an array
        const mergedData = Object.values(data);

        // Create the output CSV
        const outputCSV = 'merged_data.csv';
        fs.writeFileSync(outputCSV, '');
        fs.appendFileSync(outputCSV, Object.keys(mergedData[0]).join(',') + '\n');

        mergedData.forEach((row) => {
          fs.appendFileSync(outputCSV, Object.values(row).join(',') + '\n');
        });

        console.log('Merged data saved to ' + outputCSV);
      });
  });
```

This JavaScript script reads two CSV files, combines them based on the 'ec5\_uuid' column, and saves the merged data to a new CSV file called `merged_data.csv`. Make sure to replace the file and column names with your actual data and column names.

### Using awk (Terminal)

Here is the complete `awk` command that merges two CSV files based on the common column "ec5\_uuid" as the first column:

```bash
awk -F, 'BEGIN { OFS="," } NR == FNR { if (FNR == 1) { print; next } a[$1] = $0; next } $1 in a { print a[$1], $0 }' file1.csv file2.csv > merged_data.csv
```

This command will take `file1.csv` and `file2.csv`, which contains CSV data with "ec5\_uuid" as the first column, and merges them based on this common column. The merged data will be saved in a new file named `merged_data.csv`.


# Jumps 101

Example Implementation of Jumps in the Epicollect5 Platform

We created a playground project called [**EC5 Jumps 101**](https://five.epicollect.net/project/ec5-jumps-101) for anyone to explore and experiment with jumps logic. The form structure is straightforward, asking for a person’s **Name** and **Sex**. We designed the form to display a different follow-up question based on the selected sex or skip follow-ups entirely if the user prefers not to disclose that information.

<figure><img src="/files/wQIbGmPhl0sdKbZtSKDs" alt=""><figcaption></figcaption></figure>

#### Form Setup Details:

* The **Sex** question is set as **required**, ensuring users cannot skip it.
* Available answers: **MALE**, **FEMALE**, **PREFER NOT TO ANSWER**.

#### Jump Logic Configuration:

1. **If the user selects MALE:**
   * No jump is needed because the next question is already the **MALE-only follow-up question**.
2. **If the user selects FEMALE:**
   * We add a jump to the **FEMALE-only follow-up question**, effectively skipping the **MALE-only follow-up question**, which should not be asked to female users.
3. **If the user selects PREFER NOT TO ANSWER:**
   * We add a jump directly to the **End of the Form**, as no further questions are needed.

<figure><img src="/files/3vk9qNYYCSobmFVHwPp8" alt=""><figcaption></figcaption></figure>

#### Resolving a Logical Flow Issue:

We noticed a small issue in the form flow:

* After selecting **MALE** and answering the **MALE-only follow-up question**, the user was still presented with the **FEMALE-only follow-up question**, which was unintended due to the standard form flow.

**Solution:**

To fix this, we added a jump on the **MALE-only follow-up question** to **always** jump to the **End of the Form** after it is answered. This adjustment skips the **FEMALE-only follow-up question**, ensuring the intended logic flow.

<figure><img src="/files/Rhrzf9KkIZesvHB19Kk4" alt=""><figcaption></figcaption></figure>

#### Final Outcome:

With this correction, the form now follows the proper logic, asking only relevant questions based on the user’s input while skipping unnecessary ones. This streamlined experience improves data collection accuracy and enhances user experience.


# Other, Please Specify

Handling "Other, Please Specify" in Epicollect5 Forms

A very common scenario when converting a paper-based form to Epicollect5 is as follows:

![](/files/XStKN5C3zCySgJjjrk5v)

When converting paper-based forms to Epicollect5, a common requirement is collecting an open-ended answer when a user selects **"Other"** from a list of possible answers. This can be easily implemented using the platform's features. Let’s explore two effective approaches:

## 1 - Using Jumps

Open the formbuilder and add a question type with possible answers, like RADIO. For example, we could ask for a favourite colour and provide only three colours and the "Other" possible answer:

![](/files/3tv3u0uVN89Om7BaRYar)

Since we want the user to see a text question when he picks "Other", we add a TEXT question below the RADIO question:

![](/files/u7xNNzUXw8h67s9NYFPg)

The concept is really simple. We need the users to see the text question only when they select "Other". Basically, they will "jump" that question if they pick any other possible answer.

On the RADIO question ("What is your favourite colour?") we click on the jumps tab and we add a jump like so:

![](/files/4xPAqJf3wo2kDOV1CccF)

This will make the users "jump" to the end of the form when they pick any answer aside from "Other". If they pick "Other", they will not jump therefore they will see the text question "Please type your favourite colour". It's that simple!

## 2- Using Groups

If your question with the "Other" possible answer is in a group, you cannot add a jump. In this case, just add the text question below your multiple-choice question, asking the user to specify if they replied "Other" to the question above.

Tip: use a DROPDOWN question to save space.

Here is how it will look on a device:

|                                  |                                          |
| -------------------------------- | ---------------------------------------- |
| ![](/files/Upv8ba4JfDoj53th2IR2) | It will be similar to a paper based form |

{% hint style="info" %}
Regardless of the approach used, the final data on the Epicollect5 server and the exported `csv` files will be spread over two columns, one for the main question and one for the "Other" question.

To consolidate the data, it is pretty easy to merge columns in Google Sheets, Excel or similar in the post-processing.

[**For Google Sheets see here**](https://support.google.com/docs/answer/9060449?hl=en\&co=GENIE.Platform%3DDesktop#zippy=%2Cmerge-rows-or-columns).

[**For Excel see here**](https://support.microsoft.com/en-us/office/combine-text-from-two-or-more-cells-into-one-cell-81ba0946-ce78-42ed-b3c3-21340eb164a6)**.**
{% endhint %}


# Non-Hierarchical Forms

There are some use case where there is the need to have multiple forms on the same project but the hierarchy structure does not fit. Maybe the forms are not related or it just does not make sense for the project.

There are a couple of way to tackle this.

1. Separate the project in multiple ones
2. Use a single form with either BRANCH(es) or GROUP(s)

## 1 - Multiple projects

The simplest way would be having multiple projects, one with a single form each. Usually, a "*base*" project gets created first then it gets [cloned](/web-application/clone-project) or [shared](/web-application/import-and-export-projects) multiple times.

The name for each project might reflect what the projects are different on, which could be the period of the data collection (like year or month), the groups of users it targets, the area or the country of the data collection and so on.

Each data set is downloaded separately as multiple `csv` files which be merged in the post-processing of data using your favorite third party tool.

This is the approach we would recommend.

## 2 - Single project with BRANCH or GROUP sub-forms

If having multiple projects is not an option, there are ways to implement it with either BRANCH(es) or GROUP(s).

We built a couple of examples for anyone to view and play around with:

* [EC5 Multiple non hierarchical forms GROUP](https://five.epicollect.net/project/ec5-multiple-non-hierarchical-forms-group)
* [EC5 Multiple non hierarchical forms BRANCH](https://five.epicollect.net/project/ec5-multiple-non-hierarchical-forms-branch)

The project definition files (to import each project and see how it is done) are available here:

* [EC5 Multiple non hierarchical forms GROUP project definition](https://drive.google.com/file/d/1nSZmoIuJIotILvxNFF25SW0wmnc8-Mz8/view)
* [EC5 Multiple non hierarchical forms BRANCH project definition](https://drive.google.com/file/d/1eoTOWonDe0_Bxz722QoPPY-sF8fxhdrc/view)

The projects are very similar. There is a single hierarchy form called "*Citizen*" which has a pivot question at the beginning to pick which one of the sub-forms (BRANCH or GROUP) the user will want to fill. [JUMPS](/formbuilder/jumps) are used to build the logic flow so the users will never see questions they are not supposed to answer.

The choice of using BRANCH or GROUP depends on the project requirements and preferences. The main differences are as follows.

* BRANCH allows JUMP(s) between question, GROUP(s) do not
* BRANCH(es) data gets downloaded as separate files, one per each BRANCH. GROUP(s) data is a single file.

Feel free to give it a try using the example above. If you have any questions about these approaches do not hesitate to post it on our [**community**](https://spectrum.chat/epicollect5)!


# Users Working Groups

Managing multiple projects for multiple sites and compare all the data

There are some use cases where the same project needs to be assigned to different groups of users, for example, a different user group per each data collection site.

Each user group has access to the data collected by the same group only, but not the data collected by any other group. The project creator(s) and manager(s) need to have access to ALL the data though.

This use case can be solved by cloning a "base" project to multiple identical projects, one per user group, and then assign to each of the cloned projects different users. When [**cloning a project**](/web-application/clone-project), the project CREATOR stays the same so that user will have access to all the data. It is also possible to assign the same manager(s) to each of the cloned projects if needed. [**See Manage Users**](/web-application/manage-users)**.**

See the diagram below:

![](/files/KhR53Axsqox2gcCEjA4T)

{% hint style="warning" %}
Remember to keep the projects private to limit users' access to only the users you specify!
{% endhint %}

### Creating copies of a project

For example, we could create a project called

CENSUS BASE 2019

and clone it three times to:

1. CENSUS BASE 2019 SITE ONE
2. CENSUS BASE 2019 SITE TWO
3. CENSUS BASE 2019 SITE THREE

Now we have three exact copies of the same project. To each project, we can assign different users so access is restricted to only the users belonging to a single project (therefore to a single site or single group).

Manager(s) can be assigned to all the projects so they will have access to all the data. Merging the data can be done in the post-processing of data using your favorite third-party tools like Excel or Google Sheets.

{% hint style="info" %}
We recommend cloning the "base" project only when it is finalized and ready for data collection, otherwise each change made to it will have to be replicated manually to each of the cloned projects!
{% endhint %}

{% hint style="info" %}
If there is the need to have a different CREATOR per each project, the ownership of a project can be transferred. **(**[**See how**](/web-application/transfer-ownership)**)**
{% endhint %}

{% hint style="info" %}
It is also possible to export a project definition only (no users attached) so it can be imported by another user who will become its CREATOR after importing it. **(**[**See how**](/web-application/import-and-export-projects)**)**
{% endhint %}

### Compare data across projects

To compare data from multiple projects which share a similar structure, the [**Epicollect5 mapping feature**](/web-application/mapping-data) comes in handy. Answers are mapped against unique identifiers no matter what the question text is, therefore it is just a matter of using the same identifiers for answers that need to be compared or merged.

For example, we created a project called [**EC5 Comparison Master**](https://five.epicollect.net/project/ec5-comparison-master) with a custom mapping called "Common", see below

![](/files/ag7cKq5xpiso2u7sAZqa)

We cloned the project as [**EC5 Comparison Copy**](https://five.epicollect.net/project/ec5-comparison-copy) and we decided to translate its questions to Italian for the Italian users. It is a very common use case to localize the language of the questions to the main language used in the area where the data collection will be performed. Therefore we renamed ***Name*** to ***Nome*** and ***Age*** to ***Eta***'. We have not changed the "Common" mapping which is still the same as before.

![](/files/uv6z18qnCpkFnO5IOxlZ)

When downloading the entries for both projects (selecting the "Common" mapping) as `csv`, the following data sets are downloaded:

![EC5 Comparison Master, "Common" mapping](/files/lAmlnNpq4QZu49SbcJj4)

![EC5 Comparison Copy, "Common" mapping](/files/tYLqsN9kqqJ5p1FhjSg2)

As you can see above, the question answers are mapped to the same identifiers `name` and `age`, making a comparison of the two data sets extremely easy to do!

[**Read more about cloning a project**](/web-application/clone-project)

[**Read more about mapping data**](/web-application/mapping-data)


# Excel and UTF-8

Microsoft Excel may struggle to properly display UTF-8 compliant CSV files when they contain non-English characters. However, this issue is not related to Epicollect5.

For a solution, you can import the Epicollect5 CSV files as a UTF-8 origin.

Here’s how you can do it:

{% hint style="info" %}
The following example was done using a Mac. If you are on Windows or Linux, the procedure might differ.
{% endhint %}

Open up Excel and import your `csv` file:

![](/files/qlUOLWZ2SASQgI8WnRkL)

![](/files/Nqc0y4iokEYDIbMHPAlR)

Pick a `csv` file with data in a UTF-8 language rather than English. Select "Delimited" and set the file origin to Unicode(UTF-8)

![](/files/PDFTh2Rj8hG6RYSXfLiv)

Select "comma" and leave all other options unchecked:

![](/files/TW3Rdoc5OKaGWf8vi0be)

Select "General" then click on "Finish" to import your data.

![](/files/eWowRKoHc2LDZXyWrOMR)

Select which sheet and you are done.

![](/files/cPpXuP3Rbk76QCPCd8hn)


# Excel All Data in One Cell

If all data is appearing in a single cell in Excel when you open a CSV file, here’s how to fix it:

#### **Solution 1: Use "Text to Columns"**

1. Select the column with all the data.
2. Go to **Data** → **Text to Columns**.
3. Choose **Delimited** → Click **Next**.
4. Select the correct delimiter (e.g., **Comma**, **Semicolon**, or **Tab**).
5. Click **Finish**.

***

#### **Solution 2: Change Regional Settings**

If the data separator is incorrect, Excel may not split data properly.

1. Open **Control Panel** → **Region Settings**.
2. Check the **List separator** (e.g., change from **comma (,)** to **semicolon (;)** if needed).
3. Reopen the file in Excel.

***

#### **Solution 3: Open CSV Correctly**

1. Open Excel.
2. Click **File** → **Open** → **Browse**.
3. Select **All Files (\*.\*)** and open your CSV.
4. Follow the **Text Import Wizard** and set the delimiter.

{% embed url="<https://www.youtube.com/watch?v=n57Z7UUY2Eo>" %}

{% embed url="<https://www.youtube.com/watch?v=3J5RIs8z0_A>" %}


# Barcodes

There are a couple of ways to implement barcodes in Epicollect5.

[**See the example project.**](https://five.epicollect.net/project/ec5-barcode-example)


# Child Forms vs Branches

In Epicollect5 there are two ways to implement nested forms: child forms ([**linking forms using a hierarchy structure**](https://docs.epicollect.net/formbuilder/multiple-forms)) or [**branches**](https://docs.epicollect.net/formbuilder/branches).

While these two approaches look similar, there are some important differences.

{% hint style="success" %}
Nothing stops you from using a combination of hierarchy (child) forms and branches on your project!
{% endhint %}

### Uniqueness

When using a hierarchy structure you can choose between a [**form or a hierarchy uniqueness**](https://docs.epicollect.net/formbuilder/uniqueness). This is not possible when using branches. The branch uniqueness will be limited only to each branch scope as the hierarchy uniqueness cannot be applied.

### Nested forms

When using child forms, you can have only one child form per parent ([**see linking forms**](https://docs.epicollect.net/formbuilder/multiple-forms)). Using branches, you can have multiple branches for a single form. Using branches though, you can go down only one level (it is not possible to add a branch within another branch), while child forms can have a hierarchy of maximum 5 forms.

### Rendering on the mobile app

Child forms and branches are rendered differently on the mobile app.

[**See how to add a child entry**.](https://docs.epicollect.net/web-application/adding-data#add-or-edit-entries-for-multiple-forms-projects)

### Bookmarks

The mobile app [**bookmarks**](https://docs.epicollect.net/mobile-application/add-bookmarks) feature only works with child forms.

### Downloading entries to the mobile app

Branch entries **are not** downloaded to the mobile app, only hierarchy entries are. [**Learn more.**](https://docs.epicollect.net/mobile-application/download-entries)


# Dependent Dropdowns

One of the most useful features of data validation is the ability to create a dropdown list that lets users select a value from a predefined list. Dropdown lists make it easy for users to enter only data that meets your requirements.

We are going to investigate this feature in-depth and learn how to create cascading drop-down lists that display choices depending on the value selected in the first dropdown.

While Epicollect5 does not provide dependent (or conditional) dropdown lists directly, their behaviour can be simulated using [**JUMPS**](https://app.gitbook.com/jumps.md).

We built the example project [**EC5 Dependent dropdowns**](https://five.epicollect.net/project/ec5-dependent-dropdowns) for you to look at.

The source file can be found [**here**](https://drive.google.com/file/d/1UfBVl88EUPN6uQCuXq1pERm46Jfo8CSH/view?usp=sharing) so anyone can import it to study its structure and tweak it to their liking.

The project is really simple. The users will pick a color out of red, green, or blue, and based on that answer they will be asked a new question about the color they picked.

![](/files/uI8SCL1ntm5r5czjjVd6)

A combination of [**JUMPS**](https://app.gitbook.com/jumps.md) is used to create a conditional flow. Based on the color selected, the users will "jump" to the related dropdown, which will show a list of possible answers related to that color only.

![](/files/wQQyTZyPhugjXWWXYPLC)

{% hint style="info" %}
Please note there is not the need to "jump" when the users select "Red" as that follows the normal questionnaire flow. That is why there are only two jumps with three possible answers.
{% endhint %}

The dependent dropdowns have all a jump set to "always" pointing to the last question (the README with some comments). This is to avoid the users to see the dependent dropdowns they are not interested in.

They are also set as **required** forcing the users to pick a possible answer from the list.

![](/files/pk2YvCTHmpVxmEpuC6Wu)

When looking at the data, the answers from the dependent dropdowns will be spread across separate columns, one per each dropdown. Those columns can easily be merged in the post-processing of data using Excel or similar tools. [**This article shows a few simple ways to do that.**](https://www.ablebits.com/office-addins-blog/2013/10/13/merge-columns-excel-without-losing-data/)

![](/files/vMjDgw9xZnLy5k9dBdsg)

The approach shown here can be used with any multiple-choice question types like **RADIO**, **CHECKBOX,** and **SEARCH**.


# Referencing Parent Form Responses

Reference responses from a parent form while collecting data.

In Epicollect5, you can reference responses from a parent form while collecting data in a child form by setting the title attribute in the desired parent form question. \
This feature ensures that when you fill out a child form, the response from the parent form is displayed as a reference on the mobile app. \
\
This helps in maintaining context and ensuring accuracy in data collection, streamlining the process of gathering comprehensive and linked data sets.\
\
For example, try the [**EC5 Title as reference**](https://five.epicollect.net/project/ec5-title-as-reference) project on the mobile ap&#x70;**.**

<figure><img src="/files/F2dPI61mJkNexo8yV623" alt=""><figcaption><p>PATIENT name and NHS number are used as title(s)</p></figcaption></figure>

<figure><img src="/files/20XdrRsVRO2fTOCyPgYg" alt=""><figcaption><p>The parent form title(s) are referenced in the FOLLOW-UP child form when viewing the child entries</p></figcaption></figure>

<figure><img src="/files/6oUXeeZL9ZOGdlhHwxPN" alt=""><figcaption><p>There is a reference to the parent form title(s) when adding a FOLLOW-UP entry</p></figcaption></figure>




---

[Next Page](/llms-full.txt/1)

