# Introduction

Plumber is a no-code workflow tool that helps you to connect multiple applications to automate your repetitive tasks.

{% hint style="info" %}
Plumber is cleared to handle data up to Confidential (Cloud-Eligible) and Sensitive (High).

However, if you add a non-govt integration like Telegram or Slack in your Pipe, please ensure that your pipe only sends Official (Open) data to these services.
{% endhint %}

## Get Started

We've put together some learning content to help you set up our product quickly and easily. You may access them by visiting <https://go.gov.sg/learn-plumber>.

Learn to set up popular workflows:

{% content-ref url="/pages/OnHvsuqi6qVkY5fyCawI" %}
[All Workflows](/all-workflows/overview)
{% endcontent-ref %}

Or customise your workflows the way you want:

{% content-ref url="/pages/tjXVCc6ZHEZmSEBXJzw1" %}
[Start the workflow](/user-guides/start-the-workflow)
{% endcontent-ref %}

{% content-ref url="/pages/vLaMpZqxqEyYneaNp7Y2" %}
[Actions](/user-guides/actions)
{% endcontent-ref %}

## Quick links

{% content-ref url="/pages/jNboE88PXByV0suD6q5n" %}
[FAQ](/help/faq)
{% endcontent-ref %}

{% content-ref url="/pages/8xZ8qOTpKlzSsqJizbo0" %}
[Contact us](/help/contact-us)
{% endcontent-ref %}


# Overview

This page should inspire you to get started on your use case.

If you have suggestions for more workflows to be added here, feel free to contact us at <https://go.gov.sg/plumber-support>

[Notifications for FormSG](/all-workflows/notifications-for-formsg)

[Email customised acknowledgements to respondent](/all-workflows/email-customised-acknowledgements-to-respondent)

[Get updated on urgent requests w/ Telegram](/all-workflows/get-updated-on-urgent-requests-w-telegram)

[Keep mailing lists updated](/all-workflows/keep-mailing-lists-updated)

[Attendance taking](/all-workflows/attendance-taking)

[Dynamic responses based on respondent selections](/all-workflows/dynamic-responses-based-on-respondent-selections)


# Notifications for FormSG

Set up notifications for your storage mode form so you don't have to log in regularly to check for responses!

{% hint style="success" %}
**Why you need this**

* Save time logging in to Forms to check for responses
* Stay on top of form submissions
  {% endhint %}

## Notify yourself when a form response comes in

Before you get started, make sure you've signed into [FormSG](https://www.form.gov.sg) and have a form created.&#x20;

{% tabs %}
{% tab title="1. FormSG" %}

## Connect the form you wish to receive notifications for

1. After logging into Plumber.gov.sg
2. Click "Template" on the left or "Use a template" on the homepage
3. Click "Send a copy of form response"
4. Click "Use template" on the top right
5. Click "New form response"
6. Click "Connect" at the right
7. Under "Choose connection", click the dropdown
8. Click "+ Add new form"
9. Under "Form URL", paste the form link that you wish to connect to
10. Under "Form Secret Key", paste the form's secret key
11. Click "Connect"&#x20;
12. A message "Your form is connected successfully." will be shown
13. Click "Save and continue"
14. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

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

15. Click "Check step"
16. You're done with setting up the FormSG integration! [Next step: Postman integration](#2.-action-postman)
    {% endtab %}

{% tab title="2. Postman" %}

## Notify yourself via an email sent by Postman&#x20;

1. Click the second action, which says "2. Send email".

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

2. When the drawer opens on the right, you will see that some fields have been prefilled.
3. Delete all the variables "Replace this with data/question from step 1."
4. After deleting, select response 1 (or any other response) from your form. (see screenshot below).

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

