diff --git a/apps/web/src/app/layouts/user-layout.component.html b/apps/web/src/app/layouts/user-layout.component.html
index 10f569e2558..57b8cf047c4 100644
--- a/apps/web/src/app/layouts/user-layout.component.html
+++ b/apps/web/src/app/layouts/user-layout.component.html
@@ -3,7 +3,9 @@
-
+ @if (sendEnabled$ | async) {
+
+ }
diff --git a/apps/web/src/app/layouts/user-layout.component.ts b/apps/web/src/app/layouts/user-layout.component.ts
index 33bce661c65..6af7b0639e5 100644
--- a/apps/web/src/app/layouts/user-layout.component.ts
+++ b/apps/web/src/app/layouts/user-layout.component.ts
@@ -4,12 +4,13 @@ import { CommonModule } from "@angular/common";
import { Component, OnInit, Signal } from "@angular/core";
import { toSignal } from "@angular/core/rxjs-interop";
import { RouterModule } from "@angular/router";
-import { Observable, switchMap } from "rxjs";
+import { map, Observable, switchMap } from "rxjs";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { PasswordManagerLogo } from "@bitwarden/assets/svg";
import { canAccessEmergencyAccess } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
+import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
@@ -42,6 +43,11 @@ export class UserLayoutComponent implements OnInit {
protected hasFamilySponsorshipAvailable$: Observable;
protected showSponsoredFamilies$: Observable;
protected showSubscription$: Observable;
+ protected readonly sendEnabled$: Observable = this.accountService.activeAccount$.pipe(
+ getUserId,
+ switchMap((userId) => this.policyService.policyAppliesToUser$(PolicyType.DisableSend, userId)),
+ map((isDisabled) => !isDisabled),
+ );
protected consolidatedSessionTimeoutComponent$: Observable;
constructor(
diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts
index 932d0b8119b..a5fe3f5d627 100644
--- a/apps/web/src/app/oss-routing.module.ts
+++ b/apps/web/src/app/oss-routing.module.ts
@@ -1,5 +1,6 @@
import { NgModule } from "@angular/core";
import { Route, RouterModule, Routes } from "@angular/router";
+import { map } from "rxjs";
import { organizationPolicyGuard } from "@bitwarden/angular/admin-console/guards";
import { AuthenticationTimeoutComponent } from "@bitwarden/angular/auth/components/authentication-timeout.component";
@@ -50,6 +51,7 @@ import {
NewDeviceVerificationComponent,
} from "@bitwarden/auth/angular";
import { canAccessEmergencyAccess } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
+import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { AnonLayoutWrapperComponent, AnonLayoutWrapperData } from "@bitwarden/components";
import { LockComponent, RemovePasswordComponent } from "@bitwarden/key-management-ui";
@@ -641,6 +643,13 @@ const routes: Routes = [
path: "sends",
component: SendComponent,
data: { titleId: "send" } satisfies RouteDataProperties,
+ canActivate: [
+ organizationPolicyGuard((userId, _configService, policyService) =>
+ policyService
+ .policyAppliesToUser$(PolicyType.DisableSend, userId)
+ .pipe(map((policyApplies) => !policyApplies)),
+ ),
+ ],
},
{
path: "sm-landing",