diff --git a/eventium-sql-common.cabal b/eventium-sql-common.cabal
--- a/eventium-sql-common.cabal
+++ b/eventium-sql-common.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           eventium-sql-common
-version:        0.3.2
+version:        0.4.0
 synopsis:       Common library for SQL event stores
 description:    Eventium-sql-common provides shared utilities and abstractions for SQL-based event stores.
                 It includes Persistent entity definitions, JSON serialization helpers, and common database
@@ -51,7 +51,7 @@
       aeson >=1.5 && <2.3
     , base >=4.9 && <5
     , bytestring >=0.10 && <0.13
-    , eventium-core >=0.3.0 && <0.4.0
+    , eventium-core >=0.4.0 && <0.5.0
     , mtl >=2.2 && <2.4
     , persistent >=2.14 && <2.18
     , text >=1.2 && <2.2
diff --git a/src/Eventium/Store/Sql/Operations.hs b/src/Eventium/Store/Sql/Operations.hs
--- a/src/Eventium/Store/Sql/Operations.hs
+++ b/src/Eventium/Store/Sql/Operations.hs
@@ -155,15 +155,16 @@
   (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text) ->
   UUID ->
   [serialized] ->
-  SqlPersistT m EventVersion
+  SqlPersistT m EventWriteResult
 sqlStoreEvents config mLockCommand maxVersionSql uid events = do
   versionNum <- sqlMaxEventVersion config maxVersionSql uid
-  let entities = zipWith (\v e -> config.sequenceMakeEntity uid v e Nothing) [versionNum + 1 ..] events
+  let vers = take (length events) [versionNum + 1 ..]
+      entities = zipWith (\v e -> config.sequenceMakeEntity uid v e Nothing) vers events
   -- NB: We need to take a lock on the events table or else the global sequence
   -- numbers may not increase monotonically over time.
   for_ mLockCommand $ \lockCommand -> rawExecute (lockCommand tableName) []
-  _ <- insertMany entities
-  return $ versionNum + EventVersion (length events)
+  keys <- insertMany entities
+  return $ zip vers (map config.unKey keys)
   where
     tableName = unEntityNameDB $ tableDBName (config.sequenceMakeEntity nil 0 undefined Nothing)
 
@@ -176,10 +177,11 @@
   (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text) ->
   UUID ->
   [TaggedEvent serialized] ->
-  SqlPersistT m EventVersion
+  SqlPersistT m EventWriteResult
 sqlStoreEventsTagged config mLockCommand maxVersionSql uid taggedEvents = do
   versionNum <- sqlMaxEventVersion config maxVersionSql uid
-  let entities =
+  let vers = take (length taggedEvents) [versionNum + 1 ..]
+      entities =
         zipWith
           ( \v (TaggedEvent meta e) ->
               config.sequenceMakeEntity
@@ -188,11 +190,11 @@
                 e
                 (Just $ encodeJSON meta)
           )
-          [versionNum + 1 ..]
+          vers
           taggedEvents
   for_ mLockCommand $ \lockCommand -> rawExecute (lockCommand tableName) []
-  _ <- insertMany entities
-  return $ versionNum + EventVersion (length taggedEvents)
+  keys <- insertMany entities
+  return $ zip vers (map config.unKey keys)
   where
     tableName = unEntityNameDB $ tableDBName (config.sequenceMakeEntity nil 0 undefined Nothing)
 
