diff --git a/main/counter.hs b/main/counter.hs
new file mode 100644
--- /dev/null
+++ b/main/counter.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | Run actor.
+--
+import Network.AWS.Wolf
+import Options.Generic
+
+-- | Args
+--
+-- Program arguments.
+--
+data Args = Args
+  { config :: FilePath
+    -- ^ Configuration file.
+  , plan   :: FilePath
+    -- ^ Plan file to count on.
+  } deriving (Show, Generic)
+
+instance ParseRecord Args
+
+-- | Run counter.
+--
+main :: IO ()
+main = do
+  args <- getRecord "Counter"
+  countMain
+    (config args)
+    (plan args)
diff --git a/src/Network/AWS/Wolf.hs b/src/Network/AWS/Wolf.hs
--- a/src/Network/AWS/Wolf.hs
+++ b/src/Network/AWS/Wolf.hs
@@ -5,5 +5,6 @@
   ) where
 
 import Network.AWS.Wolf.Act     as Exports
+import Network.AWS.Wolf.Count   as Exports
 import Network.AWS.Wolf.Decide  as Exports
 import Network.AWS.Wolf.Prelude as Exports
diff --git a/src/Network/AWS/Wolf/Count.hs b/src/Network/AWS/Wolf/Count.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/AWS/Wolf/Count.hs
@@ -0,0 +1,59 @@
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | SWF Counter logic.
+--
+module Network.AWS.Wolf.Count
+  ( count
+  , countMain
+  ) where
+
+import Network.AWS.Wolf.Ctx
+import Network.AWS.Wolf.File
+import Network.AWS.Wolf.Prelude
+import Network.AWS.Wolf.SWF
+import Network.AWS.Wolf.Types
+
+-- | Count pending activities.
+--
+countActivity :: MonadAmazon c m => Task -> m ()
+countActivity t = do
+  traceInfo "count-act" [ "task" .= t ]
+  let queue = t ^. tQueue
+  runAmazonWorkCtx queue $ do
+    c <- countActivities
+    traceInfo "count-acitivities" [ "task" .= t, "count" .= c ]
+    statsGauge "wolf.act.queue.depth" c [ "queue" =. queue ]
+
+-- | Count open workflows.
+--
+countDecision :: MonadAmazon c m => Task -> m ()
+countDecision t = do
+  traceInfo "count-decision" [ "task" .= t ]
+  let queue = t ^. tQueue
+  runAmazonWorkCtx queue $ do
+    c <- countDecisions
+    traceInfo "count-decisions" [ "task" .= t, "count" .= c ]
+    statsGauge "wolf.decide.queue.depth" c [ "queue" =. queue ]
+
+-- | Counter logic - count all the queues.
+--
+count :: MonadConf c m => Plan -> m ()
+count p =
+  preConfCtx [ "label" .= LabelCount ] $
+    runAmazonCtx $ do
+      countDecision (p ^. pStart)
+      mapM_ countActivity (p ^. pTasks)
+
+-- | Run counter from main with config file.
+--
+countMain :: MonadControl m => FilePath -> FilePath -> m ()
+countMain cf pf =
+  runResourceT $
+    runCtx $
+      runStatsCtx $ do
+        conf <- readYaml cf
+        runConfCtx conf $ do
+          plans <- readYaml pf
+          mapM_ count (plans :: [Plan])
diff --git a/src/Network/AWS/Wolf/SWF.hs b/src/Network/AWS/Wolf/SWF.hs
--- a/src/Network/AWS/Wolf/SWF.hs
+++ b/src/Network/AWS/Wolf/SWF.hs
@@ -6,6 +6,8 @@
 module Network.AWS.Wolf.SWF
   ( pollActivity
   , pollDecision
+  , countActivities
+  , countDecisions
   , completeActivity
   , failActivity
   , completeDecision
@@ -46,6 +48,24 @@
     , reverse $ concatMap (view pfdtrsEvents) pfdtrs
     )
 
+-- | Count activities.
+--
+countActivities :: MonadAmazonWork c m => m Int
+countActivities = do
+  d   <- view cDomain <$> view ccConf
+  tl  <- taskList <$> view awcQueue
+  ptc <- send (countPendingActivityTasks d tl)
+  return $ fromIntegral (ptc ^. ptcCount)
+
+-- | Count decisions.
+--
+countDecisions :: MonadAmazonWork c m => m Int
+countDecisions = do
+  d   <- view cDomain <$> view ccConf
+  tl  <- taskList <$> view awcQueue
+  ptc <- send (countPendingDecisionTasks d tl)
+  return $ fromIntegral (ptc ^. ptcCount)
+
 -- | Successful job completion.
 --
 completeActivity :: MonadAmazon c m => Text -> Maybe Text -> m ()
@@ -96,5 +116,3 @@
   where
     fweda =
       failWorkflowExecutionDecisionAttributes
-
-
diff --git a/src/Network/AWS/Wolf/Types/Sum.hs b/src/Network/AWS/Wolf/Types/Sum.hs
--- a/src/Network/AWS/Wolf/Types/Sum.hs
+++ b/src/Network/AWS/Wolf/Types/Sum.hs
@@ -16,6 +16,7 @@
   = LabelWolf
   | LabelAct
   | LabelDecide
+  | LabelCount
   deriving (Show, Eq)
 
 $(deriveJSON spinalOptions ''LabelType)
diff --git a/wolf.cabal b/wolf.cabal
--- a/wolf.cabal
+++ b/wolf.cabal
@@ -1,5 +1,5 @@
 name:                  wolf
-version:               0.3.12
+version:               0.3.13
 synopsis:              Amazon Simple Workflow Service Wrapper.
 description:           Wolf is a wrapper around Amazon Simple Workflow Service.
 homepage:              https://github.com/swift-nav/wolf
@@ -19,6 +19,7 @@
 library
   exposed-modules:     Network.AWS.Wolf
   other-modules:       Network.AWS.Wolf.Act
+                     , Network.AWS.Wolf.Count
                      , Network.AWS.Wolf.Ctx
                      , Network.AWS.Wolf.Decide
                      , Network.AWS.Wolf.File
@@ -70,6 +71,15 @@
 executable wolf-decider
   hs-source-dirs:      main
   main-is:             decider.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:       base
+                     , wolf
+                     , optparse-generic
+  default-language:    Haskell2010
+
+executable wolf-counter
+  hs-source-dirs:      main
+  main-is:             counter.hs
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
   build-depends:       base
                      , wolf
