diff --git a/src/components/customerPortal/common/AgreementGate.tsx b/src/components/customerPortal/common/AgreementGate.tsx
new file mode 100644
index 0000000000..8dcfdf045d
--- /dev/null
+++ b/src/components/customerPortal/common/AgreementGate.tsx
@@ -0,0 +1,43 @@
+import { Button } from '~/components/designSystem/Button'
+import { Typography } from '~/components/designSystem/Typography'
+
+interface AgreementGateProps {
+ signingUrl?: string | null
+}
+
+export const AGREEMENT_GATE_TEST_ID = 'customer-portal-agreement-gate'
+
+// Blocking gate shown in the customer portal until the white-label / SDK MSA is
+// signed. Signing happens on the hosted gate page (signingUrl), which renders
+// the agreement, records the signature, and collects a payment method.
+const AgreementGate = ({ signingUrl }: AgreementGateProps) => {
+ return (
+
+
+ Action required: sign your agreement
+
+
+ Before you can access billing, invoices, and usage, please review and accept your
+ Master Services & White-Label / SDK Agreement. It only takes a minute and no
+ login is required.
+
+
+