diff --git a/PaymentServer.cabal b/PaymentServer.cabal
index f6997bde9da04ae348826d79e4b9c5e569c41931..134ce45a529fc52c21f8806b3bc2299dd34f5ea6 100644
--- a/PaymentServer.cabal
+++ b/PaymentServer.cabal
@@ -45,6 +45,7 @@ library
                      , sqlite-simple
                      , retry
                      , prometheus-client
+                     , servant-prometheus
   default-language:    Haskell2010
   ghc-options:       -Wmissing-import-lists -Wunused-imports
   pkgconfig-depends: libchallenge_bypass_ristretto_ffi
diff --git a/src/PaymentServer/Main.hs b/src/PaymentServer/Main.hs
index f32512abaaeee4eaa4ceeba6623de581aed2bf16..e7d700cfee97dedebb44e8c1f14371d64781f8a3 100644
--- a/src/PaymentServer/Main.hs
+++ b/src/PaymentServer/Main.hs
@@ -72,6 +72,7 @@ import PaymentServer.Issuer
   )
 import PaymentServer.Server
   ( paymentServerApp
+  , makeMetricsMiddleware
   )
 
 import Options.Applicative
@@ -313,5 +314,6 @@ getApp config =
             let
               origins = corsOrigins config
               app = paymentServerApp origins stripeConfig' issuer db
+            metricsMiddleware <- makeMetricsMiddleware
             logger <- mkRequestLogger (def { outputFormat = Detailed True})
-            return $ logger app
+            return . logger . metricsMiddleware $ app
diff --git a/src/PaymentServer/Server.hs b/src/PaymentServer/Server.hs
index 5d879594c879673a3ffffc98376c2df2c115bff1..8842dab1ee84f211897886dfbc181dcd12c09a4e 100644
--- a/src/PaymentServer/Server.hs
+++ b/src/PaymentServer/Server.hs
@@ -6,6 +6,7 @@
 -- interactions.
 module PaymentServer.Server
   ( paymentServerApp
+  , makeMetricsMiddleware
   ) where
 
 import Network.Wai.Middleware.Cors
@@ -22,6 +23,11 @@ import Servant
   , (:>)
   , (:<|>)((:<|>))
   )
+import Servant.Prometheus
+  ( MeasureQuantiles(WithQuantiles)
+  , monitorServant
+  , makeMeters
+  )
 
 import Web.Stripe.Client
   ( StripeConfig
@@ -83,3 +89,10 @@ paymentServerApp corsOrigins stripeConfig issuer =
     cors' = cors (const $ Just corsResourcePolicy)
   in
     cors' . app
+
+
+-- | Create middleware which captures metrics for the payment server app.
+makeMetricsMiddleware :: IO (Application -> Application)
+makeMetricsMiddleware = do
+  meters <- makeMeters paymentServerAPI WithQuantiles
+  return $ monitorServant paymentServerAPI meters
diff --git a/stack.yaml b/stack.yaml
index 0af84a35031953cbffd353476578ffa00b37b01f..3a4243691337cedb0356d9a76154c8aef27c46bd 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -41,6 +41,8 @@ extra-deps:
   - "stripe-core-2.5.0"
   - "stripe-haskell-2.5.0"
   - "stripe-http-client-2.5.0"
+  - github: "PrivateStorageio/servant-prometheus"
+    commit: "ec21c5ed50e6f6f8e52916ce71cd68fcd0166cad"
 
 # Override default flag values for local packages and extra-deps
 # flags: {}