diff --git a/esqueleto.cabal b/esqueleto.cabal
--- a/esqueleto.cabal
+++ b/esqueleto.cabal
@@ -1,5 +1,5 @@
 name:                esqueleto
-version:             2.4.1
+version:             2.4.2
 synopsis:            Type-safe EDSL for SQL queries on persistent backends.
 homepage:            https://github.com/prowdsponsor/esqueleto
 license:             BSD3
diff --git a/src/Database/Esqueleto.hs b/src/Database/Esqueleto.hs
--- a/src/Database/Esqueleto.hs
+++ b/src/Database/Esqueleto.hs
@@ -20,7 +20,7 @@
 -- or import @esqueleto@ itself qualified:
 --
 -- @
--- -- For a module uses esqueleto just on some queries.
+-- -- For a module that uses esqueleto just on some queries.
 -- import Database.Persistent
 -- import qualified Database.Esqueleto as E
 -- @
@@ -85,6 +85,7 @@
   , update
   , updateCount
   , insertSelect
+  , insertSelectCount
   , insertSelectDistinct
   , (<#)
   , (<&>)
@@ -134,7 +135,7 @@
 --   relational algebra EDSL such as HaskellDB, which is
 --   non-trivial to translate into SQL.)
 --
---   * Support the mostly used SQL features.  We'd like you to be
+--   * Support the most widely used SQL features.  We'd like you to be
 --   able to use @esqueleto@ for all of your queries, no
 --   exceptions.  Send a pull request or open an issue on our
 --   project page (<https://github.com/prowdsponsor/esqueleto>) if
@@ -252,7 +253,7 @@
 -- return p
 -- @
 --
--- Since @age@ is an optional @Person@ field, we use 'just' lift
+-- Since @age@ is an optional @Person@ field, we use 'just' to lift
 -- @'val' 18 :: SqlExpr (Value Int)@ into @just ('val' 18) ::
 -- SqlExpr (Value (Maybe Int))@.
 --
@@ -276,7 +277,7 @@
 -- return (b, p)
 -- @
 --
--- However, we may want your results to include people who don't
+-- However, you may want your results to include people who don't
 -- have any blog posts as well using a @LEFT OUTER JOIN@:
 --
 -- @
@@ -306,7 +307,7 @@
 --
 -- We are by no means limited to joins of two tables, nor by
 -- joins of different tables.  For example, we may want a list
--- the @Follow@ entity:
+-- of the @Follow@ entity:
 --
 -- @
 -- SELECT P1.*, Follow.*, P2.*
diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs
--- a/src/Database/Esqueleto/Internal/Language.hs
+++ b/src/Database/Esqueleto/Internal/Language.hs
@@ -413,7 +413,7 @@
   ilike :: SqlString s => expr (Value s) -> expr (Value s) -> expr (Value Bool)
   -- | The string @'%'@.  May be useful while using 'like' and
   -- concatenation ('concat_' or '++.', depending on your
-  -- database).  Note that you always to type the parenthesis,
+  -- database).  Note that you always have to type the parenthesis,
   -- for example:
   --
   -- @
@@ -456,7 +456,25 @@
   -- /Since: 2.2.12/
   justList :: expr (ValueList typ) -> expr (ValueList (Maybe typ))
 
-  -- | @IN@ operator.
+  -- | @IN@ operator. For example if you want to select all @Person@s by a list
+  -- of IDs:
+  --
+  -- @
+  -- SELECT *
+  -- FROM Person
+  -- WHERE Person.id IN (?)
+  -- @
+  --
+  -- In @esqueleto@, we may write the same query above as:
+  --
+  -- @
+  -- select $
+  -- 'from' $ \\person -> do
+  -- 'where_' $ person '^.' PersonId `in_` 'valList' personIds
+  -- return person
+  -- @
+  --
+  -- Where @personIds@ is of type @[Key Person]@.
   in_ :: PersistField typ => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool)
 
   -- | @NOT IN@ operator.
diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs
--- a/src/Database/Esqueleto/Internal/Sql.hs
+++ b/src/Database/Esqueleto/Internal/Sql.hs
@@ -28,6 +28,7 @@
   , updateCount
   , insertSelectDistinct
   , insertSelect
+  , insertSelectCount
     -- * The guts
   , unsafeSqlCase
   , unsafeSqlBinOp
@@ -1739,9 +1740,16 @@
 
 
 -- | Insert a 'PersistField' for every selected value.
+--
+-- /Since: 2.4.2/
 insertSelect :: (MonadIO m, PersistEntity a) =>
   SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m ()
-insertSelect = liftM (const ()) . rawEsqueleto INSERT_INTO . fmap EInsertFinal
+insertSelect = liftM (const ()) . insertSelectCount
+
+-- | Insert a 'PersistField' for every selected value, return the count afterward
+insertSelectCount :: (MonadIO m, PersistEntity a) =>
+  SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m Int64
+insertSelectCount = rawEsqueleto INSERT_INTO . fmap EInsertFinal
 
 
 -- | Insert a 'PersistField' for every unique selected value.
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -1208,6 +1208,18 @@
           ret <- select $ from (\(_::(SqlExpr (Entity BlogPost))) -> return countRows)
           liftIO $ ret `shouldBe` [Value (3::Int)]
 
+    describe "inserts by select, returns count" $ do
+      it "IN works for insertSelectCount" $
+        run $ do
+          _ <- insert p1
+          _ <- insert p2
+          _ <- insert p3
+          cnt <- insertSelectCount $ from $ \p -> do
+            return $ BlogPost <# val "FakePost" <&> (p ^. PersonId)
+          ret <- select $ from (\(_::(SqlExpr (Entity BlogPost))) -> return countRows)
+          liftIO $ ret `shouldBe` [Value (3::Int)]
+          liftIO $ cnt `shouldBe` 3
+
     describe "Math-related functions" $ do
       it "rand returns result in random order" $
         run $ do
