Menu

Expand
Rate this page:

Workflow Automation with C# and ASP.NET MVC

One of the more abstract concepts you'll handle when building your business is what the workflow will look like.

At its core, setting up a standardized workflow is about enabling your service providers (agents, hosts, customer service reps, administrators, and the rest of the gang) to better serve your customers.

To illustrate a very real-world example, today we'll build a C# and ASP.NET MVC webapp for finding and booking vacation properties — tentatively called Airtng.

Here's how it'll work:

  1. A host creates a vacation property listing
  2. A guest requests a reservation for a property
  3. The host receives an SMS notifying them of the reservation request. The host can either Accept or Reject the reservation
  4. The guest is notified whether a request was rejected or accepted

Learn how Airbnb used Twilio SMS to streamline the rental experience for 60M+ travelers around the world.

Workflow Building Blocks

We'll be using the Twilio REST API to send our users messages at important junctures. Here's a bit more on our API:

Loading Code Sample...
        
        
        AirTNG.Web/Domain/Reservations/Notifier.cs

        Notify the host

        AirTNG.Web/Domain/Reservations/Notifier.cs

        Ready to go? Boldly click the button right after this sentence.

        Boldly Click Me to Move On

        Authenticate Users

        For this use case to work we have to handle authentication. We will rely on ASP.NET Identity for this purpose.

        Each User will need to have a phone_number that we will use later to send SMS notifications.

        Loading Code Sample...
              
              
              AirTNG.Web/Models/IdentityModels.cs

              The User model

              AirTNG.Web/Models/IdentityModels.cs

              Next let's take a look at the Vacation Property model.

              Next

              The Vacation Property Model

              Our rental application will obviously require listing properties.

              The VacationProperty belongs to the User who created it (we'll call this user the host from this point on) and contains only two properties: a Description and an ImageUrl.

              A VacationProperty can have many Reservations.

              Loading Code Sample...
                    
                    
                    AirTNG.Web/Models/VacationProperty.cs

                    Vacation Property Model

                    AirTNG.Web/Models/VacationProperty.cs

                    Next, let's see what our Reservation model looks like.

                    Next

                    Reservation Model

                    The Reservation model is at the center of the workflow for this application.

                    It is responsible for keeping track of:

                    • The VacationProperty it is associated with.
                    • The User who owns that vacation property (the host). Through this property the user will have access to the host phone number indirectly.
                    • The Status of the reservation
                    Loading Code Sample...
                          
                          
                          AirTNG.Web/Models/Reservation.cs

                          The Reservation Model

                          AirTNG.Web/Models/Reservation.cs

                          Now that our models are ready, let's have a look at the controller that will create reservations.

                          Next

                          Create a Reservation

                          The reservation creation form holds only a single field: the message that will be sent to the host when one of her properties is reserved. The rest of the information needed to create a reservation is taken from the VacationProperty itself.

                          A reservation is created with a default status ReservationStatus.Pending. That way when the host replies with an accept or reject response the application knows which reservation to update.

                          Loading Code Sample...
                                
                                
                                AirTNG.Web/Controllers/ReservationsController.cs

                                The Reservations Controller

                                AirTNG.Web/Controllers/ReservationsController.cs

                                Next, let's see how we will send SMS notifications to the vacation rental host.

                                Message the Host!

                                Notify The Host

                                When a reservation is created we want to notify the owner of the property that someone is interested.

                                This is where we use Twilio C# Helper Library to send a SMS message to the host, using our Twilio phone number. As you can see, sending SMS messages using Twilio takes just a few lines of code.

                                Next we just have to wait for the host to send an SMS response accepting or rejecting the reservation. Then we can notify the guest and host that the reservation information has been updated.

                                Loading Code Sample...
                                      
                                      
                                      AirTNG.Web/Domain/Reservations/Notifier.cs

                                      Notify the host

                                      AirTNG.Web/Domain/Reservations/Notifier.cs

                                      Now's let's peek at how we're handling the host's responses.

                                      Next

                                      Handle Incoming Messages

                                      The Reservations/Handle controller controller handles our incoming Twilio request and does four things:

                                      1. Check for the guest's pending reservation
                                      2. Update the status of the reservation
                                      3. Respond to the host
                                      4. Send notification to the guest
                                      Loading Code Sample...
                                            
                                            
                                            AirTNG.Web/Controllers/ReservationsController.cs

                                            Handle a host response

                                            AirTNG.Web/Controllers/ReservationsController.cs

                                            Let's have closer look at how Twilio webhooks are configured to enable incoming requests to our application.

                                            Next

                                            Incoming Twilio Requests

                                            In the Twilio console, you must setup the sms web hook to call your application's end point in the route Reservations/Handle.

                                            SMS Webhook

                                            One way to expose your development machine to the outside world is using ngrok. The url for the sms web hook on your number would look like this:

                                            http://<subdomain>.ngrok.io/Reservations/Handle
                                            

                                            An incoming request from Twilio comes with some helpful parameters, such as a from phone number and the message body.

                                            We'll use the from parameter to look for the host and check if he/she has any pending reservations. If he/she does, we'll use the message body to check for 'accept' and 'reject'.

                                            In the last step, we'll use Twilio's TwiML as a response to Twilio to send an SMS message to the guest.

                                            Loading Code Sample...
                                                  
                                                  
                                                  AirTNG.Web/Controllers/ReservationsController.cs

                                                  Accept or reject a reservation

                                                  AirTNG.Web/Controllers/ReservationsController.cs

                                                  Now that we know how to expose a webhook to handle Twilio requests, let's see how we generate the TwiML needed.

                                                  Generate Some TwiML

                                                  TwiML Response

                                                  After updating the reservation status, we must notify the host that he/she has successfully confirmed or rejected the reservation. We also have to return a friendly error message if there are no pending reservations.

                                                  If the reservation is confirmed or rejected we send an additional SMS to the guest to deliver the news.

                                                  We use the verb Message from TwiML to instruct Twilio's server that it should send the SMS messages.

                                                  Loading Code Sample...
                                                        
                                                        
                                                        AirTNG.Web/Controllers/ReservationsController.cs

                                                        Respond to a message

                                                        AirTNG.Web/Controllers/ReservationsController.cs

                                                        Congratulations! You've just learned how to automate your workflow with Twilio SMS.

                                                        Next, lets see what else we can do with the Twilio C# SDK.

                                                        What Else Can I Build?

                                                        Where to Next?

                                                        If you're a .NET developer working with Twilio you know we've got a lot of great content here on the Docs site. Here are just a couple ideas for your next tutorial:

                                                        IVR: Phone Tree

                                                        Easily route callers to the right people and information with an IVR (interactive voice response) system.

                                                        Automated Survey

                                                        Instantly collect structured data from your users with a survey conducted over a voice call or SMS text messages.

                                                        Did this help?

                                                        Thanks for checking out this tutorial! Tweet to us @twilio with what you're building!

                                                        David Prothero Kat King Andrew Baker Jose Oliveros Paul Kamp Stephanie Marchante Brianna DelValle
                                                        Rate this page:

                                                        Need some help?

                                                        We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd by visiting Twilio's Stack Overflow Collective or browsing the Twilio tag on Stack Overflow.

                                                        Loading Code Sample...
                                                              
                                                              
                                                              

                                                              Thank you for your feedback!

                                                              Please select the reason(s) for your feedback. The additional information you provide helps us improve our documentation:

                                                              Sending your feedback...
                                                              🎉 Thank you for your feedback!
                                                              Something went wrong. Please try again.

                                                              Thanks for your feedback!

                                                              thanks-feedback-gif