> For the complete documentation index, see [llms.txt](https://docs.informationhub.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.informationhub.io/tutorial/advanced.md).

# Advanced: Analysis & Configuration

This section builds on the project from [Beginner](/tutorial/beginner.md) and [Intermediate](/tutorial/intermediate.md). You will build analytical dashboards with more component types, use advanced question types, configure detailed permissions, create reusable templates, and explore how FILE columns can link to external resources.

{% hint style="info" %}
This section assumes you have completed the previous tutorials and have the **Fynbos in Siberia** project with 28+ rows in the **Species Observations** table.
{% endhint %}

***

## Step 1: Build analytical dashboards

In Beginner you created a Field Map dashboard. Now Dr. Mwangi wants charts that show trends and summaries alongside it. Create a second dashboard for analysis.

### Create the dashboard and data source

1. In the project sidebar, click **Dashboards** and click **+** to create a new dashboard.
2. Name it **Growth Trends**.
3. Add a data source: click **Manage Data Source**, then **Add Data Source**.
4. Set the name to **Observations**, type to **Table**, and select **Species Observations**.
5. Test the connection and click **Create**.
6. Open the data source and make sure all columns are enabled. Click **Save**.
7. Return to the **Growth Trends** dashboard.

### Add a Line chart

1. Click **Create Component** and set the **Type** to **Line**.
2. Name it **Height Over Time**.
3. Set **Column Width** to 12 and **Height** to 40.
4. Set **Datasource** to **Observations**.
5. Set **Dimension (X-Axis)** to `observation_date` and **Metric Column (Y-Axis)** to `height_cm`.
6. Set **Calculation** to **Average**.
7. Click **Update**.

### Add a Bar chart

1. Add another component with **Type** set to **Bar**.
2. Name it **Average Height by Site**.
3. Set **Datasource** to **Observations**, **Dimension (X-Axis)** to `site`, **Metric Column** to `height_cm`, **Calculation** to **Average**.
4. Click **Update**.

### Add a Scorecard

A Scorecard shows a single aggregate number at a glance - useful for a running count of total observations.

1. Add a component with **Type** set to **Scorecard**.
2. Name it **Total Observations**.
3. Set **Datasource** to **Observations**.
4. Set **Column** to `id` (the primary key) and **Calculation** to **Count**.
5. Set **Column Width** to 4 and click **Update**.

The scorecard now shows the total number of observation rows as a large number. It updates every time the dashboard is refreshed.

### Add a Filter component

A Filter component lets anyone viewing the dashboard narrow all the other charts to a subset of the data - for example, showing only one species at a time.

1. Add a component with **Type** set to **Filter**.
2. Name it **Filter by Species**.
3. Set **Datasource** to **Observations** and **Column** to `species_name`.
4. Set **Column Width** to 4 and click **Update**.

The filter appears as a dropdown. Selecting a species name from the dropdown updates all other components on the dashboard to show only that species. Click the **X** reset icon to clear the filter and return to the full dataset.

### Share the dashboard

1. Click **Settings** on the dashboard.
2. Enable **Allow Sharing** and click **Save**.
3. Return to the dashboard and click **Share** to get the public URL.
4. Go back to the **Fynbos in Siberia - Collaborator Portal** app and add the Growth Trends dashboard as a new page.

See [Dashboards](/project/dashboards.md) for all component types and configuration options.

***

## Step 2: Hidden questions

Dr. Mwangi wants to automatically record the date and time of each submission without asking the field worker to enter it manually. A **Hidden** question with a default value does this silently.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and name it **Submitted At**.
3. Set the **Type** to **Short** (it will store a text timestamp).
4. Link it to a new **Text** column called `submitted_at` in the Species Observations table (create the column first if needed).
5. Click the **cog icon** to open the expanded configuration panel.
6. Enter a **Default value** of the current datetime (or a placeholder your team uses).
7. Back on the question card, enable the **Hidden** toggle.
8. Also enable **Locked** to prevent any accidental editing.
9. Click **Save**.

The question no longer appears when anyone fills in the form, but the `submitted_at` value is included in every submission. Open the Species Observations table after submitting a test observation to verify the column is being populated.

{% hint style="info" %}
Hidden + Locked + Default value is the pattern for any field you want to collect automatically without the respondent's involvement - timestamps, version markers, form identifiers, or environment metadata.
{% endhint %}

***

## Step 3: QR Code questions

Each plant specimen at the field sites has a QR code sticker on its marker stake. Dr. Mwangi wants field workers to scan the QR code instead of typing the specimen ID, to eliminate transcription errors.

### Add a specimen ID column

1. Open the **Species Observations** table and add a new **Text** column called `specimen_id`.

### Add a QR Code question to the form

1. Open the **Field Observation Form** in the form builder.
2. Add a question at the top of the **Observation Details** section and name it **Specimen ID**.
3. Set the **Type** to **QR Code**.
4. Link it to the `specimen_id` column.
5. Click **Save**.

When a field worker opens the form and reaches the Specimen ID question, a camera preview opens automatically. Holding the phone over the QR code on the plant's stake reads the code and populates the field immediately - no button press required.

In the field, place this question at the start of the form so the scan sets the context for the rest of the observation.

***

## Step 4: Row locking

After Dr. Volkov verifies an observation is correct, he wants to lock it so no one can accidentally edit the values. Row locking prevents edits at the row level without deleting the data.

1. Open the **Species Observations** table.
2. Find a row you want to lock (for example, one of the first five manually entered rows).
3. Click the **pencil icon** to open the edit row form.
4. Enable the **Lock row** toggle.
5. Click **Save**.

The row now shows a **lock icon** in the grid. Locked rows cannot be edited until they are explicitly unlocked by someone with the appropriate permission.

{% hint style="info" %}
Row locking is a data integrity tool, not an access control tool. It prevents accidental edits by any user, including admins. Unlocking requires opening the row edit form and toggling the lock off.
{% endhint %}

***

## Step 5: Configure custom permissions

In the Beginner section, you used default roles. Now Dr. Mwangi wants more control: field assistants should be able to submit data but not delete rows or modify the table structure.

### Create a custom role

1. Open the **Fynbos in Siberia** project and go to **Settings**.
2. In the **Role Options** card, click **Create New Role**.
3. Enter the name **Field Assistant** and click **Create**.

### Set permissions

1. Click **Update Role**.
2. Select **Field Assistant** from the role selector.
3. Configure the permissions:
   * **Forms:** Can view and submit forms
   * **Tables:** Can view data and add rows, but not edit or delete rows
   * **Storage:** Can upload files, but not delete files
   * **Manager:** Can view boards and move cards, but not create or delete boards
   * **Settings:** No access
4. Click **Save**.

### Assign the role

1. Go to **Users** in the project sidebar.
2. Click the ellipsis next to the team member you want to restrict.
3. Select **Edit Role** and change their role to **Field Assistant**.

See [Users](/project/users.md) and [Settings](/project/settings.md) for details.

***

## Step 6: Marketplace - create and use templates

Dr. Mwangi's group wants to start a similar study in a different region. Instead of setting everything up from scratch, she creates a template from the current project.

### Designate a project as a template

1. Open the **Fynbos in Siberia** project and go to **Settings**.
2. Under **Visibility**, switch the project to **Public** and save.
3. Enable the **Template** toggle and click **Save**.

Both steps are required - the project must be Public **and** have the Template toggle enabled before it appears in the Marketplace.

### Copy the project directly

For one-off copies - for example, to hand off a full project clone to a collaborator - use **Copy Project** instead of the Marketplace:

1. In the project settings, click the **Copy Project** link.
2. Choose the **Owner** (yourself, an organisation, or a group).
3. Enter a new name (e.g., **Fynbos in Patagonia**).
4. Under **Structures**, tick which parts to copy: Dashboards, Forms, Tables, Storage, Manager, Wiki, Apps.
5. Under **Data**, tick any structures whose data you also want to include (tables with rows, storage files, etc.).
6. Click **Copy**.

The new project is created immediately with the selected structures and data. Copy Project is a direct, selective clone. The Marketplace template approach is for sharing a starting structure with many users over time.

### Create a project from a Marketplace template

1. From the Home screen, click **Marketplace** in the sidebar.
2. Find the **Fynbos in Siberia** template card and click it.
3. Information Hub navigates to that project. From there you can use **Copy Project** to make your own copy with a new name.

See [Marketplace](/home/marketplace.md) for more details.

***

## Step 7: Analyse data

The **Analyse** tool generates ready-to-run R and Python scripts using your data and API key.

1. Open the **Species Observations** table.
2. Click the **Analyse** button in the toolbar.
3. Click the language toggle to switch between **Python** and **R**.
4. The panel shows a generated script that authenticates with your API key, fetches the table data, and loads it into a data frame.
5. Click the **copy** icon to copy the script to your clipboard.
6. Paste it into your local Python or R environment, replace the placeholder API key and table ID values, and run it.

The script loads the full table as a data frame. From there you can run any analysis - grouping, filtering, plotting, statistical tests - using whichever libraries you prefer.

See [Analyse Data](/project/tables/analyse-data.md) for details.

***

## Step 8: Foreign key columns

As the dataset grows, Dr. Mwangi wants to normalise her data. Instead of storing the site name as free text (which is error-prone), she creates a dedicated Sites table and links to it.

### Create a lookup table

1. Go to **Tables** and create a new table called **Sites**.
2. Add the following columns:

| Column name   | Data type        | Purpose                    |
| ------------- | ---------------- | -------------------------- |
| site\_name    | Text             | The name of the field site |
| latitude      | Double Precision | Central GPS latitude       |
| longitude     | Double Precision | Central GPS longitude      |
| climate\_zone | Text             | Climate classification     |
| elevation\_m  | Integer          | Elevation in metres        |

3. Add two rows:

| site\_name | latitude | longitude | climate\_zone | elevation\_m |
| ---------- | -------- | --------- | ------------- | ------------ |
| Site Alpha | 62.0355  | 129.6753  | Subarctic     | 95           |
| Site Beta  | 55.0084  | 82.9357   | Continental   | 120          |

### Add a foreign key column

1. Open the **Species Observations** table and click **ADD** > **Add Column**.
2. Enter the name `site_ref` and set the data type to **Foreign Key**.
3. Configure it to reference the **Sites** table, linking to the `site_name` column.
4. Click **Save**.

When adding a row or filling in a form, the `site_ref` field shows a search interface populated from the Sites table. This prevents typos and ensures consistency across all observations.

***

## Step 9: JSON questions

Some observations require structured data that does not fit neatly into a single field. JSON questions let form respondents enter key-value pairs or nested data in a structured sub-form.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and select the **JSON** question type.
3. Name it **Environmental Conditions**.
4. Link it to a new **JSON** column called `env_conditions` in the Species Observations table.
5. In the question builder, define the fields:
   * `wind_speed_kph` (number)
   * `cloud_cover_percent` (number)
   * `precipitation` (dropdown: None, Light, Moderate, Heavy)
   * `notes` (text)
6. Click **Save**.

When a field worker fills in this question, they see a structured mini-form within the main form. The data is stored as a JSON object in the `env_conditions` column.

***

## Step 10: Tabular questions

Dr. Mwangi wants field workers to record multiple plant measurements in a single form submission - for example, measuring five plants at one site visit without submitting five separate forms.

1. Open the **Field Observation Form** in the form builder.
2. Add a new question and select the **Tabular** question type.
3. Name it **Batch Measurements**.
4. Link it to a new **Tabular** column called `batch_data` in the Species Observations table.
5. Define the columns:
   * `species_name` (text)
   * `height_cm` (number)
   * `leaf_count` (number)
   * `soil_ph` (number)
   * `condition` (dropdown: Healthy, Stressed, Dead)
6. Click **Save**.

When filling in the form, the respondent sees a small table where they can add as many rows as needed. All rows are submitted together as part of a single form response. The `condition` column inside the tabular question uses a Dropdown type so the cell presents a constrained list rather than a free-text field.

***

## Step 11: FILE columns as links to external resources

FILE columns in Information Hub are stored as text under the hood - specifically as a string in `filename[url],` format. The grid renders each entry as a clickable link. This means you can use a FILE column to link to **any URL**, including external resources you have not uploaded yourself.

### Add a reference column

1. Open the **Species Observations** table and add a new **File** column called `reference`.
2. You will be prompted for a storage path configuration - enter any path (e.g., `references/`) even though you will not use it for uploads.

### Manually enter an external link

1. Click the **pencil icon** on a row to open the edit form.
2. In the `reference` field, type a value in the following format:

```
Paper title[https://doi.org/10.xxxx/example]
```

For example:

```
Mwangi et al. 2026[https://doi.org/10.1234/fynbos-siberia]
```

3. Click **Save**.

The cell now renders **Mwangi et al. 2026** as a clickable hyperlink that opens the DOI URL in a new tab.

You can store multiple links in one cell by separating entries with a comma and space:

```
Paper A[https://doi.org/10.1/aaa], Dataset[https://zenodo.org/record/12345]
```

**Use cases:**

* Link observations to published papers or preprints
* Link rows to external datasets or supplementary materials
* Link records to external ticketing systems or project management tools
* Store references to cloud-hosted assets not in your project's own Storage

{% hint style="info" %}
FILE columns are not validated for URL format. Any text in the `name[url]` pattern renders as a link. Ensure the URLs are correct before saving - there is no broken-link checker.
{% endhint %}

***

## What you have learned

* How to build dashboards with Line, Bar, Scorecard, and Filter components
* How to use Hidden + Locked + Default value for automatic metadata fields
* How to add QR Code questions for scanning specimen labels in the field
* How to lock individual rows to protect verified data from accidental edits
* How to create custom roles and configure fine-grained permissions
* How to designate a project as a Marketplace template and use Copy Project for direct clones
* How to generate R and Python analysis scripts from the Analyse tool
* How to add foreign key columns that link tables together
* How to use JSON questions for structured sub-entries
* How to use tabular questions for batch data entry with dropdown columns
* How to use FILE columns to link to external resources without uploading files

***

## Next steps

In the [Super](/tutorial/super.md) section, you will access data programmatically via the GraphQL API, configure key generators for human-readable primary keys, use URL query parameters to pre-fill forms, review row history in the audit log, set up webhooks, and configure dynamic file upload paths.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.informationhub.io/tutorial/advanced.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
