diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 2.8.1
+
+* Implemented `connPutManySql` to utilize batched `putMany`. [#770](https://github.com/yesodweb/persistent/pull/770)
+
 ## 2.8.0
 
 * Switch from `MonadBaseControl` to `MonadUnliftIO`
diff --git a/Database/Persist/Postgresql.hs b/Database/Persist/Postgresql.hs
--- a/Database/Persist/Postgresql.hs
+++ b/Database/Persist/Postgresql.hs
@@ -31,7 +31,7 @@
     ) where
 
 import Database.Persist.Sql
-import Database.Persist.Sql.Util (dbIdColumnsEsc)
+import Database.Persist.Sql.Util (dbIdColumnsEsc, commaSeparated, parenWrapped)
 import Database.Persist.Sql.Types.Internal (mkPersistBackend)
 import Data.Fixed (Pico)
 
@@ -123,7 +123,7 @@
 --
 -- @since 2.6.2
 withPostgresqlPoolWithVersion :: (MonadUnliftIO m, MonadLogger m, IsSqlBackend backend)
-                              => (PG.Connection -> IO (Maybe Double)) 
+                              => (PG.Connection -> IO (Maybe Double))
                               -- ^ action to perform to get the server version
                               -> ConnectionString
                               -- ^ Connection string to the database.
@@ -225,9 +225,10 @@
 -- | Choose upsert sql generation function based on postgresql version.
 -- PostgreSQL version >= 9.5 supports native upsert feature,
 -- so depending upon that we have to choose how the sql query is generated.
-upsertFunction :: Double -> Maybe (EntityDef -> Text -> Text)
-upsertFunction version = if (version >= 9.5)
-                         then Just upsertSql'
+-- upsertFunction :: Double -> Maybe (EntityDef -> Text -> Text)
+upsertFunction :: a -> Double -> Maybe a
+upsertFunction f version = if (version >= 9.5)
+                         then Just f
                          else Nothing
 
 
@@ -248,7 +249,8 @@
         , connStmtMap    = smap
         , connInsertSql  = insertSql'
         , connInsertManySql = Just insertManySql'
-        , connUpsertSql  = maybe Nothing upsertFunction serverVersion
+        , connUpsertSql  = serverVersion >>= upsertFunction upsertSql'
+        , connPutManySql = serverVersion >>= upsertFunction putManySql
         , connClose      = PG.close conn
         , connMigrateSql = migrate'
         , connBegin      = const $ PG.begin    conn
@@ -328,7 +330,7 @@
                 , ") VALUES ("
                 , T.intercalate "),(" $ replicate (length valss) $ T.intercalate "," $ map (const "?") (entityFields ent)
                 , ") RETURNING "
-                , T.intercalate ", " $ dbIdColumnsEsc escape ent
+                , commaSeparated $ dbIdColumnsEsc escape ent
                 ]
   in ISRSingle sql
 
@@ -1171,6 +1173,7 @@
                              connInsertManySql = Nothing,
                              connInsertSql = undefined,
                              connUpsertSql = Nothing,
+                             connPutManySql = Nothing,
                              connStmtMap = smap,
                              connClose = undefined,
                              connMigrateSql = mockMigrate,
@@ -1186,6 +1189,33 @@
       result = runReaderT $ runWriterT $ runWriterT mig
   resp <- result sqlbackend
   mapM_ T.putStrLn $ map snd $ snd resp
+
+putManySql :: EntityDef -> Int -> Text
+putManySql entityDef' numRecords
+  | numRecords > 0 = q
+  | otherwise = error "putManySql: numRecords MUST be greater than 0!"
+  where
+    tableName' = escape . entityDB $ entityDef'
+    fieldDbToText = escape . fieldDB
+    entityFieldNames = map fieldDbToText (entityFields entityDef')
+    recordPlaceholders= parenWrapped . commaSeparated
+                      $ map (const "?") (entityFields entityDef')
+    mkAssignment n = T.concat [n, "=EXCLUDED.", n]
+    fieldSets = map (mkAssignment . fieldDbToText) (entityFields entityDef')
+    uniqueFields' = concat $ map (\x -> map escape (map snd $ uniqueFields x)) (entityUniques entityDef')
+    q = T.concat
+        [ "INSERT INTO "
+        , tableName'
+        , " ("
+        , commaSeparated entityFieldNames
+        , ") "
+        , " VALUES "
+        , commaSeparated (replicate numRecords recordPlaceholders)
+        , "  ON CONFLICT ("
+        , commaSeparated uniqueFields'
+        , ") DO UPDATE SET "
+        , commaSeparated fieldSets
+        ]
 
 -- | Enable a Postgres extension. See https://www.postgresql.org/docs/10/static/contrib.html
 -- for a list.
diff --git a/persistent-postgresql.cabal b/persistent-postgresql.cabal
--- a/persistent-postgresql.cabal
+++ b/persistent-postgresql.cabal
@@ -1,5 +1,5 @@
 name:            persistent-postgresql
-version:         2.8.0
+version:         2.8.1
 license:         MIT
 license-file:    LICENSE
 author:          Felipe Lessa, Michael Snoyman <michael@snoyman.com>
@@ -19,7 +19,7 @@
                    , transformers          >= 0.2.1
                    , postgresql-simple     >= 0.4.0    && < 0.6
                    , postgresql-libpq      >= 0.6.1    && < 0.10
-                   , persistent            >= 2.8.0    && < 3
+                   , persistent            >= 2.8.1    && < 3
                    , containers            >= 0.2
                    , bytestring            >= 0.9
                    , text                  >= 0.7
