diff --git a/packages/builder/cypress.json b/packages/builder/cypress.json
index a68cea053f..d76078f509 100644
--- a/packages/builder/cypress.json
+++ b/packages/builder/cypress.json
@@ -1,5 +1,8 @@
 {
-  "baseUrl": "http://localhost:4001/_builder/",
+  "baseUrl": "http://localhost:4005/_builder/",
   "video": true,
-  "projectId": "bmbemn"
+  "projectId": "bmbemn",
+  "env": {
+    "PORT": "4005"
+  }
 }
diff --git a/packages/builder/cypress/integration/createApp.spec.js b/packages/builder/cypress/integration/createApp.spec.js
index 5382aa04cc..a32782867a 100644
--- a/packages/builder/cypress/integration/createApp.spec.js
+++ b/packages/builder/cypress/integration/createApp.spec.js
@@ -2,7 +2,7 @@ context('Create an Application', () => {
 
     beforeEach(() => {
         cy.server()
-        cy.visit('localhost:4001/_builder')
+        cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
     })
 
     // https://on.cypress.io/interacting-with-elements
@@ -11,7 +11,7 @@ context('Create an Application', () => {
         // https://on.cypress.io/type
         cy.createApp('My Cool App', 'This is a description')
 
-        cy.visit('localhost:4001/_builder')
+        cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
 
         cy.contains('My Cool App').should('exist')
     })
diff --git a/packages/builder/cypress/integration/createAutomation.spec.js b/packages/builder/cypress/integration/createAutomation.spec.js
index 92d1f907bd..2ba99fa340 100644
--- a/packages/builder/cypress/integration/createAutomation.spec.js
+++ b/packages/builder/cypress/integration/createAutomation.spec.js
@@ -1,7 +1,7 @@
 context("Create a automation", () => {
   before(() => {
     cy.server()
-    cy.visit("localhost:4001/_builder")
+    cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
 
     cy.createApp(
       "Automation Test App",
diff --git a/packages/builder/cypress/integration/createBinding.spec.js b/packages/builder/cypress/integration/createBinding.spec.js
index 971df3ed75..4074aca112 100644
--- a/packages/builder/cypress/integration/createBinding.spec.js
+++ b/packages/builder/cypress/integration/createBinding.spec.js
@@ -1,6 +1,6 @@
 xcontext('Create a Binding', () => {
     before(() => {
-        cy.visit('localhost:4001/_builder')
+        cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
         cy.createApp('Binding App', 'Binding App Description')
         cy.navigateToFrontend()
     })
diff --git a/packages/builder/cypress/integration/createComponents.spec.js b/packages/builder/cypress/integration/createComponents.spec.js
index 6931fdb86b..b87e863e53 100644
--- a/packages/builder/cypress/integration/createComponents.spec.js
+++ b/packages/builder/cypress/integration/createComponents.spec.js
@@ -1,7 +1,7 @@
 xcontext("Create Components", () => {
   before(() => {
     cy.server()
-    cy.visit("localhost:4001/_builder")
+    cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
     // https://on.cypress.io/type
     cy.createApp("Table App", "Table App Description")
     cy.createTable("dog", "name", "age")
diff --git a/packages/builder/cypress/integration/createTable.spec.js b/packages/builder/cypress/integration/createTable.spec.js
index d309f4fcb9..4553098f79 100644
--- a/packages/builder/cypress/integration/createTable.spec.js
+++ b/packages/builder/cypress/integration/createTable.spec.js
@@ -1,6 +1,6 @@
 context("Create a Table", () => {
   before(() => {
-    cy.visit("localhost:4001/_builder")
+    cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
     cy.createApp("Table App", "Table App Description")
   })
 
diff --git a/packages/builder/cypress/integration/createUser.spec.js b/packages/builder/cypress/integration/createUser.spec.js
index a5f9934dd7..45a1ffcc68 100644
--- a/packages/builder/cypress/integration/createUser.spec.js
+++ b/packages/builder/cypress/integration/createUser.spec.js
@@ -2,7 +2,7 @@ context('Create a User', () => {
 
     before(() => {
         cy.server()
-        cy.visit('localhost:4001/_builder')
+        cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
         // https://on.cypress.io/type
         cy.createApp('User App', 'This app is used to test user creation')
     })
diff --git a/packages/builder/cypress/integration/createView.spec.js b/packages/builder/cypress/integration/createView.spec.js
index 06fac6da33..168fb57dfb 100644
--- a/packages/builder/cypress/integration/createView.spec.js
+++ b/packages/builder/cypress/integration/createView.spec.js
@@ -1,6 +1,6 @@
 context("Create a View", () => {
   before(() => {
-    cy.visit("localhost:4001/_builder")
+    cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
     cy.createApp("View App", "View App Description")
     cy.createTable("data")
     cy.addColumn("data", "group", "Text")
diff --git a/packages/builder/cypress/integration/screens.spec.js b/packages/builder/cypress/integration/screens.spec.js
index 6df8af3602..d219e7daa7 100644
--- a/packages/builder/cypress/integration/screens.spec.js
+++ b/packages/builder/cypress/integration/screens.spec.js
@@ -2,7 +2,7 @@
 context('Screen Tests', () => {
     before(() => {
         cy.server()
-        cy.visit('localhost:4001/_builder')
+        cy.visit(`localhost:${Cypress.env("PORT")}/_builder`)
         cy.createApp('Conor Cy App', 'Table App Description')
         cy.navigateToFrontend()
     })
diff --git a/packages/builder/cypress/setup.js b/packages/builder/cypress/setup.js
index 7f20eff88c..1b94100fb3 100644
--- a/packages/builder/cypress/setup.js
+++ b/packages/builder/cypress/setup.js
@@ -7,6 +7,7 @@ const rimraf = require("rimraf")
 const { join, resolve } = require("path")
 // const run = require("../../cli/src/commands/run/runHandler")
 const initialiseBudibase = require("../../server/src/utilities/initialiseBudibase")
+const cypressConfig = require("../cypress.json")
 
 const homedir = join(require("os").homedir(), ".budibase")
 
@@ -15,6 +16,7 @@ rimraf.sync(homedir)
 process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE"
 process.env.NODE_ENV = "cypress"
 process.env.ENABLE_ANALYTICS = "false"
+process.env.PORT = cypressConfig.env.PORT
 
 // Stop info logs polluting test outputs
 process.env.LOG_LEVEL = "error"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index a5adef82f7..61592f1ad2 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -14,8 +14,8 @@
     "cy:run": "cypress run",
     "cy:open": "cypress open",
     "cy:run:ci": "cypress run --browser electron --record --key f308590b-6070-41af-b970-794a3823d451",
-    "cy:test": "start-server-and-test cy:setup http://localhost:4001/_builder cy:run",
-    "cy:ci": "start-server-and-test cy:setup http://localhost:4001/_builder cy:run:ci"
+    "cy:test": "start-server-and-test cy:setup http://localhost:4005/_builder cy:run",
+    "cy:ci": "start-server-and-test cy:setup http://localhost:4005/_builder cy:run:ci"
   },
   "jest": {
     "globals": {
diff --git a/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte b/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte
index 2edcbec3f1..18fff8153d 100644
--- a/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte
+++ b/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte
@@ -13,7 +13,8 @@
     if (production) {
       return `${appUrl}/${uri}`
     } else {
-      return `http://localhost:4001/${uri}`
+
+      return `${window.location.origin}/${uri}`
     }
   }
 
diff --git a/packages/server/.env.template b/packages/server/.env.template
index 1b1ff2e854..b2ff5be3f4 100644
--- a/packages/server/.env.template
+++ b/packages/server/.env.template
@@ -8,13 +8,10 @@ CLIENT_ID={{clientId}}
 # used to create cookie hashes
 JWT_SECRET={{cookieKey1}}
 
-# port to run http server on
-PORT=4001 
-
 # error level for koa-pino
 LOG_LEVEL=info
 
 DEPLOYMENT_CREDENTIALS_URL="https://dt4mpwwap8.execute-api.eu-west-1.amazonaws.com/prod/"
 DEPLOYMENT_DB_URL="https://couchdb.budi.live:5984"
 SENTRY_DSN=https://a34ae347621946bf8acded18e5b7d4b8@o420233.ingest.sentry.io/5338131
-ENABLE_ANALYTICS="true"
\ No newline at end of file
+ENABLE_ANALYTICS="true"
diff --git a/packages/server/package.json b/packages/server/package.json
index fc87f9f35b..d4695cbff2 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -36,7 +36,7 @@
     "test:integration": "jest routes --runInBand",
     "test:watch": "jest --watch",
     "run:docker": "node src/index",
-    "dev:builder": "nodemon src/index.js",
+    "dev:builder": "PORT=4001 nodemon src/index.js",
     "electron": "electron src/electron.js",
     "build:electron": "electron-builder --dir",
     "publish:electron": "electron-builder -mwl --publish always",
diff --git a/packages/server/src/app.js b/packages/server/src/app.js
index f1f3586801..92a65be7fc 100644
--- a/packages/server/src/app.js
+++ b/packages/server/src/app.js
@@ -50,8 +50,10 @@ destroyable(server)
 
 server.on("close", () => console.log("Server Closed"))
 
-module.exports = server.listen(env.PORT || 4001, async () => {
+module.exports = server.listen(env.PORT || 0, async () => {
   console.log(`Budibase running on ${JSON.stringify(server.address())}`)
+  env._set("PORT", server.address().port)
+  eventEmitter.emitPort(env.PORT)
   automations.init()
   // only init the self hosting DB info in the Pouch, not needed in self hosting prod
   if (!env.CLOUD) {
diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js
index a6fa3f5e90..290c13e6a0 100644
--- a/packages/server/src/electron.js
+++ b/packages/server/src/electron.js
@@ -7,6 +7,7 @@ const { existsSync } = require("fs-extra")
 const initialiseBudibase = require("./utilities/initialiseBudibase")
 const { budibaseAppsDir } = require("./utilities/budibaseDir")
 const { openNewGitHubIssue, debugInfo } = require("electron-util")
+const eventEmitter = require("./events")
 
 const budibaseDir = budibaseAppsDir()
 const envFile = join(budibaseDir, ".env")
@@ -17,7 +18,11 @@ async function startApp() {
   }
   // evict environment from cache, so it reloads when next asked
   delete require.cache[require.resolve("./environment")]
+  // store the port incase its going to get overridden
+  const port = process.env.PORT
   require("dotenv").config({ path: envFile })
+  // overwrite the port - don't want to use dotenv for the port
+  require("./environment")._set("PORT", port)
 
   unhandled({
     showDialog: true,
@@ -34,9 +39,6 @@ async function startApp() {
     },
   })
 
-  const APP_URL = "http://localhost:4001/_builder"
-  const APP_TITLE = "Budibase Builder"
-
   let win
 
   function handleRedirect(e, url) {
@@ -46,22 +48,26 @@ async function startApp() {
 
   async function createWindow() {
     app.server = require("./app")
-    win = new BrowserWindow({
-      width: 1920,
-      height: 1080,
-      icon: join(__dirname, "..", "build", "icons", "512x512.png"),
-    })
-    win.setTitle(APP_TITLE)
-    win.loadURL(APP_URL)
-    if (isDev) {
-      win.webContents.openDevTools()
-    } else {
-      autoUpdater.checkForUpdatesAndNotify()
-    }
+    eventEmitter.on("internal:port", port => {
+      const APP_URL = `http://localhost:${port}/_builder`
+      const APP_TITLE = "Budibase Builder"
+      win = new BrowserWindow({
+        width: 1920,
+        height: 1080,
+        icon: join(__dirname, "..", "build", "icons", "512x512.png"),
+      })
+      win.setTitle(APP_TITLE)
+      win.loadURL(APP_URL)
+      if (isDev) {
+        win.webContents.openDevTools()
+      } else {
+        autoUpdater.checkForUpdatesAndNotify()
+      }
 
-    // open _blank in default browser
-    win.webContents.on("new-window", handleRedirect)
-    win.webContents.on("will-navigate", handleRedirect)
+      // open _blank in default browser
+      win.webContents.on("new-window", handleRedirect)
+      win.webContents.on("will-navigate", handleRedirect)
+    })
   }
 
   app.whenReady().then(createWindow)
diff --git a/packages/server/src/events/index.js b/packages/server/src/events/index.js
index 990ec1e16a..fe51b0780a 100644
--- a/packages/server/src/events/index.js
+++ b/packages/server/src/events/index.js
@@ -19,6 +19,10 @@ class BudibaseEmitter extends EventEmitter {
   emitTable(eventName, appId, table = null) {
     tableEmission({ emitter: this, eventName, appId, table })
   }
+
+  emitPort(portNumber) {
+    this.emit("internal:port", portNumber)
+  }
 }
 
 const emitter = new BudibaseEmitter()