This tutorial is designed to assist people who want to have a step-by-step guide to deploy the Lumber-generated admin backend to Heroku.If you don’t have a Heroku account yet, sign up here. Then, create your first Heroku application (1)(2).After creating your application, simply follow the Heroku guide “Deploy using Heroku Git” to push the lumber-generated admin backend code to the Heroku application.Push your code using the following command:
Counting objects: 25, done.Delta compression using up to 4 threads.Compressing objects: 100% (20/20), done.Writing objects: 100% (25/25), 21.56 KiB | 5.39 MiB/s, done.Total 25 (delta 9), reused 0 (delta 0)remote: Compressing source files... done.remote: Building source:remote:remote: -----> Node.js app detectedremote:remote: -----> Creating runtime environmentremote:remote: NPM_CONFIG_LOGLEVEL=errorremote: NODE_VERBOSE=falseremote: NODE_ENV=productionremote: NODE_MODULES_CACHE=trueremote:remote: -----> Installing binariesremote: engines.node (package.json): unspecifiedremote: engines.npm (package.json): unspecified (use default)remote:remote: Resolving node version 8.x...remote: Downloading and installing node 8.11.4...remote: Using default npm version: 5.6.0remote:remote: -----> Restoring cacheremote: Skipping cache restore (not-found)remote:remote: -----> Building dependenciesremote: Installing node modules (package.json + package-lock)remote: added 246 packages in 7.72sremote:remote: -----> Caching buildremote: Clearing previous node cacheremote: Saving 2 cacheDirectories (default):remote: - node_modulesremote: - bower_components (nothing to cache)remote:remote: -----> Pruning devDependenciesremote: Skipping because npm 5.6.0 sometimes fails when running 'npm prune' due to a known issueremote: https://github.com/npm/npm/issues/19356remote:remote: You can silence this warning by updating to at least npm 5.7.1 in your package.jsonremote: https://devcenter.heroku.com/articles/nodejs-support#specifying-an-npm-versionremote:remote: -----> Build succeeded!remote: -----> Discovering process typesremote: Procfile declares types -> (none)remote: Default types for buildpack -> webremote:remote: -----> Compressing...remote: Done: 24.2Mremote: -----> Launching...remote: Released v3remote: https://lumber-deploy-to-production.herokuapp.com/ deployed to Herokuremote:remote: Verifying deploy... done.To https://git.heroku.com/lumber-deploy-to-production.git * [new branch] master -> master
Your admin backend is now deployed in a remote Heroku application. 🎉
The last step to have a complete running application is to deploy a database remotely. For this, you can follow our Populate a remote database how-to.
This does not mean your project is deployed to production on Forest. To deploy to production, check out Environments after you’ve completed the above steps.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Forest Documentation","colors":{"primary":"#3F5B1E","light":"#DDF327","dark":"#3F5B1E"},"logo":{"light":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96","dark":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/LIME.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=91e95470256b93527860cba6c206cbc4"},"favicon":{"light":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96","dark":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/LIME.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=91e95470256b93527860cba6c206cbc4"},"navbar":{"links":[{"href":"mailto:support@forestadmin.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.forestadmin.com"}},"footer":{"socials":{"twitter":"https://twitter.com/forest_admin","github":"https://github.com/ForestAdmin","linkedin":"https://linkedin.com/company/forestadmin"}},"contextual":{"options":["copy","view","claude","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"forest","hasAudioNarration":false,"actualSubdomain":"forest","customDomains":["docs.forest.app"],"gitSource":{"type":"github","owner":"forestadmin","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb428a343e8b4158140116","collectionId":"5365b6a4-fce8-4b58-90bc-27e15a3e4242","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb428a343e8b4158140116"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adb428a343e8b4158140116","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Legacy","count":289},{"language":"default","tag":"JavaScript Agents","count":141},{"language":"default","tag":"Ruby Agent","count":140},{"language":"default","tag":"Product","count":113},{"language":"default","tag":"Integrations","count":64},{"language":"default","tag":"Actions","count":48},{"language":"default","tag":"Smart Action Examples","count":34},{"language":"default","tag":"Process","count":32},{"language":"default","tag":"Upgrade","count":31},{"language":"default","tag":"Connect","count":30}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@forestadmin.com"}},"hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku","slug":"/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku","pageMetadata":{"title":"Deploy your admin backend on Heroku","description":null,"href":"/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Check,CodeBlock,Heading,OptimizedImage,Warning}=_components;if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This tutorial is designed to assist people who want to have a step-by-step guide to deploy the Lumber-generated admin backend to Heroku.`}),`\n`,_jsxs(_components.p,{children:[`If you don’t have a Heroku account yet, `,_jsx(_components.a,{href:`https://signup.heroku.com/`,children:`sign up here`}),`. Then, create your first Heroku application `,_jsx(_components.strong,{children:`(1)`}),` `,_jsx(_components.strong,{children:`(2)`}),`.`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=f50412844060af06dbe84f9644ac7653`,alt:``,\"data-og-width\":`1456`,width:`1456`,\"data-og-height\":`766`,height:`766`,\"data-path\":`images/legacy/javascript-agents/deploy heroku.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=280\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=8ee0fbc483e3324c1b675fc1a29a79d4 280w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=560\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=0f8e3e184f9f7e84fed33a62dab77da5 560w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=840\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=88e4cc04c9e69e0762de3aa5479a8081 840w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=1100\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=ecafda40273f0f64c9c8457ebce5114d 1100w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=1650\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=4c50873ec92e740da694e73ca1a514da 1650w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku.png?w=2500\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=3ba646e05d9cd65959e30f6aa29c22cf 2500w`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=6d7f85905f940fe6a691e83e88eb3e1d`,alt:``,\"data-og-width\":`1336`,width:`1336`,\"data-og-height\":`942`,height:`942`,\"data-path\":`images/legacy/javascript-agents/deply heroku 2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=280\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=0ca73b7e535cc56c90c44790eee2a821 280w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=560\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=998074e31925a2bb3539d73c52ee1c10 560w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=840\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=be707db83dfb54ef1e3c60faaefe2586 840w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=1100\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=2c2b6695a795cd2b0f571b4d7f572e25 1100w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=1650\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=3a8e4aeba77ec5d1ea179b884cfeef8f 1650w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deply%20heroku%202.png?w=2500\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=64cfe29789f15dcf7d4d25725c52d572 2500w`}),`\n`,_jsx(_components.p,{children:`After creating your application, simply follow the Heroku guide “Deploy using Heroku Git” to push the lumber-generated admin backend code to the Heroku application.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=e21b43b0dac33d5d6d8eb7c1b4c42b3e`,alt:``,\"data-og-width\":`1440`,width:`1440`,\"data-og-height\":`1606`,height:`1606`,\"data-path\":`images/legacy/javascript-agents/deploy heroku 3.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=280\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=37073cc5057787e7c04a8ea753991a22 280w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=560\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=81b05e6dd29328d51cdb64daf00ae03f 560w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=840\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=e33faa0f1bfb628be76368fa0bc47923 840w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=1100\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=53710da57a9ca65e6659a49c5dfe33fa 1100w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=1650\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=75b343b956ee523ec5e159a1ae364873 1650w, https://mintcdn.com/forest/T09Cv_v_cJunOVcs/images/legacy/javascript-agents/deploy%20heroku%203.png?w=2500\u0026fit=max\u0026auto=format\u0026n=T09Cv_v_cJunOVcs\u0026q=85\u0026s=472ed13d29fa46edb103f4dc33aa5aa9 2500w`}),`\n`,_jsx(_components.p,{children:`Push your code using the following command: `}),`\n`,_jsx(Heading,{level:`3`,id:`command-line`,children:`Command line`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`git`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` push`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` heroku`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` master`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`output`,children:`Output`}),`\n`,_jsx(CodeBlock,{numberOfLines:`60`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`60`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Counting objects: 25, done.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Delta compression using up to 4 threads.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Compressing objects: 100% (20/20), done.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Writing objects: 100% (25/25), 21.56 KiB | 5.39 MiB/s, done.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Total 25 (delta 9), reused 0 (delta 0)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Compressing source files... done.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Building source:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Node.js app detected`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Creating runtime environment`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: NPM_CONFIG_LOGLEVEL=error`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: NODE_VERBOSE=false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: NODE_ENV=production`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: NODE_MODULES_CACHE=true`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Installing binaries`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: engines.node (package.json): unspecified`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: engines.npm (package.json): unspecified (use default)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Resolving node version 8.x...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Downloading and installing node 8.11.4...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Using default npm version: 5.6.0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Restoring cache`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Skipping cache restore (not-found)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Building dependencies`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Installing node modules (package.json + package-lock)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: added 246 packages in 7.72s`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Caching build`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Clearing previous node cache`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Saving 2 cacheDirectories (default):`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: - node_modules`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: - bower_components (nothing to cache)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Pruning devDependencies`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Skipping because npm 5.6.0 sometimes fails when running 'npm prune' due to a known issue`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: https://github.com/npm/npm/issues/19356`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: You can silence this warning by updating to at least npm 5.7.1 in your package.json`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: https://devcenter.heroku.com/articles/nodejs-support#specifying-an-npm-version`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Build succeeded!`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Discovering process types`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Procfile declares types -> (none)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Default types for buildpack -> web`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Compressing...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Done: 24.2M`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: -----> Launching...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Released v3`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: https://lumber-deploy-to-production.herokuapp.com/ deployed to Heroku`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`remote: Verifying deploy... done.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`To https://git.heroku.com/lumber-deploy-to-production.git`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` * [new branch] master -> master`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Check,{children:_jsx(_components.p,{children:`Your admin backend is now deployed in a remote Heroku application. 🎉`})}),`\n`,_jsx(_components.p,{children:`The last step to have a complete running application is to deploy a database remotely. `}),`\n`,_jsxs(_components.p,{children:[`For this, you can follow our `,_jsx(_components.a,{href:`/legacy/javascript-agents/how-tos/databases/populate-a-postgresql-database-on-heroku`,children:`Populate a remote database`}),` how-to.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`This does `,_jsx(_components.strong,{children:`not`}),` mean your project is deployed to production on Forest. To deploy to production, check out `,_jsx(_components.a,{href:`/product/process/advanced-concepts/developer-workflow/environments-and-branches`,children:`Environments`}),` after you’ve completed the above steps.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Deploy your admin backend on Heroku","description":null,"href":"/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Command line","slug":"command-line","depth":3,"children":[]},{"title":"Output","slug":"output","depth":3,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"forest","siteName":"Forest Documentation","title":"Deploy your admin backend on Heroku - Forest Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T15:39:16.552Z","originalFileLocation":"legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Forest Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Deploy your admin backend on Heroku - Forest Documentation\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Forest Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://forest.mintlify.app/_mintlify/api/og/v2?division=Setup\u0026amp;title=Deploy+your+admin+backend+on+Heroku\u0026amp;theme=7cc620c0b37a08e7a7deb699\u0026amp;signature=42afccb965842281319514b2df796f2fe2e42d88c274c3c466fc6f5c692b3d9d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Deploy your admin backend on Heroku - Forest Documentation\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://forest.mintlify.app/_mintlify/api/og/v2?division=Setup\u0026amp;title=Deploy+your+admin+backend+on+Heroku\u0026amp;theme=7cc620c0b37a08e7a7deb699\u0026amp;signature=42afccb965842281319514b2df796f2fe2e42d88c274c3c466fc6f5c692b3d9d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Forest Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3F5B1E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.forest.app/#organization\",\"name\":\"Forest Documentation\",\"url\":\"https://docs.forest.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.forest.app#website\",\"name\":\"Forest Documentation\",\"url\":\"https://docs.forest.app\",\"publisher\":{\"@id\":\"https://docs.forest.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku#webpage\",\"url\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku\",\"name\":\"Deploy your admin backend on Heroku\",\"dateModified\":\"2026-10-15T15:39:16.552Z\",\"isPartOf\":{\"@id\":\"https://docs.forest.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"JavaScript Agents\",\"item\":\"https://docs.forest.app/legacy/javascript-agents/reference-guide/models/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Setup\",\"item\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/README\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Deploy your admin backend on Heroku\",\"item\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku#article\",\"headline\":\"Deploy your admin backend on Heroku\",\"name\":\"Deploy your admin backend on Heroku\",\"url\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku\",\"mainEntityOfPage\":{\"@id\":\"https://docs.forest.app/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku#webpage\"},\"dateModified\":\"2026-10-15T15:39:16.552Z\",\"publisher\":{\"@id\":\"https://docs.forest.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.forest.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Forest Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Forest Documentation","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Get Started","pages":[{"title":"Get Started","href":"/get-started/intro-to-forest-admin"}]},{"tab":"Product","pages":[{"title":"Product","href":"/product/overview"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/overview"}]},{"tab":"Legacy","groups":[{"group":"Overview","pages":[{"title":"Legacy agents","href":"/legacy/agents-overview"},{"group":"Migration guide","pages":[{"title":"Migrating from Agent v1 to v2","href":"/guides/migration/from-v1/overview"},{"title":"Migrating datasources","href":"/guides/migration/from-v1/steps/datasources"},{"title":"Migrating Smart Actions","href":"/guides/migration/from-v1/steps/smart-actions"},{"title":"Migrating Smart Fields","href":"/guides/migration/from-v1/steps/smart-fields"},{"title":"Migrating Smart Relationships","href":"/guides/migration/from-v1/steps/smart-relationships"},{"title":"Migrating Smart Segments","href":"/guides/migration/from-v1/steps/smart-segments"}]},{"title":"Releases Support","href":"/legacy/javascript-agents/how-tos/releases-support/overview"}]},{"group":"JavaScript Agents","pages":[{"group":"Models","pages":[{"title":"Models","href":"/legacy/javascript-agents/reference-guide/models/overview"},{"title":"Enrich your models","href":"/legacy/javascript-agents/reference-guide/models/enrich-your-models"},{"group":"Relationships","pages":[{"title":"Relationships","href":"/legacy/javascript-agents/reference-guide/models/relationships/overview"},{"group":"Create a Smart relationship","pages":[{"title":"Create a Smart relationship","href":"/legacy/javascript-agents/reference-guide/models/relationships/create-a-smart-relationship/overview"},{"title":"GetIdsFromRequest","href":"/legacy/javascript-agents/reference-guide/models/relationships/create-a-smart-relationship/getidsfromrequest"}]},{"group":"Smart Relationship Examples","pages":[{"title":"Smart Relationship Examples","href":"/legacy/javascript-agents/reference-guide/models/relationships/smart-relationship-examples/README"},{"title":"Smart hasMany relationship in mongoDB","href":"/legacy/javascript-agents/reference-guide/models/relationships/smart-relationship-examples/smart-hasmany-relationship-in-mongodb"}]}]}]},{"group":"Actions","pages":[{"title":"Actions","href":"/legacy/javascript-agents/reference-guide/actions/overview"},{"group":"Create and manage Smart Actions","pages":[{"title":"Create and manage Smart Actions","href":"/legacy/javascript-agents/reference-guide/actions/create-and-manage-smart-actions/overview"},{"title":"Use a Smart Action Form","href":"/legacy/javascript-agents/reference-guide/actions/create-and-manage-smart-actions/use-a-smart-action-form"},{"title":"Smart Action Intents","href":"/legacy/javascript-agents/reference-guide/actions/create-and-manage-smart-actions/use-action-intent"}]},{"group":"Smart Action Examples","pages":[{"title":"Smart Action Examples","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/README"},{"title":"Calculate the distance between two string addresses","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/calculate-the-distance-between-two-string-addresses"},{"title":"Impersonate a user","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/impersonate-a-user"},{"title":"Create a record with a multiselect through a many-to-many relationship","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/create-a-record-with-a-multiselect-through-a-many-to-many-relationship"},{"title":"Handle enums with alias labels in a smart action","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/handle-enums-with-alias-labels-in-a-smart-action"},{"title":"Dropdown with list of values in smart action form","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/dropdown-with-list-of-values-in-smart-action-form"},{"title":"Custom dynamic dropdown in a form using smart collections","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/custom-dynamic-dropdown-in-a-form-using-smart-collections"},{"title":"Refresh hasMany relationship in smart action","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/refresh-hasmany-relationship-in-smart-action"},{"title":"Smart segment to restrict access to an action on a record details view","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/smart-segment-to-restrict-access-to-an-action-on-a-record-details-view"},{"title":"BelongsToMany edition through smart collection","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/belongstomany-edition-through-smart-collection"},{"title":"Upload files to amazon s3","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/upload-files-to-amazon-s3"},{"title":"Upload several files with the File Picker","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/upload-several-files-with-the-file-picker"},{"title":"Retrieve smart field info in a smart action","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/retrieve-smart-field-info-in-a-smart-action"},{"title":"Smart action to create several records from the input of a single smart action form","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/smart-action-to-create-several-records-from-the-input-of-a-single-smart-action-form"},{"title":"Add many existing records at the same time (hasMany-belongsTo relationship)","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/add-many-existing-records-at-the-same-time-hasmany-belongsto-relationship"},{"title":"Call a n8n webhook","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/call-a-webhook-with-record-ids"},{"title":"Anonymize users in bulk","href":"/legacy/javascript-agents/reference-guide/actions/smart-action-examples/update-users-in-bulk"}]}]},{"group":"Smart Fields","pages":[{"title":"Smart Fields","href":"/legacy/javascript-agents/reference-guide/smart-fields/overview"},{"group":"Smart Field Examples","pages":[{"title":"Smart Field Examples","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/README"},{"title":"Add an HTML credit card as a smart field in a summary view","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/add-an-html-credit-card-as-a-smart-field-in-a-summary-view"},{"title":"Display field with complex info in html format (rich text editor)","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/display-field-with-complex-info-in-html-format-rich-text-editor"},{"title":"Generate signed urls to display S3 files in a smart field","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/generate-signed-urls-to-display-s3-files-in-a-smart-field"},{"title":"Print a status object in a single line field","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/print-a-status-object-in-a-single-line-field"},{"title":"Sort by smart field","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/sort-by-smart-field"},{"title":"Sort by smart field that includes value from a belongsTo relationship","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/sort-by-smart-field-that-includes-value-from-a-belongsto-relationship"},{"title":"Add fields destined to the create form","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/add-fields-destined-to-the-create-form"},{"title":"Add validation to a smart field edition","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/add-validation-to-a-smart-field-edition"},{"title":"Display smart field as progress bar using rich text editor","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/display-smart-field-as-progress-bar-using-rich-text-editor"},{"title":"Update point geometry field using a smart field and algolia api","href":"/legacy/javascript-agents/reference-guide/smart-fields/smart-field-examples/update-point-geometry-field-using-a-smart-field-and-algolia-api"}]}]},{"group":"Smart Collections","pages":[{"title":"Smart Collections","href":"/legacy/javascript-agents/reference-guide/smart-collections/overview"},{"group":"Examples","pages":[{"title":"Examples","href":"/legacy/javascript-agents/reference-guide/smart-collections/examples/README"},{"title":"Create a Smart Collection with Amazon S3","href":"/legacy/javascript-agents/reference-guide/smart-collections/examples/amazon-s3-integration-example"},{"title":"Smart relationship between model and stripe cards","href":"/legacy/javascript-agents/reference-guide/smart-collections/examples/smart-relationship-between-model-and-stripe-cards"},{"title":"Create records from a Smart collection","href":"/legacy/javascript-agents/reference-guide/smart-collections/examples/create-records-from-a-smart-collection"},{"title":"Searchable smart collection with records fetched from hubspot API","href":"/legacy/javascript-agents/reference-guide/smart-collections/examples/searchable-smart-collection-with-records-fetched-from-hubspot-api"}]},{"title":"Serializing your records","href":"/legacy/javascript-agents/reference-guide/smart-collections/serializing-your-records"}]},{"group":"Routes","pages":[{"title":"Routes","href":"/legacy/javascript-agents/reference-guide/routes/overview"},{"title":"Default routes","href":"/legacy/javascript-agents/reference-guide/routes/default-routes"},{"title":"Extend a route","href":"/legacy/javascript-agents/reference-guide/routes/extend-a-route"},{"title":"Override a route","href":"/legacy/javascript-agents/reference-guide/routes/override-a-route"}]},{"group":"Integrations","pages":[{"title":"Integrations","href":"/legacy/javascript-agents/reference-guide/integrations/README"},{"title":"Stripe","href":"/legacy/javascript-agents/reference-guide/integrations/stripe"},{"title":"Mixpanel","href":"/legacy/javascript-agents/reference-guide/integrations/mixpanel"},{"title":"Intercom","href":"/legacy/javascript-agents/reference-guide/integrations/intercom"},{"group":"Elasticsearch","pages":[{"title":"Readme","href":"/legacy/javascript-agents/reference-guide/integrations/elasticsearch/README"},{"title":"Interact with your Elasticsearch data","href":"/legacy/javascript-agents/reference-guide/integrations/elasticsearch/interact-with-your-elasticsearch-data"},{"title":"Elasticsearch service/utils","href":"/legacy/javascript-agents/reference-guide/integrations/elasticsearch/elasticsearch-service-utils"},{"title":"Another example","href":"/legacy/javascript-agents/reference-guide/integrations/elasticsearch/another-example"}]},{"group":"Zendesk","pages":[{"title":"Zendesk","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/overview"},{"title":"Authentication, Filtering \u0026 Sorting","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/authentication-filtering-and-sorting"},{"title":"Display Zendesk tickets","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/display-zendesk-tickets"},{"title":"Display Zendesk users","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/display-zendesk-users"},{"title":"View tickets related to a user","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/view-tickets-related-to-a-user"},{"title":"Bonus: Direct link to Zendesk + change priority of a ticket","href":"/legacy/javascript-agents/reference-guide/integrations/zendesk/bonus-direct-link-to-zendesk--and--change-priority-of-a-ticket"}]},{"group":"Dwolla","pages":[{"title":"Dwolla","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/README"},{"title":"Display Dwolla customers","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/display-dwolla-customers"},{"title":"Display Dwolla funding sources","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/display-dwolla-funding-sources"},{"title":"Display Dwolla transfers","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/display-dwolla-transfers"},{"title":"Link users and Dwolla customers","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/link-users-and-dwolla-customers"},{"title":"Dwolla Service","href":"/legacy/javascript-agents/reference-guide/integrations/dwolla/dwolla-service"}]},{"title":"Razorpay","href":"/legacy/javascript-agents/reference-guide/integrations/razorpay"},{"group":"Hubspot","pages":[{"title":"Readme","href":"/legacy/javascript-agents/reference-guide/integrations/hubspot/README"},{"title":"Create a Hubspot company","href":"/legacy/javascript-agents/reference-guide/integrations/hubspot/create-a-hubspot-company"},{"title":"Display Hubspot companies","href":"/legacy/javascript-agents/reference-guide/integrations/hubspot/display-hubspot-companies"}]},{"group":"Twilio","pages":[{"title":"Readme","href":"/legacy/javascript-agents/reference-guide/integrations/twilio/README"},{"title":"Send an SMS with Twilio and Zapier","href":"/legacy/javascript-agents/reference-guide/integrations/twilio/send-an-sms-with-twilio-and-zapier"}]},{"title":"Azure Table Storage","href":"/legacy/javascript-agents/reference-guide/integrations/azure-table-storage"},{"group":"Slack","pages":[{"title":"Readme","href":"/legacy/javascript-agents/reference-guide/integrations/slack/README"},{"title":"Send Smart Action notifications to Slack","href":"/legacy/javascript-agents/reference-guide/integrations/slack/send-smart-action-notifications-to-slack"}]},{"group":"Algolia","pages":[{"title":"Algolia","href":"/legacy/javascript-agents/reference-guide/integrations/algolia/README"},{"title":"Geocode an address with Algolia","href":"/legacy/javascript-agents/reference-guide/integrations/algolia/geocode-an-address-with-algolia"}]}]},{"group":"Smart Views","pages":[{"title":"Smart Views","href":"/legacy/javascript-agents/reference-guide/smart-views/overview"},{"title":"Create a Map view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-map-view"},{"title":"Create a Calendar view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-calendar-view"},{"title":"Create a Shipping view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-shipping-view"},{"title":"Create a Gallery view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-gallery-view"},{"title":"Create a custom tinder-like validation view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-custom-tinder-like-validation-view"},{"title":"Create a dynamic calendar view for an event-booking use case","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-dynamic-calendar-view-for-an-event-booking-use-case"},{"title":"Create a custom moderation view","href":"/legacy/javascript-agents/reference-guide/smart-views/create-a-custom-moderation-view"}]},{"title":"Smart Segments","href":"/legacy/javascript-agents/reference-guide/smart-segments"},{"group":"Scopes","pages":[{"title":"Scopes","href":"/legacy/javascript-agents/reference-guide/scopes/overview"},{"title":"Create a scope more than one level away based on a Smart field","href":"/legacy/javascript-agents/reference-guide/scopes/create-a-scope-more-than-one-level-away-based-on-a-smart-field"},{"title":"Scope on a smart field extracting a json's column attribute","href":"/legacy/javascript-agents/reference-guide/scopes/scope-on-a-smart-field-extracting-a-jsons-column-attribute"}]},{"title":"Performance","href":"/legacy/javascript-agents/reference-guide/performance"},{"group":"Charts","pages":[{"title":"Charts","href":"/legacy/javascript-agents/reference-guide/charts/overview"},{"title":"Create an API-based Chart","href":"/legacy/javascript-agents/reference-guide/charts/create-an-api-based-chart"},{"title":"Create a Smart Chart","href":"/legacy/javascript-agents/reference-guide/charts/create-a-smart-chart"},{"title":"Create Charts with AWS Redshift","href":"/legacy/javascript-agents/reference-guide/charts/create-charts-with-aws-redshift"}]},{"group":"Setup","pages":[{"title":"Setup","href":"/legacy/javascript-agents/how-tos/setup/README"},{"title":"Install","href":"/legacy/javascript-agents/how-tos/setup/install"},{"title":"Connecting Forest to Your Database (Forest Cloud)","href":"/legacy/javascript-agents/how-tos/setup/connecting-forest-admin-to-your-database-forest-cloud"},{"title":"Forest IP white-listing (Forest Cloud)","href":"/legacy/javascript-agents/how-tos/setup/forest-admin-ip-white-listing-forest-cloud"},{"title":"Why HTTPS is necessary even locally","href":"/legacy/javascript-agents/how-tos/setup/why-https-is-necessary-even-locally"},{"title":"Troubleshooting","href":"/legacy/javascript-agents/how-tos/setup/troubleshooting"},{"title":"Prevent permission errors at installation","href":"/legacy/javascript-agents/how-tos/setup/prevent-permission-errors-at-installation"},{"title":"Deploy Your Admin Backend With Aws","description":"This tutorial is designed to assist you with a step-by-step guide to deploy the admin backend to Amazon Web Services, using EC2, ELB, ACM and Route53.","href":"/legacy/javascript-agents/how-tos/setup/deploy-your-admin-backend-with-aws"},{"title":"Deploy your admin backend on Heroku","href":"/legacy/javascript-agents/how-tos/setup/deploy-to-production-on-heroku"},{"title":"Deploy your admin backend to Ubuntu server","description":"The goal of this tutorial is to help people deploy their admin backend to Ubuntu server.","href":"/legacy/javascript-agents/how-tos/setup/deploy-to-production-to-ubuntu-server"},{"title":"Deploy your admin backend to Google Cloud Platform","href":"/legacy/javascript-agents/how-tos/setup/deploy-your-admin-backend-with-google-cloud-platform"},{"title":"Install Forest on a remote machine","href":"/legacy/javascript-agents/how-tos/setup/install-forest-admin-on-a-remote-machine"},{"title":"Use Forest with a read-only database","href":"/legacy/javascript-agents/how-tos/setup/use-forest-admin-with-a-read-only-database"},{"title":"Configuring CORS headers","href":"/legacy/javascript-agents/how-tos/setup/configuring-cors-headers"},{"title":"Running Forest on multiple servers","href":"/legacy/javascript-agents/how-tos/setup/running-forest-admin-on-multiple-servers"}]},{"group":"Upgrade","pages":[{"title":"Upgrade","href":"/legacy/javascript-agents/how-tos/maintain/README"},{"group":"Upgrade notes","pages":[{"title":"Upgrade notes (SQL, Mongodb)","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/README"},{"title":"Upgrade to v9","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v9"},{"title":"Upgrade to v8","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v8"},{"title":"Upgrade to v7","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v7"},{"title":"Upgrade to v6","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v6"},{"title":"Upgrade to v5","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v5"},{"title":"Upgrade to v4","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v4"},{"title":"Upgrade to v3","href":"/legacy/javascript-agents/how-tos/maintain/upgrade-notes-sql-mongodb/upgrade-to-v3"}]},{"title":"Update your models' definition","href":"/legacy/javascript-agents/how-tos/maintain/update-your-models-definition"},{"title":"Monitor your Forest's status","href":"/legacy/javascript-agents/how-tos/maintain/monitor-your-forests-status"},{"title":"Manage your Forest environments programmatically","href":"/legacy/javascript-agents/how-tos/maintain/manage-your-forest-admin-programmatically"},{"title":"Changing your domain name","href":"/legacy/javascript-agents/how-tos/maintain/changing-your-domain-name"},{"title":"Migrate to the new role system","href":"/legacy/javascript-agents/how-tos/maintain/migrate-to-the-new-role-system"},{"title":"Push your new version to production","href":"/legacy/javascript-agents/how-tos/maintain/push-your-new-version-to-production"}]},{"group":"Databases","pages":[{"title":"Readme","href":"/legacy/javascript-agents/how-tos/databases/README"},{"title":"Use a demo SQL database","href":"/legacy/javascript-agents/how-tos/databases/use-a-demo-database"},{"title":"Populate a postgreSQL database on Heroku","href":"/legacy/javascript-agents/how-tos/databases/populate-a-postgresql-database-on-heroku"},{"title":"Connect to a read replica database","href":"/legacy/javascript-agents/how-tos/databases/connect-to-a-read-replica-database"},{"title":"Plug multiple schemas","href":"/legacy/javascript-agents/how-tos/databases/plug-multiple-schemas"},{"title":"Add new databases","href":"/legacy/javascript-agents/how-tos/databases/add-new-databases"},{"title":"Manage SQL views","href":"/legacy/javascript-agents/how-tos/databases/manage-sql-views"}]},{"group":"Settings","pages":[{"title":"Settings","href":"/legacy/javascript-agents/how-tos/settings/README"},{"title":"Customize your /forest folder","href":"/legacy/javascript-agents/how-tos/settings/customize-your-forest-folder"},{"title":"Disable automatic Forest schema update","href":"/legacy/javascript-agents/how-tos/settings/disable-automatic-forest-admin-schema-update"},{"title":"Include/exclude models","href":"/legacy/javascript-agents/how-tos/settings/include-exclude-models"},{"title":"Display extensive logs","href":"/legacy/javascript-agents/how-tos/settings/display-extensive-logs"}]}]},{"group":"Ruby Agent","pages":[{"group":"Models","pages":[{"title":"Models","href":"/legacy/ruby-agent/reference-guide/models/overview"},{"title":"Enrich your models","href":"/legacy/ruby-agent/reference-guide/models/enrich-your-models"},{"group":"Relationships","pages":[{"title":"Relationships","href":"/legacy/ruby-agent/reference-guide/models/relationships/overview"},{"group":"Create a Smart relationship","pages":[{"title":"Create a Smart relationship","href":"/legacy/ruby-agent/reference-guide/models/relationships/create-a-smart-relationship/overview"},{"title":"GetIdsFromRequest","href":"/legacy/ruby-agent/reference-guide/models/relationships/create-a-smart-relationship/getidsfromrequest"}]},{"group":"Smart Relationship Examples","pages":[{"title":"Smart Relationship Examples","href":"/legacy/ruby-agent/reference-guide/models/relationships/smart-relationship-examples/README"}]}]}]},{"group":"Actions","pages":[{"title":"Actions","href":"/legacy/ruby-agent/reference-guide/actions/overview"},{"group":"Create and manage Smart Actions","pages":[{"title":"Create and manage Smart Actions","href":"/legacy/ruby-agent/reference-guide/actions/create-and-manage-smart-actions/overview"},{"title":"Use a Smart Action Form","href":"/legacy/ruby-agent/reference-guide/actions/create-and-manage-smart-actions/use-a-smart-action-form"},{"title":"Smart Action Intents","href":"/legacy/ruby-agent/reference-guide/actions/create-and-manage-smart-actions/use-action-intent"}]},{"group":"Smart Action Examples","pages":[{"title":"Smart Action Examples","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/README"},{"title":"Calculate the distance between two string addresses","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/calculate-the-distance-between-two-string-addresses"},{"title":"Impersonate a user","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/impersonate-a-user"},{"title":"Create a record with a multiselect through a many-to-many relationship","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/create-a-record-with-a-multiselect-through-a-many-to-many-relationship"},{"title":"Handle enums with alias labels in a smart action","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/handle-enums-with-alias-labels-in-a-smart-action"},{"title":"Dropdown with list of values in smart action form","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/dropdown-with-list-of-values-in-smart-action-form"},{"title":"Custom dynamic dropdown in a form using smart collections","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/custom-dynamic-dropdown-in-a-form-using-smart-collections"},{"title":"Refresh hasMany relationship in smart action","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/refresh-hasmany-relationship-in-smart-action"},{"title":"Smart segment to restrict access to an action on a record details view","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/smart-segment-to-restrict-access-to-an-action-on-a-record-details-view"},{"title":"BelongsToMany edition through smart collection","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/belongstomany-edition-through-smart-collection"},{"title":"Upload files to amazon s3","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/upload-files-to-amazon-s3"},{"title":"Upload several files with the File Picker","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/upload-several-files-with-the-file-picker"},{"title":"Retrieve smart field info in a smart action","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/retrieve-smart-field-info-in-a-smart-action"},{"title":"Smart action to create several records from the input of a single smart action form","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/smart-action-to-create-several-records-from-the-input-of-a-single-smart-action-form"},{"title":"Add many existing records at the same time (hasMany-belongsTo relationship)","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/add-many-existing-records-at-the-same-time-hasmany-belongsto-relationship"},{"title":"Call a n8n webhook","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/call-a-webhook-with-record-ids"},{"title":"Anonymize users in bulk","href":"/legacy/ruby-agent/reference-guide/actions/smart-action-examples/update-users-in-bulk"}]}]},{"group":"Smart Fields","pages":[{"title":"Smart Fields","href":"/legacy/ruby-agent/reference-guide/smart-fields/overview"},{"group":"Smart Field Examples","pages":[{"title":"Smart Field Examples","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/README"},{"title":"Add an HTML credit card as a smart field in a summary view","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/add-an-html-credit-card-as-a-smart-field-in-a-summary-view"},{"title":"Display field with complex info in html format (rich text editor)","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/display-field-with-complex-info-in-html-format-rich-text-editor"},{"title":"Generate signed urls to display S3 files in a smart field","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/generate-signed-urls-to-display-s3-files-in-a-smart-field"},{"title":"Print a status object in a single line field","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/print-a-status-object-in-a-single-line-field"},{"title":"Sort by smart field","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/sort-by-smart-field"},{"title":"Sort by smart field that includes value from a belongsTo relationship","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/sort-by-smart-field-that-includes-value-from-a-belongsto-relationship"},{"title":"Add fields destined to the create form","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/add-fields-destined-to-the-create-form"},{"title":"Add validation to a smart field edition","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/add-validation-to-a-smart-field-edition"},{"title":"Display smart field as progress bar using rich text editor","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/display-smart-field-as-progress-bar-using-rich-text-editor"},{"title":"Update point geometry field using a smart field and algolia api","href":"/legacy/ruby-agent/reference-guide/smart-fields/smart-field-examples/update-point-geometry-field-using-a-smart-field-and-algolia-api"}]}]},{"group":"Smart Collections","pages":[{"title":"Smart Collections","href":"/legacy/ruby-agent/reference-guide/smart-collections/overview"},{"group":"Examples","pages":[{"title":"Examples","href":"/legacy/ruby-agent/reference-guide/smart-collections/examples/README"},{"title":"Create a Smart Collection with Amazon S3","href":"/legacy/ruby-agent/reference-guide/smart-collections/examples/amazon-s3-integration-example"},{"title":"Smart relationship between model and stripe cards","href":"/legacy/ruby-agent/reference-guide/smart-collections/examples/smart-relationship-between-model-and-stripe-cards"},{"title":"Create records from a Smart collection","href":"/legacy/ruby-agent/reference-guide/smart-collections/examples/create-records-from-a-smart-collection"},{"title":"Searchable smart collection with records fetched from hubspot API","href":"/legacy/ruby-agent/reference-guide/smart-collections/examples/searchable-smart-collection-with-records-fetched-from-hubspot-api"}]},{"title":"Serializing your records","href":"/legacy/ruby-agent/reference-guide/smart-collections/serializing-your-records"}]},{"group":"Routes","pages":[{"title":"Routes","href":"/legacy/ruby-agent/reference-guide/routes/overview"},{"title":"Default routes","href":"/legacy/ruby-agent/reference-guide/routes/default-routes"},{"title":"Extend a route","href":"/legacy/ruby-agent/reference-guide/routes/extend-a-route"},{"title":"Override a route","href":"/legacy/ruby-agent/reference-guide/routes/override-a-route"}]},{"group":"Integrations","pages":[{"title":"Integrations","href":"/legacy/ruby-agent/reference-guide/integrations/README"},{"title":"Stripe","href":"/legacy/ruby-agent/reference-guide/integrations/stripe"},{"title":"Mixpanel","href":"/legacy/ruby-agent/reference-guide/integrations/mixpanel"},{"title":"Intercom","href":"/legacy/ruby-agent/reference-guide/integrations/intercom"},{"group":"Elasticsearch","pages":[{"title":"Readme","href":"/legacy/ruby-agent/reference-guide/integrations/elasticsearch/README"},{"title":"Interact with your Elasticsearch data","href":"/legacy/ruby-agent/reference-guide/integrations/elasticsearch/interact-with-your-elasticsearch-data"},{"title":"Elasticsearch service/utils","href":"/legacy/ruby-agent/reference-guide/integrations/elasticsearch/elasticsearch-service-utils"},{"title":"Another example","href":"/legacy/ruby-agent/reference-guide/integrations/elasticsearch/another-example"}]},{"group":"Zendesk","pages":[{"title":"Zendesk","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/overview"},{"title":"Authentication, Filtering \u0026 Sorting","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/authentication-filtering-and-sorting"},{"title":"Display Zendesk tickets","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/display-zendesk-tickets"},{"title":"Display Zendesk users","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/display-zendesk-users"},{"title":"View tickets related to a user","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/view-tickets-related-to-a-user"},{"title":"Bonus: Direct link to Zendesk + change priority of a ticket","href":"/legacy/ruby-agent/reference-guide/integrations/zendesk/bonus-direct-link-to-zendesk--and--change-priority-of-a-ticket"}]},{"group":"Dwolla","pages":[{"title":"Dwolla","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/README"},{"title":"Display Dwolla customers","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/display-dwolla-customers"},{"title":"Display Dwolla funding sources","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/display-dwolla-funding-sources"},{"title":"Display Dwolla transfers","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/display-dwolla-transfers"},{"title":"Link users and Dwolla customers","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/link-users-and-dwolla-customers"},{"title":"Dwolla Service","href":"/legacy/ruby-agent/reference-guide/integrations/dwolla/dwolla-service"}]},{"title":"Razorpay","href":"/legacy/ruby-agent/reference-guide/integrations/razorpay"},{"group":"Hubspot","pages":[{"title":"Readme","href":"/legacy/ruby-agent/reference-guide/integrations/hubspot/README"},{"title":"Create a Hubspot company","href":"/legacy/ruby-agent/reference-guide/integrations/hubspot/create-a-hubspot-company"},{"title":"Display Hubspot companies","href":"/legacy/ruby-agent/reference-guide/integrations/hubspot/display-hubspot-companies"}]},{"group":"Twilio","pages":[{"title":"Readme","href":"/legacy/ruby-agent/reference-guide/integrations/twilio/README"},{"title":"Send an SMS with Twilio and Zapier","href":"/legacy/ruby-agent/reference-guide/integrations/twilio/send-an-sms-with-twilio-and-zapier"}]},{"title":"Azure Table Storage","href":"/legacy/ruby-agent/reference-guide/integrations/azure-table-storage"},{"group":"Slack","pages":[{"title":"Readme","href":"/legacy/ruby-agent/reference-guide/integrations/slack/README"},{"title":"Send Smart Action notifications to Slack","href":"/legacy/ruby-agent/reference-guide/integrations/slack/send-smart-action-notifications-to-slack"}]},{"group":"Algolia","pages":[{"title":"Algolia","href":"/legacy/ruby-agent/reference-guide/integrations/algolia/README"},{"title":"Geocode an address with Algolia","href":"/legacy/ruby-agent/reference-guide/integrations/algolia/geocode-an-address-with-algolia"}]}]},{"group":"Smart Views","pages":[{"title":"Smart Views","href":"/legacy/ruby-agent/reference-guide/smart-views/overview"},{"title":"Create a Map view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-map-view"},{"title":"Create a Calendar view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-calendar-view"},{"title":"Create a Shipping view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-shipping-view"},{"title":"Create a Gallery view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-gallery-view"},{"title":"Create a custom tinder-like validation view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-custom-tinder-like-validation-view"},{"title":"Create a dynamic calendar view for an event-booking use case","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-dynamic-calendar-view-for-an-event-booking-use-case"},{"title":"Create a custom moderation view","href":"/legacy/ruby-agent/reference-guide/smart-views/create-a-custom-moderation-view"}]},{"title":"Smart Segments","href":"/legacy/ruby-agent/reference-guide/smart-segments"},{"group":"Scopes","pages":[{"title":"Scopes","href":"/legacy/ruby-agent/reference-guide/scopes/overview"},{"title":"Create a scope more than one level away based on a Smart field","href":"/legacy/ruby-agent/reference-guide/scopes/create-a-scope-more-than-one-level-away-based-on-a-smart-field"},{"title":"Scope on a smart field extracting a json's column attribute","href":"/legacy/ruby-agent/reference-guide/scopes/scope-on-a-smart-field-extracting-a-jsons-column-attribute"}]},{"title":"Performance","href":"/legacy/ruby-agent/reference-guide/performance"},{"group":"Charts","pages":[{"title":"Charts","href":"/legacy/ruby-agent/reference-guide/charts/overview"},{"title":"Create an API-based Chart","href":"/legacy/ruby-agent/reference-guide/charts/create-an-api-based-chart"},{"title":"Create a Smart Chart","href":"/legacy/ruby-agent/reference-guide/charts/create-a-smart-chart"},{"title":"Create Charts with AWS Redshift","href":"/legacy/ruby-agent/reference-guide/charts/create-charts-with-aws-redshift"}]},{"group":"Setup","pages":[{"title":"Setup","href":"/legacy/ruby-agent/how-tos/setup/README"},{"title":"Install","href":"/legacy/ruby-agent/how-tos/setup/install"},{"title":"Connecting Forest to Your Database (Forest Cloud)","href":"/legacy/ruby-agent/how-tos/setup/connecting-forest-admin-to-your-database-forest-cloud"},{"title":"Forest IP white-listing (Forest Cloud)","href":"/legacy/ruby-agent/how-tos/setup/forest-admin-ip-white-listing-forest-cloud"},{"title":"Why HTTPS is necessary even locally","href":"/legacy/ruby-agent/how-tos/setup/why-https-is-necessary-even-locally"},{"title":"Troubleshooting","href":"/legacy/ruby-agent/how-tos/setup/troubleshooting"},{"title":"Prevent permission errors at installation","href":"/legacy/ruby-agent/how-tos/setup/prevent-permission-errors-at-installation"},{"title":"Deploy Your Admin Backend With Aws","href":"/legacy/ruby-agent/how-tos/setup/deploy-your-admin-backend-with-aws"},{"title":"Deploy your admin backend on Heroku","href":"/legacy/ruby-agent/how-tos/setup/deploy-to-production-on-heroku"},{"title":"Deploy your admin backend to Ubuntu server","href":"/legacy/ruby-agent/how-tos/setup/deploy-to-production-to-ubuntu-server"},{"title":"Deploy your admin backend to Google Cloud Platform","href":"/legacy/ruby-agent/how-tos/setup/deploy-your-admin-backend-with-google-cloud-platform"},{"title":"Install Forest on a remote machine","href":"/legacy/ruby-agent/how-tos/setup/install-forest-admin-on-a-remote-machine"},{"title":"Use Forest with a read-only database","href":"/legacy/ruby-agent/how-tos/setup/use-forest-admin-with-a-read-only-database"},{"title":"Configuring CORS headers","href":"/legacy/ruby-agent/how-tos/setup/configuring-cors-headers"},{"title":"Running Forest on multiple servers","href":"/legacy/ruby-agent/how-tos/setup/running-forest-admin-on-multiple-servers"}]},{"group":"Upgrade","pages":[{"title":"Upgrade","href":"/legacy/ruby-agent/how-tos/maintain/README"},{"group":"Upgrade notes","pages":[{"title":"Upgrade notes (Rails)","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/README"},{"title":"Upgrade to v9.22","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v9-22"},{"title":"Upgrade to v9","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v9"},{"title":"Upgrade to v8","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v8"},{"title":"Upgrade to v7","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v7"},{"title":"Upgrade to v6","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v6"},{"title":"Upgrade to v5","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/untitled"},{"title":"Upgrade to v4","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v4"},{"title":"Upgrade to v3","href":"/legacy/ruby-agent/how-tos/maintain/upgrade-notes-rails/upgrade-to-v3"}]},{"title":"Update your models' definition","href":"/legacy/ruby-agent/how-tos/maintain/update-your-models-definition"},{"title":"Monitor your Forest's status","href":"/legacy/ruby-agent/how-tos/maintain/monitor-your-forests-status"},{"title":"Manage your Forest environments programmatically","href":"/legacy/ruby-agent/how-tos/maintain/manage-your-forest-admin-programmatically"},{"title":"Changing your domain name","href":"/legacy/ruby-agent/how-tos/maintain/changing-your-domain-name"},{"title":"Migrate to the new role system","href":"/legacy/ruby-agent/how-tos/maintain/migrate-to-the-new-role-system"},{"title":"Push your new version to production","href":"/legacy/ruby-agent/how-tos/maintain/push-your-new-version-to-production"}]},{"group":"Databases","pages":[{"title":"Readme","href":"/legacy/ruby-agent/how-tos/databases/README"},{"title":"Use a demo SQL database","href":"/legacy/ruby-agent/how-tos/databases/use-a-demo-database"},{"title":"Connect to a read replica database","href":"/legacy/ruby-agent/how-tos/databases/connect-to-a-read-replica-database"},{"title":"Plug multiple schemas","href":"/legacy/ruby-agent/how-tos/databases/plug-multiple-schemas"},{"title":"Add new databases","href":"/legacy/ruby-agent/how-tos/databases/add-new-databases"},{"title":"Manage SQL views","href":"/legacy/ruby-agent/how-tos/databases/manage-sql-views"}]},{"group":"Settings","pages":[{"title":"Settings","href":"/legacy/ruby-agent/how-tos/settings/README"},{"title":"Customize your /forest folder","href":"/legacy/ruby-agent/how-tos/settings/customize-your-forest-folder"},{"title":"Disable automatic Forest schema update","href":"/legacy/ruby-agent/how-tos/settings/disable-automatic-forest-admin-schema-update"},{"title":"Include/exclude models","href":"/legacy/ruby-agent/how-tos/settings/include-exclude-models"},{"title":"Display extensive logs","href":"/legacy/ruby-agent/how-tos/settings/display-extensive-logs"}]}]}]}]},"title":"Deploy your admin backend on Heroku - Forest Documentation","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-B0E5HDf_.js","lightbox-handle-r17bVUz3.js"]}