diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.2.12.1
+
+* Fix `pass` in `ConduitM` `MonadWriter` instance
+
 ## 1.2.12
 
 * Add `exceptC`, `runExceptC` and `catchExceptC` to `Data.Conduit.Lift`
diff --git a/Data/Conduit/Internal/Conduit.hs b/Data/Conduit/Internal/Conduit.hs
--- a/Data/Conduit/Internal/Conduit.hs
+++ b/Data/Conduit/Internal/Conduit.hs
@@ -94,7 +94,7 @@
 import Control.Monad.Error.Class(MonadError(..))
 import Control.Monad.Reader.Class(MonadReader(..))
 import Control.Monad.RWS.Class(MonadRWS())
-import Control.Monad.Writer.Class(MonadWriter(..))
+import Control.Monad.Writer.Class(MonadWriter(..), censor)
 import Control.Monad.State.Class(MonadState(..))
 import Control.Monad.Trans.Class (MonadTrans (lift))
 import Control.Monad.IO.Class (MonadIO (liftIO))
@@ -207,12 +207,16 @@
          in go mempty (c0 Done)
 
     pass (ConduitM c0) = ConduitM $ \rest ->
-        let go (HaveOutput p c o) = HaveOutput (go p) c o
-            go (NeedInput p c) = NeedInput (\i -> go (p i)) (\u -> go (c u))
-            go (PipeM mp) = PipeM $ mp >>= (return . go)
-            go (Done (x,_)) = rest x
-            go (Leftover p i) = Leftover (go p) i
-         in go (c0 Done)
+        let go front (HaveOutput p c o) = HaveOutput (go front p) c o
+            go front (NeedInput p c) = NeedInput (\i -> go front (p i)) (\u -> go front (c u))
+            go front (PipeM mp) = PipeM $ do
+                (p,w) <- censor (const mempty) (listen mp)
+                return $ go (front `mappend` w) p
+            go front (Done (x,f)) = PipeM $ do
+                tell (f front)
+                return $ rest x
+            go front (Leftover p i) = Leftover (go front p) i
+         in go mempty (c0 Done)
 
 instance MonadState s m => MonadState s (ConduitM i o m) where
     get = lift get
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             1.2.12
+Version:             1.2.12.1
 Synopsis:            Streaming data processing library.
 description:
     `conduit` is a solution to the streaming data problem, allowing for production,
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -27,6 +27,7 @@
 import Control.Monad.Trans.Writer (execWriter, tell, runWriterT)
 import Control.Monad.Trans.State (evalStateT, get, put, modify)
 import Control.Monad.Trans.Maybe (MaybeT (..))
+import qualified Control.Monad.Writer as W
 import Control.Applicative (pure, (<$>), (<*>))
 import qualified Control.Monad.Catch as Catch
 import Data.Functor.Identity (Identity,runIdentity)
@@ -876,6 +877,12 @@
                     C.yield 3
                     lift $ return ()
             (src C.$$ CL.consume) `shouldBe` Right [1, 2, 4 :: Int]
+        describe "WriterT" $
+            it "pass" $
+                let writer = W.pass $ do
+                    W.tell [1 :: Int]
+                    pure ((), (2:))
+                in execWriter (C.runConduit writer) `shouldBe` [2, 1]
 
     describe "finalizers" $ do
         it "promptness" $ do
