[{"data":1,"prerenderedAt":448},["ShallowReactive",2],{"content-/core-concepts/subdomain-architecture":3,"docs-toc":266},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"type":10,"status":11,"applies_to":12,"last_reviewed":14,"related":15,"body":19,"_type":260,"_id":261,"_source":262,"_file":263,"_stem":264,"_extension":265},"/core-concepts/subdomain-architecture","core-concepts",false,"","Subdomain architecture","PropLink uses subdomains to route each kind of user to the right interface. Here is the map.","concept","live",[13],"shared","2026-05-10",[16,17,18],"/core-concepts/organisations-and-multi-tenancy","/core-concepts/the-proplink-ecosystem","/portals-and-apps",{"type":20,"children":21,"toc":251},"root",[22,30,36,43,48,54,112,117,123,128,159,172,178,183,211,216,222],{"type":23,"tag":24,"props":25,"children":27},"element","h1",{"id":26},"subdomain-architecture",[28],{"type":29,"value":8},"text",{"type":23,"tag":31,"props":32,"children":33},"p",{},[34],{"type":29,"value":35},"Where you sign in tells PropLink who you are and which organisation you belong to. The platform uses subdomains to route each kind of user to the right interface.",{"type":23,"tag":37,"props":38,"children":40},"h2",{"id":39},"the-subdomains",[41],{"type":29,"value":42},"The subdomains",{"type":23,"tag":44,"props":45,"children":47},"glossary",{":items":46},"[{\"term\":\"login.proplinkcloud.com\",\"definition\":\"The universal sign-in page. Anyone with PropLink admin access starts here. After signing in, the platform redirects you to your organisation's subdomain.\"},{\"term\":\"admin.proplinkcloud.com\",\"definition\":\"For PropLink staff only, used for tenant onboarding, support and platform-wide observability. Customers never need to touch this URL.\"},{\"term\":\"\u003Cyour-org>.proplinkcloud.com\",\"definition\":\"Your organisation's main admin app. The subdomain is chosen during organisation setup, for example goldcrest.proplinkcloud.com. This is where managers, accountants and administrators do their day-to-day work.\"},{\"term\":\"\u003Cyour-org>.residenceport.com\",\"definition\":\"Your branded resident portal. Leaseholders and tenants sign in here. Each organisation gets a subdomain on residenceport.com so the portal feels like part of your firm.\"},{\"term\":\"\u003Cyour-org>.buildingthread.com\",\"definition\":\"Coming soon. The golden thread portal for residents of high-risk buildings. Same model as ResidencePort, one subdomain per organisation.\"},{\"term\":\"contractorport.com/\u003Ctoken>\",\"definition\":\"ContractorPort is invitation-only. A contractor is sent a single-use signed link that opens the work-order submission form. There is no general portal home page.\"}]",[],{"type":23,"tag":37,"props":49,"children":51},{"id":50},"what-happens-when-you-sign-in",[52],{"type":29,"value":53},"What happens when you sign in",{"type":23,"tag":55,"props":56,"children":57},"steps",{},[58],{"type":23,"tag":59,"props":60,"children":61},"ol",{},[62,77,82,87,99],{"type":23,"tag":63,"props":64,"children":65},"li",{},[66,68,75],{"type":29,"value":67},"You open ",{"type":23,"tag":69,"props":70,"children":72},"code",{"className":71},[],[73],{"type":29,"value":74},"login.proplinkcloud.com",{"type":29,"value":76},".",{"type":23,"tag":63,"props":78,"children":79},{},[80],{"type":29,"value":81},"You enter your email and password.",{"type":23,"tag":63,"props":83,"children":84},{},[85],{"type":29,"value":86},"PropLink shows the organisations your email is linked to. Often there is only one.",{"type":23,"tag":63,"props":88,"children":89},{},[90,92,98],{"type":29,"value":91},"You pick the organisation and PropLink redirects you to ",{"type":23,"tag":69,"props":93,"children":95},{"className":94},[],[96],{"type":29,"value":97},"your-org.proplinkcloud.com/dashboard",{"type":29,"value":76},{"type":23,"tag":63,"props":100,"children":101},{},[102,104,110],{"type":29,"value":103},"From now on, every API call and every page load carries an implicit ",{"type":23,"tag":69,"props":105,"children":107},{"className":106},[],[108],{"type":29,"value":109},"X-Org-Subdomain",{"type":29,"value":111}," header that scopes the request to your organisation.",{"type":23,"tag":31,"props":113,"children":114},{},[115],{"type":29,"value":116},"The same flow works for ResidencePort and the Facility Report mobile app, only the start URL differs.",{"type":23,"tag":37,"props":118,"children":120},{"id":119},"how-the-platform-decides-which-organisation-you-are-in",[121],{"type":29,"value":122},"How the platform decides which organisation you are in",{"type":23,"tag":31,"props":124,"children":125},{},[126],{"type":29,"value":127},"The subdomain in the URL is the source of truth. Every incoming request goes through middleware that:",{"type":23,"tag":59,"props":129,"children":130},{},[131,136,141,146],{"type":23,"tag":63,"props":132,"children":133},{},[134],{"type":29,"value":135},"Reads the subdomain.",{"type":23,"tag":63,"props":137,"children":138},{},[139],{"type":29,"value":140},"Looks up the matching organisation.",{"type":23,"tag":63,"props":142,"children":143},{},[144],{"type":29,"value":145},"Confirms the signed-in user is allowed to access that organisation.",{"type":23,"tag":63,"props":147,"children":148},{},[149,151,157],{"type":29,"value":150},"Sets ",{"type":23,"tag":69,"props":152,"children":154},{"className":153},[],[155],{"type":29,"value":156},"organisation_uuid",{"type":29,"value":158}," for the duration of the request.",{"type":23,"tag":31,"props":160,"children":161},{},[162,164,170],{"type":29,"value":163},"If any of those steps fail, the request is rejected. There is no fallback to ",{"type":23,"tag":165,"props":166,"children":167},"em",{},[168],{"type":29,"value":169},"\"some other organisation\"",{"type":29,"value":171}," and no way to spoof another tenant by changing the URL.",{"type":23,"tag":37,"props":173,"children":175},{"id":174},"switching-organisations",[176],{"type":29,"value":177},"Switching organisations",{"type":23,"tag":31,"props":179,"children":180},{},[181],{"type":29,"value":182},"If you have access to several organisations:",{"type":23,"tag":55,"props":184,"children":185},{},[186],{"type":23,"tag":59,"props":187,"children":188},{},[189,194,206],{"type":23,"tag":63,"props":190,"children":191},{},[192],{"type":29,"value":193},"Click your profile in the top right.",{"type":23,"tag":63,"props":195,"children":196},{},[197,199,205],{"type":29,"value":198},"Pick ",{"type":23,"tag":200,"props":201,"children":202},"strong",{},[203],{"type":29,"value":204},"Switch organisation",{"type":29,"value":76},{"type":23,"tag":63,"props":207,"children":208},{},[209],{"type":29,"value":210},"PropLink redirects you to the chosen organisation's subdomain.",{"type":23,"tag":31,"props":212,"children":213},{},[214],{"type":29,"value":215},"Each tab in your browser stays on the organisation it was opened against. You can have two tabs open on two different organisations safely, they share nothing.",{"type":23,"tag":37,"props":217,"children":219},{"id":218},"test-domains",[220],{"type":29,"value":221},"Test domains",{"type":23,"tag":31,"props":223,"children":224},{},[225,227,233,235,241,243,249],{"type":29,"value":226},"In development the same scheme works against ",{"type":23,"tag":69,"props":228,"children":230},{"className":229},[],[231],{"type":29,"value":232},"proplink.test",{"type":29,"value":234},". ",{"type":23,"tag":69,"props":236,"children":238},{"className":237},[],[239],{"type":29,"value":240},"goldcrest.proplink.test",{"type":29,"value":242},", ",{"type":23,"tag":69,"props":244,"children":246},{"className":245},[],[247],{"type":29,"value":248},"goldcrest.residenceport.test",{"type":29,"value":250}," and so on resolve to the same backend with the same tenancy rules. There is no special test-only behaviour.",{"title":7,"searchDepth":252,"depth":252,"links":253},3,[254,256,257,258,259],{"id":39,"depth":255,"text":42},2,{"id":50,"depth":255,"text":53},{"id":119,"depth":255,"text":122},{"id":174,"depth":255,"text":177},{"id":218,"depth":255,"text":221},"markdown","content:02.core-concepts:subdomain-architecture.md","content","02.core-concepts/subdomain-architecture.md","02.core-concepts/subdomain-architecture","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"type":10,"status":11,"applies_to":267,"last_reviewed":14,"related":268,"body":269,"_type":260,"_id":261,"_source":262,"_file":263,"_stem":264,"_extension":265},[13],[16,17,18],{"type":20,"children":270,"toc":441},[271,275,279,283,286,290,334,338,342,346,371,380,384,388,411,415,419],{"type":23,"tag":24,"props":272,"children":273},{"id":26},[274],{"type":29,"value":8},{"type":23,"tag":31,"props":276,"children":277},{},[278],{"type":29,"value":35},{"type":23,"tag":37,"props":280,"children":281},{"id":39},[282],{"type":29,"value":42},{"type":23,"tag":44,"props":284,"children":285},{":items":46},[],{"type":23,"tag":37,"props":287,"children":288},{"id":50},[289],{"type":29,"value":53},{"type":23,"tag":55,"props":291,"children":292},{},[293],{"type":23,"tag":59,"props":294,"children":295},{},[296,306,310,314,324],{"type":23,"tag":63,"props":297,"children":298},{},[299,300,305],{"type":29,"value":67},{"type":23,"tag":69,"props":301,"children":303},{"className":302},[],[304],{"type":29,"value":74},{"type":29,"value":76},{"type":23,"tag":63,"props":307,"children":308},{},[309],{"type":29,"value":81},{"type":23,"tag":63,"props":311,"children":312},{},[313],{"type":29,"value":86},{"type":23,"tag":63,"props":315,"children":316},{},[317,318,323],{"type":29,"value":91},{"type":23,"tag":69,"props":319,"children":321},{"className":320},[],[322],{"type":29,"value":97},{"type":29,"value":76},{"type":23,"tag":63,"props":325,"children":326},{},[327,328,333],{"type":29,"value":103},{"type":23,"tag":69,"props":329,"children":331},{"className":330},[],[332],{"type":29,"value":109},{"type":29,"value":111},{"type":23,"tag":31,"props":335,"children":336},{},[337],{"type":29,"value":116},{"type":23,"tag":37,"props":339,"children":340},{"id":119},[341],{"type":29,"value":122},{"type":23,"tag":31,"props":343,"children":344},{},[345],{"type":29,"value":127},{"type":23,"tag":59,"props":347,"children":348},{},[349,353,357,361],{"type":23,"tag":63,"props":350,"children":351},{},[352],{"type":29,"value":135},{"type":23,"tag":63,"props":354,"children":355},{},[356],{"type":29,"value":140},{"type":23,"tag":63,"props":358,"children":359},{},[360],{"type":29,"value":145},{"type":23,"tag":63,"props":362,"children":363},{},[364,365,370],{"type":29,"value":150},{"type":23,"tag":69,"props":366,"children":368},{"className":367},[],[369],{"type":29,"value":156},{"type":29,"value":158},{"type":23,"tag":31,"props":372,"children":373},{},[374,375,379],{"type":29,"value":163},{"type":23,"tag":165,"props":376,"children":377},{},[378],{"type":29,"value":169},{"type":29,"value":171},{"type":23,"tag":37,"props":381,"children":382},{"id":174},[383],{"type":29,"value":177},{"type":23,"tag":31,"props":385,"children":386},{},[387],{"type":29,"value":182},{"type":23,"tag":55,"props":389,"children":390},{},[391],{"type":23,"tag":59,"props":392,"children":393},{},[394,398,407],{"type":23,"tag":63,"props":395,"children":396},{},[397],{"type":29,"value":193},{"type":23,"tag":63,"props":399,"children":400},{},[401,402,406],{"type":29,"value":198},{"type":23,"tag":200,"props":403,"children":404},{},[405],{"type":29,"value":204},{"type":29,"value":76},{"type":23,"tag":63,"props":408,"children":409},{},[410],{"type":29,"value":210},{"type":23,"tag":31,"props":412,"children":413},{},[414],{"type":29,"value":215},{"type":23,"tag":37,"props":416,"children":417},{"id":218},[418],{"type":29,"value":221},{"type":23,"tag":31,"props":420,"children":421},{},[422,423,428,429,434,435,440],{"type":29,"value":226},{"type":23,"tag":69,"props":424,"children":426},{"className":425},[],[427],{"type":29,"value":232},{"type":29,"value":234},{"type":23,"tag":69,"props":430,"children":432},{"className":431},[],[433],{"type":29,"value":240},{"type":29,"value":242},{"type":23,"tag":69,"props":436,"children":438},{"className":437},[],[439],{"type":29,"value":248},{"type":29,"value":250},{"title":7,"searchDepth":252,"depth":252,"links":442},[443,444,445,446,447],{"id":39,"depth":255,"text":42},{"id":50,"depth":255,"text":53},{"id":119,"depth":255,"text":122},{"id":174,"depth":255,"text":177},{"id":218,"depth":255,"text":221},1778601700085]