{"id":6073,"date":"2026-07-10T05:33:03","date_gmt":"2026-07-10T02:33:03","guid":{"rendered":"https:\/\/www.scalahosting.com\/kb\/?p=6073"},"modified":"2026-07-10T05:33:04","modified_gmt":"2026-07-10T02:33:04","slug":"create-ftp-sub-user-spanel","status":"publish","type":"post","link":"https:\/\/www.scalahosting.com\/kb\/create-ftp-sub-user-spanel\/","title":{"rendered":"How to Create an FTP Sub-User in SPanel"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In Spanel, you create an FTP sub-user under <strong>Files &gt; FTP Accounts<\/strong> using the New FTP Account form, where you set a username, a document root, and a password. SPanel namespaces every sub-user under your account, so the name you type becomes &lt;account&gt;_&lt;subuser&gt;, and the document root confines that login to one folder. This gives a developer or contractor access to a single directory without your main credentials.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note that plain FTP is unencrypted, so use FTPS for the connection.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Who this is for<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is for a site owner giving a developer, contractor, or agency FTP access to one part of their hosting account &#8211; a theme folder, a staging directory, or a single site root &#8211; without exposing everything. If you want a scoped, revocable login rather than your own credentials, this is the feature.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What problem this solves<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Handing out your main FTP login is risky: it grants access to the entire hosting account, and you cannot revoke it without changing your own password and breaking your own clients. An FTP sub-user fixes that. You create a separate login, point it at one folder, and delete it when the work is done &#8211; your own access is untouched.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How SPanel solves this<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open <strong>Files &gt; FTP Accounts<\/strong>. The page lists any accounts you already have and shows a <strong>New FTP Account<\/strong> button.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click it to open the create form, which has three fields: <strong>FTP username<\/strong>, <strong>Document Root<\/strong> (the home directory path the login is confined to), and <strong>Password<\/strong>, which shows the placeholder &#8220;Enter a Password&#8221;. Fill in those three fields and save; SPanel creates the account and it appears in the <strong>Existing FTP Accounts<\/strong> list. SPanel enforces the username format and binds the login to the folder you chose. You still choose a strong password, hand the credentials to the right person, and point their FTP client at the correct host and port.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why this is different in SPanel<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two details are specific to SPanel.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, <strong>username namespacing<\/strong>: SPanel keeps every sub-user under your account, so the effective login is &lt;account&gt;_&lt;subuser&gt;. You cannot create a bare username, and that format prevents collisions with sub-users on other accounts on the same server.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second, the <strong>home directory is set at creation<\/strong>, so the sub-user stays in the document root you enter rather than browsing the rest of your account.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Before you start<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sign in to SPanel<\/strong> with your normal account login &#8211; this is done in the user interface, no admin access required.<\/li>\n\n\n\n<li><strong>Know the exact folder the sub-user should be confined to<\/strong> before you open the form.<\/li>\n\n\n\n<li><strong>Have a strong, unique password<\/strong>; do not reuse your account password.<\/li>\n\n\n\n<li><strong>Know the FTP host and port<\/strong> the person will connect to, since SPanel does not configure their client.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step-by-step<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open <strong>Files<\/strong> > <strong>FTP Accounts<\/strong>. You will see the FTP Accounts page with your existing accounts and the New FTP Account button.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large mpg-gallery\"><img decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/01-ftp-list-1024x640.webp\" alt=\"How to Create an FTP Sub-User in SPanel, Step-by-step\" class=\"wp-image-6074\" srcset=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/01-ftp-list-1024x640.webp 1024w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/01-ftp-list-300x188.webp 300w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/01-ftp-list-768x480.webp 768w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/01-ftp-list.webp 1440w\" sizes=\"(max-width: 361px) 660px, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 910px, 1140px\" \/><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Click <strong>New FTP Account<\/strong>. The create form opens with the FTP username, Document Root, and Password fields.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large mpg-gallery\"><img decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/02-new-ftp-form-1024x640.webp\" alt=\"How to Create an FTP Sub-User in SPanel, Step-by-step 2\" class=\"wp-image-6075\" srcset=\"https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/02-new-ftp-form-1024x640.webp 1024w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/02-new-ftp-form-300x188.webp 300w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/02-new-ftp-form-768x480.webp 768w, https:\/\/www.scalahosting.com\/kb\/wp-content\/uploads\/2026\/07\/02-new-ftp-form.webp 1440w\" sizes=\"(max-width: 361px) 660px, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 910px, 1140px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Enter the <strong>FTP username<\/strong>. The effective login will be namespaced as &lt;account>_&lt;subuser>, so keep the part you type short and recognizable.<\/li>\n\n\n\n<li>Set the <strong>Document Root<\/strong> to the one folder this login should reach &#8211; in our example, \/home\/yoga\/kb-test\/. Double-check this path before saving: it is the boundary that keeps the sub-user out of the rest of your account, so a wrong path can over-expose your files.<\/li>\n\n\n\n<li>Enter a password in the <strong>Password<\/strong> field (it shows &#8220;Enter a Password&#8221;). Use something strong and unique.<\/li>\n\n\n\n<li><strong>Save<\/strong>. The account is added and appears in the Existing FTP Accounts list. From there you can hand off the credentials and delete the account later when access is no longer needed.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What happens behind the scenes<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When you save, SPanel registers the sub-user under your account name and ties it to the document root you entered. The namespacing keeps your sub-users distinct from everyone else&#8217;s on the same machine, and the home directory binding enforces the folder boundary &#8211; so the confinement is a property of how the account is created, not something the person connecting can opt out of.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Limitations and edge cases<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The username is namespaced.<\/strong> SPanel enforces the &lt;account>_&lt;subuser> format, so you cannot pick a standalone name. This means: tell the person their full login is the prefixed form, or their client will fail to authenticate with the short name alone.<\/li>\n\n\n\n<li><strong>A sub-user is not a separate system identity.<\/strong> It is an FTP login scoped to a home directory, not a Linux user or a separate filesystem identity. If you need OS-level separation or shell access, an FTP sub-user is the wrong tool.<\/li>\n\n\n\n<li><strong>Plain FTP is unencrypted.<\/strong> Credentials and file contents travel in clear text. Use FTPS so the login and data are encrypted in transit; see Connect over FTP and FTPS in SPanel for the host, port, and client settings.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troubleshooting<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-regular green-rows\"><table class=\"has-fixed-layout\"><tbody><tr><td>Symptom<\/td><td>Likely cause<\/td><td>What to do<\/td><\/tr><tr><td>Login is rejected with the name you typed<\/td><td>The client is using the short name, not the namespaced one<\/td><td>Connect with the full &lt;account>_&lt;subuser> login<\/td><\/tr><tr><td>Sub-user sees more or fewer files than expected<\/td><td>The Document Root was set to the wrong path<\/td><td>Delete the account and recreate it with the correct folder<\/td><\/tr><tr><td>New account is not in the list<\/td><td>The form was not saved, or a field was empty<\/td><td>Reopen New FTP Account, complete all three fields, and save<\/td><\/tr><tr><td>Connection works but credentials look exposed<\/td><td>Connecting over plain FTP, not FTPS<\/td><td>Switch the client to FTPS and reconnect<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>When to use this \/ when not to use this<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-regular green-cols\"><table class=\"has-fixed-layout\"><tbody><tr><td>Use this when<\/td><td>Skip or use something else when<\/td><\/tr><tr><td>You want to give one person scoped FTP access to a folder<\/td><td>You need shell or SSH access<\/td><\/tr><tr><td>The access should be easy to revoke later<\/td><td>You need a true separate system user identity<\/td><\/tr><tr><td>You want your own credentials to stay private<\/td><td>The person needs to manage databases or email<\/td><\/tr><tr><td>Work is limited to a known directory like a site root<\/td><td>The task is better done in WordPress Manager or the file manager<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>FAQ<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>What username will the developer log in with?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> The namespaced form, &lt;account>_&lt;subuser>. SPanel enforces this, so the short name you type will not authenticate on its own.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Can the sub-user reach folders outside the document root?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> No. The home directory you set at creation confines the login to that folder. To change it, delete and recreate the account with the right path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Is the FTP sub-user a separate Linux user?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> No. It is an FTP login scoped to a directory, not a system user or filesystem identity, and cannot be used for shell access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Is the connection encrypted?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> Not over plain FTP &#8211; that is clear text. Use FTPS to encrypt credentials and data in transit; the FTPS article covers the settings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>How do I remove access when the work is done?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> Delete the account from the Existing FTP Accounts list. Your own account and other sub-users are unaffected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Does creating a sub-user change my main FTP login?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> No. The sub-user is separate, so your own credentials and access stay exactly as they were.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q:<\/strong> <strong>Can two accounts on the server have the same sub-user name?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A:<\/strong> The namespacing prevents a collision: each name lives under its own account, so the effective logins stay distinct even if the typed part matches.<\/p>\n\n\n\n<script type=\"application\/ld+json\">\n    {\n      \"@context\": \"https:\/\/schema.org\",\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [{\n        \"@type\": \"Question\",\n        \"name\": \"What username will the developer log in with?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"The namespaced form, <account>_<subuser>. SPanel enforces this, so the short name you type will not authenticate on its own.\"\n        }\n      }, {\n        \"@type\": \"Question\",\n        \"name\": \"Can the sub-user reach folders outside the document root?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"No. The home directory you set at creation confines the login to that folder. To change it, delete and recreate the account with the right path.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Is the FTP sub-user a separate Linux user?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"No. It is an FTP login scoped to a directory, not a system user or filesystem identity, and cannot be used for shell access.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Is the connection encrypted?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Not over plain FTP - that is clear text. Use FTPS to encrypt credentials and data in transit; the FTPS article covers the settings.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"How do I remove access when the work is done?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"Delete the account from the Existing FTP Accounts list. Your own account and other sub-users are unaffected.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Does creating a sub-user change my main FTP login?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"No. The sub-user is separate, so your own credentials and access stay exactly as they were.\"\n        }\n      },{\n        \"@type\": \"Question\",\n        \"name\": \"Can two accounts on the server have the same sub-user name?\",\n        \"acceptedAnswer\": {\n          \"@type\": \"Answer\",\n          \"text\": \"The namespacing prevents a collision: each name lives under its own account, so the effective logins stay distinct even if the typed part matches.\"\n        }\n      }]\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>In Spanel, you create an FTP sub-user under Files &gt; FTP Accounts using the New FTP Account form, where you set a username, a document root, and a password. SPanel namespaces every sub-user under your account, so the name you type becomes &lt;account&gt;_&lt;subuser&gt;, and the document root confines that login to one folder. This gives [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_seopress_titles_title":"How to Create an FTP Sub-User in SPanel | ScalaHosting KB","_seopress_titles_desc":"Learn how to create an FTP sub-user in SPanel and grant secure access to specific files and directories. Follow this step-by-step guide to set up FTP accounts quickly and easily.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"footnotes":""},"categories":[66],"tags":[],"class_list":["post-6073","post","type-post","status-publish","format-standard","hentry","category-tutorials"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/comments?post=6073"}],"version-history":[{"count":1,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6073\/revisions"}],"predecessor-version":[{"id":6076,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/posts\/6073\/revisions\/6076"}],"wp:attachment":[{"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/media?parent=6073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/categories?post=6073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.scalahosting.com\/kb\/wp-json\/wp\/v2\/tags?post=6073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}