Setting up documents
A tab of type Documents shows documents from a Grid in the app: PDFs and other files with title, category, version and validity, plus a search and a filter by category. Documents that require an acknowledgement carry a deadline; the person confirms in the app, optionally with a signature, and you see in the Grid who confirmed when. If you need to be sure that everyone has read it, create the acknowledgements per person up front – by hand or with a flow – then the Grid also shows who has not yet.
A tab always shows one source. For the two usual areas you therefore create two tabs:
| Tab | Content | Source |
|---|---|---|
| My documents | payslips, certificates, contract documents – visible to that person only | a view filtered on the signed-in user |
| Company | policies, handbook, templates – for everyone or an audience | a Grid or a view |
Both tabs use the same field schema. Whether a Grid holds personal or company documents is decided by the fields you maintain, nothing else.
The app keeps an offline copy of the list per tab on the device; the files themselves are loaded when opened and need a connection. All copies are deleted on logout.
The tabs row
In the tabs Grid of the team Space, add one row per area:
| Field Key | Value |
|---|---|
title | for example "My documents" or "Company" |
icon | single-color SVG |
type | Documents |
gridUri | link to the Grid or a view on it |
uri | alternatively: the link of a shared view |
You need one of the two fields; if both are set, gridUri wins. If the documents live in a Space your staff has no access to, share a view there by link and enter the link in uri. No further field in the tabs Grid is needed. → Setting up tabs
The documents Grid
Only file is required. Everything else appears when it is there. Field names are up to you, the Keys must match exactly. → Assigning keys
| Field Key | Field type | Required | Description |
|---|---|---|---|
file | Files | yes | The file; the first one is used. Rows without a file don't appear |
title | Text | no | Title. Without it the row is named "document type period", otherwise after the file |
recipient | User | for personal documents | The recipient; the view filters on it, see below |
category | Single Select or Text | no | Category, for example "Safety". With categories the list is grouped by them and filterable; otherwise it is grouped by year |
type | Single Select or Text | no | Document type, for example "Payslip" |
period | Date or Text | no | Period: as a date the first of the month (the app shows "August 2026"), as text for example "2025" for a yearly document |
version | Text | no | Version, for example "2.1" |
publishedAt | Date | no | Publication or provision |
validFrom, validUntil | Date | no | Validity; after validUntil the app shows "Expired" |
owner | Text or User | no | Responsible person or department |
audience | Multi Select or Text | no | Audience – display only, see note |
description | Text | no | Short description |
acknowledge | Checkmark | no | Acknowledgement required |
acknowledgeUntil | Date | no | Deadline for the acknowledgement |
acknowledgeForm | Weblink | for self-service acknowledgements | Link of the form that creates an acknowledgement. Leave empty for assigned acknowledgements, see below |
acknowledgements | Link or Multi Link | for acknowledgements | Points to the filtered view of the acknowledgements; the cell stays empty |
active | Checkmark | no | Unchecked rows are hidden. Without the field all rows are visible |
A document without version, validity, description, owner, audience and acknowledgement – a payslip, say – opens its file directly when tapped. All others lead to a detail page.
audience is not a permission
Who sees a document is decided by the view the tab points to – not by the value in audience. If policies should reach one site only, create a filtered view and a tab per site.
Personal documents: the view filters
For "My documents" the tab does not point to the Grid but to a view with the filter recipient is the signed-in user (field recipient). The filter is evaluated on the server: every person gets only their own rows through the same address. Show recipient in the view.
The app refuses an unfiltered view
If a view with the field recipient delivers rows of several people, the tab shows no documents but a notice about the missing filter. That guards against the most common mistake – a tab pointing to the Grid instead of the view. It does not replace the filter: without it the rows would still be readable through the API.
recipient is a User field, not "Created by": a payslip is created by HR or an import, but it is the recipient who may see it.
Acknowledgement
If a document has to be confirmed, set acknowledge and a deadline in acknowledgeUntil. The confirmation itself is a row in a second Grid, the acknowledgements Grid. There are two ways to get it there:
| Self service | Assignment | |
|---|---|---|
| When the row is created | when the person confirms | up front, per person and version – by hand or with a flow |
| Open means | there is no row yet | the row exists, the done checkmark is missing |
| Who has not yet | the difference to your staff list | in the Grid: all rows without done |
| Effort | two columns, one form, no flow | plus three fields; you create the rows by hand for a few people, with a flow otherwise |
| Fits | handbook, policies, canteen menu | safety briefings, data protection – anything you must prove |
The acknowledgements Grid itself decides which way applies: if it has a User field recipient, it assigns; otherwise it is self service. There is nothing to set in the app. Both ways can be mixed in the same documents Grid, see Both side by side.
Self service: the form creates the row
The person confirms in the app, and that creates the row – "Created by" and "Created at" are set by ApptiveGrid; the app cannot create an acknowledgement on someone else's behalf.
1. The acknowledgements Grid
| Field Key | Field type | Required | Description |
|---|---|---|---|
document | Link to the documents Grid | yes | The confirmed document |
| (any) | Created by | yes | Who confirmed; set automatically |
version | Text | no | The confirmed version; the app fills it in |
acknowledgedAt | Date and time | no | Moment of confirmation; the app fills it in. Without the field "Created at" is used |
signature | Signature | no | If the form contains this field, the acknowledgement requires a signature |
2. The view
Create a view on the acknowledgements Grid with the filter Created by is the signed-in user and show all fields. From this view the app reads what the person has already confirmed.
3. The form
Create a form on the acknowledgements Grid with the field document, optionally version and acknowledgedAt. For a signature, add signature. Share the form with the restriction Any registered user, so that "Created by" is the person. → Sharing a form
4. Two columns in the documents Grid
acknowledgeForm(Weblink): the form link. It may be the same for all rows – the app fills in the document – or a prefilled link per row.acknowledgements(Link or Multi Link): points to the view from step 2, not to the Grid. The cell stays empty; the app only needs the address carried by the column. Show the column in the tab's view.
No flow is needed.
Signature
With the field signature in the form, the app shows the form with a signature pad instead of the confirm button. Without the field a single tap is enough. That way you decide per form – and thus per document – whether a signature is required. This holds for both ways.
Assignment: the rows are there first
If you must prove that everyone has read a document, turn the order around: the row exists before anyone has done anything, and it gets ticked off. Who creates it – you by hand or a flow – makes no difference to the app. The person sees the same card and the same button in the app; only what happens behind it differs.
1. Three more fields in the acknowledgements Grid
In addition to document and the optional fields above:
| Field Key | Field type | Required | Description |
|---|---|---|---|
recipient | User | yes | Whom the row was created for. This field switches assignment on |
done | Checkmark | yes | Done. The row is created unchecked, the app ticks it |
editLink | Weblink | yes | The edit link of exactly this row – from the row's share dialog or from the flow |
dueDate | Date | no | A deadline of this person's own. Takes precedence over the document's acknowledgeUntil |
Fill version in every row. A row without a version counts for the document as a whole – version 2.2 would then be covered by the confirmation of 2.1.
A "Created by" field is not needed here; it does no harm either.
2. The view
The view's filter is now recipient is the signed-in user (field recipient) instead of "Created by". Show all fields, editLink included. The acknowledgements column in the documents Grid points to this view, just as with self service.
The edit link opens exactly this row
Whoever has the link can edit the row – with no further check of who the person is. So it must reach only the person the row belongs to. That is exactly what the view's filter does: every person gets only their own rows and thus only their own links. Do not show editLink in any other shared view. → Editing entries via form
3. The form
A form on the acknowledgements Grid with the field done, optionally acknowledgedAt and signature. It does not need document – that is already in the row. This is the form the edit link opens; the app ticks done and submits. With signature it shows the form, the checkmark already set.
4. Creating the rows: by hand or with a flow
One row per person and version: recipient, document, version, dueDate if needed; done stays empty. Then the row's edit link goes into editLink.
By hand is enough for a small team or a single briefing: create the rows, generate the link with the form from step 3 via the share dialog Share for editing of each row, and enter it in editLink. → Sharing an entry for editing
With a flow when there are many people or new versions come regularly:
Trigger: Entry was changed (documents Grid, e.g. `publishedAt` set)
↓
Load all entries → your staff, filtered to the audience if needed
↓
Parallel → for each person:
├ Create entry → acknowledgements Grid: recipient, document, version, dueDate; done empty
├ Prefilled form link → the form from step 3 for the new row
└ Update entry → write the link into editLinkUntil a row is created and its link written, the detail page in the app says "The acknowledgement is being prepared". For a new version you create new rows – or the flow runs again; the old ones no longer match the new version, and the document is open again.
→ Actions · Parallel · Prefilled form link · Triggers
5. Clear acknowledgeForm
Leave acknowledgeForm empty for the documents that are assigned. A document that still carries the link stays self service – see the next section.
Both side by side
The choice is made per document, not per Grid: an assignment concerns one document, not the next. In a documents Grid whose acknowledgements Grid assigns, each row works like this:
| Situation | What the app does |
|---|---|
| Assigned row with edit link | confirm button; this row gets ticked off |
| Assigned row, link still missing | "The acknowledgement is being prepared" – editLink is still empty |
No row, document has acknowledgeForm | self service as above; the new row is created with done set |
No row, no acknowledgeForm | "The acknowledgement is being prepared" |
That way you assign the safety briefings and let people tick off the canteen menu themselves – in the same Grid, with the same acknowledgements Grid.
Clear acknowledgeForm when switching
If you switch from self service to assignment, acknowledgeForm is still set in every row. For those documents it stays self service although rows already exist – and on confirming, the person creates a second row next to the assigned one. The app cannot tell the two apart; it only names such documents in the developer log. Clear the column wherever you assign.
How the app works
- On opening the tab, the app loads the list and stores it as an offline copy per tab. Without a connection it shows the last loaded state; the files need a connection.
- With categories the list is grouped by them, alphabetically. Otherwise it is grouped by year, newest on top – for payslips and certificates.
- Above the list a notice names the open acknowledgements with the nearest deadlines; overdue ones are marked red.
- A new version of a document counts as "new" again and has to be confirmed again if the acknowledgement names a version.
- With assigned acknowledgements the app shows each person only their own rows. Who has not confirmed yet is visible in the acknowledgements Grid, not in the app.
- On logout the copies of all teams are deleted from the device.
When something is missing
The app names missing field Keys right in the tab, together with the fields the source actually delivers.
| Symptom | Cause |
|---|---|
| No tab in the app | Tabs row incomplete: type, gridUri/uri or the icon is missing |
| "Missing field keys: file" | The files field has no Key file |
| Notice "not filtered to the logged in user" | The tab points to the Grid of personal documents instead of the filtered view |
| No confirm button, "No acknowledgement is set up" | Self service: acknowledgeForm is empty |
| "The acknowledgement is being prepared" does not go away | Assignment: there is no row for this person and version, or editLink is empty – with a flow, check its run history |
| Everything counts as confirmed right away | Assignment without the done checkmark – without the field every created row is a confirmation. The app reports the missing Keys done/editLink in the status line |
| Confirmed, but open again after refreshing | acknowledgements is missing, has a different Key, or points to a different Grid than the form |
| Two rows for the same document after confirming | Assignment, but acknowledgeForm is still set on the document – clear the column |
| Status line "Acknowledgements could not be loaded" | The acknowledgements view is unreachable, or it lacks document, "Created by", or – for assignment – done/editLink |
| No deadline in the notice | The date field has no Key acknowledgeUntil |