# Finalizing all Journey Steps

In Part VI, we configured a Notification that was sent only conditionally, finalizing all elements of this Journey's Step 1. Now, we will configure Step 2 of the Journey which leads the user to leave some feedback after their appointment.

## Setting the timer to start Step 2

1. In **Web Flows** Builder, go to the Scheduler Control in the Schedule Appointment Web Flow. In the **Actions** tab of the Inspector, add a **Start Timer** Action and complete it as follows:
   * Change the key to “start-step-2”
   * Set an execution of 5 minutes after the appointment by adding the following **Custom Expression**:

```javascript
ADD_TO_DATETIME(
  session.appointment.end_time,
  5,
  "m"
)
```

This uses the Airscript function [ADD\_TO\_DATETIME](../../airscript-expressions/datetime-functions/add_to_datetime) to return a DataTime indicating a time five minutes after the appointment ends.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-fbacb88ea71e41d89483ea00efa7688486ec0f99%2Ffinalizing-all-journey-steps-v180-0.png?alt=media)

2. Beneath the **Start Timer** Action, nest a **Go to Next Journey Step** Action so that five minutes after the appointment is over, the user will be funneled into the second Step of the Journey.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-f3feaa3e83c06b8ebb4dbef70c0250f234033fdf%2Ffinalizing-all-journey-steps-v180-1.png?alt=media)

## Configuring the Collect Feedback Web Flow

This Web Flow will be triggered once the user leaves the appointment in order to collect some feedback.

1. In **Web Flows** Builder, select the Collect Feedback Web Flow and rename the associated Web Page to “Collect Feedback”.
2. Add a Label asking the user how the appointment went.
3. Add a Text Area Input Control.
4. Add a Button Control and change its text to “Submit Feedback”.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-d703f269bf9441d554161730d07e55abf81894a7%2Ffinalizing-all-journey-steps-v180-2.png?alt=media)

5. With the Submit Button selected, go to the **Actions** tab in the Inspector and add a \*\*Navigate to Web Page \*\*Action. Then, select **Add Web Page**.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-f66aa097ad6b992cd47fb8fda659dc70b808d438%2Ffinalizing-all-journey-steps-v180-3.png?alt=media)

6. Go to the new Web Page in the Tree and rename it to “Thank you”.
7. Add a Label to thank the user for their feedback. Personalize the message by including the `actor.first_name` variable:

```javascript
“Thank you for your feedback, {{actor.first_name}}!”
```

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-b116eb5a76ddcb4c01294983aaa639b460bfeed2%2Ffinalizing-all-journey-steps-v180-4.png?alt=media)

8. Save the app

## Creating the App Object to save users’ info

Let’s create an app object for the fields we want to store.

1. Go to **AirData** Builder and create a Feedback App Object with the following fields:
   * `feedback` Variable of Type Text
   * `phone` Variable of Type Phone. This attribute is the same one as the actor’s since it serves to identify the user.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-0f4a12318cb25596404ec056ca314a5e918455ed%2Ffinalizing-all-journey-steps-v180-5.png?alt=media)

2. Save the app.

## Creating the Data Flow to save feedback

In order to save the information into AirData, the next step is to create a Data Flow.

1. Go to **Connections** Builder and create a Data Flow from scratch. Rename it to “Save Feedback”.
2. In **Start**, add the following:
   * `phone` Variable of Type Phone
   * `feedback` Variable of Type Text

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-2147438162e28dca41d1425a79bc8d539abb33a3%2Ffinalizing-all-journey-steps-v180-6.png?alt=media)

3. By clicking on the ‘+’ icon, add an AirData Request Data Operation.
   * In **App Object**, select the one we have just created
   * For **Type** select INSERT
   * In **Objects to Insert or Update**, enter the Keys one by one from the ‘+’ icon and match them with their corresponding Variables:

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-78240b92dcd3de8c55ee785a8cb9d2d5e0eb7d0c%2Ffinalizing-all-journey-steps-v180-7.png?alt=media)

In **Run Results**, check that your Data Flow runs.

4. Save the app.

## Passing the Information to the Data Flow

1. Go back to **Web Flows** Builder. With the Submit Feedback Button selected, go to **Actions** and add a **Run Data Flow** Action.
2. Select the Save Feedback Data Flow and pass the following Variables:

