Let AI do the heavy lifting for you: generate the forms, translate, extract and transcribe, analyse and summarise
Get Started Request a DemoGenerate multilingual forms based on your checklists and industry best practice with AI. Deploy with an easy-to-use app that works offline. Let AI generate reports automatically. Assign corrective actions and initiate workflows already during data collection. Monitor status of tasks and send automated reminders.
Turn paper forms and spreadsheets into powerful mobile checklists. Include logic, location & rich media. No training needed to use app.
Certified security for all your data with complete update histories.
Enable all employees, clients and suppliers to contribute and share
Streamline processes by identifying bottlenecks, waste, and inefficiencies. Reduce operational costs, increase productivity, and quicker delivery times
Learn More
Identify quality issues with mobile data collection and track corrective actions effectively. Provide consistency and conformity to your clients. Secure quality of supplier deliveries. Communicate quality to customers.
Learn More
Streamline the supplier audit process. Engage suppliers with self audits and online updates of corrective actions. Compare suppliers, identify trends and see action completion statistics.
Learn More
Automatically generate professional reports that can be directly sent to customers and suppliers.
Learn More
As a provider of railway components, WABTEC TRANSIT has been using the Poimapper application to perform supplier audits worldwide since 2018. Poimapper has proven to be a flexible tool to cover all aspects of our supplier audit management: Assessment audit questionnaires, Action plan management (PDCA), Follow-up audits and related audit performance KPIs.
The excellent responsiveness of the support and the remarkable adaptability of the Poimapper application has been highly appreciated during the years in service. Cross-platform and offline use in case of limited network access and task assignment to enable an auditor team to simultaneously work on the same audit are highly valued features of the application.
Poimapper has significantly improved how we at WABTEC TRANSIT perform our supplier assessments on a global scale.
The main purpose we use Poimapper for is to create Quality Control(QC) Reports. The feedback I’ve gotten from that, internally and externally, is that people are very impressed with the reports we can make using Poimapper. What I love the most is that we have total control of how our reports are set up and how the end result looks with the custom Word and Excel report templates feature(a must-have feature if you ask me).
And since we’re not dependent on someone else who built the report for us, it has the added flexibility to add/remove/update our work templates any time we need without waiting.
Aside from our QC Report, we’ve also been able to ditch the pen and paper in some of our other Logistics processes which has saved us loads of time when needing to look up an old case.
Additionally, data collection and statistics reports are made easy and readily available on any aspect you want information collected on. Improvement features are also always being added alongside customer support that’s always quick and friendly.
To sum everything up, Poimapper is hard to beat.
The use of Poimapper makes it more efficient to assign defects to suppliers and speeds up the process of filing complaints with images. It allows us to monitor supplier problems monthly and continuously improve the performance of our suppliers. In this way, we guarantee the quality of our products more effectively.
Customer & Consumer Complaints Made Easy
Your platform (Poimapper) is designed with simplicity and efficiency in mind. Submitting customer or consumer complaints is seamless, fast, and user-friendly. With just a few steps, I can create and share all necessary details, helping us resolve issues promptly and effectively.
Copyright 2026 © Pajat Solutions, Ltd.
This is the beginning of a deliberately long document used to test popup behaviour. The content is intentionally extended over many sections so that the popup must handle a significant amount of vertical content.
This section contains a large amount of explanatory content. The purpose is to determine whether the popup close button changes position when the content becomes sufficiently long. A normal popup should be able to contain long content while maintaining the expected position of its close control.
The system provides functionality for authentication, data retrieval, data submission, data modification, data deletion, questionnaire management, location management, user management, reporting, and integration with external applications.
When a popup contains many sections of information, the content may extend far beyond the visible height of the browser window. This creates a situation where scrolling becomes necessary. The following sections intentionally reproduce this condition.
Users must authenticate before accessing protected resources. Authentication is performed by sending credentials to the login endpoint.
{
"userName": "sample-user",
"password": "sample-password",
"instance": "example"
}
| Status | Response |
|---|---|
| 200 | Authentication successful. |
| 400 | Invalid request parameters. |
| 401 | Invalid username or password. |
| 500 | Unexpected server error. |
The authentication response contains information required for subsequent requests. Clients must retain the relevant authentication values and include them in future requests where required.
The authentication mechanism is used throughout the remainder of the API. Every protected operation depends on the authentication information obtained during the login process.
The questionnaire endpoint provides information about forms available to the authenticated user. A questionnaire contains metadata and a collection of questions.
| Attribute | Description |
|---|---|
| ID | Unique identifier of the questionnaire. |
| Name | Name displayed for the questionnaire. |
| Language | Language associated with the questionnaire. |
| Version | Current questionnaire version. |
| Survey ID | Identifier associated with the survey. |
| Questionnaire ID | Alphanumeric questionnaire identifier. |
| Status | Current status of the questionnaire. |
| Attribute | Description |
|---|---|
| ID | Unique identifier for the question. |
| Type | Type of question. |
| Text | Text displayed to the user. |
| Invisible | Determines whether the question is hidden. |
| Optional | Determines whether the question is mandatory. |
| Regexp | Regular expression used for validation. |
| Maxlen | Maximum length of the response. |
| Minlen | Minimum length of the response. |
| Default | Default value for the question. |
| UseLastSavedValue | Determines whether the previous value is reused. |
| AttachImage | Determines whether images can be attached. |
| validationlist | Available validation values. |
| hideInDevice | Determines whether the question is hidden on the device. |
| hideInPortal | Determines whether the question is hidden in the portal. |
| hideInPopup | Determines whether the question is hidden in the popup. |
| Script | Script associated with calculated values. |
| Evaluate | Question evaluated for logic. |
| Operation | Operation applied to numeric values. |
| readOnlyInDevice | Determines whether the question is read-only. |
| includeFile | Determines whether file attachments are supported. |
| edit | Specifies editing permissions. |
| view | Specifies viewing permissions. |
The system supports hierarchical location structures. Locations can contain parent and child relationships and may be used when filtering data.
A location hierarchy may contain several levels. Each level can contain multiple locations and each location can contain multiple children. The structure can therefore become very large depending on the amount of geographical information stored in the system.
| Level | Name | Parent | Description |
|---|---|---|---|
| 0 | Country | None | Top-level location. |
| 1 | Region | Country | Regional location. |
| 2 | County | Region | County-level location. |
| 3 | Sub-County | County | Sub-county-level location. |
| 4 | Village | Sub-County | Lowest-level location. |
[
{
"key": "21120",
"title": "Province A",
"zoom": "0",
"parent": "-1",
"level": "0"
},
{
"key": "21121",
"title": "County 1",
"zoom": "0",
"parent": "21120",
"level": "1"
},
{
"key": "21122",
"title": "Sub-County 1",
"zoom": "0",
"parent": "21121",
"level": "2"
}
]
The user endpoint provides information about users associated with the authenticated account. User objects contain identifiers and other information required by applications consuming the API.
| Attribute | Description |
|---|---|
| id | Unique numerical user identifier. |
| name | Username. |
| groupId | Identifier of the user’s group. |
| active | Indicates whether the user is active. |
| roles | Roles assigned to the user. |
| Email address associated with the user. | |
| firstLogin | Indicates whether the user is logging in for the first time. |
The data endpoint is used to retrieve records associated with a questionnaire. The response may contain many records, depending on the amount of information stored for the selected form.
Large datasets may require pagination. The client can request a limited number of records and then use an offset or another pagination mechanism to retrieve subsequent records.
| Parameter | Description |
|---|---|
| version | Version of the response format. |
| limit | Maximum number of results returned. |
| offset | Offset used for pagination. |
| fields | Fields that should be returned. |
| query | Object containing matching conditions. |
| filter | Array containing filter conditions. |
| externalId | Determines whether external identifiers are used. |
| property | Property used for filtering. |
| condition | Condition applied to the property. |
| field | Field being evaluated. |
| value | Value used for comparison. |
| operator | Logical operator used between conditions. |
| sort | Sorting configuration. |
| sortorder | Sort direction. |
| from | Source of the request. |
| closest | Coordinates used for proximity searches. |
/answer/Form79693315?version=5&limit=1000&offset=1224
[
{
"id": "91bba030-3eff-4722-91d2-94de7ec0bc93",
"name": "Example Data",
"questionnaire_id": "FORM123",
"user_id": 11,
"needs_editing": false,
"modified": 1405588263205,
"row_id": 3002
}
]
New data can be saved by sending a JSON payload containing the appropriate question identifiers and values. The payload may contain text values, numeric values, selections, location values, coordinates, and other supported fields.
{
"Coordinates": "4.214943141390651 33.04687500000001",
"Name": "Sample Write API Test Data",
"question1": 28,
"question2": "Option A",
"location1": 95,
"location2": 96,
"location3": 97,
"location4": 98
}
A successful save operation returns information about the newly created data point. The response may include identifiers that can subsequently be used to update the record.
{
"status": "OK",
"message": "Data Saved",
"_id": "689a45018f61571a0ce5f9e1",
"id": "cf801983-7d4c-4a06-ade9-01d535ccdd25",
"dataPoint": {}
}
Existing data can be modified by using the unique identifier of the data point. The identifier allows the server to determine which record should be updated.
Applications should retain the unique identifier returned when the data point was originally created. This identifier can then be supplied when performing an update operation.
{
"Name": "Updated Sample Data",
"question1": 32,
"question2": "Option B"
}
Data can be deleted by supplying the identifiers of the records that should be removed. Multiple records may be included in a single request.
{
"arguments": [
"0d25c826-328f-4fcf-a091-cc43566f04ab",
"308a0d04-c4d8-4845-81c0-3d05582ecce4",
"91bba030-3eff-4722-91d2-94de7ec0bc93"
]
}
After processing the request, the server returns a response indicating whether the operation was successful.
| Attribute | Description |
|---|---|
| id | Unique identifier of the data point. |
| row_id | Unique numerical row identifier. |
| name | Name associated with the data point. |
| questionnaire_id | Questionnaire associated with the record. |
| user_id | User who created or modified the record. |
| modified | Timestamp of the most recent modification. |
| entryTime | Time at which the record was entered. |
| phoneEditTime | Time spent editing on the mobile application. |
| portalEditTime | Time spent editing in the portal. |
| comments | Comments associated with the record. |
| files | Files associated with the record. |
| mimeType | MIME type of an attached file. |
| fileSize | Size of an attached file. |
| fileName | Name of an attached file. |
| url | URL associated with an attached file. |
Data points may contain files and images. File objects can contain identifiers, MIME types, sizes, names, and URLs. Applications can use this information to retrieve or display the associated files.
{
"files": [
{
"id": 27,
"rowId": 3002,
"questionId": "imageQuestion",
"mimeType": "image/png",
"fileSize": 69102,
"fileName": "example-image.png",
"url": "https://example.com/file/example-image.png"
}
]
}
Filtering allows applications to restrict the data returned by the API. Filters can be based on specific fields and values.
| Condition | Description |
|---|---|
| EQUAL | Value must equal the supplied value. |
| NOT_EQUAL | Value must not equal the supplied value. |
| CONTAINS | String contains the supplied value. |
| DOES_NOT_CONTAIN | String does not contain the supplied value. |
| STARTS_WITH | String starts with the supplied value. |
| ENDS_WITH | String ends with the supplied value. |
| GREATER_THAN | Numeric value is greater than the supplied value. |
| LESS_THAN | Numeric value is less than the supplied value. |
| GREATER_THAN_OR_EQUAL | Numeric value is greater than or equal to the supplied value. |
| LESS_THAN_OR_EQUAL | Numeric value is less than or equal to the supplied value. |
Results can be sorted according to one or more fields. Sorting can be performed in ascending or descending order depending on the requirements of the client.
{
"sort": {
"sortdatafield": "modified",
"sortorder": "desc"
}
}
Pagination is useful when an endpoint contains a large number of records. Rather than requesting every record at once, the client can request a limited number of records and then request the next group of records.
For example, a client may request 1,000 records starting from a particular row identifier. After receiving the response, the client can determine the greatest row identifier returned and use that value as the starting point for the next request.
This process can continue until the server returns fewer records than the requested limit or otherwise indicates that there are no additional records available.
| Status | Description |
|---|---|
| 400 | The request contains invalid or missing parameters. |
| 401 | The request is not authenticated. |
| 403 | The authenticated user does not have permission. |
| 404 | The requested resource could not be found. |
| 500 | An unexpected server-side error occurred. |
Applications consuming the API should protect authentication information and avoid exposing credentials or session keys to unauthorized parties.
Authentication information should be transmitted only through secure connections. Applications should also validate responses before processing or displaying returned information.
Clients should avoid storing sensitive authentication information in locations where it can be accessed by unauthorized users.
The API can be consumed by external applications that need to retrieve or submit structured data. An integration can authenticate, retrieve questionnaire definitions, retrieve location information, retrieve users, retrieve existing data, submit new data, update existing data, and delete data where permitted.
A typical integration therefore consists of several sequential operations. First, the application authenticates. Second, it retrieves the required metadata. Third, it performs the required data operation. Finally, it processes the response returned by the server.
This is additional long-form content intended specifically to increase the vertical size of the popup. The paragraphs in this section do not introduce any new functionality. They simply ensure that the popup contains enough content to require substantial scrolling.
The popup should continue to behave consistently regardless of the amount of content it contains. Increasing the document height should not change the logical position of controls that are positioned relative to the popup container.
If the popup close button is positioned using absolute positioning, the positioning context is particularly important. If the close button is positioned relative to an ancestor whose dimensions or positioning change because of the content, its location may also change.
Similarly, overflow rules can affect how content is displayed. A popup may have an outer container that controls its position and an inner container that controls scrolling. If those responsibilities are mixed, long content can expose unexpected layout behaviour.
Lorem ipsum style content is intentionally avoided here so that the document resembles the type of technical documentation being tested. This paragraph contains enough text to occupy multiple lines within a typical popup width. The same pattern is repeated across several paragraphs to increase the total height of the document.
The content continues with additional technical descriptions. A client application may need to retrieve thousands of records, process responses, validate fields, handle errors, and present the resulting information to users. Each operation may require several parameters and may produce different response structures.
When technical documentation contains many endpoints, each endpoint may include a description, HTTP method, URL, request parameters, headers, response codes, example requests, example responses, and attribute descriptions. This naturally creates a long document.
The popup test therefore intentionally reproduces this pattern. The goal is to determine whether the popup’s layout remains stable when presented with a document that is significantly taller than the visible viewport.
| Field | Type | Required | Description |
|---|---|---|---|
| name | String | No | Name of the record. |
| description | String | No | Description of the record. |
| quantity | Integer | No | Numeric quantity. |
| status | String | Yes | Status of the record. |
| location1 | Integer | No | Top-level location. |
| location2 | Integer | No | Second-level location. |
| location3 | Integer | No | Third-level location. |
| location4 | Integer | No | Fourth-level location. |
More information follows to deliberately increase the height of the popup. This paragraph is part of the test and does not need to be interpreted as actual API documentation.
More information follows to deliberately increase the height of the popup. This paragraph is part of the test and does not need to be interpreted as actual API documentation.
More information follows to deliberately increase the height of the popup. This paragraph is part of the test and does not need to be interpreted as actual API documentation.
More information follows to deliberately increase the height of the popup. This paragraph is part of the test and does not need to be interpreted as actual API documentation.
If the close button remains at the top-right corner while scrolling through this document, then the popup can handle a very long document without the button moving. If the button moves to the bottom-left or another unexpected position, the issue is being reproduced by content length alone or by the interaction between long content and the popup’s CSS layout.
End of test document.