diff --git a/lib/manager/npm/lookup/filter.js b/lib/manager/npm/lookup/filter.js
index 2d3b17b10ac7a63aa03fe71d318506ecb92e2650..1b89d770350217fd0ec587ef2acb88d5a7cdae89 100644
--- a/lib/manager/npm/lookup/filter.js
+++ b/lib/manager/npm/lookup/filter.js
@@ -12,6 +12,9 @@ module.exports = {
 
 function filterVersions(config, fromVersion, latestVersion, versions) {
   const { ignoreUnstable, respectLatest } = config;
+  if (!fromVersion) {
+    return [];
+  }
   // Leave only versions greater than current
   let filteredVersions = versions.filter(version =>
     isGreaterThan(version, fromVersion)
diff --git a/lib/manager/npm/lookup/index.js b/lib/manager/npm/lookup/index.js
index 5bf108c9a65cb6bdbf5b0aa5ba8b769cdeec7310..50394b6df31a023b7973eb953f938d3886fb2c87 100644
--- a/lib/manager/npm/lookup/index.js
+++ b/lib/manager/npm/lookup/index.js
@@ -36,8 +36,9 @@ function lookupUpdates(dependency, config) {
   const allSatisfyingVersions = allVersions.filter(version =>
     matches(version, currentVersion)
   );
+  const updates = [];
   if (!allSatisfyingVersions.length) {
-    return getRollbackUpdate(config, allVersions);
+    updates.push(getRollbackUpdate(config, allVersions));
   }
   const fromVersion = getFromVersion(
     currentVersion,
@@ -45,7 +46,6 @@ function lookupUpdates(dependency, config) {
     lockedVersion,
     allVersions
   );
-  const updates = [];
   if (isRange(currentVersion) && config.rangeStrategy === 'pin') {
     updates.push({
       type: 'pin',
diff --git a/lib/manager/npm/lookup/rollback.js b/lib/manager/npm/lookup/rollback.js
index 92724ed0d89ffab62e04543d3a6c7e6ae969e868..921207541bee3762e7f5acfceeb9166b28e4b053 100644
--- a/lib/manager/npm/lookup/rollback.js
+++ b/lib/manager/npm/lookup/rollback.js
@@ -30,17 +30,15 @@ function getRollbackUpdate(config, versions) {
   const toVersion = lessThanVersions.pop();
   let fromVersion;
   const newVersion = rangify(config, currentVersion, fromVersion, toVersion);
-  return [
-    {
-      type: 'rollback',
-      branchName:
-        '{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x',
-      commitMessageAction: 'Roll back',
-      isRollback: true,
-      newVersion,
-      newVersionMajor: getMajor(toVersion),
-      semanticCommitType: 'fix',
-      unpublishable: false,
-    },
-  ];
+  return {
+    type: 'rollback',
+    branchName:
+      '{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x',
+    commitMessageAction: 'Roll back',
+    isRollback: true,
+    newVersion,
+    newVersionMajor: getMajor(toVersion),
+    semanticCommitType: 'fix',
+    unpublishable: false,
+  };
 }
diff --git a/lib/versioning/semver/range.js b/lib/versioning/semver/range.js
index e55ade1c2437f38425b1253cb09a810489f384dc..3e95cb254a07d74e2c32f06aa8a71c64f439d740 100644
--- a/lib/versioning/semver/range.js
+++ b/lib/versioning/semver/range.js
@@ -56,7 +56,10 @@ function rangify(config, currentVersion, fromVersion, toVersion) {
     return null;
   }
   if (element.operator === '^') {
-    if (fromVersion && major(toVersion) === major(fromVersion)) {
+    if (!fromVersion) {
+      return `^${toVersion}`;
+    }
+    if (major(toVersion) === major(fromVersion)) {
       if (major(toVersion) === 0) {
         if (minor(toVersion) === 0) {
           return `^${toVersion}`;
diff --git a/test/manager/npm/__snapshots__/lookup.spec.js.snap b/test/manager/npm/__snapshots__/lookup.spec.js.snap
index dbff4230ba8f5d387b7059b8dc21aade96a97cf4..74e9abc55674c966d8ef31c444e7bbbcdc3ec54e 100644
--- a/test/manager/npm/__snapshots__/lookup.spec.js.snap
+++ b/test/manager/npm/__snapshots__/lookup.spec.js.snap
@@ -352,29 +352,38 @@ Array [
 ]
 `;
 
-exports[`manager/npm/lookup .lookupUpdates() returns rollback if range not found 1`] = `
+exports[`manager/npm/lookup .lookupUpdates() returns rollback for pinned version 1`] = `
 Array [
   Object {
     "branchName": "{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x",
     "commitMessageAction": "Roll back",
     "isRollback": true,
-    "newVersion": "^2.0.0",
-    "newVersionMajor": 2,
+    "newVersion": "0.9.7",
+    "newVersionMajor": 0,
     "semanticCommitType": "fix",
     "type": "rollback",
     "unpublishable": false,
   },
+  Object {
+    "fromVersion": "0.9.99",
+    "newVersion": "1.4.1",
+    "newVersionMajor": 1,
+    "newVersionMinor": 4,
+    "toVersion": "1.4.1",
+    "type": "major",
+    "unpublishable": false,
+  },
 ]
 `;
 
-exports[`manager/npm/lookup .lookupUpdates() should allow unstable versions if ignoreUnstable is false 1`] = `
+exports[`manager/npm/lookup .lookupUpdates() returns rollback for ranged version 1`] = `
 Array [
   Object {
     "branchName": "{{{branchPrefix}}}rollback-{{{depNameSanitized}}}-{{{newVersionMajor}}}.x",
     "commitMessageAction": "Roll back",
     "isRollback": true,
-    "newVersion": "1.0.0-beta",
-    "newVersionMajor": 1,
+    "newVersion": "^0.9.7",
+    "newVersionMajor": 0,
     "semanticCommitType": "fix",
     "type": "rollback",
     "unpublishable": false,
diff --git a/test/manager/npm/lookup.spec.js b/test/manager/npm/lookup.spec.js
index 19f01519aa6e6e93fd442eb6bec31e67729e23d2..95c5f310b490437c3ac8b51d7947ac3fb3a0c89e 100644
--- a/test/manager/npm/lookup.spec.js
+++ b/test/manager/npm/lookup.spec.js
@@ -27,8 +27,12 @@ describe('manager/npm/lookup', () => {
       expect(res).toHaveLength(1);
       expect(res[0]).toMatchSnapshot();
     });
-    it('returns rollback if range not found', () => {
-      config.currentVersion = '^8.4.0';
+    it('returns rollback for pinned version', () => {
+      config.currentVersion = '0.9.99';
+      expect(lookup.lookupUpdates(qJson, config)).toMatchSnapshot();
+    });
+    it('returns rollback for ranged version', () => {
+      config.currentVersion = '^0.9.99';
       expect(lookup.lookupUpdates(qJson, config)).toMatchSnapshot();
     });
     it('supports minor and major upgrades for tilde ranges', () => {
@@ -355,19 +359,19 @@ describe('manager/npm/lookup', () => {
     it('should allow unstable versions if the ignoreUnstable=false', () => {
       config.currentVersion = '1.0.0';
       config.ignoreUnstable = false;
-      expect(
-        lookup.lookupUpdates(
-          {
-            name: 'amazing-package',
-            versions: {
-              '1.0.0-beta': {},
-              '1.0.0': {},
-              '1.1.0-beta': {},
-            },
+      const res = lookup.lookupUpdates(
+        {
+          name: 'amazing-package',
+          versions: {
+            '1.0.0-beta': {},
+            '1.0.0': {},
+            '1.1.0-beta': {},
           },
-          config
-        )
-      ).toMatchSnapshot();
+        },
+        config
+      );
+      expect(res).toMatchSnapshot();
+      expect(res).toHaveLength(1);
     });
     it('should allow unstable versions if the current version is unstable', () => {
       config.currentVersion = '1.0.0-beta';
@@ -384,22 +388,6 @@ describe('manager/npm/lookup', () => {
         )
       ).toMatchSnapshot();
     });
-    it('should allow unstable versions if ignoreUnstable is false', () => {
-      config.currentVersion = '1.0.0';
-      config.ignoreUnstable = false;
-      expect(
-        lookup.lookupUpdates(
-          {
-            name: 'amazing-package',
-            versions: {
-              '1.0.0-beta': {},
-              '1.1.0-beta': {},
-            },
-          },
-          config
-        )
-      ).toMatchSnapshot();
-    });
     it('should treat zero zero tilde ranges as 0.0.x', () => {
       config.rangeStrategy = 'replace';
       config.currentVersion = '~0.0.34';