## 6.5.1 Start and End States

As mentioned before a flow has a defined start and end state. A start state is the state which is entered when a user first initiates a conversation (or flow). The start state of A Grails flow is the first method call that takes a block. For example:

    class BookController {
       …
       def shoppingCartFlow = {
           showCart {
               on("checkout").to "enterPersonalDetails"
               on("continueShopping").to "displayCatalogue"
           }
           …
           displayCatalogue {
                redirect(controller:"catalogue", action:"show")
           }
           displayInvoice()
       }
    }

Here the `showCart` node is the start state of the flow. Since the showCart state doesn't define an action or redirect it is assumed be a view state that, by convention, refers to the view `grails-app/views/book/shoppingCart/showCart.gsp`.

Notice that unlike regular controller actions, the views are stored within a directory that matches the name of the flow: `grails-app/views/book/shoppingCart`.

The `shoppingCart` flow also has two possible end states. The first is `displayCatalogue` which performs an external redirect to another controller and action, thus exiting the flow. The second is `displayInvoice` which is an end state as it has no events at all and will simply render a view called `grails-app/views/book/shoppingCart/displayInvoice.gsp` whilst ending the flow at the same time.

Once a flow has ended it can only be resumed from the start state, in this case `showCart`, and not from any other state.