diff --git a/src/models/__tests__/base.model.test.js b/src/models/__tests__/base.model.test.js
index 7e61e9313123b8b311f4bac329483e2b36b50940..e87e855d60f1dfb10d48e4a2de2e29c0fed1b795 100644
--- a/src/models/__tests__/base.model.test.js
+++ b/src/models/__tests__/base.model.test.js
@@ -335,7 +335,7 @@ describe('Base model', () => {
     const newEntity2 = await Fake.insert({})
     const affectedRows = await Fake.deleteByIds([newEntity1.id, newEntity2.id])
     const { result } = await Fake.find({})
-    expect(affectedRows).toEqual(2)
+    expect(affectedRows).toEqual([newEntity1.id, newEntity2.id])
     expect(result).toHaveLength(0)
   })
 
diff --git a/src/models/__tests__/user.controller.test.js b/src/models/__tests__/user.controller.test.js
index 7a9973f93d2158e169aa73f341c8f3d4dd4a6a99..dbfc3a2b9d1ff1d12f22f136a39915eabb4b3d82 100644
--- a/src/models/__tests__/user.controller.test.js
+++ b/src/models/__tests__/user.controller.test.js
@@ -1,7 +1,8 @@
-const { User } = require('../index')
+const { User, Identity } = require('../index')
 
 const {
   createUser,
+  createUserAndDefaultIdentity,
   createUserWithPasswordAndIdentities,
   createUserWithPasswordAndDefaultIdentity,
 } = require('./helpers/users')
@@ -94,20 +95,44 @@ describe('User Controller', () => {
   })
 
   it('can delete an existing user', async () => {
-    const user = await createUser()
+    const { user } = await createUserAndDefaultIdentity()
     await deleteUser(user.id)
     const { result: fetchedUsers } = await getUsers()
     expect(fetchedUsers).toHaveLength(0)
   })
 
   it('can delete  multiple users', async () => {
-    const user1 = await createUser()
-    const user2 = await createUser()
+    const { user: user1 } = await createUserAndDefaultIdentity()
+    const { user: user2 } = await createUserAndDefaultIdentity()
     await deleteUsers([user1.id, user2.id])
     const { result: fetchedUsers } = await getUsers()
     expect(fetchedUsers).toHaveLength(0)
   })
 
+  it('can delete user identities when deleting a user', async () => {
+    const { user } = await createUserAndDefaultIdentity()
+    await deleteUser(user.id)
+    const { result: userIdentities } = await Identity.find({ userId: user.id })
+    expect(userIdentities).toHaveLength(0)
+  })
+
+  it("can delete users' identities when deleting multiple users", async () => {
+    const { user: user1 } = await createUserAndDefaultIdentity()
+    const { user: user2 } = await createUserAndDefaultIdentity()
+    await deleteUsers([user1.id, user2.id])
+
+    const { result: identitiesUser1 } = await Identity.find({
+      userId: user1.id,
+    })
+
+    const { result: identitiesUser2 } = await Identity.find({
+      userId: user2.id,
+    })
+
+    expect(identitiesUser1).toHaveLength(0)
+    expect(identitiesUser2).toHaveLength(0)
+  })
+
   it('can update user current password', async () => {
     const { user } = await createUserWithPasswordAndDefaultIdentity('password1')
     await updatePassword(user.id, 'password1', 'password2')
diff --git a/src/models/base.model.js b/src/models/base.model.js
index 99d6c82493e0c41bca9dca55cbf0b808d4581137..d3a920c0e0f41ae1169fb207df4c4916a0768c84 100644
--- a/src/models/base.model.js
+++ b/src/models/base.model.js
@@ -298,7 +298,7 @@ class BaseModel extends PubsweetBaseModel {
             throw new Error(`id ${delta} not found`)
           }
 
-          return result.length
+          return result.map(u => u.id)
         },
         {
           trx,
diff --git a/src/models/user/user.controller.js b/src/models/user/user.controller.js
index 79914d24c9e8053fe9efede230a4283061f3cb42..854bbcc71eef1d6e4a20a5e8c92e46155f7586b9 100644
--- a/src/models/user/user.controller.js
+++ b/src/models/user/user.controller.js
@@ -109,6 +109,12 @@ const deleteUser = async (id, options = {}) => {
         logger.info(
           `${USER_CONTROLLER} deleteUser: removing user with id ${id}`,
         )
+        // find all identities for user
+        const identities = await Identity.find({ userId: id }, { trx: tr })
+        const ids = identities.result.map(identity => identity.id)
+        // delete identities by the ids we found above
+        await Identity.deleteByIds(ids, { trx: tr })
+        // then delete user
         return User.deleteById(id, { trx: tr })
       },
       { trx, passedTrxOnly: true },
@@ -127,6 +133,16 @@ const deleteUsers = async (ids, options = {}) => {
         logger.info(
           `${USER_CONTROLLER} deleteUser: removing users with ids ${ids}`,
         )
+        // for each user id in ids, find related identities and delete them
+        await Promise.all(
+          ids.map(async userId => {
+            const identities = await Identity.find({ userId }, { trx: tr })
+
+            const identityIds = identities.result.map(({ id }) => id)
+            await Identity.deleteByIds(identityIds, { trx: tr })
+          }),
+        )
+        // then delete the users
         return User.deleteByIds(ids, { trx: tr })
       },
       { trx, passedTrxOnly: true },