diff --git a/lib/workers/package/index.js b/lib/workers/package/index.js
index 1ba8ee86135cdaf584f6ee19e64714dc3c9856dd..526e220435c7770b1231a8d507d9d9e8045ccdac 100644
--- a/lib/workers/package/index.js
+++ b/lib/workers/package/index.js
@@ -11,11 +11,21 @@ module.exports = {
 // Returns all results for a given dependency config
 async function renovatePackage(config) {
   const logger = config.logger || pLogger;
+  logger.trace(`renovatePackage(${config.depName})`);
   if (config.enabled === false) {
     logger.debug('package is disabled');
     return [];
   }
   let results = [];
+  if (!versions.isValidVersion(config.currentVersion)) {
+    results.push({
+      depName: config.depName,
+      type: 'warning',
+      message: `Dependency uses tag "\`${config.currentVersion}\`" as its version so that will never be changed by Renovate`,
+    });
+    logger.debug(results[0].message);
+    return results;
+  }
   const npmDep = await npmApi.getDependency(config.depName, logger);
   if (npmDep) {
     results = await versions.determineUpgrades(npmDep, config);
diff --git a/lib/workers/package/versions.js b/lib/workers/package/versions.js
index 7afbda5eaa7fb67ef593d87f90ca7dc6d06fa74f..8a0b7ca023fd4f19afe494d98005c44302a85662 100644
--- a/lib/workers/package/versions.js
+++ b/lib/workers/package/versions.js
@@ -19,11 +19,6 @@ function determineUpgrades(npmDep, config) {
     type: 'warning',
   };
   const currentVersion = config.currentVersion;
-  if (!isValidVersion(currentVersion)) {
-    result.message = `Dependency uses tag "${currentVersion}" as its version so that will never be changed`;
-    logger.debug(result.message);
-    return [result];
-  }
   const versions = npmDep.versions;
   if (!versions || Object.keys(versions).length === 0) {
     result.message = `No versions returned from registry for this package`;
diff --git a/test/workers/package/__snapshots__/index.spec.js.snap b/test/workers/package/__snapshots__/index.spec.js.snap
index cda4561fda69bca902dbd99c70b010052f7b5c40..7f80bfe9a11f3a129255a48299bb8cc61811bbb1 100644
--- a/test/workers/package/__snapshots__/index.spec.js.snap
+++ b/test/workers/package/__snapshots__/index.spec.js.snap
@@ -24,6 +24,166 @@ Array [
   "assignees",
   "reviewers",
   "depName",
+  "currentVersion",
   "repositoryUrl",
 ]
 `;
+
+exports[`lib/workers/package/index renovatePackage(config) returns error if no npm dep found 1`] = `
+Array [
+  Object {
+    "assignees": Array [],
+    "automerge": "none",
+    "automergeType": "pr",
+    "branchName": "renovate/{{depName}}-{{newVersionMajor}}.x",
+    "commitMessage": "{{semanticPrefix}}Update dependency {{depName}} to version {{newVersion}}",
+    "currentVersion": "1.0.0",
+    "depName": "foo",
+    "group": Object {
+      "branchName": "renovate/{{groupSlug}}",
+      "commitMessage": "{{semanticPrefix}}Renovate {{groupName}} packages",
+      "prBody": "This {{#if isGitHub}}Pull{{else}}Merge{{/if}} Request renovates the package group \\"{{groupName}}\\".
+
+{{#if schedule}}
+**Note**: This PR was created on a configured schedule (\\"{{schedule}}\\"{{#if timezone}} in timezone \`{{timezone}}\`{{/if}}) and will not receive updates outside those times.
+{{/if}}
+
+{{#each upgrades as |upgrade|}}
+-   [{{upgrade.depName}}]({{upgrade.repositoryUrl}}): from \`{{upgrade.currentVersion}}\` to \`{{upgrade.newVersion}}\`
+{{/each}}
+
+{{#unless isPin}}
+### Commits
+
+{{#each upgrades as |upgrade|}}
+{{#if upgrade.releases.length}}
+<details>
+<summary>{{upgrade.githubName}}</summary>
+{{#each upgrade.releases as |release|}}
+
+#### {{release.version}}
+{{#each release.commits as |commit|}}
+-   [\`{{commit.shortSha}}\`]({{commit.url}}){{commit.message}}
+{{/each}}
+{{/each}}
+
+</details>
+{{/if}}
+{{/each}}
+{{/unless}}
+<br />
+
+{{#if hasErrors}}
+
+---
+
+### Errors
+
+Renovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.
+
+{{#each errors as |error|}}
+-   \`{{error.depName}}\`: {{error.message}}
+{{/each}}
+{{/if}}
+
+{{#if hasWarnings}}
+
+---
+
+### Warnings
+
+Please make sure the following warnings are safe to ignore:
+
+{{#each warnings as |warning|}}
+-   \`{{warning.depName}}\`: {{warning.message}}
+{{/each}}
+{{/if}}
+
+---
+
+This {{#if isGitHub}}PR{{else}}MR{{/if}} has been generated by [Renovate Bot](https://renovateapp.com).",
+      "prTitle": "{{semanticPrefix}}Renovate {{groupName}} packages",
+      "recreateClosed": true,
+    },
+    "groupName": null,
+    "groupSlug": null,
+    "labels": Array [],
+    "lazyGrouping": true,
+    "message": "Failed to look up dependency",
+    "prBody": "This {{#if isGitHub}}Pull{{else}}Merge{{/if}} Request {{#if isRollback}}rolls back{{else}}updates{{/if}} dependency [{{depName}}]({{repositoryUrl}}) from version \`{{currentVersion}}\` to \`{{newVersion}}\`{{#if isRollback}}. This is necessary and important because version \`{{currentVersion}}\` cannot be found in the npm registry - probably because of it being unpublished.{{/if}}
+{{#if releases.length}}
+
+{{#if schedule}}
+**Note**: This PR was created on a configured schedule (\\"{{schedule}}\\"{{#if timezone}} in timezone \`{{timezone}}\`{{/if}}) and will not receive updates outside those times.
+{{/if}}
+
+### Commits
+
+<details>
+<summary>{{githubName}}</summary>
+
+{{#each releases as |release|}}
+#### {{release.version}}
+{{#each release.commits as |commit|}}
+-   [\`{{commit.shortSha}}\`]({{commit.url}}) {{commit.message}}
+{{/each}}
+{{/each}}
+
+</details>
+{{/if}}
+
+{{#if hasErrors}}
+
+---
+
+### Errors
+
+Renovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.
+
+{{#each errors as |error|}}
+-   \`{{error.depName}}\`: {{error.message}}
+{{/each}}
+{{/if}}
+
+{{#if hasWarnings}}
+
+---
+
+### Warnings
+
+Please make sure the following warnings are safe to ignore:
+
+{{#each warnings as |warning|}}
+-   \`{{warning.depName}}\`: {{warning.message}}
+{{/each}}
+{{/if}}
+
+---
+
+This {{#if isGitHub}}PR{{else}}MR{{/if}} has been generated by [Renovate Bot](https://renovateapp.com).",
+    "prCreation": "immediate",
+    "prTitle": "{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to version {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}{{newVersionMajor}}.x{{else}}{{newVersion}}{{/if}}{{/if}}",
+    "rebaseStalePrs": false,
+    "recreateClosed": false,
+    "repoIsOnboarded": true,
+    "repositoryUrl": "",
+    "requiredStatusChecks": Array [],
+    "reviewers": Array [],
+    "schedule": "some schedule",
+    "semanticCommits": false,
+    "semanticPrefix": "chore(deps): ",
+    "timezone": null,
+    "type": "error",
+  },
+]
+`;
+
+exports[`lib/workers/package/index renovatePackage(config) returns warning if using invalid version 1`] = `
+Array [
+  Object {
+    "depName": "foo",
+    "message": "Dependency uses tag \\"\`git+ssh://git@github.com/joefraley/eslint-config-meridian.git\`\\" as its version so that will never be changed by Renovate",
+    "type": "warning",
+  },
+]
+`;
diff --git a/test/workers/package/__snapshots__/versions.spec.js.snap b/test/workers/package/__snapshots__/versions.spec.js.snap
index 64966888becec049516f66a1647be7253e357531..d91ab568238a0a198a4a7ef1dd5b477ab58cde1c 100644
--- a/test/workers/package/__snapshots__/versions.spec.js.snap
+++ b/test/workers/package/__snapshots__/versions.spec.js.snap
@@ -109,13 +109,6 @@ Object {
 }
 `;
 
-exports[`workers/package/versions .determineUpgrades(npmDep, config) return warning if invalid current version 1`] = `
-Object {
-  "message": "Dependency uses tag \\"invalid\\" as its version so that will never be changed",
-  "type": "warning",
-}
-`;
-
 exports[`workers/package/versions .determineUpgrades(npmDep, config) return warning if null versions 1`] = `
 Object {
   "message": "No versions returned from registry for this package",
@@ -123,13 +116,6 @@ Object {
 }
 `;
 
-exports[`workers/package/versions .determineUpgrades(npmDep, config) return warning if using a known tag 1`] = `
-Object {
-  "message": "Dependency uses tag \\"next\\" as its version so that will never be changed",
-  "type": "warning",
-}
-`;
-
 exports[`workers/package/versions .determineUpgrades(npmDep, config) returns both updates if automerging minor 1`] = `
 Array [
   Object {
diff --git a/test/workers/package/index.spec.js b/test/workers/package/index.spec.js
index c617b7d33ced80f60497be1378c58bf9086766f6..ac175021ce17b59872e37bf9f1313807418611d6 100644
--- a/test/workers/package/index.spec.js
+++ b/test/workers/package/index.spec.js
@@ -5,7 +5,6 @@ const defaultConfig = require('../../../lib/config/defaults').getConfig();
 const configParser = require('../../../lib/config');
 
 jest.mock('../../../lib/workers/branch/schedule');
-jest.mock('../../../lib/workers/package/versions');
 jest.mock('../../../lib/api/npm');
 
 describe('lib/workers/package/index', () => {
@@ -14,23 +13,31 @@ describe('lib/workers/package/index', () => {
     beforeEach(() => {
       config = configParser.filterConfig(defaultConfig, 'package');
       config.depName = 'foo';
+      config.currentVersion = '1.0.0';
     });
     it('returns empty if package is disabled', async () => {
       config.enabled = false;
       const res = await pkgWorker.renovatePackage(config);
       expect(res).toMatchObject([]);
     });
+    it('returns warning if using invalid version', async () => {
+      config.currentVersion =
+        'git+ssh://git@github.com/joefraley/eslint-config-meridian.git';
+      const res = await pkgWorker.renovatePackage(config);
+      expect(res).toMatchSnapshot();
+    });
     it('returns error if no npm dep found', async () => {
       config.repoIsOnboarded = true;
       config.schedule = 'some schedule';
       const res = await pkgWorker.renovatePackage(config);
+      expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('error');
       expect(npmApi.getDependency.mock.calls.length).toBe(1);
     });
     it('returns warning if warning found', async () => {
       npmApi.getDependency.mockReturnValueOnce({});
-      versions.determineUpgrades.mockReturnValueOnce([
+      versions.determineUpgrades = jest.fn(() => [
         {
           type: 'warning',
           message: 'bad version',
@@ -41,7 +48,7 @@ describe('lib/workers/package/index', () => {
     });
     it('returns array if upgrades found', async () => {
       npmApi.getDependency.mockReturnValueOnce({});
-      versions.determineUpgrades.mockReturnValueOnce([{}]);
+      versions.determineUpgrades = jest.fn(() => [{}]);
       const res = await pkgWorker.renovatePackage(config);
       expect(res).toHaveLength(1);
       expect(Object.keys(res[0])).toMatchSnapshot();
diff --git a/test/workers/package/versions.spec.js b/test/workers/package/versions.spec.js
index ecd4468a12108bc76065415c5cd84d7c1072d2a4..e7fabd074497e134e04ac398e57ac0d7ba0a0f0f 100644
--- a/test/workers/package/versions.spec.js
+++ b/test/workers/package/versions.spec.js
@@ -11,18 +11,6 @@ describe('workers/package/versions', () => {
   });
 
   describe('.determineUpgrades(npmDep, config)', () => {
-    it('return warning if invalid current version', () => {
-      config.currentVersion = 'invalid';
-      const res = versions.determineUpgrades(qJson, config);
-      expect(res).toHaveLength(1);
-      expect(res[0]).toMatchSnapshot();
-    });
-    it('return warning if using a known tag', () => {
-      config.currentVersion = 'next';
-      const res = versions.determineUpgrades(qJson, config);
-      expect(res).toHaveLength(1);
-      expect(res[0]).toMatchSnapshot();
-    });
     it('return warning if null versions', () => {
       config.currentVersion = '1.0.0';
       const testDep = {