GxP App Building Basics
  • 22 Jan 2024
  • 11 Minutes to read
  • Contributors

GxP App Building Basics

Article summary

This article will provide you with basic knowledge for approaching app building in GxP environments.

This article assumes prior knowledge of basic Tulip concepts such as Variables, Tables, and Completion records.


The style and language of Apps should fit with their intended use. Standard operating procedures, work instructions and methods should be written in an imperative mandatory style.


When publishing an App, it is recommended to describe the nature of the changes, e.g. UI refresh, error corrections or else, against the previously published App in the comment section.

Standard Information to be Displayed on Each Step

The following elements should be shown on each step in order to provide to the user the appropriate context:

  • The name or unique ID of the main item that the App is used to process. "Item" e.g. batch, order, equipment, or tool that is being used or processed. In some cases there could be multiple items. In most cases, this should be accomplished by creating or loading a table record containing the information at the beginning of the app.
  • The Logged-In User
  • The version of the App
  • The App Step name

It is also recommended to have a Log-Off button on all steps triggering an “Log-off current user” action.

Timestamps and Date Format

Timestamps in the completion record are captured in UTC with an offset for time zone. Date and time formatting can be set at the Instance level for all Apps. This is done in the "Date and Time" section of the instance's "Settings" menu and needs to be configured by an Account Owner.

Capturing Electronic Signature with the E-Signature Widget

In order to comply with ER/ES (Electronic Records / Electronic Signatures) regulations, a Signature should give context to the signers:

  • “What”
    Context of the signature, e.g. batch, order, equipment, etc.
  • “Why”
    The reason of the signature, e.g. release of process order

The following structure is recommended for signatures:

  • Group steps that require an e-signature and include the e-signature widget on the last step in the group
  • Create a summary step, if applicable, before the widget showing all relevant data to provide the signer the context of the signature (“What”)
  • Use the form title, e.g. “Signature for label reprint”, and username label, e.g. “Supervisor”, to define the reason for the signature (“Why”).

When the signature is submitted, Tulip automatically logs additional information:

  • “Who” signed the form
  • “When” the signature is submitted
  • Any added comments

It is mandatory to commit the current App data to an immutable completion record. This can be achieved in two ways:

  • By using the “Save All App Data” action in a “Custom Action” trigger on the submit button of the signature widget.
  • By completing the App, either using the standard “Complete App” setting for the submit button or using a “Complete App” action in a “Custom Action” trigger.

Save All App Data Action

The “Save All App Data” action stores the current values of all App Variables as well as the current field values of all loaded table records into a Completion record of the App. Completion records are immutable and cannot be deleted.

App Completion

An App Completion stores the data in the same way the “Save All App Data” Action does. In addition, an App Completion resets all Variables to their default value, but the ones which do have the option “clear on completion” deactivated. Additionally, all Table Record Placeholder are cleared. After an App completion, it is possible to restart the same App from the beginning or proceed to a specific step within the same App or another App. This can be configured in the “transition” used to do the completion.

App Cancellation

An App Cancel is identical to an App Completion however all Variables will be reset to their default value.

Automatic App Initialization

For an App which needs to be completed multiple times during execution, i.e. due to multiple signatures, it is recommended to store its context before each completion, hence the App can be configured to automatically restore its context after it restarts. The context can be the ID of table records, e.g. current batch, and/or Variables, e.g. a counter. It is recommended to store the App context in a table using the “App Info: Station Name” as the record ID. This Record can be loaded on App (re)start using an “App Started” trigger. The same approach can be used to achieve a seamless Transition to another App.

Similar principles can be applied to resume App execution after an App cancellation, i.e. due to an auto-logout or selecting “Restart” in the Player menu. For these use cases, it is recommended to store a step name as additional context information for the App to open after restarting. This can either be the name of the last step shown, or a specific step that should be opened for recovery.

Exceptions and enabling review by exception

The use of one Tulip Table to collate all exceptions occurring during app execution is recommended. Every exception (defect, observation, etc.) should be stored as a single record in that Tulip Table including all relevant information on the exception, i.e. type, description, date/time, app, operator, etc. In addition this record should be linked using the “Linked Records” feature to the records of all artifacts related to the exception, i.e. batch, order, material, equipment, room, etc.

Records, Record Correction, Record History

It is recommended to store GxP relevant data as Record into Tulip Tables with reference to its relevant artifacts, i.e. batch, order, material, equipment, room, etc.

It is recommended to correct GxP relevant data within the original record, as any changes will be reflected in the record history. The correction should be submitted by a signature form.

To facilitate record retrieval, it is recommended to assign an unambiguous and systematic ID for all entries, i.e. “-”.

Record History

As described above, the values of Variables are stored into a Completion record at the time of completing or cancelling the App. In contrast, manipulation of data in a Table happens in real time. Any change to any field of a table record will automatically be logged with contextual information (user, app, app version, station, timestamp) by Tulip.

Every Tulip Table record has a record history. This record history will show all the logged changes including the contextual information (user, app, app version, station, timestamp).

Furthermore, the record history will show the data of any App completion or cancellation in which the record is included, i.e. was loaded upon completion/cancellation. This includes any e-signatures logged in those completions/cancellations. Signatures will be shown in the record history timeline according to the timestamp when they were performed. All other completion data will be shown with the timestamp of the completion/cancellation.

Further Reading

Was this article helpful?