5. Repeat step 4 until satisfied
6. You are welcome to make necessary changes in other fields, but **ensure the email under "Recipient email(s)" remains unchanged.** (it should be the Plumber user's account email address)
7. Click "Check step"
8. An email will be sent out to the email address under "Recipient email(s)".&#x20;
9. Click "Publish" so the automation becomes active
10. That's it, you're done!&#x20;
    {% endtab %}

{% tab title="How it looks like" %}
{% embed url="<https://www.loom.com/share/24d997ecc2ae4d5ab139fbd26f5f2776>" %}

{% endtab %}
{% endtabs %}


# Email customised acknowledgements to respondent

Automate email acknowledgements for your storage mode form so you can provide assurance to respondent's

{% hint style="success" %}
**Why you need this**

* Improve user experience when you acknowledge form submissions
* Provide assurance when you send users details of their form submission
  {% endhint %}

{% tabs %}
{% tab title="1. Trigger: FormSG" %}

## Connect the form you wish to receive notifications for <a href="#connect-the-form-you-wish-to-receive-notifications-for" id="connect-the-form-you-wish-to-receive-notifications-for"></a>

1. After logging into Plumber.gov.sg
2. Click "Template" on the left or "Use a template" on the homepage
3. Click "Send a copy of form response"
4. Click "Use template" on the top right
5. Click "New form response"
6. Click "Connect" at the right
7. Under "Choose connection", click the dropdown
8. Click "+ Add new form"
9. Under "Form URL", paste the form link that you wish to connect to
10. Under "Form Secret Key", paste the form's secret key
11. Click "Connect"
12. A message "Your form is connected successfully." will be shown
13. Click "Save and continue"
14. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

<figure><img src="https://guide.plumber.gov.sg/~gitbook/image?url=https%3A%2F%2F2212031742-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FXyVsBiX9OwOL1o9g5hLM%252Fuploads%252FC9XfJoUQzMgUVDvYkZ5W%252Fimage.png%3Falt%3Dmedia%26token%3D795822d6-2674-493a-b543-83aee4cc0170&#x26;width=768&#x26;dpr=4&#x26;quality=100&#x26;sign=a4be96cd&#x26;sv=2" alt=""><figcaption></figcaption></figure>

15. Click "Check step"
    {% endtab %}

{% tab title="2. Action: Postman" %}

## Email customised acknowledgements to respondent&#x20;

1. Click the second action, which says "2. Send email".

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

2. When the drawer opens on the right, you will see that some fields have been prefilled.
3. Delete all the variables "Replace this with data/question from step 1."
4. After deleting, select response 1 (or any other response) from your form. (see screenshot below).

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

5. Repeat step 4 until satisfied
6. Click on on the field under "Recipient email(s)"
7. A drop down would appear, select the response that contains the email address of the respondent.
8. Click "Check step"
9. An email will be sent to the address specified under 'Recipient email(s)'. Note: If you're using mock data, the system will use a test email address.
10. Click "Publish" so the automation becomes active
11. That's it, you're done!&#x20;
    {% endtab %}

{% tab title="Experience it yourself" %}
Fill out the form below to receive an email acknowledgement!&#x20;

{% embed url="<https://form.gov.sg/64928e74e7e1cf0012007ddf>" %}
{% endtab %}
{% endtabs %}


# Get updated on urgent requests w/ Telegram

Receive notifications through Telegram for urgent requests that need responding to quickly

{% hint style="success" %}
**Why you need this**

* Get alerted of urgent and high priority requests on your personal device
* Address these requests quickly
  {% endhint %}

In this use case, we want to get alerted to users who are facing technical difficulties that occur everyday. Here is a sample form below!&#x20;

{% embed url="<https://form.gov.sg/64a53db4921cd4001266b8e4>" %}

{% tabs %}
{% tab title="1. Trigger: FormSG" %}

## Connect formSG to Plumber

1. Upon clicking "Create pipe" on the homepage
2. Click on "Choose how you want your workflow to start"
3. Click on "FormSG"
4. Under "Choose connection", click the drop down
5. Click "Add new form"
6. Under "Form URL", paste the form link that you wish to connect to
7. Under "Form Secret Key", paste the form's secret key
8. Click "Connect"
9. A message "Your form is connected successfully." will be shown
10. Click "Save and continue"
11. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

<figure><img src="https://guide.plumber.gov.sg/~gitbook/image?url=https%3A%2F%2F2212031742-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FXyVsBiX9OwOL1o9g5hLM%252Fuploads%252FC9XfJoUQzMgUVDvYkZ5W%252Fimage.png%3Falt%3Dmedia%26token%3D795822d6-2674-493a-b543-83aee4cc0170&#x26;width=768&#x26;dpr=4&#x26;quality=100&#x26;sign=a4be96cd&#x26;sv=2" alt=""><figcaption></figcaption></figure>

11. Click "Check step"
12. You're done with setting up the FormSG integration!
    {% endtab %}

{% tab title="2. Action: Logic" %}

## Add logic to only get notified of urgent requests

**Choose app and event**

1. Select **Logic** as the app.
2. Select **Only continue if** as the action event.

**Set up action**

1. Select the variable that you want Logic to apply to. In this example, we will select question 4's answer variable.
2. Select the rule that you want to use. In this example, we will select **Is** and **equals**
3. Define the value that you want to compare the variable against. We only accept text input. In this example, the value will be **Every day**.

**Test action**

1. Click **Test step**.
2. If the test data pulled in from your FormSg submission **has met** the conditions, you’ll see a confirmation that the Pipe would **have continued**. \
   ![](/files/hIVaHS5yycmxHFnjuOTp)\
   \
   If the test data pulled in from your FormSg submission **has not met** the conditions, you’ll see a confirmation that the Pipe would **not have continued**. \
   ![](/files/rE1JvM1XdsBUrTkqPXHm)<br>

You're done with setting up the conditions to be alerted! [Next step: Telegram](#3.-action-telegram)
{% endtab %}

{% tab title="3. Action: Telegram" %}

## Set up a Telegram bot to alert you on urgent requests

Before you can set up your Telegram step, you would need to [create a Telegram bot](broken://pages/NG7AsUKgWtQ5tfyDnYab)!&#x20;

**Setting up your pipe**

1. Choose **Telegram** as the app.
2. Choose **Send message** as the action event.

**Choose connection**&#x20;

1. Select the connection for your bot.&#x20;

**Set up action**

1. Under the **Chat ID** field, select the chat you want to send a message to whenever an urgent submission comes in. If you are sending to a group or channel, ensure that you have [added your bot to the chat](/user-guides/actions/telegram#adding-or-re-adding-bots-to-groups-or-channels).

<figure><img src="/files/hkgONqIiq2c6ceHlgbPM" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="warning" %}
**Help! My chat does not appear in the dropdown list.**\
This dropdown list shows chats with recent activity in the past 24 hours. If your chat is missing try the following:

**For private messages,** send your bot a message directly.

**For group chats,** ensure your bot has been added to the group. Next, either send a message in the group chat (only works if your bot has [read permissions](#allowing-bots-to-read-group-messages)) or [re-invite your bot](#adding-or-re-adding-bots-to-groups-or-channels) to the group.\
**For channels,** ensure your bot has been added as an admin to the channel and send a message to the channel with your own telegram account.

Then, click on the refresh ↺ button on the right.
{% endhint %}

3. Type in the message you want to send in the **Message text** field.
4. Select if you would like to disable notifications.
5. Click **Continue.**
6. Then, click **Test Step** to verify that the message has been sent as you intended.

You're done with setting up alerts for urgent requests!
{% endtab %}
{% endtabs %}


# Keep mailing lists updated

Automatically update your mailing lists whenever users change their information

{% hint style="success" %}
**Why you need this**

* Keep your lists up to date automatically
  {% endhint %}

In this use case, we want to automatically update our mailing list whenever someone changes their email! This pipe will also help create new email address automatically.

{% embed url="<https://form.gov.sg/64a8cf3c58aaf80011146ede>" %}

{% tabs %}
{% tab title="1. Trigger: FormSG" %}

## Connect the form you want to collect email addresses from

1. After logging into Plumber.gov.sg
2. Click "Template" on the left or "Use a template" on the homepage
3. Click "Update mailing lists"
4. Click "Use template" on the top right
5. Click "New form response"
6. Click "Connect" at the right
7. Under "Choose connection", click the dropdown
8. Click "+ Add new form"
9. Under "Form URL", paste the form link that you wish to connect to
10. Under "Form Secret Key", paste the form's secret key
11. Click "Connect"
12. A message "Your form is connected successfully." will be shown
13. Click "Save and continue"
14. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

<figure><img src="https://guide.plumber.gov.sg/~gitbook/image?url=https%3A%2F%2F2212031742-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FXyVsBiX9OwOL1o9g5hLM%252Fuploads%252FC9XfJoUQzMgUVDvYkZ5W%252Fimage.png%3Falt%3Dmedia%26token%3D795822d6-2674-493a-b543-83aee4cc0170&#x26;width=768&#x26;dpr=4&#x26;quality=100&#x26;sign=a4be96cd&#x26;sv=2" alt=""><figcaption></figcaption></figure>

15. Click "Check step"
    {% endtab %}

{% tab title="2. Action: Find single row" %}

## Configuring "Find single row"

1. Click on "2. Find single row"&#x20;
2. Under "Lookup conditions", backspace the dotted line variable

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

3. Replace the dotted line variable with a name response

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

1. Click "Check step", a green box will appear

<figure><img src="/files/4kX00zww0AuFdTtZHuU2" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="3. Action: Configuring if-then" %}

## Configuring If-then

There will be 2 branches for you to configure in this use case.

1. Click on "3. Condition" under "Officer has signed up mailing lists"
2. Click "Check step"
3. A green box would appear stating "Based on your sample data, it meets the conditions that you have set up and your pipe would have continued."
4. Click on "4. Create Row"
5. Delete all the 3 dotted line variables
6. Click on the empty field
7. Insert the corresponding variables
8. For "Email" under "New row data", click on the email response from the drop down (see screenshot)

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

1. For "Name" under "New row data", click on the name response from the drop down/
2. For "Mobile number" under "New row data", click on the mobile number response from the drop down.
3. Click "Check step"
4. Click on "5. Condition" under "Officer has signed up for the mailing list".
5. Click "Check step".
6. A yellow box would appear stating "Based on your sample data, it meets the conditions that you have set up and your pipe **would not have** continued."&#x20;
7. Delete all the 2 dotted line variables
8. Replace them with the corresponding variables.
9. Click "Check step"
10. A green box would appear stating "updated, false".
11. Done! Click "Publish" at the top right and send a submission through your form to experience the flow.
    {% endtab %}
    {% endtabs %}


# Attendance taking

Smoothen event management by automating and tracking turnout. Track the success of your event by automating the sending of post-event surveys to attendees.

{% hint style="success" %}
**Why you need this**

* Track turnout for your event
* Track the success of your event so you can plan future events better
  {% endhint %}

{% hint style="info" %}
This template automatically creates a Tile to capture attendance. For the flow to work, you need to upload a column labeled 'Email' containing email addresses
{% endhint %}

{% tabs %}
{% tab title="1. Trigger: FormSG" %}

## Connect to the form you wish to use for capturing attendance.

1. After logging into Plumber.gov.sg
2. Click "Template" on the left or "Use a template" on the homepage
3. Click "Attendance taking"
4. Click "Use template" on the top right
5. Click "New form response"
6. Click "Connect" at the right
7. Under "Choose connection", click the dropdown
8. Click "+ Add new form"
9. Under "Form URL", paste the form link that you wish to connect to
10. Under "Form Secret Key", paste the form's secret key
11. Click "Connect"
12. A message "Your form is connected successfully." will be shown
13. Click "Save and continue"
14. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

<figure><img src="https://guide.plumber.gov.sg/~gitbook/image?url=https%3A%2F%2F2212031742-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FXyVsBiX9OwOL1o9g5hLM%252Fuploads%252FC9XfJoUQzMgUVDvYkZ5W%252Fimage.png%3Falt%3Dmedia%26token%3D795822d6-2674-493a-b543-83aee4cc0170&#x26;width=768&#x26;dpr=4&#x26;quality=100&#x26;sign=a4be96cd&#x26;sv=2" alt=""><figcaption></figcaption></figure>

1. Click "Check step"
   {% endtab %}

{% tab title="2. Action: Find single row" %}

## Configuring "Find single row"

1. Click on "2. Find single row"&#x20;
2. Under "Lookup conditions", backspace the dotted line variable

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

3. Replace the dotted line variable with a name response

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

4. Click "Check step", a green box will appear

<figure><img src="/files/4kX00zww0AuFdTtZHuU2" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="3. Action: Configuring if-then" %}

## Configuring If-then

There will be 2 branches for you to configure in this use case.

1. Click on "3. Condition" under "New event attendance"
2. Click "Check step"
3. A green box would appear stating "Based on your sample data, it meets the conditions that you have set up and your pipe would have continued."
4. Click on "4. Create Row"
5. Delete all the dotted line variables
6. Click on the empty field
7. Insert the corresponding variables
8. For "Email" under "New row data", click on the email response from the drop down (see screenshot)

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

1. For "Name" under "New row data", click on the name response from the drop down/
2. For "Attending?" under "New row data", click on the attendance response from the drop down.
3. Leave "Remarks" as is.&#x20;
4. Click "Check step"
5. Click on "5. Condition" under "Updating existing attendance".
6. Click "Check step".
7. A yellow box would appear stating "Based on your sample data, it meets the conditions that you have set up and your pipe **would not have** continued."&#x20;
8. Click "6. Update single row"
9. Click "Check step"
10. A green box would appear stating "updated, false".
11. Done! Click "Publish" at the top right and send a submission through your form to experience the flow.
    {% endtab %}
    {% endtabs %}


# Dynamic responses based on respondent selections

It refers to the process of generating different response based on the options selected by the respondents. This approach allows for a more personalized and efficient experience for respondents.

{% hint style="success" %}
**Why you need this**

* Save time by streamlining processes and reduce errors. Form admins no longer have to spend time cleaning and arranging responses, as this process can be automated.
  {% endhint %}

As there are many different types of forms that may require such automation, we will focus solely on demonstrating the use of the dropdown field from FormSG. To follow this guide, make sure that your dropdown field contains at least two options.

## Send unique response to respondents based on the options they've selected.

{% tabs %}
{% tab title="Step 1. Trigger: FormSG" %}

## Connect the form you wish to automate with

{% hint style="success" %}
In this example, the demonstration will utilize the dropdown field in FormSG. To follow this guide, ensure that your dropdown field contains these options. <br>

1. Resetting device

2. Damaged device

3. Lost device

4. New device
   {% endhint %}

5. After logging into Plumber.gov.sg

6. Click "Template" on the left or "Use a template" on the homepage

7. Click "Route support enquiries"

8. Click "Use template" on the top right

9. Click "New form response"

10. Click "Connect" at the right

11. Under "Choose connection", click the dropdown

12. Click "+ Add new form"

13. Under "Form URL", paste the form link that you wish to connect to

14. Under "Form Secret Key", paste the form's secret key

15. Click "Connect"

16. A message "Your form is connected successfully." will be shown

17. Click "Save and continue"

18. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

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

15. Click "Check step"
    {% endtab %}

{% tab title="Step 2: If-then" %}

1. Click "2. Condition". A side drawer will appear
2. You will see "Replace with response 1 request"&#x20;

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

3. Delete that variable
4. Click on the field, a drop down will appear
5. Select the response that correspond with the **drop-down option's response**&#x20;
6. Click "Check step"&#x20;
7. **The step would either passed or fail, it doesn't matter at this point**
8. Click "3. Send email"
9. Delete "Replace this with data from step 1" for all of the fields

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

10. Replace with the variable you would like&#x20;
11. Click "Check step" once you are done
12. You should receive an email to your inbox
13. Repeat step 1 to step 12&#x20;
    {% endtab %}
    {% endtabs %}


# FormSG and SMS integration (For gov.sg users)

Plumber offers SMS integration, allowing government staffs to send automated SMS notifications to form respondents. This helps improve communication and reduce response times, streamlining operations.

{% hint style="success" %}
**Why you need this**

* This allows agencies to send automated SMS notifications to form respondents
* Deliver better outcomes for the respondents
  {% endhint %}

## Sending SMS to respondent or users with Plumber

Before you get started, make sure you've signed into [FormSG](https://www.form.gov.sg) and have an API created on postman.gov.sg. For more info how to retrieve API key for Postman, click [here](https://guide.plumber.gov.sg/user-guides/actions/sms-by-postman#step-a-create-a-postman-sms-campaign-and-api-key).

{% hint style="warning" %}
From 1st July 2025, SMS services on Postman will require payment. To learn more about pricing and arrangements, please contact your agency's Point of Contact (PIC). You can find your PIC's details by logging into postman.gov.sg
{% endhint %}

{% tabs %}
{% tab title="1. FormSG" %}

## Connect the form you wish to receive notifications for

1. After logging into Plumber.gov.sg
2. Click "Template" on the left or "Use a template" on the homepage
3. Click "Send a copy of form response"
4. Click "Use template" on the top right
5. Click "New form response"
6. Click "Connect" at the right
7. Under "Choose connection", click the dropdown
8. Click "+ Add new form"
9. Under "Form URL", paste the form link that you wish to connect to
10. Under "Form Secret Key", paste the form's secret key
11. Click "Connect"&#x20;
12. A message "Your form is connected successfully." will be shown
13. Click "Save and continue"
14. Under "1. New form response", a green dot will appear as an indication that the form has been connected successfully.

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

15. Click "Check step"
16. You're done with setting up the FormSG integration!

You're done with setting up the FormSG integration! Next, setting up [Twilio integration](#send-sms-with-twilio)
{% endtab %}

{% tab title="2. Postman SMS" %}

1. Delete the step by hovering your mouse over to the right hand side of the action
2. Click on the trash icon&#x20;
3.

{% endtab %}
{% endtabs %}


# Start the workflow

Choose how you want to start you workflows:

{% content-ref url="/pages/BHdtlCoJKD81vSLXRuzW" %}
[FormSG](/user-guides/start-the-workflow/formsg)
{% endcontent-ref %}

{% content-ref url="/pages/F5DjMl53siZAQr1gh66r" %}
[FormSG (Multi-Respondent Form) integration](/user-guides/start-the-workflow/formsg-multi-respondent-form-integration)
{% endcontent-ref %}

{% content-ref url="/pages/APubAaHIeXZOITYH33MJ" %}
[Broken mention](broken://pages/APubAaHIeXZOITYH33MJ)
{% endcontent-ref %}

{% content-ref url="/pages/AefjJLAsM449Osz1a5mv" %}
[Ownself Gather](/user-guides/start-the-workflow/ownself-gather)
{% endcontent-ref %}

{% content-ref url="/pages/4scIWnqEmaYlEMffmK6E" %}
[Webhook](/user-guides/start-the-workflow/webhook)
{% endcontent-ref %}


# FormSG

## What is FormSG?

FormSG is a self-service, easy-to-use and feature rich form builder that enables public officers to collect citizen data quickly and securely. Since launching in September 2017, FormSG has replaced almost 200 million paper form submissions and is used by over 160 public agencies. More than 150 thousand public officers are users of FormSG today.

More information about FormSG can be found [here](https://guide.form.gov.sg/)

## Choose form to connect

Only forms that fulfil the requirements below can be connected to Plumber

* Storage mode
* Form should be open to responses
* Restricted and Sensitive Normal

{% hint style="warning" %}
**Note: One form can only connect to one Pipe at a time.**
{% endhint %}

## Connecting FormSG to Plumber

1. Click "Choose how you want your workflow to start"<br>

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

2. Click "FormSG"

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

3. Click "+ Add new form"&#x20;

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

4. When the pop-up appears, fill in the Form URL in this format: "<https://form.gov.sg/654ab1234abc1a012345f1e0b>" and enter the respective secret key under "Form Secret Key".

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

5. Click "Connect"
6. A message stating "Connected to ..." will be shown along with a green light on the left. This means it has connected to the form successfully.

   <figure><img src="/files/vuPEFLJk0KS3n3ERfSrI" alt=""><figcaption></figcaption></figure>
7. Click "Check step" and Plumber will generate mock data for you to use to build pipes.

## Common errors when connecting

<details>

<summary>We couldn't verify your webhook settings</summary>

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

This could be due to one of these reasons:\
\- your plumber account email is not registered with FormSG\
\- your form credentials are invalid or form is not public\
\- a server error on our side (contact us!)

</details>

<details>

<summary>The form you are trying to connect is currently being used in another pipe. Continuing with this connection will cause the other pipe to break.</summary>

Ensure that current pipe is no longer in use before proceeding.

</details>

<details>

<summary>The form is currently connected to a different endpoint. Continuing with this connection will override this setting.</summary>

You may have set your form webhook endpoint to something else that is not a plumber webhook endpoint. Proceeding with the connection will no longer allow the current webhook endpoint to receive further submissions.

</details>

## Check step

The **Check step** button generates mock responses based on your form fields. This allows you to verify that Plumber has connected the correct form with the correct fields.&#x20;

## Refreshing FormSG fields

If you make changes to your FormSG after connecting it to Plumber, the updated fields will not be reflected automatically. You will need to run the Check step again to retrieve the latest questions.

* If you do not wish to make a new submission, click “**Use mock data**” to load the latest fields.
* If you prefer to use a real submission, submit a new response to your form, then click “**Check with last submission**” again.


# FormSG (Multi-Respondent Form) integration

{% hint style="info" %}
**Advanced Feature**

This guide covers Plumber's integration with FormSG Multi-Respondent Forms. Before proceeding, you should:

* Be comfortable using Plumber to create basic pipes
* Understand how Multi-Respondent Forms work in FormSG
* Have already set up and tested an MRF workflow in FormSG

If you're new to MRF, we recommend reading [FormSG's guide on Multi-Respondent Forms](https://guide.form.gov.sg/user-guides/multi-respondent-form-guide) first to understand workflow steps, approval fields, and respondent routing.
{% endhint %}

## What is Multi-Respondent Forms?

Multi-Respondent Forms (MRF) is a FormSG feature that allows multiple people to fill out different parts of the same form in sequence. For example, an employee submits a leave request, then their manager reviews and approves it, then HR processes it, all within a single form submission.

## MRF Integration with Plumber

When you connect an MRF form to Plumber, you can automate actions at each step of the approval process:

* Send notifications when someone submits or approves
* Update spreadsheets with the latest status
* Trigger different actions based on approval or rejection

{% hint style="info" %}
**Requirements** \
\
Before you start, make sure you have:

* A **Multirespondent FormSG form**&#x20;
* Workflow steps configured in FormSG (who fills out what, in what order)
* The form must be **published**
  {% endhint %}

## How to Connect Your MRF Form

1. Click "Choose how you want your workflow to start"
2. Select "FormSG"
3. Click "Choose connection" and add new form
4. Enter your MultiRespondent form URL and secret key
5. Click "Connect"
6. Plumber will detect that your form is a Multirespondent form

## Adding action to each step

{% hint style="info" %}
MRF forms don't always require approvers, but the example in this guide will include approval steps
{% endhint %}

Now you can add actions after each workflow step. Click the + button after any step to add an action. In this example, there are two other approvers in this workflow.

### Understanding Approval Branches

When you add an approval step to your workflow, you can set up two different paths depending on the outcome:

Each approval step shows two tabs:

#### Setting Up Your Branches

1. Click on the **If approved** tab&#x20;
2. Add the actions you want to happen when approved
3. Click on the **If rejected** tab
4. Add the actions you want to happen when rejected

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

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

**"If Rejected" is currently selected**, the **Third Submission step is greyed out and will not run**. The automation is essentially **blocked at Step 2**<sub>**,**</sub> nothing downstream will trigger until the rejection is handled or the flow is redesigned.

<table><thead><tr><th width="249">Tab</th><th>What It Does</th></tr></thead><tbody><tr><td>If approved</td><td>Actions that run when someone approves the request</td></tr><tr><td>If rejected</td><td>Actions that run when someone rejects the request</td></tr></tbody></table>

## Example

Imagine you're building a leave request workflow that involves approval from both team lead and manager:

**If approved:**

* Send an email to employee that team has approved
* Send a confirmation email to the employee&#x20;
* Notify HR via email

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

**If rejected:**

* Send a rejection email with the reason

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

## **Tips & Good to Know**

1. **Updating step names:** Step names are pulled from FormSG. To rename a step, update it in your FormSG workflow settings, then click "Test step" in Plumber to sync the new name.
2. **MRF steps can only be managed in FormSG.** You cannot reorder, create, delete, or edit them in Plumber. After making changes in FormSG, click "Test step" in Plumber to sync.
   * You can, however, freely reorder action steps within or across MRF steps and branches.

**What Happens When MRF Steps Change**

* **Deleting an MRF step in FormSG:** After syncing via "Test step", all action steps between the deleted step and the next MRF step will also be removed from Plumber.
* **Adding a new MRF step in FormSG:** The new step appears after the last existing MRF step. If the previous last step had a rejection branch that the new step doesn't, the rejection branch will be removed.

**Limitations**

* **For-Each** and **If-Then** steps can only be added in the last MRF step, one per branch in approval branches.
* **Delay** and **Only Continue If** cannot be placed immediately before an MRF step. It will not work as intended.
* Reconnecting your pipe to a non-MRF form will wipe your entire pipe configuration.

## Common errors when using MRF integration

<details>

<summary>MRF steps didn't appear after testing</summary>

* Make sure your form is set to [**Multirespondent mode**](https://guide.form.gov.sg/user-guides/multi-respondent-form-guide) in FormSG
* Check that you have workflow steps configured in FormSG
* Make sure the form is published
* Try clicking Test step again

</details>

<details>

<summary>The form you are trying to connect is currently being used in another pipe. Continuing with this connection will cause the other pipe to break.</summary>

Ensure that current pipe is no longer in use before proceeding.

</details>

<details>

<summary>'If approved' and 'If rejected' are not showing up</summary>

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

Ensure the 'Make this step an approval' toggle is enabled in your MRF form's workflow

</details>


# Scheduler

## What is Scheduler?

Scheduler allows you to schedule a time for your workflow to begin. You can choose from these options:&#x20;

| Schedule... | Description                                                       |
| ----------- | ----------------------------------------------------------------- |
| Hourly      | Workflow runs every hour.                                         |
| Daily       | Workflow runs everyday at a specific hour, set by you.            |
| Weekly      | Workflow runs every week on a specific day and hour, set by you.  |
| Monthly     | Workflow runs every month on a specific day and hour, set by you. |

{% hint style="info" %}
All schedules run in Singapore Standard Time (SGT, UTC+8).
{% endhint %}

Sub-hourly (e.g. every 15 minutes), quarterly, and yearly frequencies are not supported.

**Quarterly workaround:** Run the Scheduler monthly, then add an "Only continue if" step that checks whether the current month contains 3, 6, 9, or 12. The pipe will only proceed in those months, effectively running quarterly.

**Scheduler is not designed for uptime or health monitoring.** Hourly is the most frequent interval available, which isn't reliable enough for monitoring purposes. Use a dedicated monitoring tool like Datadog or Better Uptime instead.

## Schedule hourly/daily/weekly/monhtly

<table><thead><tr><th width="204.05859375">Field</th><th width="410.37109375">Description</th><th>Required?</th></tr></thead><tbody><tr><td>Trigger on weekends?</td><td>Sets your preference on whether the workflow should run on weekends (Saturday and Sunday).</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Time of day</td><td>Sets the specific time of the day that the workflow will run.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Day of the week</td><td>Sets the day of the week (Monday - Sunday) that the workflow will run.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Day of the month</td><td>Sets the specific day in a month that the workflow will fun.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

## Check step

**Check step** will tell you the date and time when the pipe will next run.


# Webhook

## What is a webhook?

A webhook allows two applications to communicate with each other in real time. When a specific event occurs—such as an external app calling a Plumber webhook URL when new data is available—the source application automatically sends a notification to the destination application. This ensures information stays up to date without requiring manual checks or updates.

{% hint style="warning" %}
Limited support will be provided for webhooks, as they are intended for advanced users.
{% endhint %}

## Catch raw webhook

You can test the webhook by sending a GET, POST, PUT, or PATCH request to the URL provided.

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

## Check step

**Check step** will return the data that was sent to the webhook.

## Support policy

Please note that our team may not be able to respond to queries about this feature, as it is not currently a priority. While the feature remains available for use, users should consult their technical teams or the documentation for implementation support. We are focusing our efforts on other strategic priorities and core system functionality. If you find any information missing from this document, we will be happy to update it to better serve your needs.


# Ownself Gather

Ownself Gather (OG) is a lightweight customer relationship management (CRM) tool designed for seamless collaboration and productivity. It helps you digitalise your operations with minimal development effort.

More information about OG can be found [here](https://ownself.gather.gov.sg/).

## New instant workflow

This executes actions in your Plumber Pipe when an instant workflow is triggered from OG.

| Fields         | Description                                                 | Required? |
| -------------- | ----------------------------------------------------------- | --------- |
| Encryption key | Enter an optional encryption key for your instant workflow. |           |

### **Additional set up required on Ownself Gather**

**To enable this integration, complete the following steps on OG:**

1. Create a new instant workflow on OG.
2. Copy the webhook URL from your Plumber Pipe.

   <figure><img src="/files/dKqFGOF9wp80J7NkOARQ" alt=""><figcaption></figcaption></figure>
3. Paste the webhook URL into the "Webhook URL" field on OG.

   <figure><img src="/files/9W84TFlDT2YxrGREHeYb" alt=""><figcaption></figcaption></figure>
4. Enter the encryption key if you have configured one.

## Check step

To receive real data from OG, you will need to perform an action on OG that triggers an instant workflow.&#x20;

For example, if your instant workflow is configured to run on "Case created", create a new case in OG then return to Plumber and click "Check step" to retrieve the details of the new case.

## Common errors

<details>

<summary>We couldn't find any data from your last test</summary>

This means that no data was received from OG during your last test. Please make sure your instant workflow has been triggered in OG before clicking "Check step" again.

</details>

## FAQ

<details>

<summary>Is there a guide for Ownself Gather?</summary>

Yes. You can find the guide [here](https://go.gov.sg/og-user-guide).

</details>

<details>

<summary>Is Ownself Gather free to use?</summary>

Yes. Ownself Gather is free to use. You can find more details in the [guide](https://dcubeux.gitbook.io/ownself-gather#is-it-free-to-use).

</details>

<details>

<summary>Who can use Ownself Gather?</summary>

Ownself Gather is available to all government officers.

|                                                                                                                                   | How to sign in?                                                                                                              |
| --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| <mark style="color:blue;">gov.sg</mark> email holders                                                                             | Sign in directly using your <mark style="color:blue;">gov.sg</mark> email address.                                           |
| Non-<mark style="color:blue;">gov.sg</mark> email holders (TIVO, Agencies without <mark style="color:blue;">gov.sg</mark> emails) | Sign up for an account via Singpass, then request a <mark style="color:blue;">gov.sg</mark> officer to add you to their app. |

</details>

<details>

<summary>How do I log in to Ownself Gather?</summary>

Follow the instructions in the [guide](https://dcubeux.gitbook.io/ownself-gather/basic-guide/signup-login).

</details>

<details>

<summary>I cannot find the Ownself Gather option on Plumber</summary>

Submit a request using this [form](https://go.gov.sg/plumber-support) and the team will get back to you.

</details>


# Actions

Choose what action you want to perform when your workflow starts:

### Communications

{% content-ref url="/pages/ekJt9tKxyqDw41AfajkP" %}
[Email by Postman](/user-guides/actions/email-by-postman)
{% endcontent-ref %}

{% content-ref url="/pages/BxTMaYVqmGAtNk6SQIAj" %}
[SMS by Postman](/user-guides/actions/sms-by-postman)
{% endcontent-ref %}

{% content-ref url="/pages/esRdXZZ9QghcC98jEFVd" %}
[LetterSG](/user-guides/actions/lettersg)
{% endcontent-ref %}

{% content-ref url="/pages/Vv33WWST64kgeTCZF5rQ" %}
[Telegram](/user-guides/actions/telegram)
{% endcontent-ref %}

{% content-ref url="/pages/DaPm4QLRMIP727Tq80OH" %}
[Slack](/user-guides/actions/slack)
{% endcontent-ref %}

### Data

{% content-ref url="/pages/cQ8GKh4r9cdJhvC5alJ9" %}
[Tiles](/user-guides/actions/tiles)
{% endcontent-ref %}

{% content-ref url="/pages/aqEwv5ygnK8zTF2ch86U" %}
[M365 Excel (.gov.sg Agencies only)](/user-guides/actions/m365-excel-.gov.sg-agencies-only)
{% endcontent-ref %}

{% content-ref url="/pages/gVyqOktXe4pleH9GElhc" %}
[Formatter](/user-guides/actions/formatter)
{% endcontent-ref %}

### Logic

{% content-ref url="/pages/fw1kZ6GOJMH7R2AWp358" %}
[Only continue if](/user-guides/actions/only-continue-if)
{% endcontent-ref %}

{% content-ref url="/pages/h1inOLX89kUISvhnfNPn" %}
[If-then](/user-guides/actions/if-then)
{% endcontent-ref %}

{% content-ref url="/pages/qGTDRNCodoywNVENQ4xV" %}
[For each item](/user-guides/actions/for-each-item)
{% endcontent-ref %}

### Others

{% content-ref url="/pages/0vS41Q4lzD0bEFRDnucJ" %}
[Delay](/user-guides/actions/delay)
{% endcontent-ref %}

{% content-ref url="/pages/SLcKYn6L45mS5Cje1ZGX" %}
[PaySG](/user-guides/actions/paysg)
{% endcontent-ref %}

{% content-ref url="/pages/DFdPoZEkgtoMtUXEgqao" %}
[Custom API](/user-guides/actions/custom-api)
{% endcontent-ref %}

{% content-ref url="/pages/zgczTnMSAc5vBbsfRzM2" %}
[Broken mention](broken://pages/zgczTnMSAc5vBbsfRzM2)
{% endcontent-ref %}


# Email by Postman

## What is Postman?

Postman is a mass messaging tool for the Singapore Government. To date, Postman has sent out more than 100 million messages from over 90 agencies. These include quarantine orders, COVID-19 test results, and employer notices.

More information about Postman can be found [here](https://guide.postman.gov.sg/)

## Send email

<table><thead><tr><th width="204.05859375">Field</th><th width="410.37109375">Description</th><th>Required?</th></tr></thead><tbody><tr><td>Email subject</td><td>Sets the subject line that recipients will see in their inbox.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Body</td><td><p>Sets the main content of the email, which the recipient will see in the message area.</p><p></p><p>You can enter plain text, use variables from previous steps to personalise the message, or format it with the editor to add tables, images, and links.</p></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Recipient email(s)</td><td><p>Sets the email address(es) of the recipient(s).</p><p><br>Note: each recipient will receive an individual email.</p></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>CC recipient email(s)</td><td><p>Sets the recipients to be CC’d on every email.</p><p><br>Note: CC recipients will receive a separate copy of the email for each main recipient. For example, if there are 5 main recipients, each CC recipient will receive 5 emails.<br><br>If you want to avoid duplicate emails, add those recipients to the <strong>Recipient email(s)</strong> field instead.</p></td><td></td></tr><tr><td>Sender name</td><td><p>Sets the from name for the email.</p><p></p><p>For example, setting "Your custom name", this name will appear in the from field of the email sent to recipients.<br><img src="/files/HwM4bXbTO2FCToXHBgQJ" alt=""></p></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Reply-To email</td><td><p>Sets the Reply-To address for the email.</p><p></p><p>When recipients click Reply, their response will be directed to this address instead of the From address.<br>For example, setting "support@plumber.gov.sg" means replies will be sent to that address.<br><img src="/files/UKnbzJBegQkJJTZiXktK" alt=""></p></td><td>If left blank, it defaults to your email address.</td></tr><tr><td>Attachments</td><td>Add attachments to your emails from multiple sources, including FormSG, LetterSG, and manual uploads. For a list of supported file types, refer to the Postman documentation <a href="https://guide.postman.gov.sg/email-api-guide/programmatic-email-api/send-email-api/attachments#list-of-supported-attachment-file-types">here</a>.<br><br>To upload your own files:<br>1. Click on the <strong>Uploaded attachments</strong> tab<br>2. Upload your own files<br>3. Select them from the list</td><td></td></tr></tbody></table>

{% hint style="info" %}
**BCC is not supported.** Each recipient in the Recipient email(s) field already receives an individual email and cannot see other recipients, which achieves a similar outcome.
{% endhint %}

1. Set up your email by completing the required fields:
   1. **Email subject**
   2. **Body**
   3. **Recipient email(s)**
   4. **Sender name**
2. Set up the optional fields, if required.
3. Click on **Check step** to save and send an email to the address(es) specified in **Recipient email(s)**

## Check step

The **Check step** button saves your set up and tests the Email by Postman action by sending a **real** email to the address(es) specified in the **Recipient email(s)** field. This allows you to verify the email output before the Pipe is published and the workflow runs automatically.

## Common errors

<details>

<summary>Blacklisted recipient</summary>

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

This happens when email addresses are added to the Postman blacklist after a delivery attempt results in a hard bounce (e.g., the email address does not exist).&#x20;

Click the link to submit a request to remove the email from the blacklist. Once you receive a notification from Plumber confirming the removal, try sending the email to the recipient again.

</details>

<details>

<summary>Total attachment size exceeded</summary>

This happens when the cumulative size of all attachments exceed the limit imposed by Postman.

You should check that the attachments do not exceed 10 MB in total.

</details>

<details>

<summary>Invalid attachment</summary>

This can happen for the following reasons:

* **Password-protected files** - Plumber is unable to process password-protected attachments. Remove the password protection before attaching the file.
* **Unsupported file type** - check that your attachment is not an executable or script file type (e.g. `.exe`, `.bat`, `.js`). For the full list, refer to the [AWS SES documentation](https://docs.aws.amazon.com/ses/latest/dg/attachments.html#mime-types).

</details>

<details>

<summary>Invalid recipient emails</summary>

There is an invalid email in the field (e.g., invalid-email.com).

</details>

<details>

<summary>CC recipient did not receive email</summary>

The email status of CC recipients is not tracked by Postman, which means no blacklist notification will be sent.

In such cases, you will need to manually resend the email to the blacklisted CC recipient.

More details can be found [here](https://postman-v1.guides.gov.sg/email-api-guide/programmatic-email-api/send-email-api/cc-and-bcc).

</details>


# SMS by Postman

## **What is SMS by Postman**

SMS by Postman is an action available to all .gov.sg users. It is a SMS messaging service built in accordance with the Singapore government SMS policy. Messages will be sent under the gov.sg sender ID, featuring a fixed header and footer, as demonstrated below.

<figure><img src="/files/nYObsMBG6GUg6GCBi3UL" alt="" width="287"><figcaption></figcaption></figure>

## Getting started

To use SMS by Postman on Plumber, you must create a campaign ID and API key. Please follow the steps below.

### Step-by-step guide

1. Click "Create Campaign"

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

2. Assign a campaign name (You may alter it later)
3. Choose "General Public" and "gov.sg" from the dropdown menu.

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

4. Enter`{{body}}` in the text field.&#x20;

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

5. After creating the campaign, note down its campaign ID:<br>

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

6. Whitelist Plumber's IP addresses in your campaign by following this [guide](https://postman-v2.guides.gov.sg/postman-v2-admin-portal-for-api-users-mop/campaign-settings#ip-address-whitelisting). You should whitelist the 3 IPs below:
   1. 52.76.216.61
   2. 52.74.55.209
   3. 18.139.42.66
7. Generate API keys for your SMS campaign by following this [guide](https://postman-v2.guides.gov.sg/postman-v2-admin-portal-for-api-users-mop/campaign-settings#api-keys). You will need this when setting up Plumber later.

### Connecting SMS by Postman in Plumber

1. In the pipe creation page, select 'SMS by Postman' as the app.
2. Select 'Send SMS' as the action.
3. Click 'Continue' to connect your Postman SMS campaign to Plumber.
4. In the 'Choose connection' drop down, select 'Add new connection'
5. In the 'Label' field, enter a description for your campaign
6. In the "Campaign ID" field, paste your campaign ID&#x20;
7. In the 'API key' field, enter the API key for your campaign (you generated this in Step A4 above)
8. Click 'Submit' to finish connecting your Postman SMS campaign to Plumber

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

## Send SMS by Postman

| Feature                | Description                                                                                   | Required? |
| ---------------------- | --------------------------------------------------------------------------------------------- | --------- |
| Recipient phone number | Enter the recipient's phone number, including the country code.. Only 1 recipient per action. |           |
| Message Body           | The message that will be delivered to the recipient. We only support up to 1,000 characters.  | ✔️​       |

## Check step

{% hint style="warning" %}
Please note that an actual SMS will be sent to the recipient. If you are testing, use a phone number suitable for testing or use your own mobile number.
{% endhint %}

1. Click 'Continue' to proceed to test your action
2. Click on 'Check step' and verify that the SMS has been sent to the recipient's phone.

## FAQs

<details>

<summary>Are SMS messages chargeable?</summary>

Yes. For pricing matters, please refer to this [Postman guide](https://postman-v2.guides.gov.sg/postman-v2-pricing-from-1-july-2025/billing-overview/detailed-charges-and-pricing#how-much-will-messages-cost).&#x20;

</details>

<details>

<summary>Is this feature available to healthcare users?</summary>

Unfortunately not. To use the SMS feature in Plumber Flow, please contact us with your existing vendor. If you don't have one, do reach out to us as well.

You may contact us at go.gov.sg/plumber-support.

</details>

<details>

<summary>Can I send SMS to multiple recipients?</summary>

You can send SMS to multiple recipients by adding additional SMS actions. Each action can only cater to 1 recipient. Alternatively, you may use "For-each" to send SMS to multiple users.

</details>


# Pair

Coming soon!

You can use Pair actions to automatically process text or images — summarising feedback, categorising responses, extracting information from documents, and more — without writing any code.

These actions are powered by AI models hosted on [Foundry](https://foundry.pair.gov.sg), which also powers [Pair](https://pair.gov.sg/). Note that these are not [Pair](https://pair.gov.sg) (the AI assistant) or Pair Assistants. They are standalone AI actions within Plumber.

## Actions

### Use Pair

Enter a prompt to tell Pair what to do with your data. Pair will return structured outputs that you can use as variables in later steps.

#### Fields

| Field                                                  | Description                                                                                                                    | Require |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------- |
| Describe what you want Pair to do                      | Your prompt. You can use variables from previous steps (e.g. a form response) to pass in the content you want Pair to work on. | ✔️      |
| Define how you want Pair to structure what it extracts | The list of outputs you want Pair to return. Each output becomes a variable you can use in later steps.                        | ✔️      |

#### Presets

To get started quickly, you can choose from four presets. Each preset fills in a template prompt and suggested output fields that you can customise. You can edit the preset prompt after selecting it, or write your own from scratch.

<table><thead><tr><th width="165.0703125">Preset</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Summarise</strong></td><td>Pulls out the key points and main takeaways</td></tr><tr><td><strong>Analyse</strong></td><td>Finds patterns, strengths, weaknesses, and recommendations</td></tr><tr><td><strong>Categorise</strong></td><td>Groups responses into themes or labels</td></tr><tr><td><strong>Write</strong></td><td>Generates content from a brief</td></tr></tbody></table>

#### Output

For each output, you define:

<table><thead><tr><th width="169.34765625">Sub-field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Type</strong></td><td>The data type Pair should return: <strong>Text</strong>, <strong>Number</strong>, or <strong>Category</strong></td></tr><tr><td><strong>Output name</strong></td><td>The name of this output (e.g. <code>Summary</code>, <code>Priority level</code>). This becomes the variable name in later steps.</td></tr><tr><td><strong>Categories</strong></td><td><em>(Category type only)</em> A comma-separated list of allowed values (e.g. <code>High, Medium, Low</code>). Pair will only return one of these values.</td></tr></tbody></table>

**Output types:**

* **Text** — a free-form text response (e.g. a summary or recommendation)
* **Number** — a numeric value (e.g. a score or count)
* **Category** — one of a fixed set of values you define (e.g. `Positive`, `Negative`, `Neutral`)

> **Tip:** Use the Category type when you need to route or filter based on Pair's output in a later step, since the values are predictable.

#### Check step

Click **Check step** to test your configuration. Pair will run against your test data and show you what it returns for each output field.

### Process image

Extract specific information from an image or PDF. You describe what you want Pair to look for, and it returns a structured value for each item.

| Field                        | Description                                                                                                                              | Required? |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| Image                        | Select a file variable from a previous step (e.g. an attachment from a FormSG submission). Only one image or PDF at a time is supported. | ✔️        |
| What do you want to extract? | The list of things you want Pair to look for in the image. Each item becomes a variable you can use in later steps.                      | ✔️        |

> **Note:** The image must come from a variable in a previous step. You cannot upload a file directly in this step.

#### Output fields

For each item you want to extract, you define:

| Sub-field            | Description                                                                                                                                              |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **What to look for** | A description of what Pair should find in the image (e.g. `Whether the image contains a handwritten signature`, `The total amount shown on the receipt`) |
| **Output name**      | The name of this output (e.g. `Signature present`, `Total amount`). This becomes the variable name in later steps.                                       |

#### Check step

Click **Check step** to test your configuration. Pair will process your test image and show you what it extracted for each item.

## FAQ

<details>

<summary>What kinds of content can I pass into Use Pair?</summary>

Any text you have as a variable in your pipe — for example, a form response, a row from Tiles, or the body of an email. Paste the variable into your prompt where you want Pair to read it.

</details>

<details>

<summary>What file types does Process an image support?</summary>

Images (PNG, JPG) and PDFs only. One file per step. Zip files and other formats are not supported.

</details>

<details>

<summary>Can I store a knowledge base for Pair to reference?</summary>

Not currently. Pair actions work on a per-step basis - you pass in content via your prompt or the Process image action, and Pair processes it in that execution only. There's no persistent knowledge base or document store.

If this is something you need, let us know your use case at <https://go.gov.sg/plumber-support>.

</details>

<details>

<summary>Can I have multiple Pair steps in the same pipe?</summary>

Yes. You can chain multiple Pair steps, and each step's outputs are available as variables in all subsequent steps.

</details>

<details>

<summary>What is the data classification for content processed by Pair?</summary>

PAIR is cleared for Restricted and Sensitive (Normal) data only. Do not pass in data classified Sensitive (High) or above, even if the rest of your pipe handles it

</details>


# LetterSG

## What is LetterSG?

LetterSG is a platform that allows public officers to create, issue and track personalised official e-letters to citizens.

More information about LetterSG can be found [here](https://guide.letters.gov.sg/).

## Setting up LetterSG connection

1. Click on the :heavy\_plus\_sign: logo in between steps or "Add Step"
2. Select "LetterSG"
3. Under "Choose connection", click the dropdown
4. Click "Add new connection"
5. Under "Label", key in the name you want to associate this connection with
6. Login to [LetterSG](https://letters.gov.sg/) and follow this [guide](https://guide.letters.gov.sg/developer-guide/api-documentation) to obtain the API key. Key it under "API key"
7. Click "Connect"
8. Under "2. Create letter", a green dot will appear as an indication that the LetterSG connection is successful

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

## Create letter

| Field               | Description                                                                                                                                                                                                                                                                  | Required?            |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| Template            | Sets the template you want for creating a letter                                                                                                                                                                                                                             | :heavy\_check\_mark: |
| Export as PDF       | <p>Two options to select:</p><ol><li>Send the letter link directly (recommended): This does not generate a PDF to be sent to the user.</li><li>Export letter as PDF to send: This generates a PDF which can be used with an "Email by Postman" in the next step.  </li></ol> | :heavy\_check\_mark: |
| Personalised fields | <p>These are variables in your letter template in this format <code>{{field\_name}}</code> </p><p></p><p>Click on "+ And" to add all the fields in your template.</p>                                                                                                        | :heavy\_check\_mark: |

1. Set up your letter by completing the required fields:
   1. **Template**
   2. **Export as PDF**
   3. **Personalised fields**
2. Click on **Check step** to save and generate a letter for your templated based on the personalised fields you have set up.

### Check step

The **Check step** button saves your set up and tests the Create Letter action by generating a **sample** letter based on the personalised fields specified. This allows you to verify the letter design before the Pipe is published and the workflow runs automatically.

## Common Errors

<details>

<summary>Personalised field(s) not specified</summary>

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

This happens when you have not selected all the fields required in your template. Check that you have selected those fields that are indicated in the error message before running "Check step" again.

</details>

<details>

<summary><code>field_name</code> is repeated</summary>

This happens when you have selected repeated fields in your setup. Make sure you only include one of each before running "Check step" again.

</details>

<details>

<summary>Field empty</summary>

This happens when you have not selected a field in the dropdown. Please make sure you select the required fields for your template.

</details>

<details>

<summary>Value empty</summary>

This happens when you have not entered a value for your field. Please make sure you key in the respective value for your template fields.

</details>


# Telegram

## What is Telegram?

Telegram is a messaging app that allows you to send and receive messages, photos, videos, and other files over the internet. It is similar to other messaging apps like WhatsApp and Facebook Messenger. Telegram also offers several additional features, such as the ability to create groups with up to 200,000 members, channels for broadcasting messages to large audiences, and bots that can perform automated tasks like sending reminders or providing information.

## Add a new Telegram connection

1. Start a chat with [Botfather](https://telegram.me/BotFather).\
   ![Botfather is an official Telegram bot to create and manage other bots](/files/jJa5Lj5b0PpfZOU4GA1n)  *Botfather is an official Telegram bot to create and manage other bots*
2. Click **Menu >** **create a new bot** or enter `/newbot`.
3. Enter a name for your bot (this can be changed later).
4. Enter a username for your bot (this cannot be changed later).
5. Copy the **token** value from the answer to the **Bot token** field on Plumber.

   <figure><img src="/files/jB5VTwrdYGyzlWaiUyYL" alt=""><figcaption></figcaption></figure>
6. Click **Connect** and you're done :tada:!

## Send a message

<table><thead><tr><th width="168.078125">Field</th><th width="437.375">Description</th><th width="121.6328125">Required</th></tr></thead><tbody><tr><td>Chat ID</td><td>Select a chat, group or channel you want to send a message to.<br><br>Plumber will show a dropdown of recent chats that the Bot has interacted with. If your chat does not appear in the list, see <a href="#my-chat-does-not-appear-in-the-dropdown-list">here</a>.<br><br>If <a href="https://gist.github.com/nafiesl/4ad622f344cd1dc3bb1ecbe468ff9f8a">you know your Chat ID</a>, you can also manually enter it.</td><td>✔️</td></tr><tr><td>Message</td><td><p>This is your message body.</p><p></p><p>It support simple Markdown formatting.<br></p><p><strong>Basic formatting:</strong></p><ul><li><code>*text*</code> - bold text</li><li><code>_text_</code> - italic text</li><li><code>`text`</code> - monospace/code text</li><li><code>[text](URL)</code> - links</li></ul><p></p><p><strong>Code blocks:</strong></p><ul><li><code>text</code> - for multi-line code blocks (using triple backticks)</li></ul><p>No support for strikethrough, underline, or spoiler text</p></td><td>✔️</td></tr><tr><td>Disable notification</td><td>Defaults to <strong>No.</strong> If set to <strong>Yes</strong>, the recipient(s) will not receive a notification for the mesas</td><td>Defaults to <strong>No.</strong></td></tr><tr><td>Channel Topic</td><td><p>This is only applicable to Telegram channels with groups. If you are unsure, please leave this field empty.</p><p></p><ul><li>To enable topics in your telegram group, go to <code>Group Settings > Edit > "Topics"</code>. Toggle it on. </li><li>Create a Topic: <code>Tap the three dots > "New Topic."</code> Enter a title and tap "Create."</li><li><p>To get the topic ID for your group: </p><ol><li>Send a message to that topic, then right-click on it and select <code>Copy Message Link</code>. </li><li>Paste it on a notepad and notice that it has the following structure <code>https://t.me/c/XXXXXXXXXX/YY/ZZ</code>. The topic ID is <code>YY</code> (integer).</li></ol></li></ul></td><td></td></tr></tbody></table>

## Common errors

## Check step

Clicking **Check step** will send a telegram message to the configured telegram chat. If you are just testing, send it to a test chat first before selecting the intended chat.

## FAQ

<details>

<summary>Adding (or re-adding) bots to groups or channels</summary>

1. Access your private message with your bot. (You can do this by clicking your bot's @username in [BotFather](https://telegram.me/BotFather))
2. Tap on your bot's name at top to view profile.
3. Click on **Add to Group or Channel**\
   ![](/files/aeJfEQyyHcJbZlm2FEL3)

</details>

<details>

<summary>Allowing bots to read group messages</summary>

1. In [BotFather](https://telegram.me/BotFather), type `/mybots`
2. Select your bot
3. Bot Settings > Group Privacy
4. Click **Turn off**\
   ![](/files/GIFsYBiv7hwgWebMATmi)

</details>

<details>

<summary>Can I send attachments using this Telegram action?</summary>

This Telegram action does not support sending attachments.

</details>

<details>

<summary>My chat does not appear in the dropdown list!<br></summary>

This dropdown list shows chats with recent activity in the past 24 hours. If your chat is missing, try the following:

**For private messages,** send your bot a message directly.

**For group chats,** ensure your bot has been added to the group. Next, either send a message in the group chat (only works if your bot has [read permissions](#allowing-bots-to-read-group-messages)) or [re-invite your bot](#adding-or-re-adding-bots-to-groups-or-channels) to the group.

**For channels,** ensure your bot has been added as an admin to the channel and send a message to the channel with your own telegram account.

Then, click on the **Refresh Items** button at the bottom of the list

</details>


# Slack

Slack is a messaging application designed for businesses that enables individuals to access the information they require. By uniting people to function as a cohesive team, Slack revolutionizes the way organizations communicate.

### Setting up a new Slack connection

1. Head to this [link](https://api.slack.com/apps) and click on **Create New App > From scratch**\
   ![](/files/eZdTD00tlZZnAv0JbYui)
2. Enter your app name and select your slack workspace.
3. Then click on **Create App**
4. Go to **OAuth & Permissions** page.\
   &#x20;![](/files/t2Ytj6OGzfX0hXYfrF8Q)
5. Copy **OAuth Redirect URL** from Plumber and add it in Redirect URL. Click on **Save URLs.**\
   ![](/files/9doExMqF7xwACU5ZWCky)
6. Go to **Bot Token Scopes** and add `chat:write.customize` along with `chat:write` scope to enable the bot functionality.\
   ![](/files/xcJ1MrBKlXpnEDrtmrDE)
7. Go back to **Basic Information** on the left sidebar.
8. Scroll down to **App Credentials**.&#x20;
   * Copy **Client ID** into the **API Key** field in Plumber
   * Copy **Client Secret** into the **API Secret** field in Plumber

     <figure><img src="/files/V2HFbdkz3mV72gBWTzwR" alt=""><figcaption></figcaption></figure>
9. Click on **Connect.**
10. A new window with the Slack consent screen will pop up.&#x20;

{% hint style="info" %}
If a new window does not appear, it could because your Slack organisation does not allowing adding this new Slack app. Ask your Slack admin to approve this.
{% endhint %}

11. Click on **Allow**.\
    ![](/files/siumVQYOuN9v2HYM8dbm)
12. Your **Slack** integration is now ready!

### Send a message to a channel

<table><thead><tr><th>Field</th><th width="347.32421875">Description</th><th>Required</th></tr></thead><tbody><tr><td>Channel</td><td><p>Select the channel you want to send the message to. </p><p></p><p>If you do not find your channel in the dropdown list, ensure that the channel is Public or the user that your API token is created under has access to the channel. If you want to send to a private channel, see here.</p></td><td>✔️</td></tr><tr><td>Message </td><td><p>Message body of the message.</p><p></p><p> This supports whatever markdown syntax that Slack supports. <a href="https://docs.slack.dev/messaging/formatting-message-text/#basic-formatting">See how to format your message</a>.<br><br>To <a href="https://api.slack.com/reference/surfaces/formatting#mentioning-users"><strong>mention users</strong></a>, use the following format: &#x3C;@USER_ID>. e.g.:</p><p>Copy</p><pre><code>Hey &#x3C;@U024BE7LH>, thanks for submitting your report.
</code></pre><p>To get the user's ID, click on the overflow button in their Slack profile, and choosing the <code>Copy member ID</code> option.</p><p>To <a href="https://api.slack.com/reference/surfaces/formatting#mentioning-groups"><strong>mention user groups</strong></a>, use the following format: &#x3C;!subteam^ID>, e.g.:</p><p>Copy</p><pre><code>Hey &#x3C;!subteam^SAZ94GDB8>, there's a new task in your queue.
</code></pre></td><td>✔️</td></tr><tr><td>Send as a bot?</td><td><p>If <code>false</code>, the message will be sent as yourself. </p><div><figure><img src="/files/tAtIZ7lNoJflMekKAk7p" alt="" width="350"><figcaption><p>The first message is sent with <code>Send as a bot?</code> set to false. The next is set to true.</p></figcaption></figure></div></td><td>Defaults to <strong>No</strong></td></tr><tr><td>Bot name</td><td><p><em>Only works if Yes is selected for Send as a bot?</em> </p><p>Sender name of the bot.</p></td><td></td></tr><tr><td>Bot icon</td><td><p><em>Only works if Yes is selected for Send as a bot?</em> </p><p>Display image of the bot. This can be:</p><ul><li> an emoji that your Slack org supports such as <code>:robot:</code> 🤖 </li><li>a URL pointing to the image</li></ul></td><td></td></tr></tbody></table>

### Find a message

This action looks for a message in your Slack org.

<table><thead><tr><th>Field</th><th width="348.71484375">Description</th><th>Required</th></tr></thead><tbody><tr><td>Search Query</td><td><p>Search query to use for finding matching messages. <br></p><p>Examples:<br><code>hello world</code> -> search term</p><p><code>in:#plumber hello world</code> -> search for the term in #plumber channel<br><code>in:#plumber-dev from:@ian hello world</code> -> search for the term in #plumber channel and sent by ian</p><p></p><p>See the <a href="https://slack.com/intl/en-gb/help/articles/202528808-Search-in-Slack">Slack Search Documentatio</a>n for more information on constructing a query.</p></td><td>✔️</td></tr><tr><td>Sort by </td><td>Options:<br>- <strong>Match strength</strong>: relevance to search query<br>- <strong>Message date time</strong>: date and time the message was sent</td><td>Defaults to <strong>Match strength</strong></td></tr><tr><td>Sort direction</td><td>Options:<br>- <strong>Descending</strong>: newest or best match<br>- <strong>Ascending</strong>: oldest or worst match</td><td>Defaults to <strong>Descending</strong></td></tr></tbody></table>

## FAQ

<details>

<summary>How to send a message to a private channel?</summary>

To send to private channels, you would need the Slack ID of the private channel (it will not appear in the dropdown). To retrieve this:&#x20;

1. start by typing `/display ids` into any conversation on Slack.
2. Select the built-in shortcut `Display IDs`

   <figure><img src="/files/ekEn7ah2mOsLD2g23sm7" alt=""><figcaption></figcaption></figure>
3. Select the private channel in the dropdown as shown in the screenshot below. ![](/files/BYOr9ELbNpzPdfh6AtUt)
4. Copy and paste the selected conversation/channel ID into Plumber and click Use: \<CHANNEL\_ID>

   <figure><img src="/files/3TNZPdLlmeHAgma5oLBQ" alt=""><figcaption></figcaption></figure>

You can also manually retrieve a specific user group's ID by clicking `Copy group ID` in the overflow menu.

Ensure that you are not sending the message as a bot.

</details>


# Tiles

## What is Tiles?

Tiles is a platform designed for storing and sharing flat data, providing a spreadsheet experience - think Excel without formulas. With Tiles, you can easily organise and store data, maintain state across pipe executions or use it as a lookup table. You can also generate simple sharing links or add other users to your tiles, making data sharing and collaboration simple.

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

## How can Tiles help me?

Since Tiles is a feature under Plumber, it can integrate with other products such as FormSG, Telegram, and other products available on Plumber.

You can also use Tiles as a standalone feature without any automation set up. Are you looking to share data with external users outside of the department? Tiles can help with that too.

Other examples include:

1. Data collection: Pipe responses collected from Forms directly into Tiles and easily search and filter for responses.
2. Ease of sharing data: Easily share your data with a click of a button.
3. Supercharge your pipes: Store data across different executions or even pipes or use it as a reference table.

## Actions

1. [Create a row](#create-a-row)
2. [Find single row](#find-single-row)
3. [Find multiple rows](#find-single-row)
4. [Update single row](#update-single-row)

### Create a row

This allows you to add a row to the bottom of your specified Tile.

<table><thead><tr><th width="154">Field</th><th width="464">Description</th><th>Required</th></tr></thead><tbody><tr><td>Select Tile</td><td>Select the Tile you want to create a row in.<br><br>You may select an existing Tile you have or Click <strong>+ Create a new tile</strong> to create an empty one directly from the editor.<br><br><img src="/files/pYiFr2pepVwAiCweoglT" alt="" data-size="original"></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>New row data</td><td>Enter the row data you want to insert.<br><br>Column (Left input)<br>Select the column name for the corresponding cell value. You can also type in a new column name to create a new column.<br><br>Cell value (Right input)<br>Input the value or variable you want to insert as cell value.<br><br><img src="/files/Oc7wp9Dp9r51XvarJGwd" alt=""></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

#### Check Step

Checking step will insert the test row into your Tile. Feel free to delete this row when you're done testing.

### Find single row

This step allows you to retrieve a row from your Tile based on your lookup conditions

<table><thead><tr><th width="154">Field</th><th width="464">Description</th><th>Required</th></tr></thead><tbody><tr><td>Select Tile</td><td>Select the Tile you want to want search from.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Lookup conditions</td><td><p>Column (Left input)<br>Select the column name you want to search from.</p><p></p><p>Operator (Middle input)</p><p>See <a data-mention href="#lookup-operators">#lookup-operators</a> for more info.<br><br>Cell value (Right input)<br>The value to compare to.</p></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Return most recent row instead?</td><td><p><strong>No (Returns oldest row)</strong> - If more than one row satisfies the conditions, this option will return the oldest row (highest up in the Tile).<br></p><p><strong>Yes (Returns most recent row)</strong> - This option will return the newest row (lowest down in the Tile).</p></td><td>Defaults to No</td></tr></tbody></table>

#### Lookup operators

| Operator                                                                                | Description                                    | Good for                                                                                                                                                              |
| --------------------------------------------------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Equals to                                                                               | Looks for the exact value (**Case Sensitive)** | <ul><li>All non-empty data</li></ul>                                                                                                                                  |
| <p>Greater than<br>Greater than or equals to<br>Less than<br>Less than or equals to</p> | <p>><br>>=<br><<br><=</p>                      | <ul><li>Numbers</li><li>Dates in specific format (ISO string, YYYY-MM-DD)<br>Not used for dates that cannot be sorted lexicographically such as 24 May 2025</li></ul> |
| Begins with                                                                             | Looks values beginning with a certain prefix   | <ul><li>Text</li></ul>                                                                                                                                                |
| Contains                                                                                | Looks values containing certain text           | <ul><li>Text</li></ul>                                                                                                                                                |
| Is empty                                                                                | Looks for empty cells                          | <ul><li>Empty cells</li></ul>                                                                                                                                         |

#### Check Step

Checking step will look for a row matching your conditions as well as return the number of rows that satisfies them. To test this properly, you can add some test data into your Tile first.

### Find multiple rows

This step is similar to [#find-single-row](#find-single-row "mention") except that it returns up to 500 rows. To be used with [For each item](/user-guides/actions/for-each-item) action.

This means if you have 10,000 rows in your dataset and you're searching for something that should return 600 results, the system can only retrieve the first 500 results

### Update single row

This action updates the data of the row based on a row ID. Usually used after the [#find-single-row](#find-single-row "mention") action.

<table><thead><tr><th width="154">Field</th><th width="464">Description</th><th>Required</th></tr></thead><tbody><tr><td>Select Tile</td><td>Select the Tile you want to update.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Row ID</td><td>Obtain the Row ID from a <a data-mention href="#find-single-row">#find-single-row</a> action.<br><br>OR <br><br>If it's a fixed row or just for testing purposes, you can right click on the row in your Tile to copy the Row ID like so:<br><img src="/files/Ymc3QFjVyQ1HaZXedvpJ" alt=""><br></td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Row data</td><td>Enter the row data you want to update. Columns not selected will be left unchanged.<br><br><strong>Column</strong> (Left input)<br>Select the column name for the corresponding cell value.<br><br><strong>Operator</strong> (Middle input)<br>Available options<br><strong>=</strong> : sets the value as-is<br><strong>+ :</strong> increments the value by a specified value (only for numbers)<br><strong>- :</strong> decrements the value by a specified value (only for numbers) <br><br><strong>Cell value</strong> (Right input)<br>Input the value or variable you want to update to.</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

## Tiles collaboration

### Adding collaborators

You can add whitelisted users as **Editors** or **Viewers** to your Tile.

1. Open the Tile you want to add collaborators to
2. Click the 'Share' button in the top-right corner
3. Enter the collaborator's email and select the desired role\
   Example:<br>

   <figure><img src="/files/VG0Yy1vpY03L8tdmZpHn" alt=""><figcaption></figcaption></figure>
4. Click on 'Add collaborator' to confirm

### Generate public access link

<figure><img src="/files/05jEQIgnDsefsG4D5xZv" alt=""><figcaption></figcaption></figure>

Generate a shareable link to let others view your data. Note that anyone with the link can access the data. For security, generating a new link will automatically deactivate the previous one

### Setting a Password for Your Tile

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

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

You can set password to your public access tiles.&#x20;

* Under General Access, tick the **Password required** checkbox. A password input field will appear.
* Enter your password — it must be **at least 8 characters** long.
* Click the **tick button (✔)** to the right of the password field to save your password. Your tile link is now password-protected.

**Resetting the Password**

To reset or change the password, click the **cross button (✕)** to the right of the password field. This clears the current password so you can enter a new one.

## FAQ

<details>

<summary><strong>What is the data classification for Tiles?</strong></summary>

The data classification for data on the Plumber platform is Confidential (Cloud-Eligible) and Sensitive (High).

</details>

<details>

<summary><strong>Can I use Tiles to trigger automated reminders or checks?</strong></summary>

Yes. Tiles has a native "Read from Tiles" action, so your pipe can pull data directly from a Tile. A common pattern is:

**Step 1: Set up your Tile**\
Make sure your Tile has the data you need - for example, a list of records with a deadline date or a status column.

**Step 2: Create a new pipe with a Scheduler trigger**\
Set it to run at your preferred frequency (e.g. daily at 9 am).

**Step 3: Add a Find multiple rows action**\
Select your Tile and set your lookup conditions. For example, filter by a status column that equals "Pending", or a date column that is less than today's date. This returns up to 500 matching rows.

**Step 4: Add a For Each action**\
This loops through each row returned from the Tile.

**Step 5: Add your action inside the For Each loop**\
For example, Email by Postman to send a reminder, or Only continue if to filter rows before acting on them.

**Example use cases:**

* Send a daily reminder to staff whose deadline is approaching
* Check for records with a pending status and send a follow-up email

This lets you run automated checks or reminders based on data in your Tile, without needing a form submission to trigger the pipe.

</details>

<details>

<summary><strong>How do I manage data for multiple groups or organisations in Tiles?</strong></summary>

Create a separate Tile for each group and share only the relevant Tile link with each group. Since Tiles doesn't support filtered views, this is the cleanest way to keep each group's data isolated.

For example, if you're collecting FormSG responses from multiple schools, use an If-then or Only continue if step in your pipe to route each submission to the correct school's Tile based on a field in the form (e.g. school name).

</details>

<details>

<summary> <strong>Can I use Tiles without using any of the automation in Plumber?</strong></summary>

Yes! As long as our product improves your life, you may use it however you like.

</details>

<details>

<summary><strong>How many rows can be handled now?</strong></summary>

Tiles (created after 1 Sep 2025) can safely handle up to 200k rows. Anything beyond that may result in degraded performance and we strongly advise against that. If you a use case that requires storing more than 200k rows, let us know!

</details>

<details>

<summary><strong>Is there any mechanism to prevent editing collisions?</strong></summary>

No, the latest write will override the row data.

</details>

<details>

<summary><strong>Is the data stored encrypted?</strong></summary>

Yes, as with all of OGP's databases, it’s encrypted at rest.

</details>

<details>

<summary><strong>Where is the data stored?</strong></summary>

The data and its backups are stored on the AWS Singapore region.

</details>

<details>

<summary><strong>What are the backup options for this?</strong></summary>

We do not have version controls or user-generated backups yet. However, in times of catastrophic failures, we have PITR (point in time recovery), which allows us to recover all lost data up to 35 days.

</details>

<details>

<summary><strong>What improvements are coming to Tiles?</strong></summary>

Over the next year and a half, here's what's coming:

1. **Persistent sort** - Right now, sorting a column resets when you come back. Soon, Tiles will remember your preferred sort order so you don't have to redo it every time.
2. **Filtered views** - Filter your table to only the rows that matter, then share that view with someone, even if they don't have access to your full Tile.
3. **Bulk row selection** - Instead of updating or deleting rows one by one, you'll be able to select multiple rows and act on all of them at once, like bulk deleting outdated entries.
4. **Proper date handling** - Dates in Tiles are currently treated as plain text, which makes sorting and filtering unreliable. This fix will make dates behave as expected.

</details>

<details>

<summary><strong>Is there a limit to the number of collaborators?</strong></summary>

No, there is no limit to the number of collaborators. However, keep in mind that having many collaborators can make it more challenging to manage permissions, coordinate changes, and troubleshoot issues when they arise

</details>

<details>

<summary><strong>Can I restrict what different users see in a Tile?</strong></summary>

No. Tiles doesn't support filtered or role-based views yet. Anyone with access to a Tile can see all the data in it.

If you need data isolation, for example each school or department seeing only their own submissions, create a separate Tile for each group and share only the relevant link with them.

</details>


# M365 Excel (.gov.sg Agencies only)

## What is M365 Excel?

M365 Excel is a spreadsheet program used to organize, format, and analyse data using tables, calculations, formulas and graphs. It's part of the Microsoft Office suite and is widely used for tasks like data entry, accounting, financial analysis, and more.&#x20;

## What to take note?

{% hint style="danger" %}
**Please make sure to read through this entire document as there may be restrictions that could affect your operations.**
{% endhint %}

There is a cap on total disk space and Excel actions across all Plumber users. Please exercise prudence when using this action. To ensure that storage space is sufficient for all users, versions are deleted when they exceed 90 days since last modified.\
\
We maintain a M365 Excel action queue to ensure fairness. If there are many executions on the same file, the changes may not execute immediately.\
\
To prevent choking of the system, **the Plumber team reserves the right to pause your pipe** from using Excel if:

* Your pipe exceeds a large amount of actions in a short span of time.
* You are storing large files in your folder.

If your use case requires large files (>500 MB), or more than 100 Excel actions per 10 minutes, please contact us at <https://go.gov.sg/plumber-support> to avoid any disruption to your workflow.

## Setting up M365 Excel connection (one-time)

{% hint style="info" %}
M365 Excel is only available for agencies that can access the SG Govt SharePoint. Or, you may try to access this [link](https://gccprod-my.sharepoint.com) on your GSIB, if you're able to access, it means you'll be able to access the integration on Plumber.\
\
If your agency can access this SharePoint, but you are unable to see this app in Plumber, please contact us at <https://go.gov.sg/plumber-support>
{% endhint %}

To get started, you need to perform a one-time configuration to connect your Plumber account to M365. This will create a shared folder, known as your "Plumber folder," where you can place Excel files for Plumber to access.

Follow the steps below to set up the configuration.

### Part 1: Configure on Plumber

1. Select "Add step" in the pipe editor

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

2. Select “M365 Excel” action

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

3. Then select the “Create table row” action (or any action you require)

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

4. Click on "Connect" and we will create a folder for you to use on the SharePoint site

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

5. Click on "Ok, got it!" and the connection is completed. You can now perform M365 excel actions on Plumber!

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

### Part 2: Start creating or moving Excel files into your Plumber folder on the SharePoint site

1. Go to your OneDrive on the SG Govt SharePoint, and click on the “Shared” link

<figure><img src="/files/rPzoomMYAaOMBEnNWqaA" alt="" width="563"><figcaption></figcaption></figure>

2. You will see a new folder named with your email. The subtitle of that folder will be *Plumber (OGP)*. Any Excel files placed in this folder can be processed in a plumber pipe. **We recommend that you star this folder for easy access.**

<figure><img src="/files/nTw8OQc6Pl3AQzd6PmMh" alt="" width="563"><figcaption></figcaption></figure>

3. You can create a new excel file via the “Add New” button, or move an existing excel file to this folder.

<figure><img src="/files/CyvHmH1obbvIJrFPEB1q" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="danger" %}
***CAUTION***: If you want to move files into this folder, make sure that “Keep sharing with the same people” is selected! Otherwise, existing users will lose access to that file!
{% endhint %}

<figure><img src="/files/gzf4CKarEbzAOYfeN4yI" alt="" width="563"><figcaption></figcaption></figure>

## Available Actions

{% hint style="info" %}
Plumber does not automatically refresh changes to your excel file. If you make changes (*e.g. creating a new table / renaming a column*), you need to manually trigger a data refresh. To do this:

1. After editing your excel file, please wait 1-2 minutes for Microsoft servers to sync. Or you can refresh your excel file.
2. Navigate to your Plumber pipe and expand the appropriate drop down menu (*e.g. if you added a new table, expand the “Table” menu*)
3. Click on the “*Refresh Items*” button at the bottom of the menu.
   {% endhint %}

* [Create table row](#create-table-row)
* [Find table row](#find-table-row)
* [Update table row](#update-table-row)

> **You’ll need a table to use any of the actions** Please refer to Microsoft’s video [here](https://support.microsoft.com/en-us/office/create-and-format-tables-e81aa349-b006-4f8a-9806-5af9df0ac664) for instructions on creating a table.

## Create Table Row

This action allows you to add rows to an Excel [table](https://support.microsoft.com/en-us/office/overview-of-excel-tables-7ab0bb7d-3a9e-4b56-a3c9-6c94334e492c).

| Field        | Description                                                                                                                      | Required?            |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| Excel File   | Sets the Excel file where your Table will reside in.                                                                             | :heavy\_check\_mark: |
| Table        | <p>This field will only appear after you select an Excel file.</p><p></p><p>Set the Excel table you want to create a row to.</p> | :heavy\_check\_mark: |
| New row data | These are the columns and the respective values you want to add when you create a row                                            | :heavy\_check\_mark: |

* Set up your Excel step by completing the required fields:
  1. **Excel File**
  2. **Table**
  3. **New row data**
* Click on **Check step** to save and create an Excel row in your table in the Excel file selected based on the row data you have set up.

{% hint style="danger" %}
Please do NOT edit the excel table unless you un-publish your pipe first! Editing the table while the pipe is running will result in data corruption!
{% endhint %}

## Find Table Row

This action allows you to find a single table row by looking up a column value.

{% hint style="info" %}
*Find Table Row* only supports tables that are smaller than **50,000** rows or **100,000** cells.

It will also use the **first** table row whose lookup column matches the lookup value.
{% endhint %}

| Field         | Description                                                                                                                              | Required?            |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| Excel File    | Sets the Excel file where your Table will reside in.                                                                                     | :heavy\_check\_mark: |
| Table         | <p>This field will only appear after you select an Excel file.</p><p></p><p>Set the Excel table you want to find a row in.</p>           | :heavy\_check\_mark: |
| Lookup column | This is the column you will select to match with your lookup value to find the topmost row that matches.                                 | :heavy\_check\_mark: |
| Lookup value  | <p>This is the value you input for matching with the lookup column.<br><br>If this is left empty, it will search for an empty value.</p> |                      |

* Set up your Excel step by completing the required fields:
  1. **Excel File**
  2. **Table**
  3. **Lookup column**
* Click on **Check step** to save and find an Excel row in your table in the Excel file selected based on the lookup column and value you have set up.

## Update Table Row

This action allows you to update a single table row whose column matches a lookup value

{% hint style="info" %}
*Update Table Row* only supports tables that are smaller than **50,000** rows or **100,000** cells.

It will also update the **first** table row whose lookup column matches the lookup value.
{% endhint %}

| Field         | Description                                                                                                                              | Required?            |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| Excel File    | Sets the Excel file where your Table will reside in.                                                                                     | :heavy\_check\_mark: |
| Table         | <p>This field will only appear after you select an Excel file.</p><p></p><p>Set the Excel table you want to update a row in.</p>         | :heavy\_check\_mark: |
| Lookup column | This is the column you will select to match with your lookup value to find the topmost row that matches.                                 | :heavy\_check\_mark: |
| Lookup value  | <p>This is the value you input for matching with the lookup column.<br><br>If this is left empty, it will search for an empty value.</p> |                      |
| Row data      | These are the columns and the respective values you want to overwrite and update the found row with                                      | :heavy\_check\_mark: |

* Set up your Excel step by completing the required fields:
  1. **Excel File**
  2. **Table**
  3. **Lookup column**
  4. **Row data**
* Click on **Check step** to save and update an Excel row in your table in the Excel file selected based on the lookup column and value you have set up.

## List of agencies allowed for M365 integration&#x20;

*This list was last updated on 29 Nov 2024.*

If you're user with the email domains "x.gov.sg" and you're not able to access M365 app, please raise a ticket with us at <https://go.gov.sg/plumber-support>

| Approved government email domains | Disallowed government/org email domains |
| --------------------------------- | --------------------------------------- |
| @tech.gov.sg                      | @schools.gov.sg                         |
| @sport.gov.sg                     | @defence.gov.sg                         |
| @mom.gov.sg                       | All .edu.sg                             |
| @mindef.gov.sg                    | All healthcare institutions             |
| @nlb.gov.sg                       |                                         |
| @mnd.gov.sg                       |                                         |
| @singstat.gov.sg                  |                                         |
| @wsg.gov.sg                       |                                         |
| @bca.gov.sg                       |                                         |
| @spf.gov.sg                       |                                         |
| @thedigitalacademy.tech.gov.sg    |                                         |
| @mas.gov.sg                       |                                         |
| @nea.gov.sg                       |                                         |
| @hdb.gov.sg                       |                                         |
| @moh.gov.sg                       |                                         |
| @mlaw\.gov.sg                     |                                         |
| @judiciary.gov.sg                 |                                         |
| @nyc.gov.sg                       |                                         |
| @moe.gov.sg                       |                                         |
| @pub.gov.sg                       |                                         |
| @customs.gov.sg                   |                                         |
| @iras.gov.sg                      |                                         |
| @msf.gov.sg                       |                                         |
| @htx.gov.sg                       |                                         |
| @scdf.gov.sg                      |                                         |
| @mci.gov.sg                       |                                         |
| @mha.gov.sg                       |                                         |
| @stb.gov.sg                       |                                         |
| @jtc.gov.sg                       |                                         |
| @lta.gov.sg                       |                                         |
| @vital.gov.sg                     |                                         |
| @pris.gov.sg                      |                                         |
| @caas.gov.sg                      |                                         |
| @hsa.gov.sg                       |                                         |
| @gra.gov.sg                       |                                         |
| @ssg.gov.sg                       |                                         |
| @ica.gov.sg                       |                                         |
| @pa.gov.sg                        |                                         |
| @acra.gov.sg                      |                                         |
| @mfa.gov.sg                       |                                         |
| @cpf.gov.sg                       |                                         |
| @pmo.gov.sg                       |                                         |
| @toteboard.gov.sg                 |                                         |
| @csa.gov.sg                       |                                         |
| @hpb.gov.sg                       |                                         |
| @mddi.gov.sg                      |                                         |
| @mpa.gov.sg                       |                                         |
| @psd.gov.sg                       |                                         |
| @nparks.gov.sg                    |                                         |
| @enterprisesg.gov.sg              |                                         |
| @mti.gov.sg                       |                                         |
| @sfa.gov.sg                       |                                         |
| @muis.gov.sg                      |                                         |
| @ncss.gov.sg                      |                                         |
| @hta.gov.sg                       |                                         |
| @imda.gov.sg                      |                                         |
| @mccy.gov.sg                      |                                         |
| @edb.gov.sg                       |                                         |
| @cscollege.gov.sg                 |                                         |
| @nac.gov.sg                       |                                         |
| @ura.gov.sg                       |                                         |
| @agc.gov.sg                       |                                         |
| @agd.gov.sg                       |                                         |

## Common Errors

<details>

<summary>Table too large (for find and update table row actions)</summary>

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

This happens when your table has more than 50k rows, please reduce the number of rows before running the execution again.

</details>

<details>

<summary>Invalid column in Excel table (for any action)</summary>

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

The column is most likely deleted from your table, please reselect the correct column before running the execution again.

</details>

<details>

<summary>One or more users could not be resolved</summary>

This error usually means the Excel file or SharePoint folder was connected using a group or shared email account (e.g. `team@agency.gov.sg`).

M365 Excel requires an individual `.gov.sg` account to connect. Group emails don't have the same OneDrive and SharePoint permissions that Plumber needs.

**To fix this:**\
Reconnect M365 Excel using your personal `.gov.sg` email account, then move your Excel file into the new Plumber folder created under that account.

</details>

<details>

<summary>Sensitivity label is removed after file upload</summary>

If your Excel file had a sensitivity label applied locally, it may be stripped when uploaded to SharePoint via Plumber.

This is a known behaviour with M365 APIs. The label is not carried over automatically during file operations.

**To fix this:**\
Apply the sensitivity label directly in SharePoint after the file is uploaded, rather than relying on the local label. You can also configure a default sensitivity label at the SharePoint library level so it applies automatically to all files in your Plumber folder.

</details>

<details>

<summary>403 forbidden</summary>

You are most likely attempting to perform actions on a protected sheet.

Remove the protection and try again.

</details>

<details>

<summary>504 gateway timeout error</summary>

You most likely have a long-running formula in your excel sheet, please set your formulas to `manual` instead of `automatic` to prevent issues with creating a table row.&#x20;

Follow these steps: click on `Formulas` -> `Calculation Options`-> `Manual`

</details>

<details>

<summary>409 insert delete conflict</summary>

Your table may be too large or contains too many empty rows.

Check that you did not accidentally create too many rows.

To fix this:

1. Create a new Excel table from scratch.
2. Copy and paste only the rows that contain actual data.
3. Make sure there are no unnecessary blank rows in the table.
4. Save the file and try running your Pipe again.

</details>

## FAQ

<details>

<summary>Why are only ".gov.sg" email domains given access to M365?</summary>

This restriction is in place because the ".gov.sg" email domains share the same system on SG SharePoint, which is the only system integrated with the product. The other domains reside on a separate SharePoint system to which the product does not have access.

</details>

<details>

<summary>What is the meaning of disallowed email domains?</summary>

Users will not be able to use the M365 excel integration on Plumber. The reason is because the users are not able to access SG sharepoint.

</details>

<details>

<summary>Can I keep my Excel file open while the data pipe runs?</summary>

No, you need to close the Excel file before running the pipe. The pipeline requires exclusive access to read/write the file. Once closed, the pipe will run successfully.

</details>

<details>

<summary>Why does the date from Excel display as numbers on Plumber?</summary>

Excel stores dates internally as serial numbers (days since January 1, 1900). When Excel doesn't recognise your input as a proper date format, it may display these serial numbers instead of formatted dates.

**To fix this:**

In your Excel column, add a formula to convert the serial number to a readable date:\
`=TEXT(G2,"dd mmm yyyy")`

Apply this to the entire column. This forces Excel to store the date as text in a consistent format that Plumber can read correctly.

</details>

<details>

<summary>Will the team work towards opening M365 to everyone?</summary>

There are multiple systems across Singapore Government and healthcare settings. We aim to make these available to as many users as possible, so please bear with us while we work behind the scenes.&#x20;

</details>

<details>

<summary>Why does my response take a while to appear in M365 excel?</summary>

We have implemented a queuing system to ensure fairness. If there are many automations using M365 running at the same time, your request may not execute immediately. Please allow around half an hour for your response to show up. The response ultimately resides on FormSG. Alternatively, you may also set up Tiles in your action.

</details>

<details>

<summary>Can I use macros along with this integration?</summary>

No, it is not possible to use macros with this integration. Plumber will not be able to detect the excel sheet if it's macros-enabled.

</details>

<details>

<summary>How do I know if I am able to access M365 integration on Plumber?</summary>

You can try to access the  <https://gccprod-my.sharepoint.com> with your GSIB.&#x20;

If you are able to access it, you should be able to use the integration on Plumber.

</details>

<details>

<summary>I cannot find my Plumber folder on SharePoint. What should I do?</summary>

1. Open SharePoint: <https://gccprod-my.sharepoint.com/>
2. Click on 'Shared'
3. Click on the Folder icon to filter by folders

</details>

<details>

<summary>Why can't I see my Excel table on Plumber?</summary>

Please ensure you have set up a table in Excel. For more information, view the Microsoft guide [here](https://support.microsoft.com/en-us/office/create-and-format-tables-e81aa349-b006-4f8a-9806-5af9df0ac664).

</details>

<details>

<summary>Why am I unable to access Excel actions with group emails?</summary>

Unfortunately, Excel actions are not supported for group emails due to system limitations. Excel actions require individual email addresses because group emails operate with different permission settings.

</details>


# Formatter

## What is Formatter?

Allows you to manipulate dates by either:

1. Changing them to a new format style or
2. Adding/subtracting days, months, years, hours or minutes to it

## Add/subtract time

<table><thead><tr><th width="204.05859375">Field</th><th width="410.37109375">Description</th><th>Required?</th></tr></thead><tbody><tr><td>Value to transform</td><td>The time that you want to manipulate</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Select the format of your value</td><td>The format that the time you want to manipulate, is currently in</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Specify the amount of time you want to add or subtract</td><td>The amount of time you wish to add or subtract to the time you want to manipulate</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

## Format  date/time

<table><thead><tr><th width="204.05859375">Field</th><th width="410.37109375">Description</th><th>Required?</th></tr></thead><tbody><tr><td>Value to transform</td><td>The time that you want to manipulate</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>Select the format of your value</td><td>The format that the time you want to manipulate, is currently in</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr><tr><td>What format do you want to transform value to?</td><td>The new format for your time</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2714">✔️</span></td></tr></tbody></table>

1. Set up your step by completing the fields.&#x20;
2. Click on **Check step.**

## Check step

The **Check step** button saves your set up and tells you what the transformed value will be according to what you set up.

## Common errors

<details>

<summary>Incorrect format of your value</summary>

This happens when you choose the wrong format of your value.&#x20;

You should make sure that you select the correct format of your value.

</details>


# Only continue if

## What is Only continue if?

Stops your Pipe from running the next steps unless the configured conditions are met. If the conditions are not met, the Pipe ends at this step and no further actions are executed.

## Only continue if

| Field        | Description                                                 | Required?            |
| ------------ | ----------------------------------------------------------- | -------------------- |
| Field        | Select the variable that you want to check                  | :heavy\_check\_mark: |
| Is or is not | Set the logical condition                                   | :heavy\_check\_mark: |
| Condition    | Set the logical condition                                   | :heavy\_check\_mark: |
| Value        | Set the value that you want to compare the variable against | :heavy\_check\_mark: |

## Check step

You can expect one of these two results when you **Check step**.

<table><thead><tr><th width="118.28125">Result</th><th>Description</th></tr></thead><tbody><tr><td>true</td><td>The condition you set is met. Your Pipe will continue to the next steps.</td></tr><tr><td>false</td><td>The condition you set is not met. Your Pipe will stop here.</td></tr></tbody></table>

{% hint style="info" %}
**Check Step** is just a way to test your condition using the current sample data. It’s like a “preview” to see if your rule is working. In real executions, the result might change because the input data can be different.
{% endhint %}

## Common errors

<details>

<summary>Non-number used in value/field for comparison</summary>

This happens because you are comparing text against a number or vice versa.&#x20;

Make sure that your Field and Value fields are using numbers, if you are using conditions made for numbers (Greater than, Greater than or equals to, Less than, Less than or equals to)&#x20;

</details>


# If-then

## What is If-then?

If-then **allows one Pipe to perform different actions based on rules you define.** Using conditional logic, these rules determine the subsequent steps, for example, If response is A, then do X. If response is B, then do Y.

## If-then

| Field        | Description                                                                     | Required?            |
| ------------ | ------------------------------------------------------------------------------- | -------------------- |
| Branch name  | Give a name for this branch. We would suggest using the condition as your name. | :heavy\_check\_mark: |
| Field        | Select the variable that you want to check                                      | :heavy\_check\_mark: |
| Is or is not | Set the logical condition                                                       | :heavy\_check\_mark: |
| Condition    | Set the logical condition                                                       | :heavy\_check\_mark: |
| Value        | Set the value that you want to compare the variable against                     | :heavy\_check\_mark: |

## Check step

You can expect one of these two results when you **Check step**.

<table><thead><tr><th width="118.28125">Result</th><th>Description</th></tr></thead><tbody><tr><td>true</td><td>The condition you set is met. Your Pipe will continue to the next steps.</td></tr><tr><td>false</td><td>The condition you set is not met. Your Pipe will stop here.</td></tr></tbody></table>

{% hint style="info" %}
**Check Step** is like a “preview” to see if your rule is working, according to sample data. When your Pipe is running, the result might change because the data that comes in for each execution is different.
{% endhint %}

## Common errors

<details>

<summary>Non-number used in value/field for comparison</summary>

This happens because you are comparing text against a number or vice versa.&#x20;

Make sure that your Field and Value fields are using numbers, if you are using conditions made for numbers (Greater than, Greater than or equals to, Less than, Less than or equals to)&#x20;

</details>


# For each item

## What is For each item?

For each item repeats the same actions on a list of items. For example, if you have a list of event attendees, it will send an email for each event attendee.

<figure><img src="/files/1GCjbGoYmlVWxeOyPg2R" alt=""><figcaption></figcaption></figure>

## Prerequisites to use

You would need any one of these to be able to use for each item in:

* Tiles - Find multiple rows step
* M365 Excel - Find multiple table rows step&#x20;
* FormSG checkbox field
* FormSG table field

## For each item

| Field        | Description                                                           | Required?            |
| ------------ | --------------------------------------------------------------------- | -------------------- |
| Choose items | This is the list of items that we would run the subsequent actions on | :heavy\_check\_mark: |

## Check step

The **Check step** button saves your set up and lets you check how many items are found.

## Video tutorial

{% @arcade/embed flowId="TUPrjd5WzQjFPHx1DEIZ" url="<https://app.arcade.software/share/TUPrjd5WzQjFPHx1DEIZ>" fullWidth="false" %}


# Delay

## What is Delay?

Delay is a tool that allows you to pause your Pipe for a specified amount of time or till a specified date before your actions run. You can use delays to set up scheduled emails, get notified of incomplete tasks, send automatic follow-ups, and automate other tasks on your timeline.

## Delay for

| Field           | Description                                           | Required?            |
| --------------- | ----------------------------------------------------- | -------------------- |
| Delay for unit  | Select whether you want minutes, hours, days or weeks | :heavy\_check\_mark: |
| Delay for value | Enter a value                                         | :heavy\_check\_mark: |

## Delay until

| Field            | Description                                     | Required?            |
| ---------------- | ----------------------------------------------- | -------------------- |
| Delay until date | Enter the date you want to delay the Pipe until | :heavy\_check\_mark: |
| Delay until time | Enter the time you want to delay the Pipe until | :heavy\_check\_mark: |

## Check step

The **Check step** button saves your set up and tells you how long your Pipe will be paused for/until when your Pipe will be paused too.

## Common errors

<details>

<summary>Invalid delay for value entered</summary>

This happens when you pick a field that is not a **number.**

Make sure you select a **numeric** field or enter a number.

</details>

<details>

<summary>Delay until timestamp entered is in the past</summary>

This happens when you enter a date that has passed.

Make sure you enter a date that is in the future.

</details>

<details>

<summary>Invalid timestamp entered</summary>

This happens when you enter a timestamp that is not a date/time.

Make sure you check the format or for any extra characters.

</details>


# PaySG

## What is PaySG?

PaySG is a self-service and free-of-charge service designed specifically for public sector organisations to accept online payments. With PaySG, there are no monthly fees, setup charges, or cumbersome procurement processes to navigate. It empowers teams to swiftly replace existing payment methods with a secure, accessible, and fully compliant user experience hosted on the PaySG platform.&#x20;

{% hint style="info" %}
For more information on setting up a PaySG account, refer to PaySG's [documentation](https://guide.pay.gov.sg/overview/introduction).
{% endhint %}

## Getting started

1. Upon choosing any of the payment options below, you will be required to connect to PaySG.

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

2. Under "Label", give a name you like for the connection. This is just for your own identification purpose.
3. Under "Payment Service ID", you may refer to the example below.

This is the string right after `services` in your payment service's URL. For example:

* If the URL is `http://pay.gov.sg/admin/services/`**`payment_service_1534d338-8dca-4c1a-84f3-895b7fe96d81`**`/payments`
* The Payment Service ID is `payment_service_1534d338-8dca-4c1a-84f3-895b7fe96d81.`

4. Under "API key"**,** enter the API key provided to you by the PaySG team.
5. Click "Connect" once you're done.

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

## PaySG options

<table><thead><tr><th width="137.540771484375">Feature</th><th width="135.7664794921875">Description</th><th>How to use</th></tr></thead><tbody><tr><td>Create payment</td><td>Create a new PaySG payment</td><td><p></p><ol><li>Select <strong>PaySG > Create payment</strong></li><li>Select a PaySG connection</li><li>Choose an existing connection</li><li>Click <strong>Add step</strong></li><li><p>Complete the following required fields:</p><ol><li><strong>Reference ID</strong></li><li><strong>Payer Name</strong></li><li><strong>Description</strong></li><li><strong>Payment amount (in cents)</strong></li></ol></li></ol><p>Refer to PaySG's <a href="https://guide.pay.gov.sg/api-resources/payments/create-a-payment">documentation</a> if you need additional guidance.</p><ol start="6"><li>Complete any optional fields if needed</li><li>Click <strong>Check step</strong> to verify that the payment is created</li></ol></td></tr><tr><td>Get payment</td><td>Get details of a payment that has previously been created</td><td><p></p><ol><li>Select <strong>PaySG > Get payment</strong></li><li>Select a PaySG connection</li><li>Click <strong>Add step</strong></li><li>Enter the <strong>Payment ID</strong></li><li>Click <strong>Check step</strong> to verify that the details of the corresponding payment are retrieved</li></ol></td></tr><tr><td>Send payment email</td><td>Send email to payee for a payment that has previously been created</td><td>Refer to PaySG's <a href="https://guide.pay.gov.sg/start-using-the-dashboard/payment-workflows-with-plumber/set-up#sending-emails">documentation</a> for a demo on setting up payment emails.</td></tr><tr><td>Create payment form submission for one-time payment</td><td>Create a new submission for a payment form, and initiate a one-time payment</td><td>Refer to PaySG's <a href="https://guide.pay.gov.sg/start-using-the-dashboard/payment-forms/set-up">documentation</a> for a demo on how to create a payment form submission for one-time payment.</td></tr><tr><td>Create payment form submission for subscription</td><td>Create a new submission for a payment form, and initiate a subscription</td><td>Refer to PaySG's <a href="https://guide.pay.gov.sg/start-using-the-dashboard/payment-forms/set-up">documentation</a> for a demo on how to create a payment form submission for subscription.</td></tr></tbody></table>

## FAQ

<details>

<summary>Do I need a Stripe account to use PaySG?</summary>

Yes, you will need to create a Stripe account. Refer to PaySG’s [documentation](https://guide.pay.gov.sg/overview/stripe-onboarding) for instructions on how to onboard to Stripe.

</details>


# Ownself Gather

Ownself Gather (OG) is a lightweight customer relationship management (CRM) tool designed for seamless collaboration and productivity. It helps you digitalise your operations with minimal development effort.

More information about OG can be found [here](https://ownself.gather.gov.sg/).

{% hint style="info" %}
When creating your API key on OG to use with Plumber, ensure that you have granted the **Admin** role.

**How to create an API key on OG?**

1. Go to `Settings` &#x20;
2. Navigate to  `API Keys`&#x20;
3. Create a new API Key, and name it accordingly.
4. Choose the appropriate permissions.
5. Save your API key safely.
   {% endhint %}

## Adding a new Ownself Gather connection

| Field   | Description                                 | Required? |
| ------- | ------------------------------------------- | --------- |
| Label   | Enter the desired name for your connection. | ✔️        |
| API key | Enter the API key that you created on OG.   | ✔️        |

## Update case

Use this action to update an existing case in OG. For example, you can update a case status (e.g. from *Pending* to *Approved*) or modify existing field values.

This is useful when automating case progression or syncing status updates.

| Field       | Description                                                                                                                   | Required? |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------- | --------- |
| Case UUID   | Select the Case UUID for the case you want to update.                                                                         | ✔️        |
| Case status | Select the status to update the case to.                                                                                      |           |
| Case fields | <p>Select the fields and enter the values you want to update.</p><p></p><p><img src="/files/QWtxBLN9pym2SkbmbavG" alt=""></p> |           |

## Tag/untag case

Use this action to add or remove tags from an existing case in OG. Tags help you group and filter cases easily on OG, for example by marking certain cases as *High Priority* or *Follow-up Required*.

| Field        | Description                                                   | Required? |
| ------------ | ------------------------------------------------------------- | --------- |
| Case UUID    | Select the Case UUID of the case you want to tag or untag.    | ✔️        |
| Tag or untag | Select whether you want to add or remove a tag from the case. | ✔️        |
| Tag value    | Enter the tag value.                                          | ✔️        |

## Create case

Use this action to create a new case in OG. You can select the case type, specify its initial status, and fill in the necessary fields that define the case.

This action is typically used when you want to automatically create new case entries in response to a new form submission or other trigger.

| Field       | Description                                                        | Required? |
| ----------- | ------------------------------------------------------------------ | --------- |
| Case type   | Select the type of case you want to create.                        | ✔️        |
| Case status | Select the status to assign to the new case.                       |           |
| Case fields | Select the fields and enter the values to include in the new case. | ✔️        |

## Get case details

Use this action to retrieve the details of an existing case in OG. It returns the case's fields and values, which you can use as variables in later steps.

This is useful when you need to reference or act on existing case data — for example, looking up a case before updating it.

| Field     | Description                                            | Required? |
| --------- | ------------------------------------------------------ | --------- |
| Case UUID | Select the Case UUID of the case you want to retrieve. | ✔️        |

**Output variables include:** Case type, Case UUID, Name, Email, and any other fields defined in your case type.

## Common errors

<details>

<summary>Invalid or missing field values</summary>

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

This error occurs when the field values do not match the expected type. For example, this may happen if you selected a number type but entered a string, or if a required value is missing.

**Date fields**\
Dates must be converted to the "YYYY-MM-DD" format when updating date fields in OG. Use the **Formatter** action to convert the dates, then use the formatted value in your OG step.<br>

</details>

<details>

<summary>Please enter a valid case uuid</summary>

This error occurs when an invalid Case UUID is provided. Ensure that you have selected the correct Case UUID for your case.

</details>

<details>

<summary>Error fetching case fields</summary>

If you encounter the error “You have not been granted access to this feature or page” when attempting to refresh the Case fields, ensure that the API key you’re using with Plumber has been granted the **Admin** role.

</details>

## FAQ

<details>

<summary>Is there a guide for Ownself Gather?</summary>

Yes. You can find the guide [here](https://go.gov.sg/og-user-guide).

</details>

<details>

<summary>Is Ownself Gather free to use?</summary>

Yes. Ownself Gather is free to use. You can find more details in the [guide](https://dcubeux.gitbook.io/ownself-gather#is-it-free-to-use).

</details>

<details>

<summary>Who can use Ownself Gather?</summary>

Ownself Gather is available to all government officers.

|                                                                                                                           | How to sign in?                                                                                                              |
| ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| <mark style="color:blue;">gov.sg</mark> email holders                                                                     | Sign in directly using your <mark style="color:blue;">gov.sg</mark> email address.                                           |
| Non-<mark style="color:blue;">gov.sg</mark> users (TIVO, Agencies without <mark style="color:blue;">gov.sg</mark> emails) | Sign up for an account via Singpass, then request a <mark style="color:blue;">gov.sg</mark> officer to add you to their app. |

</details>

<details>

<summary>How do I log in to Ownself Gather?</summary>

Follow the instructions in the [guide](https://dcubeux.gitbook.io/ownself-gather/basic-guide/signup-login).

</details>

<details>

<summary>I cannot find the Ownself Gather option on Plumber</summary>

Submit a request using this [form](https://go.gov.sg/plumber-support) and the team will get back to you.

</details>


# Custom API

## What is Custom API?

Custom API actions facilitate the connection to an external system outside of Plumber. This is beneficial if your workflow requires interaction with an external system.

{% hint style="warning" %}
Limited support shall be provided for Custom API actions, as they are intended for advanced users.
{% endhint %}

## Getting started

The implementation might require some changes to the system receiving raw data from Plumber. Speak to the system owner or pass this guide to the relevant stakeholders to facilitate the process.

{% hint style="info" %}
If you wish to whitelist traffic from Plumber, please specify the following IP addresses

* 52.76.216.61
* 52.74.55.209
* 18.139.42.66
  {% endhint %}

## Support policy&#x20;

Please note that our team may not respond to queries about this feature as it is not currently a priority area. Whilst the feature remains available for use, users should consult their technical teams or documentation for implementation support. We are focusing our efforts on other strategic priorities and core system functionality. If you find any information lacking in this document, we are more than happy to update it to better serve your needs.

## Connecting to a system

1. Click "Connect"

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

2. Under "choose connection", click "+ Add new connection"
3. Under "Label", give a name you like for the connection. This is just for your own identification purpose.
4. Under "Headers", enter the identifying parameters for the system you're interacting with.

## Make a HTTP request

<table><thead><tr><th>Field</th><th width="334.2083740234375">Description</th><th>Required?</th></tr></thead><tbody><tr><td>Method</td><td><p>Available HTTP methods for requests:</p><ol><li>GET</li><li>DELETE</li><li>PATCH</li><li>POST</li><li>PUT</li></ol></td><td>✔️</td></tr><tr><td>URL</td><td>All URLs with a query string will be properly re-encoded. URLs from Plumber (e.g., https://plumber.gov.sg/webhooks/...) are not permitted.</td><td>✔️</td></tr><tr><td>Custom Headers</td><td>Add custom headers here.</td><td></td></tr><tr><td>Data</td><td><p>Ensure the JSON data is properly formatted. Each key-value pair should be enclosed in curly braces <code>{}</code> with key names in double quotes and values appropriately quoted or unquoted per JSON standards. Use a comma <code>,</code> to separate pairs and validate against a JSON validator to prevent syntax errors.<br><br></p><p>Example:</p><div><figure><img src="/files/MvYDjIflYnC4cZ2tmEtQ" alt=""><figcaption></figcaption></figure></div><p>How to address invalid JSON data errors:</p><ul><li>Ensure that you use <strong>"</strong>double quotes<strong>"</strong> instead of 'single quotes<strong>'</strong></li><li>Ensure that you are not using curly or fancy quotes: <strong>“</strong> <strong>”</strong></li></ul></td><td></td></tr></tbody></table>

## FAQ

<details>

<summary>Can Plumber connect to systems in the intranet space?</summary>

Plumber can access intranet systems if specific conditions are fulfilled. To enable integration, intranet systems must whitelist the Plumber IP addresses provided above. Without this whitelisting, Plumber might not be able to connect to any systems within the intranet space.

</details>

<details>

<summary>Why is my Custom API request failing with a DNS or "URL not allowed" error?</summary>

* **The URL is incorrect** - double-check the domain is spelled correctly and the endpoint exists
* **The API is on an internal network** - Plumber runs on AWS and cannot reach APIs hosted on government intranets or private networks. The API must be publicly accessible, or your IT team must whitelist Plumber's outbound IPs (listed at the top of this page)

</details>

<details>

<summary>Why is my Custom API request timing out?</summary>

**HTTP request exceeded timeout**

Plumber has a 60-second timeout for all Custom API requests. If the external API takes longer to respond, the step will fail.

Test the API endpoint directly using Postman or curl before connecting it to Plumber.&#x20;

</details>

<details>

<summary>What can I include in the 'Data' field?</summary>

The 'Data' field requires valid JSON input. Please use correct JSON formatting with key-value pairs inside curly braces { }. For more details on JSON formatting, visit [this resource](https://json.org/example.html).

{% hint style="info" %}
💡 **Tip**: You can use tools like the JSON formatter in VSCode or an online JSON validator to quickly check if your data is valid
{% endhint %}

Example:

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

How to address invalid JSON data errors:

* Ensure that you use **"**&#x64;ouble quote&#x73;**"** instead of 'single quote&#x73;**'**
* Ensure that you are not using curly or fancy quotes: **“** **”**
* Ensure that there are not trailing commas

</details>

<details>

<summary>What is meant by limited support for custom APIs?</summary>

You may use this feature, but technical knowledge is essential. Users must manage their own API configurations and troubleshooting. While we will assist with some basic issues, we won't write code or solve complex problems. Most implementation queries should be handled independently. We'll only intervene if the core system breaks; otherwise, rely on your own technical expertise or development team.

</details>

<details>

<summary>Can I use Custom API to send attachments?</summary>

The Custom API action allows you to send a JSON body, but it doesn't support file attachments.

</details>


# Toolbox

Toolbox contains a selection of useful actions, such as conditional logic, that enables you to control what actions your pipes run.

## **Available Actions**

* [If-then](#if-then) - Make your pipe run different actions depending on desired conditions
* [Only Continue If](#only-continue-if) - Stop your pipe from running if it did not receive the desired input

## If-then

{% hint style="info" %}
Do note if you have an existing pipe, "if-then" will only appear at the **last step.**
{% endhint %}

1. Select **Toolbox** as the app
2. Select **If-then** as the action event.

#### Initial Set-up

1. Once you have selected the **If-then** action, 2 branches will appear (a *branch is a set of actions that you want your pipe to run when certain conditions are met):*<br>

   <figure><img src="/files/oN70HEMqrrhrE0jF1f39" alt=""><figcaption><p>Default If-then branches</p></figcaption></figure>
2. Click on one of the branches. A window will appear where you can configure your desired condition, as well as actions to take if the condition is met:\
   \
   You can give your branch an unique name to avoid any confusion under "Branch Name"

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

#### Configuring your condition

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

1. In the "*Field*" input box, select the variable that you want to check.
2. In the "*Is or Is Not*" and "*Condition*" input boxes, configure the logical rule you want to apply.
3. Finally, in the "*Value*" field, input the value that you want to compare the variable against.
4. You can also click the "*And*" button to add more logical rules.

#### Test condition

1. Click **Test Step**.
2. If the test data **has met** the conditions, you’ll see a confirmation that the Pipe would **have continued**. <br>

   <figure><img src="/files/cmohzSKHygvl2nJUndvS" alt=""><figcaption></figcaption></figure>
3. If the test data **has not met** the conditions, you’ll see a confirmation that the Pipe would **not have continued**. This doesn't stop you from building your pipe. <br>

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

#### Adding actions

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

1. Verify that you are in the desired branch's window. The background should be pink and you should see "back to pipe" in the top left corner.
2. You can add actions by clicking the "+" button in between steps.

## Only Continue If

#### Initial Set-up

1. Select **Toolbox** as the app.
2. Select **Only continue if...** as the action event.

**Set up action**

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

1. In the "*Field*" input box, select the variable that you want to check.
2. In the "*Is or Is Not*" and "*Condition*" input boxes, configure the logical rule you want to apply.
3. Finally, in the "*Value*" field, input the value that you want to compare the variable against.
4. You can also click the "*And*" button to add more logical rules.

**Test action**

1. Click **Test step**.
2. If the test data **has met** the conditions, you’ll see a confirmation that the Pipe would **have continued**. \
   ![](/files/hIVaHS5yycmxHFnjuOTp)\
   \
   If the test data **has not met** the conditions, you’ll see a confirmation that the Pipe would **not have continued**. \
   ![](/files/rE1JvM1XdsBUrTkqPXHm)<br>

## Supported comparisons for data types

### All types

1. Equals to
2. Empty

### Text&#x20;

1. Contains

### Number&#x20;

1. Less than
2. Less than or equals to
3. Greater than
4. Greater than or equals to

### Date

1. Before
2. After

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

Supported date/time formats:

<pre><code><strong>30/12/24 
</strong>30/12/2024 
30 Dec 2024
30 December 2024
2024/12/30
30 Dec 2024 13:30 PM 
30 Dec 2024 13:30:59 PM 
</code></pre>


# Calculator

Use Calculator to perform math operations on numbers in your pipe. No connection is required.

### Perform a calculation

Use this action to add, subtract, multiply, or divide two numbers.

| Field                     | Description                                | Required? |
| ------------------------- | ------------------------------------------ | --------- |
| Number to transform       | The first number in your calculation.      | ✔️        |
| Math operation to perform | Select Add, Subtract, Multiply, or Divide. | ✔️        |
| Value                     | The second number in your calculation.     | ✔️        |

The output is stored as **Result**, which you can use in later steps.

### Round number

Use this action to round a number to a set number of decimal places.

| Field           | Description                                                                                                                          | Required? |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------- |
| Number to round | The number you want to round.                                                                                                        | ✔️        |
| Rounding        | Select Round Down (always rounds towards zero), Round Up (always rounds away from zero), or Round Off (rounds to the nearest value). | ✔️        |
| Decimal places  | The number of decimal places to round to. Enter a whole number.                                                                      | ✔️        |

The output is stored as **Result**, which you can use in later steps.

### Common errors

<details>

<summary>Ensure that you have entered valid numbers</summary>

This error occurs when a field receives a value that isn't a number, for example a text string or an empty variable.

Check that all fields contain numeric values. If you're using a variable, make sure the step it comes from is returning a number.

</details>


# Executions page

This page will guide you on how to interpret the status and information on the executions page.

There are 3 statuses in the executions page

1. Success
2. Failure
3. Waiting

## Success

This means that the pipe that has been successfully ran.&#x20;

## Failure

This indicates that the pipe has failed due to several reasons.&#x20;

1. You may click on the failed pipe to further investigate.

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

2. Look for an exclamation mark (as shown below), and click on "Error" to better understand what had happened.

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

3. Click on the "Error" tab
4. Click on "View error details below", refer to the message, and try to troubleshoot from there. If the error message was not helpful, you may write to go.gov.sg/plumber-support along with the screenshot of the error.

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

## Waiting

This means that your pipe might have apps that do not execute immediately. Most likely, there are either the "scheduler" or "delay" apps in your workflow.

## FAQ

**My pipe shows that an email was sent out successfully, but my recipient did not receive it. Why is this happening?**

There could be several reasons:

1. Large attachment(s) in the email: The SG mail server will drop emails with attachments larger than 7 MB.
2. Intranet environment: The email addresses may be intended for internal use only within the intranet environment, making them unable to receive emails sent out by Plumber. This situation will not cause Plumber's execution page to show the pipe as "Failure."
3. Invalid email address: If you're collecting the email address from FormSG, ensure that email verification is enabled.

**Why does my recipient address get blacklisted on Plumber?**

There could be several reasons why email addresses get blacklisted. For instance, the recipient may have left the organization and rejoined. You may contact us at Plumber Support for assistance with this.

**The Plumber team has rectified my issue, what do I do now?**

You may click on the "Retry" button and monitor if the pipe succeeds or not. If it still doesn't succeed, please let the Plumber team know about it.


# Pipe settings

This page can be found within each pipe. To access this page, enter your pipe and click on the Gear icon on the top right corner of the page.

<details>

<summary>Collaborators</summary>

### Adding a collaborator

You can add existing Plumber users as an **Editor** or **Viewer** to your Pipe.&#x20;

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

<table><thead><tr><th width="323.87890625"></th><th>Editor</th><th>Viewer</th></tr></thead><tbody><tr><td>View Pipe</td><td>✔️</td><td>✔️</td></tr><tr><td>Modify Pipe</td><td>✔️</td><td></td></tr><tr><td>Publish / unpublish Pipe</td><td>✔️</td><td></td></tr><tr><td>View Executions</td><td>✔️</td><td>✔️</td></tr><tr><td>Retry failed Executions</td><td>✔️</td><td></td></tr><tr><td>Modify collaborators</td><td>✔️</td><td></td></tr><tr><td>Select connections already added in the pipe</td><td>✔️</td><td></td></tr><tr><td>Add / select new connections</td><td>Coming soon!</td><td></td></tr></tbody></table>

#### Connections-related information

<table><thead><tr><th width="193.49609375">App</th><th>Description</th></tr></thead><tbody><tr><td>ALL</td><td>Editors are only able to use existing connections added by the owner.</td></tr><tr><td>FormSG</td><td>Collaborators will not be able to verify this connection unless the form is shared with them. This is optional as the pipe will still work normally.</td></tr><tr><td>Tiles</td><td>Pipe collaborators are automatically added as collaborators to Tiles used in the pipe.</td></tr><tr><td>Excel</td><td>Collaborators will not be able to access the Excel file unless explicitly shared with them.</td></tr></tbody></table>

</details>

<details>

<summary>Transfer Pipe</summary>

### Step 1: Making the transfer

1. Enter the email address you wish to transfer the pipe to. (**They'll have to login at least once for this feature to work.)**
2. Click on "Transfer Pipe".
3. Click on "Yes, transfer pipe" if the email address has been entered correctly.
4. A message indicating the pipe has been transferred will be shown (screenshot below).

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

Your pipe is now pending transfer. Get your colleague to double check the pipe connections and actions.

* You will need to **manually pass over the permissions and credentials** for each connection involved e.g. **FormSG** would involve you handing ownership or editor rights of the form to the receiving user and passing of the secret key as well. **M365 excel** will require the receiving user to be granted the right permissions and access to the file involved.
* If you accidentally made a transfer request to the wrong user, you can click on "cancel" to retract it.
* The process is only completed once your colleague accepts the pipe transfer on their account.

### Step 2: Accepting a Pipe transfer

1. Receiving user will need to login to [Plumber](https://plumber.gov.sg/) and accept the transfer.
2. A prompt will appear on the receiver's account as seen in the screenshot below.<br>

   <figure><img src="/files/Wd2QUhdmuxjSLbrnnYqr" alt=""><figcaption></figcaption></figure>
3. Click on "View and accept".
4. You'll be brought to another page to accept or reject the trasnfer.
5. Ensure that you reconnect all connections and check all steps in the pipe to ensure that everything works well. If there are no connections involved, you should be able to immediately publish the pipe and it will still work as intended.

</details>

<details>

<summary>Email notifications</summary>

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

This is where you customise the frequency of receiving error notifications from us. Choose from these options:

| Option                                                   |                                                                                                                                                                |
| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| First error on this pipe, one email notification per day | When the first error on your pipe for that day is detected, we send an email to you. No emails will be sent for subsequent errors that happen on the same day. |
| Each error on this pipe                                  | Whenever there is an error, we send an email to you. For e.g. 100 errors = 100 emails                                                                          |

When the Pipe has been shared with collaborators, you can choose to notify them of any errors by selecting the relevant checkboxes:

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

</details>


# FAQ

A bunch of frequently asked questions arranged according to topic.

<details>

<summary>Getting Started</summary>

#### **Q: What apps does Plumber integrate with?**

A: For the most up-to-date list of integrations, log into Plumber and browse the available connectors when creating a new pipe. You can also view them in the [guide](https://guide.plumber.gov.sg/user-guides/actions).

#### **Q: How do I get the latest announcements from Plumber?**

A: Simply log into Plumber at least once - we send announcements to everyone in our database.

\
**Q: What's the difference between Power Automate and Plumber?**

| Developer        | Microsoft                                                      | Open Government Products (OGP)                                  |
| ---------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
| Main Advantage   | Microsoft ecosystem integration                                | OGP products integration                                        |
| Key Integrations | Excel, SharePoint, Teams, Outlook, OneDrive                    | FormSG, LetterSG, Email by Postman, Tiles                       |
| Best For         | Microsoft-centric workflows                                    | Singapore Government workflows with OGP tools                   |
| Use Cases        | Connect Excel with SharePoint lists, automate Office 365 tasks | Automate form submissions, generate letters, send notifications |

</details>

<details>

<summary>Collaboration &#x26; Access</summary>

#### Q: Can I share my pipe with colleagues like FormSG collaborator mode?

A: Yes. Check out [Pipe settings](/user-guides/pipe-settings#collaborators) section for more info.

#### Q: Can I use a group email (e.g. <team@agency.gov.sg>) to access Plumber?

A: Yes. If you're unable to receive emails from Plumber, contact your ITD as your group email might not be configured to receive emails from external providers.

#### Q: Will I be notified if a CC recipient is blacklisted?

A: Not currently. Postman does not check for blacklisted addresses in the CC field, so if a CC recipient is blacklisted, the email will still be sent to other recipients and you won't receive a notification about it.

We're working on a fix for this. Expected by end of Q3 or start of Q4 2026.

</details>

<details>

<summary>Pipe Management</summary>

#### Q: I disabled my pipe. Will it stop steps that are already running?

A: No. Disabling a pipe only prevents new submissions from triggering it. Any steps already in progress will continue until they complete.

If you need to stop a running execution immediately, you'll need to delete the pipe. Note that this removes the pipe configuration as well.

#### Q: Can I use a group email (e.g. <team@agency.gov.sg>) to access Plumber?

A: Yes. If you're unable to receive emails from Plumber, contact your ITD as your group email might not be configured to receive emails from external providers.

#### **Q: My pipe isn't triggering. What should I check?**

A: Run through this checklist:

1. **FormSG webhook** - is the webhook URL correctly pasted into your FormSG form settings?
2. **Pipe status** - is the pipe published and active?
3. **Scheduler time** - if using a Scheduler trigger, double-check the time and day settings
4. **Connected apps** - do you still have access to all connected apps (FormSG, Postman, Excel)?
5. **Previous step failure** - check your pipe's execution history. If an earlier step failed, subsequent steps won't run

#### Q: My if-then or "only continue if" condition isn't working as expected. What should I check?

A: A few common causes:

1. **Date comparisons** - use the Formatter to standardise dates to YYYY/MM/DD first, then compare as text
2. **Extra spaces** - text comparisons are exact and case-sensitive. A trailing space or different capitalisation will cause a mismatch.
3. **Data type mismatch** - make sure you're comparing the right types (text vs number)
4. **Empty values** - check if the field might be empty for some submissions. Empty values behave differently across conditions

Use "Check step" in Plumber to test your conditions with sample data before publishing.

If none of these help, send us your pipe name and a screenshot of the execution history at <https://go.gov.sg/plumber-support>.

</details>

<details>

<summary>Data Classification &#x26; Security</summary>

**Q: What is the data classification for Plumber?**

A: Plumber is cleared for Confidential (Cloud-Eligible) and Sensitive (High).

Note: individual actions may have their own limits. For example, PAIR is only cleared for Restricted and Sensitive (Normal).

</details>

<details>

<summary>FormSG Integration</summary>

#### Q: What types of forms can be integrated with Plumber?

A: Plumber supports FormSG Storage Mode forms and Multi-Respondent Forms (MRF). You can connect either type as a trigger for your pipe.

#### Q: Can I connect multiple forms to a single pipe?

A: No, you can only connect one form to one pipe.

#### Q: Can Plumber extract data from an attached Excel file submitted via FormSG?

A: No, Plumber does not read or process files submitted via FormSG.

#### Q: I've added new fields to my form, but they're not showing up when I test my pipe. What's going on?

A: Go to your pipe, go to Form action, re-trigger "check step" to pull the new fields. Then re-check all the actions to use the new fields in your automation.

#### Q: How does "Check step" work in Plumber?

A: We generate fake data to simulate actual submission. You may use the fake data to continue with building the pipe.

#### Q: How can I better handle Table responses when using Plumber?

A: There are two methods to handle table responses:

Method 1: Fixed Method (Recommended for most users)

This method handles up to 5 maximum rows consistently. Always set a maximum number of rows in your form. This allows you to configure the automation for the highest possible number of rows. If a submission has fewer rows than the maximum, the automation will still function correctly.

For example, if your form's table allows 5 rows:

* Set up your pipe with all 5 rows filled by doing a test form submission with all 5 rows completed
* Go to your pipe's Form action and re-trigger "check step" to pull the new fields
* Re-check all actions to use the new fields in your automation

Method 2: Dynamic Method

This method uses the for-each action and works well with the Tile action. It accepts any number of rows and populates Tiles accordingly. For example, if a respondent submits 3 rows, it will create 3 separate tiles with duplicate responses (except for the table data). Note: If you use for-each with table responses followed by an email action, you'll send multiple emails based on the number of table rows.

Which method should I choose?

Since these methods can be confusing to understand from reading alone, we recommend trying both to see which works better for your use case. For simplicity, use Method 1. However, if you need to handle an unknown, dynamic number of table rows, use Method 2.

Data Storage: Tiles vs M365 Excel

Q: What is the difference between Tiles and M365 Excel?

A: Tiles is a feature built into Plumber, whilst M365 Excel is a separate Microsoft application that Plumber can integrate with. Both can store data for your automations, but they serve different purposes depending on your needs.

| Feature          | Tiles                                                  | M365 Excel                                                               |
| ---------------- | ------------------------------------------------------ | ------------------------------------------------------------------------ |
| Built by         | Plumber (OGP)                                          | Microsoft                                                                |
| Availability     | All Plumber users                                      | .gov.sg users only                                                       |
| Primary function | Basic data storage and retrieval                       | Advanced data processing and analysis                                    |
| Capabilities     | Store information, allow automation to read table data | Formulas, computations, dashboards, pivot tables, conditional formatting |
| Response speed   | Faster responses                                       | Slower due to government-wide queuing mechanism                          |
| Best for         | Pure data storage, time-sensitive multi-user access    | Complex calculations, data analysis, reporting                           |
| Collaboration    | Multiple users can view data quickly                   | Advanced sharing and collaboration features                              |

**When to use Tiles:** If your use case is purely storing data or you need multiple users to view data in a time-sensitive manner.

**When to use M365 Excel:** If you require computations, formulas, dashboards, or advanced data analysis features.<br>

</details>

<details>

<summary>M365 Excel Issues</summary>

#### Q: How come I do not have access to M365 Excel integration?

A: This restriction is in place because the ".gov.sg" email domains share the same system on SG SharePoint, which is the only system integrated with the product. The other domains reside on a separate SharePoint system to which the product does not have access.

#### Q: Why am I not able to find the Microsoft 365 folder created by Plumber?

A: First, check whether you're able to locate the folder by accessing this link: <https://gccprod-my.sharepoint.com/gccprod-my.sharepoint.com>

If you're able to access the link but still unable to locate the folder, please try these troubleshooting steps:

1. Login to Plumber.gov.sg
2. Open My Apps on the left → M365 Excel → Delete "SG Govt SharePoint" connection
3. Open OneDrive in your GSIB → Shared → Refresh page
4. You should now be able to see a folder named after your email address

#### Q: I'm from a healthcare institution. Why can't I access M365 Excel?

A: M365 Excel in Plumber connects to SG Govt SharePoint (gccprod-my.sharepoint.com), which is not accessible to healthcare cluster institutions (SingHealth, SGH, NHG, NUHS).

Use Tiles instead for data storage. It's built into Plumber and has no access restrictions.

#### Q: I'm from a school. Why can't I access M365 Excel?

A: M365 Excel is not yet available for @schools.gov.sg accounts. We're working on it.

In the meantime, use Tiles for data storage.

#### Q: Can I transfer my Plumber Excel folder to another account?

A: No. The Plumber Excel folder is tied to the account that created it and can't be moved or transferred.

If you need a different account to own the workflow, reconnect M365 Excel under that account. Plumber will create a new dedicated folder for it.

</details>

<details>

<summary>Tiles </summary>

#### Q: Can I restrict what different users see in a Tile?

A: No. Tiles doesn't support filtered or role-based views. Anyone with access to a Tile can see all the data in it.

If you need data isolation (for example, each school seeing only their own submissions), create a separate Tile for each group and share only the relevant link with each group.

#### Q: Can I use Tiles to trigger automated reminders or checks?

A: Yes. Tiles has a native "Read from Tiles" action, so your pipe can pull data directly from a Tile. A common pattern is:

Scheduler → Read from Tiles → For Each → action (e.g. Email by Postman)

This lets you run automated checks or reminders based on data in your Tile, without needing a form submission to trigger the pipe. If you need to filter rows before acting on them, add an "Only continue if" step inside the For Each loop.

</details>

<details>

<summary>Email &#x26; Attachments</summary>

#### Q: Can I change the email address that Plumber uses to send emails?

A: No, Plumber uses a fixed system email address (<info@plumber.gov.sg>) for all outgoing emails. This cannot be modified by users.

#### Q: Can I send attachments to SharePoint folders, Excel files, Tiles, or custom APIs?

A: No, attachments can only be forwarded through email by Postman.

#### Q: Why do some email addresses get blacklisted?

A: There could be several reasons why email addresses get blacklisted. For instance, the recipient may have left the organisation and rejoined, or the recipient may have unsubscribed to emails sent out by Postman. You may contact us at Plumber Support for assistance with this.

<br>

</details>

<details>

<summary>Current Limitations</summary>

#### Q: Are there OR functions in if-then conditions?

A: We don't have OR functions, so you will have to build the if-then conditions accordingly.

#### Q: Can Plumber generate calendar invites?

A: No. Plumber doesn't support calendar invites. CalSG is also not integrated and it's currently in maintenance mode with no integration planned.

#### Q: Is there any integration with any AI product?

A: Yes. Plumber has a PAIR action that lets you send text and files to an AI model as part of your pipe. PAIR supports images (PNG, JPG) and PDFs. For details, see the [PAIR guide](https://guide.plumber.gov.sg/user-guides/actions/pair).

#### Q: Can I use the Scheduler to monitor if a system or API is down?

A: No. The Scheduler is designed for workflow automation, not uptime or health monitoring. It only supports hourly intervals at its most frequent, and it doesn't have the alerting reliability that monitoring requires.

For monitoring, use a dedicated tool like Datadog or Better Uptime instead.

#### **Q: Can I schedule a pipe to run every 15 minutes, or once a quarter?**

A: Plumber doesn't have native sub-hourly, quarterly, or yearly frequencies. The most frequent option is **every hour**.

For quarterly runs, you can use a monthly Scheduler combined with an "Only continue if" step that checks whether the current month is 3, 6, 9, or 12. It's a workaround, but it works. We'll add a step-by-step guide to the Scheduler page.

#### Q: Can Plumber integrate with CalSG?

A: No. CalSG is currently in maintenance mode and there are no plans to integrate it with Plumber as of now.&#x20;

If you need to send automated reminders based on CalSG bookings, here's a workaround:

1. Export your CalSG bookings manually
2. Upload them to a Tile
3. Build a pipe using Scheduler → Read from Tiles → For Each → Email by Postman

Let us know more about your use case and we can help you set this up.

#### Q: Can Plumber integrate with AIBots?

A: AIBots is a GovTech product currently going into maintenance mode. We'd recommend using PAIR instead, which is Plumber's built-in AI action.

PAIR lets you send text prompts and extract information from images or PDFs as part of your pipe. If you'd like to be whitelisted for PAIR beta, let us know.

**Need More Help?**

Have questions not answered here? Reach out to us at <https://go.gov.sg/plumber-support><br>

</details>

<details>

<summary>Plumber specifications</summary>

#### **Q: Where does Plumber reside?**

A: Plumber resides on GCC (OGP).

#### **Q: Who can view the data and pipes?**&#x20;

A: Data and pipes can be viewed by:

* Users you explicitly grant access to
* The Plumber team for troubleshooting purposes

#### **Q: What are the access controls for Plumber?**&#x20;

A: Access is controlled through user permissions. You determine who can view or edit your pipes and associated data. The Plumber team maintains access solely for technical support and troubleshooting when needed.

#### **Q: Where can I find Plumber's GitHub repository?**&#x20;

A: You can find Plumber's GitHub repository at: <https://github.com/opengovsg/plumber>

</details>


# Contact us

| Plumber support | <https://go.gov.sg/plumber-support> |
| --------------- | ----------------------------------- |


# Postman Email Scheduled Maintenance

{% hint style="warning" %}
Postman Email will undergo scheduled maintenance on **30 April 2026, 12am–2am SGT.**
{% endhint %}

During this window:

* Emails from your pipes will paused.
* Test Steps for email actions will be unavailable.
* **Login OTP emails will not be sent**. Only Singpass login will be available. If you need to log in during this period, please log in beforehand. Your session will remain active for 72 hours from login.

Your pipes will continue running as normal, and all emails will automatically be sent out after the maintenance. No other action is required on your part. We will send a follow-up email once the maintenance is complete.

If you have any questions, please reach us at <support@plumber.gov.sg>.


# Terms of Use

## 1. **General**

1.1. These Terms of Use govern your access to and use of our services, including the application (whether as software or as a website or otherwise), its contents (including APIs, if any), push notifications and all other accompanying materials as identified in the Schedule below (collectively, the "**Service**”).

1.2. This Service is provided to you by the Government Technology Agency ("**GovTech**"). GovTech’s office is located at 10 Pasir Panjang Road, #10-01, Mapletree Business City, Singapore 117438.

1.3. By accessing or using any part of this Service, you unconditionally agree and accept to be legally bound by these Terms of Use and any amendments thereto from time to time. **GovTech reserves the right to amend these Terms of Use at its sole discretion and at any time, with or without notice to you.** **Please read the Terms of Use carefully each time you access or use any part of this Service as (without prejudice to any other means your agreement to the Terms of Use as amended may manifest) such access or use shall constitute your agreement to the Terms of Use and any amendments to it.** **Your failure to do so shall not prejudice the effect or enforceability of the Terms of Use or any amendments thereto.** GovTech may, at its sole discretion and without prejudice to its other rights under this Clause 1.3, also amend these Terms of Use by providing you with notice effective immediately or such other time designated by GovTech, and such notice may be provided by any means GovTech deems appropriate (for example, by posting the notice through the Service, any website related to the Service, or by email).

1.4. **If you do not agree to these Terms of Use, please do not use this Service or any part of this Service.**

1.5. If you are accessing or using the Service for and on behalf of another entity (such as your employer), you warrant and represent that you have the necessary authority to bind such entity to these Terms of Use.

## **2.** **Nature of this Service**

Please see the Schedule for more information and terms concerning this Service.

## **3.** **Licence Terms and Restrictions**

3.1. The Service, including the materials made available on or through the Service, is owned by, licensed to, managed or controlled by GovTech. Please see clause 4 (Third Party Materials) for more information.

3.2. Subject to these Terms of Use, GovTech grants to you a non-exclusive, revocable, and non-transferable right to access and use the Service for personal or internal purposes only, and only for such use permitted by the functions of the Service and intended by GovTech.

3.2A You shall not, and shall not authorise or permit any third party to:

3.2A.1 bypass or circumvent any technical restrictions or digital protection measures in the Service or attempt to circumvent any such restrictions;

3.2A.2. reverse engineer, decompile, disassemble, modify, translate, adapt or create derivative works of the Service (whether in relation to its source code, object code, underlying structure, ideas, algorithms or otherwise);

3.2A.3. reproduce, publish, distribute, transfer, publicly display, resell, rent, lease, or sublicense the Service, or loan, lend, pledge, assign, or otherwise encumber the Service to or in favour of any third party;

3.2A.4. remove or obscure the copyright, trademark and other proprietary notices contained on or in the Service;

3.2A.5. use the Service in any manner that is contrary to any applicable laws or regulations or rights of third parties (however arising and of whatever nature), or in a manner that constitutes harmful, fraudulent, or obscene activity;

3.2A.6. make the Service available in or through a network, file-sharing service, service bureau or any similar timesharing arrangement or as a managed service provider;

3.2A.7. perform any benchmarking tests or analyses of the Service;

3.2A.8. use the Service to create anything that would compete with the Service;

3.2A.9. transfer, assign or permit the sharing of license keys to or with a third party;

3.2A.10. use the Service to process or permit to be processed any code of a third party;

3.2A.11. provide third party access to the Service; or.

3.2A.12. export the Service in violation of any international sanctions or laws applicable to US entities.

3.2B All express or implied rights to the Service not specifically granted herein are expressly reserved to GovTech.

3.3. GovTech reserves the right to:

3.3.1. Update or modify this Service from time to time;

3.3.2. Deny or restrict access to or use of the Service by any particular person without ascribing any reasons whatsoever; and

3.3.3. Discontinue or terminate this Service at any time without notice or liability to you whatsoever, whereupon all rights granted to you hereunder shall also terminate forthwith. You shall further upon notice from GovTech return or destroy all copies of the Service or materials therein that you may have been provided with.

3.4. You will not interfere or attempt to interfere with the proper working of the Service or otherwise do anything that imposes an unreasonable or disproportionately large load on GovTech’s servers.

3.5. You shall comply with all set-up procedures and requirements, as well as all policies, guidelines, rules, notices and instructions relating to the Service as may be issued by and/or amended by GovTech from time to time.

### **3A. Account Access and Security**

3A.1 You are solely responsible for maintaining the confidentiality and security of any authentication credentials associated with your use of the Service, including the security of any of your devices which store the authentication credentials.

3A.2 GovTech shall be entitled, but not obliged, to verify the identity of the person using the Service. Without prejudice to the foregoing, GovTech is not under any duty to verify that any biometric identifier used with the Service, or on your device, belongs to you.

3A.3 GovTech shall have the sole and absolute discretion to invalidate any authentication credentials at any time, or require you to have to re-authenticate or refresh your authentication credentials at any time, without having to give any reason for the same.

3A.4 GovTech shall be entitled, but not obliged, to act upon or rely on any instructions, information, transmissions of data, or communications received from the account or use of the Service in relation to your authentication credentials, as if such instructions, information, data or communications were issued by you, whether or not the same was authorized by you.

3A.5 For the avoidance of doubt, you are solely responsible for any loss of whatever nature arising from unauthorized or unofficial modifications made to your device which permit or escalate privileged access, or remove restrictions to such access, which are not intended by the manufacturer or provider of your device or operating system of your device (e.g., “rooting” or “jailbreaking” your mobile phone).

## **4.** **Third Party Materials**

4.1. The Service may require, enable or facilitate access to or use of software or services of a third party (“**Third Party**”). In such an event, there may be terms of use of the third party software or service (the “**Third Party Terms**”). GovTech may be required under or as a result of the Third Party Terms to notify you of certain terms that apply to you (either directly as an end user, or as a party whose acts or omissions could cause GovTech to breach the Third Party Terms) when you use the Services. An example of Third Party Terms may be open source software terms or standard form terms of the distribution platform from which you obtain any part of the Service (e.g. Google Play Store or Apple App Store terms) which bind GovTech as a developer or user of the distribution platform (the “**Distribution Terms**”). Information on the Third Party Terms are embedded in the Service, already accounted for in these Terms of Use, publicly available (e.g the Distribution Terms) or otherwise indicated in the Schedule herein. For the avoidance of doubt, insofar as this Clause 4 relates to the Distribution Terms, the relevant Distribution Terms are the terms of the specific platform from which you obtained a copy of the software or application that is part of the Service. For example, if you obtained the said copy from the Google Play Store, then the relevant terms are Google’s Distribution Terms.

4.2. **It is your responsibility to check and read the most up-to-date versions of these Third Party Terms and you are deemed to have notice of the same**. In particular, you are deemed to have notice of the Third Party Terms that GovTech (under the Third Party Terms) is required to notify you, and you unconditionally agree to be bound by all the obligations in the Third Party Terms which are applicable to you (whether as end user, or as a party whose acts or omissions could cause GovTech to breach the Third Party Terms, or otherwise). For the avoidance of doubt, where Third Party Terms are listed, such Third Party Terms shall be deemed to include any privacy policies and acceptable use policies as are applicable to you.

4.3. If the Third Party Terms require you to enter into an agreement directly with the Third Party, then you unconditionally agree to enter into such agreement, and in any event, to be legally bound by the Third Party Terms. For the avoidance of doubt:

4.3.1. Some Third Party Terms (particularly open-source terms) permit either a direct licence to you from the Third Party or a sublicence from GovTech to you. In such cases, your licence is a direct licence from the Third Party to you; and

4.3.2. the terms of your agreement with the Third Party will govern your use of the relevant third party software or service, and not these Terms of Use.

4.4. If the Third Party Terms expressly or impliedly require GovTech to incorporate certain terms in these Terms of Use (inclusive of terms which impose any minimum or maximum standards herein, and/or terms described in Clause 4.5 below), such terms are deemed to have been so incorporated (the “**Incorporated Terms**”). Examples of Incorporated Terms include provisions which require GovTech to give you notice of certain rights and liabilities or require GovTech to ensure that you acknowledge certain matters. Similarly, if the Third Party Terms expressly or impliedly require these Terms of Use to be altered such that the Third Party Terms are complied with, the parties herein agree that the Terms of Use shall be deemed to be so altered but only to the extent necessary for compliance.

4.5. Some Third Party Terms grant the Third Party, or require GovTech to grant the Third Party, direct rights of enforcement of these Terms of Use as a third party beneficiary, against you. Such Third Party Terms are deemed to have been incorporated into these Terms of Use as Incorporated Terms, and you hereby agree to grant such Third Party, such direct rights of enforcement against you.

4.5A Unless the applicable Third Party Terms permit you to commence legal proceedings against the relevant Third Party, you shall not threaten or commence legal proceedings against a Third Party without GovTech’s prior written approval.

4.6. For the avoidance of doubt, without prejudice to Clause 4.4, to the extent of any inconsistency between these Terms of Use and the Third Party Terms, the latter shall prevail provided nothing in the Third Party Terms increases the liability of GovTech beyond that stated in Clause 6.

4.7. Without prejudice and in addition to the foregoing, GovTech shall not be responsible for your use of any software or service of a Third Party.

## **5.** **Your Consent to Your Data and to Access Functions of Your Device**

5.1. You hereby grant to GovTech a non-exclusive, worldwide, perpetual and royalty-free right to collect, use, disclose, process, modify, adapt, create derivative works of, reproduce, and sublicense any and all information or data submitted, uploaded or shared by you to the extent necessary to provide the Service or for any other purpose expressly or impliedly provided in these Terms of Use, or as permitted by law.

5.2. Use of the Service may require you to allow access by the Service to certain functions of your device, such as push notifications, the obtaining and/or sharing of your location, or the collection of data from you in connection with the Service. Your use of the Service shall constitute your consent to the access by the Service of such functions of your device as may be reasonably required by the Service.

5.3. You further irrevocably and unconditionally waive, and shall cause to be irrevocably and unconditionally waived, all existing and future moral rights (including the right of identification) wherever in the world in respect of any information or data submitted, uploaded or shared by you (including feedback, requests or suggestions concerning the Services) to GovTech. Such waiver shall also extend to GovTech’s licencees, assigns and successors-in-title.

5.4. Please also see clause &#x38;**.** (Privacy Statement).

### **5A. Ownership of Feedback/Requests/Suggestions**

You agree that all title and interest in any feedback, requests or suggestions from you concerning the Services provided to GovTech shall be owned by GovTech and, without prejudice and in addition to clause 5.3, you shall waive all rights existing in or in respect of the same (including, for the avoidance of doubt, any signature requirements).

### **5B. Confidentiality**

5B.1 If you receive information or data (in whatever form) from GovTech or a Third Party which is designated confidential or proprietary or is otherwise reasonably understood to be confidential or proprietary (collectively, “**Confidential Information**”), you shall not use, disclose or reproduce the Confidential Information except for the purpose for which it was provided to you. If consent to disclose the Confidential Information to a third party is given by GovTech or the Third Party to you, any act or omission in respect of the Confidential Information by that person shall be deemed to be your act or omission and you agree to be fully liable for the same. In all cases, you shall protect the Confidential Information to the same extent you protect your own confidential information but in no event less than a reasonable standard of care. You shall ensure that any recipients are bound by confidentiality terms at least as restrictive as this Clause.

5B.2 You shall destroy any Confidential Information immediately upon request by GovTech or the Third Party.

5B.3 In the event:

5B.3.1 you are, or likely to be, required by an order of court to disclose Confidential Information; or

5B.3.2 you have reasonable grounds to suspect the unauthorised use or disclosure or reproduction of Confidential Information;

you shall immediately notify GovTech or the Third Party of the same and cooperate with GovTech or the Third Party to prevent or limit such disclosure.

5B.4 Nothing in this Clause 5B shall prejudice GovTech’s or the Third Party’s other rights at law.

## **6.** **Disclaimers and Indemnity**

6.1. **The Service is provided on an "as is" and “as available” basis without warranties of any kind. To the fullest extent permitted by law, GovTech does not make any representations or warranties of any kind whatsoever in relation to the Service or its output and hereby disclaims all express, implied and/or statutory warranties of any kind to you or any third party, whether arising from usage or custom or trade or by operation of law or otherwise, including but not limited to any representations or warranties:**

**6.1.1.** **as to the accuracy, completeness, correctness, currency, timeliness, reliability, availability, interoperability, security, non-infringement, title, merchantability, quality or fitness for any particular purpose of the Service or its output; and/or**

**6.1.2.** **that the Service or its output or any functions associated therewith will be uninterrupted or error-free, or that defects will be corrected or that this Service, its output, website and the server are and will be free of all viruses and/or other malicious, destructive or corrupting code, programme or macro.**

6.2. **GovTech shall also not be liable to you or any third party for any damage or loss of any kind whatsoever and howsoever caused, including but not limited to any direct or indirect, special or consequential damages, loss of income, revenue or profits, lost or damaged data, or damage to your computer, software or any other property, whether or not arising directly or indirectly from –**

**6.2.1.** **your access to or use of this Service or its output, or any part thereof;**

**6.2.2.** **any loss of access or use of this Service or any part of this Service or its output, howsoever caused;**

**6.2.3.** **any inaccuracy or incompleteness in, or errors or omissions in the transmission of, the Service or its output;**

**6.2.4.** **any delay or interruption in the transmission of the Service or its output, whether caused by delay or interruption in transmission over the internet or otherwise; or**

**6.2.5.** **any decision made or action taken by you or any third party in reliance upon the Service or its output,regardless of whether GovTech has been advised of the possibility of such damage or loss.**

6.3. **Without prejudice and in addition to the foregoing, insofar as the Service facilitates or requires the provision, use or functioning of, or is provided in conjunction with, other products, software, materials and/or services not provided by GovTech, GovTech makes no representation or warranty in relation to such products, software, materials and/or services (including without limitation any representation or warranties as to timeliness, reliability, availability, interoperability, quality, fitness for purpose, non-infringement, suitability or accuracy).**

6.4. You shall not rely on any part of the Service or its output to claim or assert any form of legitimate expectation against GovTech, whether or not arising out of or in connection with GovTech’s roles and functions as a public authority. GovTech shall have no responsibility or liability to you or any third party arising out of or in connection with any fraud, phishing, or any other illegal act or omission by other parties in relation to the Service and it is your own responsibility to ensure that the Service you are using or accessing is from a legitimate source.

6.5. **You agree to defend and indemnify and keep GovTech and its officers, employees, agents and contractors harmless against all liabilities, losses, damages, costs or expenses (including legal costs on an indemnity basis) howsoever arising out of or in connection with your access or use of the Service (including third party software or services) or its output or your non-compliance with the Terms of Use, Third Party Terms or Incorporated Terms, whether or not you had been advised or informed of the nature or extent of such liabilities, losses, damages, costs or expenses. You warrant and represent that your access or use of the Service and its output does not and will not breach or violate any laws, regulations, trade, economic and/or export sanctions (wherever in the world) applicable to you, and that you shall not transmit any malicious code, illegal, infringing or undesirable content or materials to GovTech or its agents or any Third Party.**

6.6. GovTech shall have the right to take any and all necessary actions/omissions to protect its interests, including complying with any legal requirements (such as taking down, disabling and disabling access to, removing (permanently or temporarily), and/or restoring (including restoring access to) any materials contained in, accessed through, uploaded to, and/or made available via the Service in response to any take-down or restoration notices). You agree that GovTech is not obliged to determine the merits of any take-down or restoration notices. You further waive any rights arising as a result of the actions/omissions taken by GovTech.

6.7. Without prejudice and in addition to GovTech’s other rights:

6.7.1. in no event shall GovTech’s total cumulative liability arising out of or in connection with these Terms of Use to you exceed the amount of fees or payment received by GovTech (and not paid or given to any Third Party by GovTech) from you for the Service in the 12 months preceding the date of the first cause of action; and

6.7.2. no action may be brought by you against GovTech arising out of or in connection with these Terms of Use more than one (1) year after the cause of action arose.

## **7.** **Hyperlinks**

7.1. Insofar as the Service provides a hyperlink to material not maintained or controlled by GovTech, GovTech shall not be responsible for the content of the hyperlinked material and shall not be liable for any damages or loss arising from access to the hyperlinked material. Use of the hyperlinks and access to such hyperlinked materials are entirely at your own risk. The hyperlinks are provided merely as a convenience to you and do not imply endorsement by, association or affiliation with GovTech of the contents of or provider of the hyperlinked materials.

7.2. Caching and hyperlinking to, and the framing of, any part of the Service is prohibited save where you have obtained GovTech’s prior written consent. Such consent may be subject to any conditions as may be determined by GovTech in its sole discretion. If you hyperlink to or frame any part of the Service, that shall constitute your acceptance of these Terms of Use and all amendments thereto. If you do not accept these Terms of Use as may be amended from time to time, you must immediately discontinue linking to or framing of any part of the Service.

7.3. GovTech reserves all rights:

7.3.1. to disable any links to, or frames of, any materials which are unauthorised (including without limitation materials which imply endorsement by or association or affiliation with GovTech, materials containing inappropriate, profane, defamatory, infringing, obscene, indecent or unlawful topics, names, or information that violates any written law, any applicable intellectual property, proprietary, privacy or publicity rights); and

7.3.2. to disclaim responsibility and/or liability for materials that link to or frame any part of the Service.

## **8.** **Privacy Statement**

You also agree to the terms of the Government Agency Privacy Statement for this Service as may be amended from time to time. The Government Agency Privacy Statement will form part of these Terms of Use.

## **9.** **Rights of Third Parties**

Subject to the rights of the Third Party and/or Singapore public sector agencies, a person who is not a party to this Terms of Use shall have no right under the Contract (Rights of Third Parties) Act or otherwise to enforce any of its terms. Variation or rescission of these Terms of Use shall not require the consent of any third party, including any Third Party and/or other Singapore public sector agencies.

## **10.** **Assignment**

10.1. You may not assign or sub-contract this Terms of Use without the prior written consent of GovTech.

10.2. GovTech may assign, novate, transfer, or sub-contract the rights and liabilities in respect of the Service and this Terms of Use, without notifying you and without further reference to you. Your acceptance of this Terms of Use shall also constitute your consent to such assignment, novation, transfer or sub-contract.

### **10A. Severability**

If any term of these Terms of Use is held by a court or tribunal of competent jurisdiction to be invalid or unenforceable, then these Terms of Use, including all of the remaining terms, will remain in full force and effect as if such invalid or unenforceable term had never been included but, to the extent permissible, such invalid or unenforceable terms shall be deemed to have been replaced by terms that are (a) valid and enforceable and (b) express the intention or produce the result closest to the original intention of the invalid or unenforceable terms.

### **10B. Order of Precedence**

In the event of any conflict, inconsistency or ambiguity between or in any one or more terms in these Terms of Use, such conflict, inconsistency or ambiguity shall be resolved in favour of GovTech and the provision or interpretation which is more favourable to GovTech shall prevail. Notwithstanding any other term, GovTech has the sole and absolute discretion to determine which term or interpretation is more favourable to it and such decision shall be binding on you.

### **10C. Entire Agreement**

These Terms of Use contains the entire and whole agreement concerning the subject matter of these Terms of Use. The Terms of Use supersedes all prior written or oral representations, agreements and/or understandings between GovTech and yourself. Except for amendments by GovTech under these Terms of Use, no amendment to these Terms of Use shall be of any force unless agreed upon in writing by both parties.

### **10D. Waiver**

10D.1 Any delay, failure or omission on the part of GovTech in enforcing any right, power, privilege, claim or remedy (“**Remedy**”), which is conferred under the Terms of Use or at law or in equity, or arises from any breach by you, shall not (a) be deemed to be or be construed as a waiver or variation of the Remedy, or of any other such Remedy, in respect of the particular circumstances in question, or (b) operate so as to bar the enforcement or exercise of the Remedy, or of any other such Remedy in any other subsequent instances.

10D.2 No waiver by GovTech of any breach of the Terms of Use by you shall be deemed to be a waiver of any other or of any subsequent breach.

10D.3 Any waiver by GovTech granted under the Terms of Use must be in writing and may be given subject to conditions. Such waiver under the Terms of Use shall be effective only in the instance and for the purpose for which it is given.

## **11.** **Governing Law and Dispute Resolution**

11.1. These Terms of Use shall be governed by and construed in accordance with laws of Singapore.

11.2. Subject to clause 11.3, any dispute arising out of or in connection with these Terms of Use, including any question regarding its existence, validity or termination, shall be referred to and finally resolved in the Courts of the Republic of Singapore and the parties hereby submit to the exclusive jurisdiction of the Courts of the Republic of Singapore.

11.3. GovTech may, at its sole discretion, refer any dispute referred to in clause 11.2 above to arbitration administered by the Singapore International Arbitration Centre (“**SIAC**”) in Singapore in accordance with the Arbitration Rules of the SIAC ("**SIAC Rules**") for the time being in force, which rules are deemed to be incorporated by reference in this clause. Further:

11.3.1. The seat of the arbitration shall be Singapore.

11.3.2. The tribunal shall consist of one (1) arbitrator.

11.3.3. The language of the arbitration shall be English.

11.3.4. All information, pleadings, documents, evidence and all matters relating to the arbitration shall be confidential.

Where GovTech is the defendant or respondent, it shall be given at least 30 days before the commencement of any legal action against it to elect to exercise the right herein to have the dispute submitted to arbitration. This right to elect shall not prejudice GovTech’s right to a limitation defence and the period to exercise the right shall not be abridged by reason of any accrual of a limitation defence in favour of GovTech during the said period.

**These Terms of Use are dated 3 May 2024.**

## **SCHEDULE**

**1. Name of Service**: Plumber

**2. Nature of Service**

a. Plumber is a workflow automation platform to build integrations with and between applications (“**Apps**”) by creating Pipes, and/or Tiles. Integrations include configuring a Pipe to automatically use one or more Apps’ features by invoking their API, where such API is provided remotely on the App.

b. Notwithstanding anything to the contrary, the Plumber software is made available to you under an open source licence found here[^1] instead of these Terms of Use. These Terms of Use apply to the extent GovTech provides assistance, infrastructure and/or other kinds of services needed to run Plumber for you or provide Plumber to you, as well as the domain under which you access Plumber.

c. Notwithstanding anything in the Terms of Use, the Service is intended for use by:

i. a Singapore public sector agency,

ii. a healthcare institution that is under the National Healthcare Group (“**NHG**”), Singapore Health Services (“**SingHealth**”), or National University Health System (“**NUHS**”); or

iii. an entity owned and operated by MOH Holdings Pte Ltd (“**MOHH**”).

"You" in paragraphs 2 and 4, refers to such entities.

d. Please note that GovTech may collect, store and/or process data that you collect using the Pipes created by the Service.

e. You are responsible for any issues concerning the Pipe and/or Tiles you create and for replying to and/or dealing with any other individual or entity concerning your Pipe and/or Tiles, including without limitation the use, linking, or publication of your own privacy policy/statement applying to the Pipe and/or Tiles. GovTech is not responsible for your compliance with the applicable policies, rules or laws, or for any failure by you to provide a privacy policy/statement.

f. You may not access or use the Service to collect, upload or transmit any data classified as, or above, Confidential or Sensitive-High. You are responsible for ensuring that you are authorised to collect or distribute any data uploaded or transmitted through the Service and its Third-Party Applications.

**3. Third party software/services**

a. Please see [this](https://github.com/opengovsg/plumber/blob/production/LICENSE.md) link for a list of open source components used in the Service.

**4. Special terms**

a. The Service can operate with or use APIs and/or other services operated or provided by either GovTech or third parties (“**Interoperational Applications**”) which you select on your own. You are solely responsible for acquiring the license and rights to use the Interoperational Applications and accepting and complying with the applicable terms and conditions and privacy policies of the Interoperational Applications. The Service facilitates access to these Interoperational Applications, we do not provide licenses for these (save where the other services are provided or operated by GovTech) nor accept these licenses on your behalf.

b. You are responsible for the use of such Interoperational Applications and use of the same is solely at your own risk. GovTech shall not be liable for any data loss or other losses you may suffer as a result of using such Interoperational Applications through this Service.

c. GovTech shall not be responsible for any changes or new developments in Interoperational Applications that may interrupt your use or interaction with the Service, or the continued functioning of your Pipes.

[^1]:


# Government Agency Privacy Statement

This Government Agency Privacy Statement (“**Privacy Statement**”) must be read in conjunction with the Terms of Use that accompany the applicable service you are requesting from us (the “**Service**”).

## General

1\. This is a Government agency digital service.

2\. Please note that:

2.1. We may use "cookies", where a small data file is sent to your browser to store and track information about you when you enter our digital services. The cookie is used to track information such as the number of users and their frequency of use, profiles of users and their preferred digital services. While this cookie can tell us when you enter our digital services and which pages you visit, it cannot read data off your hard disk.

2.2. (not used)

2.3. The Service may utilise cookies to facilitate authentication and/or login to the Service. If such cookies are rejected, you might not be able to use the Service.

3\. Please see the Annex for any additional terms or information.

4\. Nothing in this Privacy Statement shall be construed as limiting or prejudicing our rights at law to collect, use or disclose any data without your consent or agreement.

## Use of data

5\. We may request or collect certain types of data from you in connection with your access or use of the Service. The data that may be requested/collected include those identified in the Annex herein. Your data may be stored in our servers, systems or devices, in the servers, systems or devices of our third party service providers or collaborators, or on your device, and may be used by us or our third party service providers or collaborators to facilitate your access or use of the Service. We or our third party service providers or collaborators may collect system configuration information and/or traffic information (such as an IP address) and/or use information or statistical information to operate, maintain or improve the Services or the underlying service of the third party service provider or collaborator. For the avoidance of doubt, in this Privacy Statement, a reference to a third party service provider or collaborator includes other third parties who provide a service or collaborate with our third party service provider or collaborator.

6\. If you provide us with personal data, or where we collect personal data from you:

6.1.  We may use, disclose and process the data for any one or more of the following purposes:

6.1.1. to assist, process and facilitate your access or use of the Service;

6.1.2. to administer, process and facilitate any transactions or activities by you, whether with us or any other Government Agency or third party service provider or collaborator, and whether for your own benefit, or for the benefit of a third party on whose behalf you are duly authorized to act;

6.1.3. to carry out your instructions or respond to any queries, feedback or complaints provided by (or purported to be provided by) you or on your behalf, or otherwise for the purposes of responding to or dealing with your interactions with us;

6.1.4. to monitor and track your usage of the Service, to conduct research, data analytics, surveys, market studies and similar activities, in order to assist us in understanding your interests, concerns and preferences and improving the Service (including any service of a third party service provider or collaborator) and other services and products provided by Government Agencies. For the avoidance of doubt, we may also collect, use, disclose and process such information to create reports and produce statistics regarding your transactions with us and your usage of the Services and other services and products provided by Government Agencies for record-keeping and reporting or publication purposes (whether internally or externally);

6.1.5. for the purposes of storing or creating backups of your data (whether for contingency or business continuity purposes or otherwise), whether within or outside Singapore;

6.1.6. to enable us to contact you or communicate with you on any matters relating to your access or use of the Service, including but not limited to the purposes set out above, via email, push notifications or such other forms of communication that we may introduce from time to time depending on the functionality of the Service and/or your device.

6.2. We may share necessary data with other Government Agencies, and third party service providers in connection with the Service, so as to improve or facilitate the discharge of public functions and/or serve you in the most efficient and effective way, unless such sharing is prohibited by law.

6.3. We will NOT share your personal data with entities which are not Government Agencies, except where such sharing is necessary for such entities to assist us in providing the Service to you or for fulfilling any of the purposes herein.

6.4. For your convenience, we may also display to you data you had previously supplied us or other Government Agencies. This will speed up the transaction and save you the trouble of repeating previous submissions. Should the data be out-of-date, please supply us the latest data.

6A. Please note that we may be required to disclose your data by law, including any law governing the use/provision of any service of a third party service provider or collaborator.

7\. You may withdraw your consent to the use and disclosure of your data by us with reasonable notice and subject to any prevailing legal or contractual restrictions; however, doing so may prevent the proper functioning of the Service and may also result in the cessation of the Service to you.

## Protection of data

8\. To safeguard your personal data, all electronic storage and transmission of personal data is secured with appropriate security technologies.

9\. The Service may contain links to external sites or services whose data protection and privacy practices may differ from ours. We are not responsible for the content and privacy practices of these other websites or services and encourage you to consult the privacy notices of those sites or services.

## Contact information

10\. Please contact <info@tech.gov.sg> if you:

10.1. have any enquiries or feedback on our data protection policies and procedures; or

10.2. need more information on or access to data which you have provided to us directly in the past.

## Definitions

11\. In this Privacy Statement, “Government Agencies” means the Government (including its ministries, departments and organs of state) and public authorities (such as statutory boards) and “personal data” shall have the same meaning as its definition in the Personal Data Protection Act 2012, provided our obligations in respect of personal data do not apply to:

11.1. Business contact information; and

11.2. Personal data of a deceased individual. However, clauses relating to the disclosure of personal data and protection of personal data shall apply in respect of the personal data of an individual who has been dead for 10 or less years.

**This version of the Privacy Statement is dated 3 May 2024.**

## **ANNEX**

1. **Name of Service**: Plumber
2. **Types of data requested/collected**
   1. If you are a Plumber user, please note that GovTech will collect: (a) your email address; (b) other contact details; (c) details of your browser client; (d) device brand; (e) operating system; and (f) IP address. When you use an integration with a payments feature, GovTech will collect information on the goods/services purchased, including the quantity and value of the same. GovTech will also collect all data traversing Plumber automations but will only access such data for troubleshooting and support purposes.
   2. Interoperational Applications that are integrated with the Service may access, retrieve, transmit, upload, post, delete, collect, maintain, use, store, or otherwise process certain of your data, content, or information for their further use. When you integrate Interoperational Applications, we will collect the information that is necessary to enable access to the Interoperational Application and any data or content contained within the Interoperational Application required to effect the action or command. The Interoperational Application will share information with us, and we will share information with the vendor of the Interoperational Applications. Collection, use and disclosure of such data, content or information by the provider of the Interoperational Application are subject to separate terms.