* `actor.phone` for the phone input
* `text_area` for the feedback input as that was the auto generated variable we got when adding the Text Area Input control to the Web Flow.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-f4fbf60a49c4d514dec1c15343bc29b97d4ff7b1%2Ffinalizing-all-journey-steps-v180-8.png?alt=media)

## Informing the user

The last thing we need to configure is a Notification inviting users to submit some feedback once their appointment is over.

1. In **Notifications** Builder, add another SMS Notification and rename it to “Ask for Feedback”.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-37d5f2cd73b23e5aa24aa65faee4e9276caf1318%2Ffinalizing-all-journey-steps-v180-9.png?alt=media)

2. Add a text inviting the user to submit some feedback. Personalize the message by entering `actor.first_name` in Custom Airscript Expression.
3. Click on the ‘+’ sign below the message and add a separate **Link to Journey** step to direct the user.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-3f28ad9020d71fa6d4217f3edfc313cc07e96f1d%2Ffinalizing-all-journey-steps-v180-10.png?alt=media)

4. Go to **Journey** Builder and drag Send an SMS from **Notifications** in the Tree to **Step 2**. Finally, select the **Ask for Feedback** Notification.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-fa7478846f8ff3f6903e40b3dcbc7bce85ad40a5%2Ffinalizing-all-journey-steps-v180-11.png?alt=media)

<details>

<summary>Is this Notification TCPA Compliant?</summary>

\


Yes! All Notification send from Journey Steps are automatically TCPA complaint, **provided you've initialized the Actor properly**, which we did back in Part 2.

Enabling TCPA timing restrictions on Notifications sent from a Journey Step requires initializing the Actor with an appropriate value for `actor.calendar_restriction`.

`actor.calendar_restriction` expects an Availability Schedule Key, and Notifications sent from Journey Steps will only be sent within the windows of time described by the Availability Schedule. To simplify the process of defining `actor.calendar_restriction`, Airkit does it automatically whenever an Actor is initialized with values for `actor.region` and `actor.time_zone`, so that:

```json
actor.calendar_restriction = "TCPA-{{actor.region}}-{{actor.time_zone}}"
```

(This Availability Schedule Key should look very familiar! It's what we used to enforce TCPA compliance when scheduling our first two Notifications.)

This `actor.calendar_restriction` value references an out-of-the-box Availability Schedule that encompasses blocks of time the TCPA allows messages to be sent within the Actor's region and timezone. Outgoing Notifications sent from Journey Steps will only be sent within the allowed blocks of time.

For more on TCPA compliance and Notifications, see [TCPA](../../security-and-compliance/tcpa).

</details>

## Previewing the start-step-2 timer

Let's go to **App Preview** to preview the finalized application.

1. After emulating all of Step 1, click on the **Timers** tab to see the timers that are available at that stage of the Journey.
2. Select the timer you want to test and, from **Actions**, click on **Activate Scheduled Trigger**. By doing so, the timer will be triggered regardless of the time it was set for.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-e1256c3fbd69b3522d6dbf13fe94af7b342bb376%2Ffinalizing-all-journey-steps-v180-12.png?alt=media)

3. Go back to the **Device** tab and click on the chat icon at the bottom to see the Notification's message.

Congratulations! You've now built out a multi-Step scheduling application, capable of scheduling appointments and sending a variety of TCPA-compliant messages.

## A note about publishing

There's one important element of sending SMS Notifications that went largely unaddressed throughout this tutorial: when outgoing text messages are sent, we've established that they're sent to the Actor, but **what number are they sent&#x20;**_**from**_**?** This question is primarily important in the context to of publishing your application; see [Publishing Your Application](../../building-apps/publishing/publishing-your-application) to learn more.

The [Console](../../console/console) provides the means to connect your Twilio numbers to your [Org](../../administration/airkit-organizations). Once connected to an Org, phone numbers will become available in [Settings](../../studio/builder-bar/settings) when accessing your application in the Studio. Under the **Chat Bot** section, you can select an available number to manage the texts associated with your application. Once a phone number is configured, your outgoing SMS Notifications will be sent from the configured number.

For more on how to associate your phone numbers with Airkit apps, see [Connecting Your Twilio Numbers To Airkit](../../sms/connecting-twilio-numbers).
