diff --git a/lib/manager/ansible-galaxy/extract.ts b/lib/manager/ansible-galaxy/extract.ts
index 1cd3edf22bb076c5449de630516f9c26e487623b..d299cbf4c0c90f6a3d3d471f345691406f4d94c5 100644
--- a/lib/manager/ansible-galaxy/extract.ts
+++ b/lib/manager/ansible-galaxy/extract.ts
@@ -2,6 +2,7 @@ import { logger } from '../../logger';
 import { PackageFile, PackageDependency } from '../common';
 import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourceGalaxy from '../../datasource/galaxy';
+import { SkipReason } from '../../types';
 
 function interpretLine(
   lineMatch: RegExpMatchArray,
@@ -40,7 +41,7 @@ function interpretLine(
 function finalize(dependency: PackageDependency): boolean {
   const dep = dependency;
   if (dependency.managerData.version === null) {
-    dep.skipReason = 'no-version';
+    dep.skipReason = SkipReason.NoVersion;
     return false;
   }
 
@@ -58,7 +59,7 @@ function finalize(dependency: PackageDependency): boolean {
     dep.depName = dep.managerData.src;
     dep.lookupName = dep.managerData.src;
   } else {
-    dep.skipReason = 'no-source-match';
+    dep.skipReason = SkipReason.NoSourceMatch;
     return false;
   }
   if (dep.managerData.name !== null) {
diff --git a/lib/manager/bazel/extract.ts b/lib/manager/bazel/extract.ts
index 1390bc9a24a931a13520d144bbd4606618a2d76b..e496bf0649aab3f34dfb66311d6618aaa3e4efac 100644
--- a/lib/manager/bazel/extract.ts
+++ b/lib/manager/bazel/extract.ts
@@ -8,6 +8,7 @@ import * as dockerVersioning from '../../versioning/docker';
 import * as datasourceDocker from '../../datasource/docker';
 import * as datasourceGo from '../../datasource/go';
 import * as datasourceGithubReleases from '../../datasource/github-releases';
+import { SkipReason } from '../../types';
 
 interface UrlParsedResult {
   repo: string;
@@ -202,7 +203,7 @@ export function extractPackageFile(content: string): PackageFile | null {
         if (remoteMatch && remoteMatch[0].length === remote.length) {
           dep.lookupName = remote.replace('https://', '');
         } else {
-          dep.skipReason = 'unsupported-remote';
+          dep.skipReason = SkipReason.UnsupportedRemote;
         }
       }
       if (commit) {
diff --git a/lib/manager/buildkite/extract.ts b/lib/manager/buildkite/extract.ts
index 8b83061f17aa4c4d4f66aad950334100ddfb3a5e..8685446b41e0f50cd9623cc229ef7e60db9a1ef4 100644
--- a/lib/manager/buildkite/extract.ts
+++ b/lib/manager/buildkite/extract.ts
@@ -2,6 +2,7 @@ import { logger } from '../../logger';
 import { isVersion } from '../../versioning/semver';
 import { PackageFile, PackageDependency } from '../common';
 import * as datasourceGithubTags from '../../datasource/github-tags';
+import { SkipReason } from '../../types';
 
 export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
@@ -29,17 +30,17 @@ export function extractPackageFile(content: string): PackageFile | null {
         } else if (depLineMatch) {
           const { depName, currentValue } = depLineMatch.groups;
           logger.trace('depLineMatch');
-          let skipReason: string;
+          let skipReason: SkipReason;
           let repo: string;
           if (depName.startsWith('https://') || depName.startsWith('git@')) {
             logger.debug({ dependency: depName }, 'Skipping git plugin');
-            skipReason = 'git-plugin';
+            skipReason = SkipReason.GitPlugin;
           } else if (!isVersion(currentValue)) {
             logger.debug(
               { currentValue },
               'Skipping non-pinned current version'
             );
-            skipReason = 'invalid-version';
+            skipReason = SkipReason.InvalidVersion;
           } else {
             const splitName = depName.split('/');
             if (splitName.length === 1) {
@@ -51,7 +52,7 @@ export function extractPackageFile(content: string): PackageFile | null {
                 { dependency: depName },
                 'Something is wrong with buildkite plugin name'
               );
-              skipReason = 'unknown';
+              skipReason = SkipReason.Unknown;
             }
           }
           const dep: PackageDependency = {
diff --git a/lib/manager/bundler/extract.ts b/lib/manager/bundler/extract.ts
index 1088d015221a82df04c7c2a319cf7712630ca67b..2b3938286d3ce714255d3d0330d6d3ff4cff16d2 100644
--- a/lib/manager/bundler/extract.ts
+++ b/lib/manager/bundler/extract.ts
@@ -4,6 +4,7 @@ import { platform } from '../../platform';
 import { regEx } from '../../util/regex';
 import { extractLockFileEntries } from './locked-version';
 import * as datasourceRubygems from '../../datasource/rubygems';
+import { SkipReason } from '../../types';
 
 export async function extractPackageFile(
   content: string,
@@ -57,7 +58,7 @@ export async function extractPackageFile(
           .replace(regEx(gemDelimiter, 'g'), '')
           .trim();
       } else {
-        dep.skipReason = 'no-version';
+        dep.skipReason = SkipReason.NoVersion;
       }
       if (!dep.skipReason) {
         dep.datasource = datasourceRubygems.id;
diff --git a/lib/manager/cargo/extract.ts b/lib/manager/cargo/extract.ts
index a1b0904649bba0368ff7c389d8d2106b1ac9f5f2..353b803db55f636cfda55ac873253e6f17b6455e 100644
--- a/lib/manager/cargo/extract.ts
+++ b/lib/manager/cargo/extract.ts
@@ -3,6 +3,7 @@ import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import { CargoConfig, CargoSection } from './types';
 import * as datasourceCrate from '../../datasource/crate';
+import { SkipReason } from '../../types';
 
 function extractFromSection(
   parsedContent: CargoSection,
@@ -15,7 +16,7 @@ function extractFromSection(
     return [];
   }
   Object.keys(sectionContent).forEach(depName => {
-    let skipReason: string;
+    let skipReason: SkipReason;
     let currentValue = sectionContent[depName];
     let nestedVersion = false;
     if (typeof currentValue !== 'string') {
@@ -26,20 +27,20 @@ function extractFromSection(
         currentValue = version;
         nestedVersion = true;
         if (path) {
-          skipReason = 'path-dependency';
+          skipReason = SkipReason.PathDependency;
         }
         if (git) {
-          skipReason = 'git-dependency';
+          skipReason = SkipReason.GitDependency;
         }
       } else if (path) {
         currentValue = '';
-        skipReason = 'path-dependency';
+        skipReason = SkipReason.PathDependency;
       } else if (git) {
         currentValue = '';
-        skipReason = 'git-dependency';
+        skipReason = SkipReason.GitDependency;
       } else {
         currentValue = '';
-        skipReason = 'invalid-dependency-specification';
+        skipReason = SkipReason.InvalidDependencySpecification;
       }
     }
     const dep: PackageDependency = {
diff --git a/lib/manager/cocoapods/extract.ts b/lib/manager/cocoapods/extract.ts
index 12730742064668ce863e38c0d7f2a5cbed9b6c0e..93ae76caee379c00145e6bd9cead9069675db492 100644
--- a/lib/manager/cocoapods/extract.ts
+++ b/lib/manager/cocoapods/extract.ts
@@ -2,6 +2,7 @@ import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import * as datasourcePod from '../../datasource/pod';
 import * as datasourceGithubTags from '../../datasource/github-tags';
+import { SkipReason } from '../../types';
 
 const regexMappings = [
   /^\s*pod\s+(['"])(?<spec>[^'"/]+)(\/(?<subspec>[^'"]+))?\1/,
@@ -96,7 +97,7 @@ export function extractPackageFile(content: string): PackageFile | null {
       let dep: PackageDependency = {
         depName,
         groupName,
-        skipReason: 'unknown-version',
+        skipReason: SkipReason.UnknownVersion,
       };
 
       if (currentValue) {
@@ -115,14 +116,14 @@ export function extractPackageFile(content: string): PackageFile | null {
           dep = {
             depName,
             groupName,
-            skipReason: 'git-dependency',
+            skipReason: SkipReason.GitDependency,
           };
         }
       } else if (path) {
         dep = {
           depName,
           groupName,
-          skipReason: 'path-dependency',
+          skipReason: SkipReason.PathDependency,
         };
       }
 
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index bcbab989b6a6b94060bf100dc5b550bd04871b94..2a81ecd28675c084fe96a43e57cd5f645a8b45e8 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -1,5 +1,5 @@
 import { ReleaseType } from 'semver';
-import { RangeStrategy } from '../types';
+import { RangeStrategy, SkipReason } from '../types';
 import { ValidationMessage, GlobalConfig, UpdateType } from '../config/common';
 
 export type Result<T> = T | Promise<T>;
@@ -149,7 +149,7 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> {
   propSource?: string;
   registryUrls?: string[];
   rangeStrategy?: RangeStrategy;
-  skipReason?: string;
+  skipReason?: SkipReason;
   source?: string;
   sourceLine?: number;
   toVersion?: string;
diff --git a/lib/manager/composer/extract.ts b/lib/manager/composer/extract.ts
index b520f7cfe7e86b225694b0a2e97935ea7fbc65c6..5744369b89bfbba8f272785914a7a09b1838a8e9 100644
--- a/lib/manager/composer/extract.ts
+++ b/lib/manager/composer/extract.ts
@@ -3,7 +3,7 @@ import { logger } from '../../logger';
 import { api as semverComposer } from '../../versioning/composer';
 import { PackageFile, PackageDependency } from '../common';
 import { platform } from '../../platform';
-
+import { SkipReason } from '../../types';
 import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourcePackagist from '../../datasource/packagist';
 
@@ -154,10 +154,10 @@ export async function extractPackageFile(
             dep.lookupName = lookupName;
           }
           if (!depName.includes('/')) {
-            dep.skipReason = 'unsupported';
+            dep.skipReason = SkipReason.Unsupported;
           }
           if (currentValue === '*') {
-            dep.skipReason = 'any-version';
+            dep.skipReason = SkipReason.AnyVersion;
           }
           if (lockParsed) {
             const lockedDep = lockParsed.packages.find(
diff --git a/lib/manager/dockerfile/extract.ts b/lib/manager/dockerfile/extract.ts
index 70e57fdd5d0fca834d8ae5d89e1048ff127e47cf..fae5f194f4d168d633615352124bf4e7a1eba88a 100644
--- a/lib/manager/dockerfile/extract.ts
+++ b/lib/manager/dockerfile/extract.ts
@@ -1,11 +1,12 @@
 import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import * as datasourceDocker from '../../datasource/docker';
+import { SkipReason } from '../../types';
 
 export function splitImageParts(currentFrom: string): PackageDependency {
   if (currentFrom.includes('$')) {
     return {
-      skipReason: 'contains-variable',
+      skipReason: SkipReason.ContainsVariable,
     };
   }
   const [currentDepTag, currentDigest] = currentFrom.split('@');
diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts
index 7a7124689444510884850584d7fd4eae4d789748..83a5dcef7ab69a190abb5037cc0294ef15171003 100644
--- a/lib/manager/gitlabci-include/extract.ts
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -3,6 +3,7 @@ import yaml from 'js-yaml';
 import { logger } from '../../logger';
 import { PackageDependency, ExtractConfig, PackageFile } from '../common';
 import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
+import { SkipReason } from '../../types';
 
 function extractDepFromInclude(includeObj: {
   file: any;
@@ -18,7 +19,7 @@ function extractDepFromInclude(includeObj: {
     depType: 'repository',
   };
   if (!includeObj.ref) {
-    dep.skipReason = 'unknown-version';
+    dep.skipReason = SkipReason.UnknownVersion;
     return dep;
   }
   dep.currentValue = includeObj.ref;
diff --git a/lib/manager/gomod/extract.ts b/lib/manager/gomod/extract.ts
index 0e45ac0ef6bd10db2b3da7a2ade92e63886390f2..839bfdb4f71e1e85155e7ddff27f8fccda2666d3 100644
--- a/lib/manager/gomod/extract.ts
+++ b/lib/manager/gomod/extract.ts
@@ -2,6 +2,7 @@ import { logger } from '../../logger';
 import { isVersion } from '../../versioning/semver';
 import { PackageDependency, PackageFile } from '../common';
 import * as datasourceGo from '../../datasource/go';
+import { SkipReason } from '../../types';
 
 function getDep(
   lineNumber: number,
@@ -20,7 +21,7 @@ function getDep(
     currentValue,
   };
   if (!isVersion(currentValue)) {
-    dep.skipReason = 'unsupported-version';
+    dep.skipReason = SkipReason.UnsupportedVersion;
   } else {
     if (depName.startsWith('gopkg.in/')) {
       const [pkg] = depName.replace('gopkg.in/', '').split('.');
diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts
index e3a751bdfab4fb24f45964182fcac47cf3b88d1b..90b266bd3a3bd30ad9586367c21fde00ffb54e72 100644
--- a/lib/manager/helm-requirements/extract.ts
+++ b/lib/manager/helm-requirements/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
 import upath from 'upath';
 import yaml from 'js-yaml';
-
+import { SkipReason } from '../../types';
 import { logger } from '../../logger';
 import { PackageFile, PackageDependency, ExtractConfig } from '../common';
 import { platform } from '../../platform';
@@ -59,20 +59,20 @@ export async function extractPackageFile(
           return res;
         }
 
-        res.skipReason = 'placeholder-url';
+        res.skipReason = SkipReason.PlaceholderUrl;
       } else {
         try {
           const url = new URL(dep.repository);
           if (url.protocol === 'file:') {
-            res.skipReason = 'local-dependency';
+            res.skipReason = SkipReason.LocalDependency;
           }
         } catch (err) {
           logger.debug({ err }, 'Error parsing url');
-          res.skipReason = 'invalid-url';
+          res.skipReason = SkipReason.InvalidUrl;
         }
       }
     } else {
-      res.skipReason = 'no-repository';
+      res.skipReason = SkipReason.NoRepository;
     }
     return res;
   });
diff --git a/lib/manager/helmfile/extract.ts b/lib/manager/helmfile/extract.ts
index 278af59c0e1516202c1d3595019e74e6aae27468..662a9647fbb04931e420acd29d0260a2400db20c 100644
--- a/lib/manager/helmfile/extract.ts
+++ b/lib/manager/helmfile/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
 import yaml from 'js-yaml';
-
+import { SkipReason } from '../../types';
 import { logger } from '../../logger';
 import { PackageFile, PackageDependency, ExtractConfig } from '../common';
 import * as datasourceHelm from '../../datasource/helm';
@@ -65,18 +65,18 @@ export function extractPackageFile(
 
     // If version is null is probably a local chart
     if (!res.currentValue) {
-      res.skipReason = 'local-chart';
+      res.skipReason = SkipReason.LocalChart;
     }
 
     // By definition on helm the chart name should be lowecase letter + number + -
     // However helmfile support templating of that field
     if (!isValidChartName(res.depName)) {
-      res.skipReason = 'unsupported-chart-type';
+      res.skipReason = SkipReason.UnsupportedChartType;
     }
 
     // Skip in case we cannot locate the registry
     if (is.emptyArray(res.registryUrls)) {
-      res.skipReason = 'unknown-registry';
+      res.skipReason = SkipReason.UnknownRegistry;
     }
 
     return res;
diff --git a/lib/manager/homebrew/extract.ts b/lib/manager/homebrew/extract.ts
index 1abb7e44daf02a86d02a427eabcd5564d106746e..454ff063abf9a823e5f63b94f025c12e67190756 100644
--- a/lib/manager/homebrew/extract.ts
+++ b/lib/manager/homebrew/extract.ts
@@ -2,6 +2,7 @@ import { skip, isSpace, removeComments } from './util';
 import { logger } from '../../logger';
 import { PackageFile, PackageDependency } from '../common';
 import * as datasourceGithubTags from '../../datasource/github-tags';
+import { SkipReason } from '../../types';
 
 function parseSha256(idx: number, content: string): string | null {
   let i = idx;
@@ -167,7 +168,7 @@ export function extractPackageFile(content: string): PackageFile | null {
     logger.debug('Invalid URL field');
   }
   const urlPathResult = parseUrlPath(url);
-  let skipReason: string;
+  let skipReason: SkipReason;
   let currentValue: string = null;
   let ownerName: string = null;
   let repoName: string = null;
@@ -177,12 +178,12 @@ export function extractPackageFile(content: string): PackageFile | null {
     repoName = urlPathResult.repoName;
   } else {
     logger.debug('Error: Unsupported URL field');
-    skipReason = 'unsupported-url';
+    skipReason = SkipReason.UnsupportedUrl;
   }
   const sha256 = extractSha256(cleanContent);
   if (!sha256 || sha256.length !== 64) {
     logger.debug('Error: Invalid sha256 field');
-    skipReason = 'invalid-sha256';
+    skipReason = SkipReason.InvalidSha256;
   }
   const dep: PackageDependency = {
     depName: `${ownerName}/${repoName}`,
diff --git a/lib/manager/maven/extract.ts b/lib/manager/maven/extract.ts
index 9cef6388d55ff642e84a0e6b24ec761e567de572..43893ba20673a473987b3a68cc7e86e13ebdd249 100644
--- a/lib/manager/maven/extract.ts
+++ b/lib/manager/maven/extract.ts
@@ -6,6 +6,7 @@ import { ExtractConfig, PackageFile, PackageDependency } from '../common';
 import { platform } from '../../platform';
 import * as datasourceMaven from '../../datasource/maven';
 import { MAVEN_REPO } from '../../datasource/maven/common';
+import { SkipReason } from '../../types';
 
 export function parsePom(raw: string): XmlDocument | null {
   let project: XmlDocument;
@@ -125,9 +126,9 @@ function applyProps(
   }
 
   if (containsPlaceholder(depName)) {
-    result.skipReason = 'name-placeholder';
+    result.skipReason = SkipReason.NamePlaceholder;
   } else if (containsPlaceholder(currentValue)) {
-    result.skipReason = 'version-placeholder';
+    result.skipReason = SkipReason.VersionPlaceholder;
   }
 
   return result;
diff --git a/lib/manager/mix/extract.ts b/lib/manager/mix/extract.ts
index b592001307162d8f7f88a97f95364bd6667dc66a..0cb543e4fb527ab4a274ece4525f3161e57d0002 100644
--- a/lib/manager/mix/extract.ts
+++ b/lib/manager/mix/extract.ts
@@ -1,6 +1,7 @@
 import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import * as datasourceHex from '../../datasource/hex';
+import { SkipReason } from '../../types';
 
 const depSectionRegExp = /defp\s+deps.*do/g;
 const depMatchRegExp = /{:(\w+),\s*([^:"]+)?:?\s*"([^"]+)",?\s*(organization: "(.*)")?.*}/gm;
@@ -45,7 +46,7 @@ export function extractPackageFile(content: string): PackageFile {
           }
 
           if (dep.datasource !== datasourceHex.id) {
-            dep.skipReason = 'non-hex depTypes';
+            dep.skipReason = SkipReason.NonHexDeptypes;
           }
 
           // Find dep's line number
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 6a239084dd503eebc26b5f8b076e9b6009ebe3aa..3bfb283c3449ddf9f8fb88d83c00b2b68cc4c440 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -4,7 +4,7 @@ import { join } from 'upath';
 import validateNpmPackageName from 'validate-npm-package-name';
 import is from '@sindresorhus/is';
 import { logger } from '../../../logger';
-
+import { SkipReason } from '../../../types';
 import { getLockedVersions } from './locked-versions';
 import { detectMonorepos } from './monorepo';
 import { mightBeABrowserLibrary } from './type';
@@ -145,11 +145,11 @@ export async function extractPackageFile(
   ): PackageDependency {
     const dep: PackageDependency = {};
     if (!validateNpmPackageName(depName).validForOldPackages) {
-      dep.skipReason = 'invalid-name';
+      dep.skipReason = SkipReason.InvalidName;
       return dep;
     }
     if (typeof input !== 'string') {
-      dep.skipReason = 'invalid-value';
+      dep.skipReason = SkipReason.InvalidValue;
       return dep;
     }
     dep.currentValue = input.trim();
@@ -165,10 +165,10 @@ export async function extractPackageFile(
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'npm';
       } else {
-        dep.skipReason = 'unknown-engines';
+        dep.skipReason = SkipReason.UnknownEngines;
       }
       if (!isValid(dep.currentValue)) {
-        dep.skipReason = 'unknown-version';
+        dep.skipReason = SkipReason.UnknownVersion;
       }
       return dep;
     }
@@ -183,10 +183,10 @@ export async function extractPackageFile(
         dep.datasource = datasourceNpm.id;
         dep.commitMessageTopic = 'Yarn';
       } else {
-        dep.skipReason = 'unknown-volta';
+        dep.skipReason = SkipReason.UnknownVolta;
       }
       if (!isValid(dep.currentValue)) {
-        dep.skipReason = 'unknown-version';
+        dep.skipReason = SkipReason.UnknownVersion;
       }
       return dep;
     }
@@ -205,23 +205,23 @@ export async function extractPackageFile(
       }
     }
     if (dep.currentValue.startsWith('file:')) {
-      dep.skipReason = 'file';
+      dep.skipReason = SkipReason.File;
       hasFileRefs = true;
       return dep;
     }
     if (isValid(dep.currentValue)) {
       dep.datasource = datasourceNpm.id;
       if (dep.currentValue === '*') {
-        dep.skipReason = 'any-version';
+        dep.skipReason = SkipReason.AnyVersion;
       }
       if (dep.currentValue === '') {
-        dep.skipReason = 'empty';
+        dep.skipReason = SkipReason.Empty;
       }
       return dep;
     }
     const hashSplit = dep.currentValue.split('#');
     if (hashSplit.length !== 2) {
-      dep.skipReason = 'unknown-version';
+      dep.skipReason = SkipReason.UnknownVersion;
       return dep;
     }
     const [depNamePart, depRefPart] = hashSplit;
@@ -232,7 +232,7 @@ export async function extractPackageFile(
       .replace(/\.git$/, '');
     const githubRepoSplit = githubOwnerRepo.split('/');
     if (githubRepoSplit.length !== 2) {
-      dep.skipReason = 'unknown-version';
+      dep.skipReason = SkipReason.UnknownVersion;
       return dep;
     }
     const [githubOwner, githubRepo] = githubRepoSplit;
@@ -241,7 +241,7 @@ export async function extractPackageFile(
       !githubValidRegex.test(githubOwner) ||
       !githubValidRegex.test(githubRepo)
     ) {
-      dep.skipReason = 'unknown-version';
+      dep.skipReason = SkipReason.UnknownVersion;
       return dep;
     }
     if (isVersion(depRefPart)) {
@@ -260,7 +260,7 @@ export async function extractPackageFile(
       dep.datasource = datasourceGithubTags.id;
       dep.lookupName = githubOwnerRepo;
     } else {
-      dep.skipReason = 'unversioned-reference';
+      dep.skipReason = SkipReason.UnversionedReference;
       return dep;
     }
     dep.githubRepo = githubOwnerRepo;
diff --git a/lib/manager/nuget/__snapshots__/extract.spec.ts.snap b/lib/manager/nuget/__snapshots__/extract.spec.ts.snap
index 4b965dc465c87b89498de8a953cdf8cf87659390..35604872ad0112dd3c41e51c09438418c0bc97b6 100644
--- a/lib/manager/nuget/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/nuget/__snapshots__/extract.spec.ts.snap
@@ -109,7 +109,7 @@ Array [
     "managerData": Object {
       "lineNumber": 23,
     },
-    "skipReason": "not-version",
+    "skipReason": "not-a-version",
   },
   Object {
     "currentValue": "1.2.3",
diff --git a/lib/manager/nuget/extract.ts b/lib/manager/nuget/extract.ts
index 4891ada92e70d8d6733e43d2021248492e87de18..beda76e4fb9adf65ea92a18a2421610843527693 100644
--- a/lib/manager/nuget/extract.ts
+++ b/lib/manager/nuget/extract.ts
@@ -3,6 +3,7 @@ import { get } from '../../versioning';
 import { PackageDependency, ExtractConfig, PackageFile } from '../common';
 import * as semverVersioning from '../../versioning/semver';
 import * as datasourceNuget from '../../datasource/nuget';
+import { SkipReason } from '../../types';
 
 export function extractPackageFile(
   content: string,
@@ -41,7 +42,7 @@ export function extractPackageFile(
         datasource: datasourceNuget.id,
       };
       if (!isVersion(currentValue)) {
-        dep.skipReason = 'not-version';
+        dep.skipReason = SkipReason.NotAVersion;
       }
       deps.push(dep);
     }
diff --git a/lib/manager/pip_requirements/extract.ts b/lib/manager/pip_requirements/extract.ts
index eb8e7d95ccbc4b5361e17205d3aed1d5a5c97e5b..4274a71a28eb51b20a18c45a94ca7af382b2ac50 100644
--- a/lib/manager/pip_requirements/extract.ts
+++ b/lib/manager/pip_requirements/extract.ts
@@ -4,6 +4,7 @@ import { logger } from '../../logger';
 import { isSkipComment } from '../../util/ignore';
 import { ExtractConfig, PackageDependency, PackageFile } from '../common';
 import * as datasourcePypi from '../../datasource/pypi';
+import { SkipReason } from '../../types';
 
 export const packagePattern =
   '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]';
@@ -53,7 +54,7 @@ export function extractPackageFile(
       let dep: PackageDependency = {};
       const [line, comment] = rawline.split('#').map(part => part.trim());
       if (isSkipComment(comment)) {
-        dep.skipReason = 'ignored';
+        dep.skipReason = SkipReason.Ignored;
       }
       regex.lastIndex = 0;
       const matches = regex.exec(line);
diff --git a/lib/manager/pip_setup/extract.ts b/lib/manager/pip_setup/extract.ts
index fe7dab277c2354e9e0861db16effe843081e9bdc..47e4429bd25c371a2a10e1392ebb68fafaccd30c 100644
--- a/lib/manager/pip_setup/extract.ts
+++ b/lib/manager/pip_setup/extract.ts
@@ -6,6 +6,7 @@ import { dependencyPattern } from '../pip_requirements/extract';
 import { ExtractConfig, PackageFile, PackageDependency } from '../common';
 import * as datasourcePypi from '../../datasource/pypi';
 import { BinarySource } from '../../util/exec/common';
+import { SkipReason } from '../../types';
 
 export const pythonVersions = ['python', 'python3', 'python3.8'];
 let pythonAlias: string | null = null;
@@ -127,7 +128,7 @@ export async function extractPackageFile(
       let dep: PackageDependency = {};
       const [, comment] = rawline.split('#').map(part => part.trim());
       if (isSkipComment(comment)) {
-        dep.skipReason = 'ignored';
+        dep.skipReason = SkipReason.Ignored;
       }
       regex.lastIndex = 0;
       const matches = regex.exec(req);
diff --git a/lib/manager/pipenv/extract.ts b/lib/manager/pipenv/extract.ts
index 980e8d71733b667e0b1e806c1173472bb78ff97e..5f53f8b72cc5dc7a4cdbfbcf73819f6a76bbe471 100644
--- a/lib/manager/pipenv/extract.ts
+++ b/lib/manager/pipenv/extract.ts
@@ -4,6 +4,7 @@ import { RANGE_PATTERN } from '@renovate/pep440/lib/specifier';
 import { logger } from '../../logger';
 import { PackageFile, PackageDependency } from '../common';
 import * as datasourcePypi from '../../datasource/pypi';
+import { SkipReason } from '../../types';
 
 // based on https://www.python.org/dev/peps/pep-0508/#names
 const packageRegex = /^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$/i;
@@ -49,23 +50,23 @@ function extractFromSection(
       const [depName, requirements] = x;
       let currentValue: string;
       let nestedVersion: boolean;
-      let skipReason: string;
+      let skipReason: SkipReason;
       if (requirements.git) {
-        skipReason = 'git-dependency';
+        skipReason = SkipReason.GitDependency;
       } else if (requirements.file) {
-        skipReason = 'file-dependency';
+        skipReason = SkipReason.FileDependency;
       } else if (requirements.path) {
-        skipReason = 'local-dependency';
+        skipReason = SkipReason.LocalDependency;
       } else if (requirements.version) {
         currentValue = requirements.version;
         nestedVersion = true;
       } else if (is.object(requirements)) {
-        skipReason = 'any-version';
+        skipReason = SkipReason.AnyVersion;
       } else {
         currentValue = requirements;
       }
       if (currentValue === '*') {
-        skipReason = 'any-version';
+        skipReason = SkipReason.AnyVersion;
       }
       if (!skipReason) {
         const packageMatches = packageRegex.exec(depName);
@@ -73,14 +74,14 @@ function extractFromSection(
           logger.debug(
             `Skipping dependency with malformed package name "${depName}".`
           );
-          skipReason = 'invalid-name';
+          skipReason = SkipReason.InvalidName;
         }
         const specifierMatches = specifierRegex.exec(currentValue);
         if (!specifierMatches) {
           logger.debug(
             `Skipping dependency with malformed version specifier "${currentValue}".`
           );
-          skipReason = 'invalid-version';
+          skipReason = SkipReason.InvalidVersion;
         }
       }
       const dep: PackageDependency = {
diff --git a/lib/manager/poetry/extract.ts b/lib/manager/poetry/extract.ts
index ff7e57c5e6788dd866c03df7baa3d7beda818223..ba4f945e878052cf977864a29e14f06ebfa8ccd4 100644
--- a/lib/manager/poetry/extract.ts
+++ b/lib/manager/poetry/extract.ts
@@ -4,6 +4,7 @@ import { logger } from '../../logger';
 import { PackageFile, PackageDependency } from '../common';
 import { PoetryFile, PoetrySection } from './types';
 import * as datasourcePypi from '../../datasource/pypi';
+import { SkipReason } from '../../types';
 
 function extractFromSection(
   parsedFile: PoetryFile,
@@ -15,7 +16,7 @@ function extractFromSection(
     return [];
   }
   Object.keys(sectionContent).forEach(depName => {
-    let skipReason: string;
+    let skipReason: SkipReason;
     let currentValue = sectionContent[depName];
     let nestedVersion = false;
     if (typeof currentValue !== 'string') {
@@ -26,20 +27,20 @@ function extractFromSection(
         currentValue = version;
         nestedVersion = true;
         if (path) {
-          skipReason = 'path-dependency';
+          skipReason = SkipReason.PathDependency;
         }
         if (git) {
-          skipReason = 'git-dependency';
+          skipReason = SkipReason.GitDependency;
         }
       } else if (path) {
         currentValue = '';
-        skipReason = 'path-dependency';
+        skipReason = SkipReason.PathDependency;
       } else if (git) {
         currentValue = '';
-        skipReason = 'git-dependency';
+        skipReason = SkipReason.GitDependency;
       } else {
         currentValue = '';
-        skipReason = 'multiple-constraint-dep';
+        skipReason = SkipReason.MultipleConstraintDep;
       }
     }
     const dep: PackageDependency = {
@@ -52,7 +53,7 @@ function extractFromSection(
     if (skipReason) {
       dep.skipReason = skipReason;
     } else if (!isValid(dep.currentValue)) {
-      dep.skipReason = 'unknown-version';
+      dep.skipReason = SkipReason.UnknownVersion;
     }
     deps.push(dep);
   });
diff --git a/lib/manager/pub/extract.ts b/lib/manager/pub/extract.ts
index 935c8345c53e98796208b49e6e7ed1f446be6a41..2f9332667c3c5a8c4562863727883367ec830cce 100644
--- a/lib/manager/pub/extract.ts
+++ b/lib/manager/pub/extract.ts
@@ -2,6 +2,7 @@ import { safeLoad } from 'js-yaml';
 import { logger } from '../../logger';
 import { PackageDependency, PackageFile } from '../common';
 import * as datasourceDart from '../../datasource/dart';
+import { SkipReason } from '../../types';
 
 function getDeps(
   depsObj: { [x: string]: any },
@@ -23,7 +24,7 @@ function getDeps(
 
     const dep: PackageDependency = { ...preset, depName, currentValue };
     if (!currentValue) {
-      dep.skipReason = 'not-a-version';
+      dep.skipReason = SkipReason.NotAVersion;
     }
 
     return [...acc, dep];
diff --git a/lib/manager/terraform/extract.ts b/lib/manager/terraform/extract.ts
index a57c504a7fda23c3dba43032f63d9c7b2efbc353..adaa6cf62f262443f266271d1bb631120ac474a3 100644
--- a/lib/manager/terraform/extract.ts
+++ b/lib/manager/terraform/extract.ts
@@ -5,6 +5,7 @@ import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourceGithubTags from '../../datasource/github-tags';
 import * as datasourceTerraformModule from '../../datasource/terraform-module';
 import * as datasourceTerraformProvider from '../../datasource/terraform-provider';
+import { SkipReason } from '../../types';
 
 export enum TerraformDependencyTypes {
   unknown = 'unknown',
@@ -101,7 +102,7 @@ export function extractPackageFile(content: string): PackageFile | null {
         dep.lookupName = githubRefMatch[2];
         dep.managerData.lineNumber = dep.sourceLine;
         if (!isVersion(dep.currentValue)) {
-          dep.skipReason = 'unsupported-version';
+          dep.skipReason = SkipReason.UnsupportedVersion;
         }
       } else if (gitTagsRefMatch) {
         dep.depType = 'gitTags';
@@ -112,12 +113,12 @@ export function extractPackageFile(content: string): PackageFile | null {
         dep.lookupName = gitTagsRefMatch[1];
         dep.managerData.lineNumber = dep.sourceLine;
         if (!isVersion(dep.currentValue)) {
-          dep.skipReason = 'unsupported-version';
+          dep.skipReason = SkipReason.UnsupportedVersion;
         }
       } else if (dep.source) {
         const moduleParts = dep.source.split('//')[0].split('/');
         if (moduleParts[0] === '..') {
-          dep.skipReason = 'local';
+          dep.skipReason = SkipReason.Local;
         } else if (moduleParts.length >= 3) {
           dep.depType = 'terraform';
           dep.depName = moduleParts.join('/');
@@ -127,7 +128,7 @@ export function extractPackageFile(content: string): PackageFile | null {
         }
       } else {
         logger.debug({ dep }, 'terraform dep has no source');
-        dep.skipReason = 'no-source';
+        dep.skipReason = SkipReason.NoSource;
       }
     } else if (
       dep.managerData.terraformDependencyType ===
@@ -140,10 +141,10 @@ export function extractPackageFile(content: string): PackageFile | null {
       dep.datasource = datasourceTerraformProvider.id;
       if (dep.managerData.lineNumber) {
         if (!isValid(dep.currentValue)) {
-          dep.skipReason = 'unsupported-version';
+          dep.skipReason = SkipReason.UnsupportedVersion;
         }
       } else if (!dep.skipReason) {
-        dep.skipReason = 'no-version';
+        dep.skipReason = SkipReason.NoVersion;
       }
     }
     delete dep.sourceLine;
diff --git a/lib/types/index.ts b/lib/types/index.ts
index 95cfeb6540df3972082b69c746558f8cdad9ba91..fbc1cdb92d312aefe040d0f375a72ce36a2b4480 100644
--- a/lib/types/index.ts
+++ b/lib/types/index.ts
@@ -1,3 +1,4 @@
 export * from './host-rules';
+export * from './skip-reason';
 export * from './versioning';
 export * from './branch-status';
diff --git a/lib/types/skip-reason.ts b/lib/types/skip-reason.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aab3912f5df8f5b644256fc7c8aa6b4de592c0b8
--- /dev/null
+++ b/lib/types/skip-reason.ts
@@ -0,0 +1,44 @@
+export enum SkipReason {
+  AnyVersion = 'any-version',
+  ContainsVariable = 'contains-variable',
+  Disabled = 'disabled',
+  Empty = 'empty',
+  FileDependency = 'file-dependency',
+  File = 'file',
+  GitDependency = 'git-dependency',
+  GitPlugin = 'git-plugin',
+  Ignored = 'ignored',
+  InternalPackage = 'internal-package',
+  InvalidDependencySpecification = 'invalid-dependency-specification',
+  InvalidName = 'invalid-name',
+  InvalidSha256 = 'invalid-sha256',
+  InvalidUrl = 'invalid-url',
+  InvalidValue = 'invalid-value',
+  InvalidVersion = 'invalid-version',
+  LocalChart = 'local-chart',
+  LocalDependency = 'local-dependency',
+  Local = 'local',
+  MultipleConstraintDep = 'multiple-constraint-dep',
+  NamePlaceholder = 'name-placeholder',
+  NoRepository = 'no-repository',
+  NoSourceMatch = 'no-source-match',
+  NoSource = 'no-source',
+  NoVersion = 'no-version',
+  NonHexDeptypes = 'non-hex depTypes',
+  NotAVersion = 'not-a-version',
+  PathDependency = 'path-dependency',
+  PlaceholderUrl = 'placeholder-url',
+  UnknownEngines = 'unknown-engines',
+  UnknownRegistry = 'unknown-registry',
+  UnknownVersion = 'unknown-version',
+  UnknownVolta = 'unknown-volta',
+  Unknown = 'unknown',
+  UnsupportedChartType = 'unsupported-chart-type',
+  UnsupportedRemote = 'unsupported-remote',
+  UnsupportedUrl = 'unsupported-url',
+  UnsupportedValue = 'unsupported-value',
+  UnsupportedVersion = 'unsupported-version',
+  Unsupported = 'unsupported',
+  UnversionedReference = 'unversioned-reference',
+  VersionPlaceholder = 'version-placeholder',
+}
diff --git a/lib/workers/repository/process/fetch.ts b/lib/workers/repository/process/fetch.ts
index 58ffdc128f7acb575973709dba0a6f78f7cdf272..ef60ba0d23e5a11bbf5c459cf3dcaf2aa1144f6c 100644
--- a/lib/workers/repository/process/fetch.ts
+++ b/lib/workers/repository/process/fetch.ts
@@ -15,6 +15,7 @@ import {
   PackageDependency,
   PackageUpdateResult,
 } from '../../../manager/common';
+import { SkipReason } from '../../../types';
 
 async function fetchDepUpdates(
   packageFileConfig: ManagerConfig & PackageFile,
@@ -32,7 +33,7 @@ async function fetchDepUpdates(
   depConfig = applyPackageRules(depConfig);
   if (depConfig.ignoreDeps.includes(depName)) {
     logger.debug({ dependency: dep.depName }, 'Dependency is ignored');
-    dep.skipReason = 'ignored';
+    dep.skipReason = SkipReason.Ignored;
   } else if (
     depConfig.internalPackages &&
     depConfig.internalPackages.includes(depName)
@@ -41,10 +42,10 @@ async function fetchDepUpdates(
       { dependency: dep.depName },
       'Dependency is ignored due to being internal'
     );
-    dep.skipReason = 'internal-package';
+    dep.skipReason = SkipReason.InternalPackage;
   } else if (depConfig.enabled === false) {
     logger.debug({ dependency: dep.depName }, 'Dependency is disabled');
-    dep.skipReason = 'disabled';
+    dep.skipReason = SkipReason.Disabled;
   } else {
     let lookupResults: UpdateResult | PackageUpdateResult[];
     if (depConfig.datasource) {
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index db625850ac0e4476d87c070e62bb1b352584e460..fdc6c5652c3c8f108be84eb54797b90a637b6c0b 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -14,6 +14,7 @@ import { RangeConfig } from '../../../../manager/common';
 import { RenovateConfig, UpdateType } from '../../../../config';
 import { clone } from '../../../../util/clone';
 import * as datasourceGitSubmodules from '../../../../datasource/git-submodules';
+import { SkipReason } from '../../../../types';
 
 export interface LookupWarning {
   updateType: 'warning';
@@ -28,7 +29,7 @@ export interface UpdateResult {
   homepage?: string;
   deprecationMessage?: string;
   sourceUrl?: string;
-  skipReason?: string;
+  skipReason: SkipReason;
   releases: Release[];
 
   updates: LookupUpdate[];
@@ -138,7 +139,7 @@ export async function lookupUpdates(
   const res: UpdateResult = { updates: [], warnings: [] } as any;
 
   const isValid = currentValue && version.isValid(currentValue);
-  if (!isValid) res.skipReason = 'invalid-value';
+  if (!isValid) res.skipReason = SkipReason.InvalidValue;
 
   if (isValid) {
     const dependency = clone(await getPkgReleases(config));
@@ -344,11 +345,11 @@ export async function lookupUpdates(
     }
     res.updates = res.updates.concat(Object.values(buckets));
   } else if (!currentValue) {
-    res.skipReason = 'unsupported-value';
+    res.skipReason = SkipReason.UnsupportedValue;
   } else {
     logger.debug(`Dependency ${depName} has unsupported value ${currentValue}`);
     if (!config.pinDigests && !config.currentDigest) {
-      res.skipReason = 'unsupported-value';
+      res.skipReason = SkipReason.UnsupportedValue;
     } else {
       delete res.skipReason;
     }