diff --git a/lib/excelsior/error.rb b/lib/excelsior/error.rb
new file mode 100644
index 0000000000000000000000000000000000000000..849361969f64fc77ba9bf00133ddc582f5a3efe4
--- /dev/null
+++ b/lib/excelsior/error.rb
@@ -0,0 +1,3 @@
+module Excelsior
+  Error = Struct.new(:row, :errors)
+end
diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb
index 455ee544dd3fc3d8dde5a0a181cf3e5b64f1deb8..fd17e4285e828b273d892803c3ecb1c5e78f749d 100644
--- a/lib/excelsior/import.rb
+++ b/lib/excelsior/import.rb
@@ -3,6 +3,7 @@ require 'rails'
 require 'active_record'
 require 'excelsior/source'
 require 'excelsior/mapping'
+require 'excelsior/error'
 
 module Excelsior
   class Import
@@ -26,12 +27,13 @@ module Excelsior
     end
 
     def run # takes an optional block
-      @rows.map do |row|
+      @rows.map.with_index do |row, i|
         attributes = map_row_values(row, @columns)
         if block_given?
           yield attributes
         else
-          model_class.create!(attributes)
+          record = model_class.create(attributes)
+          add_model_errors(record, i)
         end
       end
     end
@@ -52,5 +54,13 @@ module Excelsior
     def model_class
       self.class.name.gsub("Import", "").constantize
     end
+
+    def add_model_errors(record, index)
+      return if record.errors.empty?
+
+      @errors[:model] ||= []
+
+      @errors[:model] << Error.new(index + 1, record.errors.full_messages)
+    end
   end
 end
diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb
index adafe5fdd598954831d2cd2957c39ad6b504ce03..40b3c3feec892f48d5b0a5cbbc1e263d1137e36d 100644
--- a/test/excelsior_test.rb
+++ b/test/excelsior_test.rb
@@ -15,6 +15,7 @@ end
 
 class ExcelsiorTest < Minitest::Test
   def setup
+    User.delete_all
     @import = UserImport.new
   end
 
@@ -74,4 +75,10 @@ class ExcelsiorTest < Minitest::Test
     import = UserImport.new("test/files/missing-column.xlsx")
     assert import.errors[:missing_column].any?
   end
+
+  def test_model_validations
+    import = UserImport.new("test/files/missing-first-name.xlsx").tap(&:run)
+    assert import.errors[:model].any?
+    assert_equal import.errors[:model], [Excelsior::Error.new(3, ["First name can't be blank"])]
+  end
 end
diff --git a/test/files/missing-first-name.xlsx b/test/files/missing-first-name.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..56f6349dbf85db3ad7986cca64c9c5f9c02d4d22
Binary files /dev/null and b/test/files/missing-first-name.xlsx differ