diff --git a/lib/config/validation.js b/lib/config/validation.js
index b8dbea7b4bf88e6623aae03b970e0314e7a821f4..8c146badf2154311bec7ab3d00d7bf2f4e565345 100644
--- a/lib/config/validation.js
+++ b/lib/config/validation.js
@@ -12,7 +12,7 @@ module.exports = {
   validateConfig,
 };
 
-async function validateConfig(config) {
+async function validateConfig(config, parentPath) {
   if (!optionTypes) {
     optionTypes = {};
     options.forEach(option => {
@@ -48,6 +48,7 @@ async function validateConfig(config) {
   }
 
   for (const [key, val] of Object.entries(config)) {
+    const currentPath = parentPath ? `${parentPath}.${key}` : key;
     if (
       !isIgnored(key) && // We need to ignore some reserved keys
       !isAFunction(val) // Ignore all functions
@@ -55,14 +56,14 @@ async function validateConfig(config) {
       if (!optionTypes[key]) {
         errors.push({
           depName: 'Configuration Error',
-          message: `Invalid configuration option: \`${key}\``,
+          message: `Invalid configuration option: \`${currentPath}\``,
         });
       } else if (key === 'schedule') {
         const [validSchedule, errorMessage] = hasValidSchedule(val);
         if (!validSchedule) {
           errors.push({
             depName: 'Configuration Error',
-            message: `Invalid schedule: \`${errorMessage}\``,
+            message: `Invalid ${currentPath}: \`${errorMessage}\``,
           });
         }
       } else if (key === 'timezone' && val !== null) {
@@ -70,14 +71,14 @@ async function validateConfig(config) {
         if (!validTimezone) {
           errors.push({
             depName: 'Configuration Error',
-            message: errorMessage,
+            message: `${currentPath}: ${errorMessage}`,
           });
         }
       } else if (key === 'allowedVersions' && val !== null) {
         if (!isValidSemver(val)) {
           errors.push({
             depName: 'Configuration Error',
-            message: `Invalid semver range for allowedVersions: \`${val}\``,
+            message: `Invalid semver range for ${currentPath}: \`${val}\``,
           });
         }
       } else if (val != null) {
@@ -86,7 +87,7 @@ async function validateConfig(config) {
           if (val !== true && val !== false) {
             errors.push({
               depName: 'Configuration Error',
-              message: `Configuration option \`${key}\` should be boolean. Found: ${JSON.stringify(
+              message: `Configuration option \`${currentPath}\` should be boolean. Found: ${JSON.stringify(
                 val
               )} (${typeof val})`,
             });
@@ -95,13 +96,14 @@ async function validateConfig(config) {
           if (!Array.isArray(val)) {
             errors.push({
               depName: 'Configuration Error',
-              message: `Configuration option \`${key}\` should be a list (Array)`,
+              message: `Configuration option \`${currentPath}\` should be a list (Array)`,
             });
           } else {
-            for (const subval of val) {
+            for (const [subIndex, subval] of val.entries()) {
               if (isObject(subval)) {
                 const subValidation = await module.exports.validateConfig(
-                  subval
+                  subval,
+                  `${currentPath}[${subIndex}]`
                 );
                 warnings = warnings.concat(subValidation.warnings);
                 errors = errors.concat(subValidation.errors);
@@ -117,7 +119,7 @@ async function validateConfig(config) {
                   if (!validTimezone) {
                     errors.push({
                       depName: 'Configuration Error',
-                      message: errorMessage,
+                      message: `${currentPath}: ${errorMessage}`,
                     });
                   }
                 }
@@ -141,7 +143,7 @@ async function validateConfig(config) {
                     }
                   }
                   if (!hasSelector) {
-                    const message = `Each packageRule must contain at least one selector (${selectors.join(
+                    const message = `${currentPath}: Each packageRule must contain at least one selector (${selectors.join(
                       ', '
                     )}). If you wish for configuration to apply to all packages, it is not necessary to place it inside a packageRule at all.`;
                     errors.push({
@@ -152,7 +154,7 @@ async function validateConfig(config) {
                 } else {
                   errors.push({
                     depName: 'Configuration Error',
-                    message: 'packageRules must contain JSON objects',
+                    message: `${currentPath} must contain JSON objects`,
                   });
                 }
               }
@@ -166,7 +168,7 @@ async function validateConfig(config) {
               } catch (e) {
                 errors.push({
                   depName: 'Configuration Error',
-                  message: `Invalid regExp for ${key}: \`${val}\``,
+                  message: `Invalid regExp for ${currentPath}: \`${val}\``,
                 });
               }
             }
@@ -175,18 +177,21 @@ async function validateConfig(config) {
           if (!isString(val)) {
             errors.push({
               depName: 'Configuration Error',
-              message: `Configuration option \`${key}\` should be a string`,
+              message: `Configuration option \`${currentPath}\` should be a string`,
             });
           }
         } else if (type === 'json') {
           if (isObject(val)) {
-            const subValidation = await module.exports.validateConfig(val);
+            const subValidation = await module.exports.validateConfig(
+              val,
+              currentPath
+            );
             warnings = warnings.concat(subValidation.warnings);
             errors = errors.concat(subValidation.errors);
           } else {
             errors.push({
               depName: 'Configuration Error',
-              message: `Configuration option \`${key}\` should be a json object`,
+              message: `Configuration option \`${currentPath}\` should be a json object`,
             });
           }
         }
diff --git a/test/config/__snapshots__/validation.spec.js.snap b/test/config/__snapshots__/validation.spec.js.snap
index dc3e1b49874243f5aa6cf33a55fb1ccf7a35acec..2d94c737f2227083124032af39cbe52cb56abecb 100644
--- a/test/config/__snapshots__/validation.spec.js.snap
+++ b/test/config/__snapshots__/validation.spec.js.snap
@@ -16,7 +16,7 @@ Array [
   },
   Object {
     "depName": "Configuration Error",
-    "message": "Invalid timezone: Asia",
+    "message": "timezone: Invalid timezone: Asia",
   },
   Object {
     "depName": "Configuration Error",
@@ -40,15 +40,15 @@ Array [
   },
   Object {
     "depName": "Configuration Error",
-    "message": "Invalid timezone: Europe/Brussel",
+    "message": "extends: Invalid timezone: Europe/Brussel",
   },
   Object {
     "depName": "Configuration Error",
-    "message": "Invalid configuration option: \`foo\`",
+    "message": "Invalid configuration option: \`packageRules[1].foo\`",
   },
   Object {
     "depName": "Configuration Error",
-    "message": "Each packageRule must contain at least one selector (depTypeList, packageNames, packagePatterns, excludePackageNames, excludePackagePatterns). If you wish for configuration to apply to all packages, it is not necessary to place it inside a packageRule at all.",
+    "message": "packageRules: Each packageRule must contain at least one selector (depTypeList, packageNames, packagePatterns, excludePackageNames, excludePackagePatterns). If you wish for configuration to apply to all packages, it is not necessary to place it inside a packageRule at all.",
   },
   Object {
     "depName": "Configuration Error",
@@ -65,7 +65,7 @@ Array [
   },
   Object {
     "depName": "Configuration Error",
-    "message": "Invalid configuration option: \`bar\`",
+    "message": "Invalid configuration option: \`lockFileMaintenance.bar\`",
   },
 ]
 `;