{"id":5706,"date":"2020-07-24T06:56:29","date_gmt":"2020-07-24T06:56:29","guid":{"rendered":"https:\/\/infyblog.zluck.in\/?p=5706"},"modified":"2025-07-17T09:31:30","modified_gmt":"2025-07-17T09:31:30","slug":"spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder","status":"publish","type":"post","link":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/","title":{"rendered":"Customize Spatie Multi-Tenancy Without Subdomain"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"5706\" class=\"elementor elementor-5706\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2cbfa6b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2cbfa6b\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a339fad\" data-id=\"a339fad\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\n\t\t<div class=\"elementor-element elementor-element-3e63754 elementor-widget elementor-widget-text-editor\" data-id=\"3e63754\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Recently <a href=\"https:\/\/spatie.be\/\">Spatie<\/a> released a brand new package for multi-tenancy called<a href=\"https:\/\/spatie.be\/docs\/laravel-multitenancy\/v1\/introduction\"> laravel-multitenancy<\/a>.<\/p><p>It comes with great support to work out of the box with sub-domains like,<\/p><p>https:\/\/zluck.infychat.com<\/p><p>https:\/\/infyom.infychat.com<\/p><p>https:\/\/vasundhara.infychat.com<\/p><p>It identifies the tenant based on the sub-domain and sets a database runtime for your tenant-specific models.<\/p><p>Recently, we used it in one of our clients for Snow Removal CRM. Here we have two models,<\/p><ul><li>Freemium Model &#8211; with no sub-domain (application will work on main domain only)<\/li><li>Premium Model &#8211; where the tenant will get its subdomain<\/li><\/ul><p>And a user can convert his account from Freemium to Premium at any point in time by just subscribing to the plan.<\/p><p>So what we want is, on the backend, we want to have a separate database for each tenant, but the application should run on main as well as a sub-domain.<\/p><p>So what we want to have is the ability to extend\/customize the tenant detection mechanism. And Spatie does a very good job there where you can customize the logic.<\/p><p>You can create your own TenantFinder class and configure it in the config file of the package. And there is very good documentation for that here:<a href=\"https:\/\/docs.spatie.be\/laravel-multitenancy\/v1\/installation\/determining-current-tenant\/\">https:\/\/docs.spatie.be\/laravel-multitenancy\/v1\/installation\/determining-current-tenant\/<\/a><\/p><p>To do that, what we did is, we have a field called<span style=\"color: #e83e8c;\"> tenant_id<\/span> in our<span style=\"color: #e83e8c;\"> users<\/span> table. All of our users are stored in the main database since we may have user access across the tenant.<\/p><p>And when any user does a login, we listen for the event <span style=\"color: #e83e8c;\">Illuminate\\Auth\\Events\\Login<\/span> which is documented in Laravel Docs over <a href=\"https:\/\/laravel.com\/docs\/7.x\/authentication#events\">here<\/a>.<\/p><p>When a user does a login, our listener will be called and will create a cookie called<span style=\"color: #e83e8c;\"> tenant<\/span> on the browser with the tenant id of the user. So our listener will look like,<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-763d644 elementor-widget elementor-widget-code-highlight\" data-id=\"763d644\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript \">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp><?php\r\nnamespace App\\Listeners;\r\n\r\nuse App\\Models\\User;\r\nuse Cookie;\r\nuse Illuminate\\Auth\\Events\\Login;\r\n\r\nclass LoginListener\r\n{\r\n    public function handle(Login $event)\r\n    {\r\n        \/* @var User $authUser \/\r\n        $authUser = $event->user;\r\n\r\n        Cookie::forget('tenant');\r\n        Cookie::queue(Cookie::forever('tenant', encrypt($authUser->tenant_id)));\r\n    }\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bf35005 elementor-widget elementor-widget-text-editor\" data-id=\"bf35005\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Also, we encrypt the cookie on our end, so we do not want Laravel to encrypt it again, so we added the <span style=\"color: #e83e8c;\">tenant<\/span> cookie into except array of<span style=\"color: #e83e8c;\"> EncryptCookies<\/span> middleware as per documentation <a href=\"https:\/\/laravel.com\/docs\/7.x\/responses#cookies-and-encryption\">here<\/a>. so our middleware looks like,<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-624a269 elementor-widget elementor-widget-code-highlight\" data-id=\"624a269\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript \">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp><?php\r\nnamespace App\\Http\\Middleware;\r\n\r\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies as Middleware;\r\n\r\nclass EncryptCookies extends Middleware\r\n{\r\n    \/**\r\n      The names of the cookies should not be encrypted.\r\n\r\n      @var array\r\n     \/\r\n    protected $except = [undefined];\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce6383d elementor-widget elementor-widget-text-editor\" data-id=\"ce6383d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Now at the last point, we extended our logic to find a tenant and get it to work on the main domain as well as sub-domain.<\/p><p>We have created our own custom class called <span style=\"color: #e83e8c;\">InfyChatTenantFinder<\/span>, which looks like,<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6682676 elementor-widget elementor-widget-code-highlight\" data-id=\"6682676\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript \">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp><?php\r\nnamespace App\\TenantFinder;\r\n\r\nuse App\\Models\\Account;\r\nuse App\\Models\\SubDomain;\r\nuse Illuminate\\Http\\Request;\r\nuse Spatie\\Multitenancy\\Models\\Concerns\\UsesTenantModel;\r\nuse Spatie\\Multitenancy\\Models\\Tenant;\r\nuse Spatie\\Multitenancy\\TenantFinder\\TenantFinder;\r\n\r\nclass InfyChatTenantFinder extends TenantFinder\r\n{\r\n    use UsesTenantModel;\r\n\r\n    public function findForRequest(Request $request): ?Tenant\r\n    {\r\n        $host = $request->getHost();\r\n        list($subDomain) = explode('.', $host, 2);\r\n\r\n        \/\/ Get Tenant by subdomain if it's on subdomain\r\n        if (!in_array($subDomain, [\"www\", \"admin\", \"infychat\"])) {\r\n            return $this->getTenantModel()::whereDomain($host)->first();\r\n        }\r\n\r\n        \/\/ Get Tenant from user's account id if it's main domain\r\n        if (in_array($subDomain, [\"www\", \"infychat\"])) {\r\n\r\n            if ($request->hasCookie('tenant')) {\r\n                $accountId = $request->cookie('tenant');\r\n                $accountId = decrypt($accountId);\r\n                $account = $this->getTenantModel()::find($accountId);\r\n\r\n                if (!empty($account)) {\r\n                    return $account;\r\n                }\r\n                \\Cookie::forget('tenant');\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0274802 elementor-widget elementor-widget-text-editor\" data-id=\"0274802\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>So basically, first we check if the sub-domain is there, then find a tenant from the sub-domain.<\/p><p>If the domain is the main domain then get the tenant id from the cookie and return the account (tenant) model.<\/p><p>So this is how you can customize the logic the way you want to have a custom tenant identification system.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t\n    <div class=\"xs_social_share_widget xs_share_url after_content \t\tmain_content  wslu-style-1 wslu-share-box-shaped wslu-fill-colored wslu-none wslu-share-horizontal wslu-theme-font-no wslu-main_content\">\n\n\t\t\n        <ul>\n\t\t\t        <\/ul>\n    <\/div> \n","protected":false},"excerpt":{"rendered":"<p>How to use Spatie multi-tenancy package with a single domain and create your custom TenantFinder class in&#8230;<\/p>\n","protected":false},"author":2,"featured_media":5709,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"two_page_speed":[],"footnotes":""},"categories":[9],"tags":[175,174,14],"class_list":["post-5706","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-multi-tenancy","tag-sub-domain","tag-tips"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Customize Spatie Multi-Tenancy Without Subdomain<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Customize Spatie Multi-Tenancy Without Subdomain\" \/>\n<meta property=\"og:description\" content=\"How to use Spatie multi-tenancy package with a single domain and create your custom TenantFinder class in...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog | InfyOm Technologies\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infyom\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-24T06:56:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-17T09:31:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png\" \/>\n\t<meta property=\"og:image:width\" content=\"772\" \/>\n\t<meta property=\"og:image:height\" content=\"484\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InfyOm\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@InfyOm\" \/>\n<meta name=\"twitter:site\" content=\"@InfyOm\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InfyOm\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\"},\"author\":{\"name\":\"InfyOm\",\"@id\":\"https:\/\/infyom.com\/blog\/#\/schema\/person\/659bfc844c333d041221e83c5f5ec754\"},\"headline\":\"Customize Spatie Multi-Tenancy Without Subdomain\",\"datePublished\":\"2020-07-24T06:56:29+00:00\",\"dateModified\":\"2025-07-17T09:31:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\"},\"wordCount\":443,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/infyom.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png\",\"keywords\":[\"Multi-Tenancy\",\"Sub Domain\",\"Tips\"],\"articleSection\":[\"Laravel\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\",\"url\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\",\"name\":\"Customize Spatie Multi-Tenancy Without Subdomain\",\"isPartOf\":{\"@id\":\"https:\/\/infyom.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png\",\"datePublished\":\"2020-07-24T06:56:29+00:00\",\"dateModified\":\"2025-07-17T09:31:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage\",\"url\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png\",\"contentUrl\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png\",\"width\":772,\"height\":484,\"caption\":\"Spatie Laravel Multi-Tenancy without Sub Domain (customize TenantFinder)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/infyom.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Customize Spatie Multi-Tenancy Without Subdomain\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/infyom.com\/blog\/#website\",\"url\":\"https:\/\/infyom.com\/blog\/\",\"name\":\"Blog | InfyOm Technologies\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/infyom.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/infyom.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/infyom.com\/blog\/#organization\",\"name\":\"InfyOm Technologies\",\"url\":\"https:\/\/infyom.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/infyom.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/06\/InfyOm-Logo.png\",\"contentUrl\":\"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/06\/InfyOm-Logo.png\",\"width\":88,\"height\":41,\"caption\":\"InfyOm Technologies\"},\"image\":{\"@id\":\"https:\/\/infyom.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infyom\",\"https:\/\/x.com\/InfyOm\",\"https:\/\/www.instagram.com\/infyomtechnologies\/\",\"https:\/\/in.linkedin.com\/company\/infyom-technologies\",\"https:\/\/github.com\/infyomlabs\",\"https:\/\/x.com\/infyom\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/infyom.com\/blog\/#\/schema\/person\/659bfc844c333d041221e83c5f5ec754\",\"name\":\"InfyOm\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/infyom.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1ad162864d8d33c04ea9e6d0333cc483?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1ad162864d8d33c04ea9e6d0333cc483?s=96&d=mm&r=g\",\"caption\":\"InfyOm\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Customize Spatie Multi-Tenancy Without Subdomain","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/","og_locale":"en_US","og_type":"article","og_title":"Customize Spatie Multi-Tenancy Without Subdomain","og_description":"How to use Spatie multi-tenancy package with a single domain and create your custom TenantFinder class in...","og_url":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/","og_site_name":"Blog | InfyOm Technologies","article_publisher":"https:\/\/www.facebook.com\/infyom","article_published_time":"2020-07-24T06:56:29+00:00","article_modified_time":"2025-07-17T09:31:30+00:00","og_image":[{"width":772,"height":484,"url":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png","type":"image\/png"}],"author":"InfyOm","twitter_card":"summary_large_image","twitter_creator":"@InfyOm","twitter_site":"@InfyOm","twitter_misc":{"Written by":"InfyOm","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#article","isPartOf":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/"},"author":{"name":"InfyOm","@id":"https:\/\/infyom.com\/blog\/#\/schema\/person\/659bfc844c333d041221e83c5f5ec754"},"headline":"Customize Spatie Multi-Tenancy Without Subdomain","datePublished":"2020-07-24T06:56:29+00:00","dateModified":"2025-07-17T09:31:30+00:00","mainEntityOfPage":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/"},"wordCount":443,"commentCount":0,"publisher":{"@id":"https:\/\/infyom.com\/blog\/#organization"},"image":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage"},"thumbnailUrl":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png","keywords":["Multi-Tenancy","Sub Domain","Tips"],"articleSection":["Laravel"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/","url":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/","name":"Customize Spatie Multi-Tenancy Without Subdomain","isPartOf":{"@id":"https:\/\/infyom.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage"},"image":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage"},"thumbnailUrl":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png","datePublished":"2020-07-24T06:56:29+00:00","dateModified":"2025-07-17T09:31:30+00:00","breadcrumb":{"@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#primaryimage","url":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png","contentUrl":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/08\/multi-tenant.png","width":772,"height":484,"caption":"Spatie Laravel Multi-Tenancy without Sub Domain (customize TenantFinder)"},{"@type":"BreadcrumbList","@id":"https:\/\/infyom.com\/blog\/spatie-laravel-multi-tenancy-without-sub-domain-customize-tenantfinder\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/infyom.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Customize Spatie Multi-Tenancy Without Subdomain"}]},{"@type":"WebSite","@id":"https:\/\/infyom.com\/blog\/#website","url":"https:\/\/infyom.com\/blog\/","name":"Blog | InfyOm Technologies","description":"","publisher":{"@id":"https:\/\/infyom.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/infyom.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/infyom.com\/blog\/#organization","name":"InfyOm Technologies","url":"https:\/\/infyom.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/infyom.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/06\/InfyOm-Logo.png","contentUrl":"https:\/\/infyom.com\/blog\/wp-content\/uploads\/2024\/06\/InfyOm-Logo.png","width":88,"height":41,"caption":"InfyOm Technologies"},"image":{"@id":"https:\/\/infyom.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infyom","https:\/\/x.com\/InfyOm","https:\/\/www.instagram.com\/infyomtechnologies\/","https:\/\/in.linkedin.com\/company\/infyom-technologies","https:\/\/github.com\/infyomlabs","https:\/\/x.com\/infyom"]},{"@type":"Person","@id":"https:\/\/infyom.com\/blog\/#\/schema\/person\/659bfc844c333d041221e83c5f5ec754","name":"InfyOm","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/infyom.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1ad162864d8d33c04ea9e6d0333cc483?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1ad162864d8d33c04ea9e6d0333cc483?s=96&d=mm&r=g","caption":"InfyOm"}}]}},"_links":{"self":[{"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/posts\/5706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/comments?post=5706"}],"version-history":[{"count":20,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/posts\/5706\/revisions"}],"predecessor-version":[{"id":8193,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/posts\/5706\/revisions\/8193"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/media\/5709"}],"wp:attachment":[{"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/media?parent=5706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/categories?post=5706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infyom.com\/blog\/wp-json\/wp\/v2\/tags?post=5706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}