diff --git a/demo/demo.hs b/demo/demo.hs
new file mode 100644
--- /dev/null
+++ b/demo/demo.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+import System.Environment
+
+import Network.Api.Postmark.Demo
+
+main :: IO ()
+main = do
+  args <- getArgs
+  dispatch args >>= print
diff --git a/postmark.cabal b/postmark.cabal
--- a/postmark.cabal
+++ b/postmark.cabal
@@ -1,5 +1,5 @@
 Name:               postmark
-Version:            0.0.2
+Version:            0.1.0
 License:            BSD3
 License-File:       LICENSE
 Author:             Mark Hibberd <mark@hibberd.id.au>
@@ -21,6 +21,10 @@
 Flag                small_base
   Description:      Choose the new, split-up base package.
 
+Flag demo
+    Description:   Build the demo executable.
+    Default:       False
+
 Library
   Build-Depends:
                     base                            >= 3          && < 5
@@ -50,3 +54,17 @@
                     Network.Api.Postmark.Request
                     Network.Api.Postmark.Response
                     Network.Api.Postmark.Settings
+                    Network.Api.Postmark.Tutorial
+
+executable         postmark-demo
+    if flag(demo)
+        Buildable: True
+    else
+        Buildable: False
+
+    ghc-options:   -Wall -threaded -O2
+    main-is:           ../demo/demo.hs
+    hs-source-dirs:    dist demo
+    build-depends:     base
+                     , postmark
+                     , text
diff --git a/src/Network/Api/Postmark.hs b/src/Network/Api/Postmark.hs
--- a/src/Network/Api/Postmark.hs
+++ b/src/Network/Api/Postmark.hs
@@ -1,11 +1,23 @@
 -- |
--- Module:      Network.Postmark
+-- Module:      Network.Api.Postmark
 -- Copyright:   (c) 2012 Mark Hibberd
 -- License:     BSD3
 -- Maintainer:  Mark Hibberd <mark@hibberd.id.au>
 -- Portability: portable
 --
--- Library for postmarkapp.com HTTP Api
+-- Library for postmarkapp.com HTTP Api.
+--
+-- To get start see some examples in the 'Network.Api.Postmark.Tutorial' module at <http://hackage.haskell.org/packages/archive/postmark/0.0.2/doc/html/Network-Api-Postmark-Tutorial.html>.
+--
+-- Source and more information can be found at <https://github.com/apiengine/postmark>.
+--
+-- To experiment with a live demo try:
+-- > $ git clone https://github.com/apiengine/postmark
+-- > $ cd postmark
+-- > $ cabal install --only-dependencies &&  cabal configure -f demo  && cabal build
+-- > $ ./dist/build/postmark-demo/postmark-demo
+--
+-- Issues can be reported at <https://github.com/apiengine/postmark/issues>.
 --
 module Network.Api.Postmark (module X) where
 
diff --git a/src/Network/Api/Postmark/Settings.hs b/src/Network/Api/Postmark/Settings.hs
--- a/src/Network/Api/Postmark/Settings.hs
+++ b/src/Network/Api/Postmark/Settings.hs
@@ -7,7 +7,7 @@
   PostmarkSettings {
       apiUrl :: Text
     , apiToken :: Text
-    }
+    } deriving (Eq, Show)
 
 postmarkTestToken :: Text
 postmarkTestToken = "POSTMARK_API_TEST"
diff --git a/src/Network/Api/Postmark/Tutorial.hs b/src/Network/Api/Postmark/Tutorial.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Api/Postmark/Tutorial.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-| @postmark@ is a haskell toolkit for dealing with the postmarkapp.com api
+    for sending and receiving email.
+-}
+module Network.Api.Postmark.Tutorial (
+    -- * Settings
+    -- $settings
+
+    -- * Sending Mail
+    -- $email
+
+    -- * Handling Responses
+    -- $response
+    ) where
+
+import Network.Api.Postmark
+
+{- $settings
+
+
+
+> postmarkHttp "<your api token>"   -- Build PostmarkSettings to talk to
+>                                   -- the _http_ api with you own api token.
+> postmarkHttps "<your api token>"  -- Build PostmarkSettings to talk to
+>                                   -- the _https_ api with you own api token.
+> postmarkHttpTest                  -- Build PostmarkSettings to talk to
+>                                   -- the _http_ api with the public test token.
+> postmarkHttpsTest                 -- Build PostmarkSettings to talk to
+>                                   -- the _https_ api with the public test token.
+
+-}
+
+{- $email
+
+Sending a single email.
+
+> import Network.Api.Postmark
+>
+> request postmarkHttpTest $ email defaultEmail {
+>       emailFrom = "demo-from@postmark.hs"
+>     , emailTo = ["demo-to@postmark.hs"]
+>     , emailSubject = "demo, yes it really is a demo"
+>     , emailTag = Just "demo"
+>     , emailHtml = Just "Hello world!"
+>     , emailReplyTo = "demo-reply-to@postmark.hs"
+>     }
+
+Sending multiple emails.
+
+> import Network.Api.Postmark
+>
+> demo = request postmarkHttpTrest $ emails [
+>     defaultEmail {
+>       emailFrom = "demo-from@postmark.hs"
+>     , emailTo = ["demo-to@postmark.hs"]
+>     , emailSubject = "demo, yes it really is a demo"
+>     , emailTag = Just "demo"
+>     , emailHtml = Just "Hello world!"
+>     , emailReplyTo = "demo-reply-to@postmark.hs"
+>     }
+>   , defaultEmail {
+>       emailFrom = "demo-from@postmark.hs"
+>     , emailTo = ["demo-to@postmark.hs"]
+>     , emailSubject = "demo, yes it really is a demo"
+>     , emailTag = Just "demo"
+>     , emailHtml = Just "Hello world again!"
+>     , emailReplyTo = "demo-reply-to@postmark.hs"
+>     }
+>   }
+-}
+
+{- $response
+
+Checking if the response is a success, ignoring detail:
+
+> import Network.Api.Postmark
+>
+> case result of
+>   PostmarkSuccess _ -> True
+
+
+Handling specific failure cases:
+
+> import Network.Api.Postmark
+>
+> case result of
+>   PostmarkSuccess a ->  undefined            -- Everything ok.
+>   PostmarkUnauthorized -> undefined          -- Invalid api token.
+>   PostmarkFailure (PostmarkError errortype message)
+>                     -> undefined             -- A standard postmark failure.
+>   PostmarkUnexpected reason code body message
+>                     -> undefined             -- Unexpected failure (bug or
+>                                              -- api change).
+
+Handling known postmark failures:
+
+> import Network.Api.Postmark
+>
+> case errortype of
+>   PostmarkBadApiToken -> undefined
+>   PostmarkInvalidEmail -> undefined
+>   PostmarkSenderNotFound -> undefined
+>   PostmarkSenderNotConfirmed -> undefined
+>   PostmarkInvalidJson -> undefined
+>   PostmarkIncompatibleJson -> undefined
+>   PostmarkNotAllowed -> undefined
+>   PostmarkInactive -> undefined
+>   PostmarkBounceNotFound -> undefined
+>   PostmarkBounceQueryException -> undefined
+>   PostmarkJsonRequired -> undefined
+>   PostmarkTooManyMessages -> undefined
+>   PostmarkUnkownError Int -> undefined
+-}
