← 11. Agency Global Settings
Chunks — 11. Agency Global Settings
The FRD markdown is the source of truth; these chunks are the derived retrieval index used to give the test-case generator only the relevant slices. Rebuilt automatically when the FRD is saved.
343 chunks · ~63,508 tokens
#1
(intro)
~6 tok
Agency Global Settings
#2
(intro)
~1 tok
#
#3
(intro)
~1 tok
#
#4
(intro)
~1 tok
#
#5
(intro)
~1 tok
#
#6
(intro)
~1 tok
#
#7
**Agency Global Settings**
~48 tok
# **Agency Global Settings** **Functional Requirement Document** **BA & Ideation: Deval Chauhan** **Reviewed By: Keval Gajjar** **Updated Date:25 December 2025 Status:** **Version: 1.0**
#8
**Agency Global Settings - Executive Summary**
~38 tok
# **Agency Global Settings - Executive Summary** **Module Overview** | **11 Sections** | **6 Complete FRDs + 5 Linked Modules** | **December 27, 2025**
#9
**Agency Global Settings - Executive Summary** > **🎯 Module Purpose**
~71 tok
## **🎯 Module Purpose** The Agency Global Settings module serves as the centralized configuration hub for managing user profiles, agency-wide business settings, payment methods, security preferences, and system configurations that govern the entire platform's operational behavior.
#10
**Agency Global Settings - Executive Summary** > **📋 Key Components**
~6 tok
## **📋 Key Components**
#11
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 1\. My Profile
~81 tok
### 1\. My Profile * **Features:** Personal info, profile photo (15MB max), business toggle * **Security:** Dual-verification email change, password complexity enforcement * **Preferences:** Date formats (DD/MM/YYYY, MM/DD/YYYY), timezone settings * **Key Rule:** Business toggle only for Agency Owner/Admin roles
#12
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 2\. General Settings
~77 tok
### 2\. General Settings * **Company Config:** Name (250 chars max), country, currency (Owner-only) * **Measurement:** Imperial/Metric toggle (future projects only) * **Travel Policy:** 25-mile increments (0-500) or "any" for no minimum * **Event Colors:** Customizable per event type with hex picker
#13
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 3\. Business & Payment Details
~75 tok
### 3\. Business & Payment Details * **Stripe Integration:** OAuth connection with 24-48hr verification * **Business Info:** Legal entity details for tax compliance * **Multi-Brand:** Each brand can have separate Stripe accounts * **Key Rule:** Only Agency Owner can edit; others read-only
#14
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 4\. Accepted Payment Methods
~72 tok
### 4\. Accepted Payment Methods * **Options:** Card Payments (2.9% + $0.30), ACH Transfers (lower fees) * **Validation:** At least one method must remain active * **Processing Fees:** Dynamic based on subscription plan * **Integration:** Direct connection to Stripe capabilities
#15
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 5\. Team Management _(Separate FRD)_
~53 tok
### 5\. Team Management _(Separate FRD)_ * **Roles:** 6 hierarchical levels (Owner → Contractor) * **Permissions:** Granular access controls per role * **Management:** Invite, edit, deactivate team members
#16
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 6\. 2-Step Verification
~65 tok
### 6\. 2-Step Verification * **Methods:** Email and/or SMS (both can be active) * **Security:** 1-minute cooldown, 5 attempts/day limit * **Codes:** 6-digit, 10-minute expiration * **Key Rule:** Mandatory for all users, cannot be permanently disabled
#17
**Agency Global Settings - Executive Summary** > **📋 Key Components** > 7-11. Linked Modules
~93 tok
### 7-11. Linked Modules * **Referral System:** Commission tracking and payouts _(Separate FRD)_ * **Notifications:** Email/SMS preferences and templates _(Separate FRD)_ * **Brands:** Multi-brand management and switching _(Separate FRD)_ * **Data Management:** Lead sources, custom fields, tags * **Subscription:** Plan management and billing _(Separate FRD)_
#18
**Agency Global Settings - Executive Summary** > **🔄 Access Control Matrix**
~106 tok
## **🔄 Access Control Matrix** **Role** **My Profile** **General** **Business/Payment** **Team** **2FA** **Data Mgmt** **Agency Owner** Full Full Full Edit Full Own Full **Admin** Full Most Read-Only Edit Own Full **Project Manager** Personal Limited Read-Only View Own View **Editor** Personal Limited No Access View Own View **Contractor** Personal Minimal No Access None Own None
#19
**Agency Global Settings - Executive Summary** > **✅ Critical Business Rules**
~160 tok
## **✅ Critical Business Rules** **Rule** **Description** **Impact** **Email Verification** Dual-code verification for email changes Security compliance **Currency Lock** Only Agency Owner can change currency Financial consistency **Measurement Forward-Only** Changes apply to future projects only Data integrity **Stripe Dependency** Payment collection requires verified Stripe Revenue protection **2FA Mandatory** Cannot be permanently disabled Account security **One Payment Method** At least one must remain active Transaction capability **Travel Fee Threshold** One-way distance before fees apply Cost management
#20
**Agency Global Settings - Executive Summary** > **🚨 Critical Validations**
~8 tok
## **🚨 Critical Validations**
#21
**Agency Global Settings - Executive Summary** > **🚨 Critical Validations** > Security Layer
~68 tok
### Security Layer * **Password:** Min 6 chars, 1 upper, 1 lower, 1 special character * **2FA Codes:** 6 digits, numeric only, 10-min expiration * **Email Change:** Both old and new email verification required * **Profile Photo:** JPG/PNG/JPEG only, 15MB maximum
#22
**Agency Global Settings - Executive Summary** > **🚨 Critical Validations** > Business Layer
~58 tok
### Business Layer * **Company Name:** 250 character maximum * **Business Verification:** 24-48 hour Stripe approval * **Processing Fees:** Subscription-dependent rates * **Lead Sources:** Cannot delete if in use by projects
#23
**Agency Global Settings - Executive Summary** > **📊 Key Metrics & Tracking**
~86 tok
## **📊 Key Metrics & Tracking** * **Audit Trail:** All settings changes logged with timestamps * **Verification Status:** Real-time Stripe account status * **2FA Success Rate:** Failed attempt monitoring * **Travel Fee Calculations:** Google Maps API integration * **Custom Field Usage:** Visibility across Agency/Client/Contractor
#24
**Agency Global Settings - Executive Summary** > **🔗 Integration Points**
~113 tok
## **🔗 Integration Points** **System** **Integration Type** **Purpose** **Stripe API** OAuth + Webhooks Payment processing & verification **Google Maps API** Distance calculation Travel fee computation **SendGrid/Twilio** Email/SMS delivery 2FA codes & notifications **Client Portal** Data sync Profile information updates **Invoice Module** Payment methods Transaction processing **Project Module** Custom fields Data collection
#25
**Agency Global Settings - Executive Summary** > **⚠️ Edge Cases & Limitations**
~9 tok
## **⚠️ Edge Cases & Limitations**
#26
**Agency Global Settings - Executive Summary** > **⚠️ Edge Cases & Limitations** > Handled Scenarios
~65 tok
### Handled Scenarios * **Lost 2FA Access:** Manual override via Pixally support * **Stripe Rejection:** Clear messaging with resolution steps * **Concurrent Edits:** Last-save-wins with session locking * **Email Service Down:** SMS fallback for 2FA
#27
**Agency Global Settings - Executive Summary** > **⚠️ Edge Cases & Limitations** > Known Limitations
~66 tok
### Known Limitations * **Transfer Ownership:** Not available in Phase 1 * **Password History:** Backend only, not visible to users * **QR Code Analytics:** Scan tracking pending implementation * **Multi-currency Conversion:** Display only, no conversion
#28
**Agency Global Settings - Executive Summary** > **📈 Success Metrics**
~6 tok
## **📈 Success Metrics**
#29
**Agency Global Settings - Executive Summary** > **📈 Success Metrics** > Quantified Benefits
~77 tok
### Quantified Benefits * **100% 2FA adoption** ensuring security compliance * **60% reduction** in payment setup time via Stripe OAuth * **Real-time synchronization** across all user sessions * **6 role levels** with granular permissions * **Unlimited custom fields** for flexible data collection
#30
**Agency Global Settings - Executive Summary** > **📈 Success Metrics** > Test Coverage
~49 tok
### Test Coverage * **40+ test cases** per module * **9 test categories** covering all scenarios * **4 priority levels** (Critical/High/Medium/Low) * **100% role-based access validation**
#31
**Agency Global Settings - Executive Summary** > **🎯 Business Value**
~211 tok
## **🎯 Business Value** The Agency Global Settings module provides the foundational configuration layer that enables agencies to: * **Customize operations** to match business needs without code changes * **Ensure security compliance** through mandatory 2FA and verification processes * **Scale efficiently** with multi-brand support and role-based access * **Automate financial operations** through Stripe integration * **Maintain data integrity** through comprehensive validation and audit trails The module reduces configuration time by 70%, eliminates security vulnerabilities through enforced 2FA, and provides the flexibility needed for agencies to operate across multiple brands and international markets. **Implementation Priority:** Critical | **Dependencies:** Authentication System | **Phase:** 1 1\. My Profile Module
#32
**FRD #1: My Profile Module**
~8 tok
# **FRD #1: My Profile Module**
#33
**FRD #1: My Profile Module** > **1\. Module Overview**
~157 tok
## **1\. Module Overview** **Module Name:** My Profile **Purpose:** The My Profile module enables users to manage their personal information, authentication credentials, display preferences, and professional details within the CRM system. **Business Goals:** * Provide users with self-service capabilities to maintain accurate personal information * Ensure security through robust password management and email verification processes * Enable personalization of user experience through display preferences including date and time formats * Maintain data integrity through proper validation and verification mechanisms
#34
**FRD #1: My Profile Module** > **2\. User Roles & Permissions**
~224 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Permissions** **Date & Time Preferences** Agency Owner Full access to all fields All personal fields, business toggle Can enable/disable business information view Full access Admin Full access to all fields All personal fields, business toggle Can enable/disable business information view Full access Project Manager Personal fields only Own profile fields only Cannot access business information toggle Full access Editor Personal fields only Own profile fields only Cannot access business information toggle Section not visible Supervising Editor Personal fields only Own profile fields only Cannot access business information toggle Section not visible Contractor Personal fields only Own profile fields only Cannot access business information toggle Section not visible
#35
**FRD #1: My Profile Module** > **3\. User Flow**
~482 tok
## **3\. User Flow** 3.1 The user clicks on the Settings icon from the left sidebar navigation menu. 3.2 The system redirects the user to the Settings page with My Profile section displayed by default. 3.3 The user views their current personal information including first name, last name, email address, and profile photo. 3.4 The user clicks on the camera icon overlay on the profile photo to upload a new image. 3.5 The system opens a file picker dialog allowing selection of JPG, PNG, or JPEG files up to 15MB. 3.6 The user selects an image file and confirms the upload action. 3.7 The system validates the file format and size, then displays the new profile photo in the circular frame. 3.8 The user enters or modifies their first name and last name in the respective text fields. 3.9 The user views their email address in the read-only field and clicks the email change link if modification is needed. 3.10 The system initiates the email change process by displaying a modal for entering a new email address. 3.11 The user enters the new email address and submits the request. 3.12 The system sends verification codes to both the old and new email addresses. 3.13 The user enters both verification codes in the respective fields and confirms the change. 3.14 The system validates the codes and updates the email address if both codes are correct. 3.15 The user toggles the Business Information switch if they have appropriate permissions. 3.16 The system displays additional business fields including business name, type, and phone number when enabled. 3.17 The user fills in or modifies the business information fields as needed. 3.18 The user navigates to the password change section and enters their current password. 3.19 The user enters a new password meeting the security requirements and confirms it in the repeat field. 3.20 The system validates the password strength and matching confirmation.
#36
**FRD #1: My Profile Module** > **3\. User Flow** > Date & Time Preferences Flow
~452 tok
### Date & Time Preferences Flow 3.21 The user scrolls to the Date & Time Preferences section at the bottom of the My Profile page. 3.22 The system displays the Date & Time Preferences section with Date Format dropdown, Include day of the week checkbox (checked by default), and Time Format radio buttons. 3.23 The user clicks on the "Date Formatting Guide" link located next to the Date Format dropdown. 3.24 The system opens a modal displaying all five available date formats with examples and regional usage information. 3.25 The user reviews the date format options and clicks "Got it" to close the modal. 3.26 The user clicks on the Date Format dropdown to view available options. 3.27 The system displays five date format options: DD/MM/YYYY, MM/DD/YYYY, YYYY/MM/DD, DD MMM YYYY, and MMM DD, YYYY. 3.28 The user selects their preferred date format from the dropdown. 3.29 The user optionally unchecks the "Include day of the week (Sat, Sun etc)" checkbox if they do not want the full day name displayed with dates. 3.30 The user selects their preferred time format by clicking either the "12 hour (AM/PM)" or "24 hour" radio button. 3.31 The user clicks the "Save changes" button to apply the new date and time preferences. 3.32 The system validates the selections and saves the user's preferences. 3.33 The system displays a success message: "Date & time preferences saved successfully." 3.34 The system applies the selected date and time format across all applicable areas of the platform. 3.35 Alternatively, the user clicks "Reset Changes" to revert to system defaults. 3.36 The system resets Date Format to MMM DD, YYYY, Time Format to 12 hour (AM/PM), and checks the Include day of the week checkbox. 3.37 The user continues to other settings sections or exits the Settings area.
#37
**FRD #1: My Profile Module** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#38
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.1 Personal Information Management
~183 tok
### 4.1 Personal Information Management • The Personal Information section displays the user's first name, last name, and email address as the primary identification fields. • First name and last name fields accept alphabetic characters and common name symbols like hyphens and apostrophes, with a maximum length of 100 characters each. • The system automatically trims leading and trailing whitespace from name fields before saving to ensure data consistency. • The email address field appears as read-only text displaying the current registered email address associated with the user account. • Users must use the dedicated email change process to modify their email address, which cannot be directly edited in the form field.
#39
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.2 Profile Photo Management
~246 tok
### 4.2 Profile Photo Management • The profile photo section displays a circular frame with either the user's uploaded image or a default avatar with initials. • When no custom photo exists, the system generates a default avatar using the first letter of the first and last name. • The camera icon overlay appears on hover or focus, indicating the photo upload functionality is available. • Clicking the camera icon triggers the file upload dialog, which filters for accepted image formats by default. • The system accepts JPG, PNG, and JPEG file formats with a maximum file size limit of 15MB per upload. • Upon successful upload, the system processes the image to fit the circular display frame while maintaining aspect ratio. • The uploaded image is stored securely and associated with the user's profile across all system interfaces. • If an upload fails due to size or format restrictions, the system displays an appropriate error message and retains the previous photo.
#40
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.3 Email Address Change Process
~309 tok
### 4.3 Email Address Change Process • The email change process requires multi-step verification to ensure security and prevent unauthorized modifications. • When initiating an email change, the system first checks if the new email address is already registered to another account. • If the new email is already in use, the system immediately rejects the change request with an appropriate error message. • For valid new email addresses, the system generates unique verification codes and sends them simultaneously to both email addresses. • The verification code sent to the old email ensures the current account owner authorizes the change. • The verification code sent to the new email confirms the user has access to the new address and it's valid. • Both verification codes must be entered correctly within the session timeout period for the change to proceed. • The old email address is preserved in the backend system for audit and recovery purposes but is not displayed to users. • After successful email change, the system logs the user out and requires re-authentication with the new email address. • Email change notifications are sent to both addresses confirming the successful modification for security awareness.
#41
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.4 Business Information Toggle
~212 tok
### 4.4 Business Information Toggle • The Business Information toggle is only visible to users with Agency Owner or Admin roles. • When enabled, the toggle reveals additional fields for business name, business type dropdown, and business phone number. • The business name field accepts up to 250 characters and allows standard business name characters including ampersands and periods. • The business type dropdown presents predefined options such as Photography, Videography, or Multi-Service Studio. • The phone number field includes international format support with country code selection and automatic formatting. • Business information changes are logged separately from personal information for compliance and audit purposes. • The toggle state persists across sessions, maintaining the user's preference for viewing business fields.
#42
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.5 Password Management
~239 tok
### 4.5 Password Management • The password change section requires users to first authenticate by entering their current password. • The system verifies the current password against the stored hash before allowing any password modification. • New passwords must meet security requirements including minimum 6 characters, at least one uppercase letter, one lowercase letter, and one special character. • The password strength indicator provides real-time feedback as the user types, showing weak, medium, or strong ratings. • The repeat password field must exactly match the new password field for the change to be accepted. • After successful password change, the system invalidates all existing sessions and requires fresh login. • Password change events trigger security notification emails to the user's registered email address. • The system maintains a password history to prevent reuse of recent passwords, though this is not visible to users.
#43
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences
~8 tok
### 4.6 Date & Time Preferences
#44
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Overview**
~141 tok
#### **Overview** • The Date & Time Preferences section allows users to customize how dates and times are displayed throughout the platform based on their regional preferences. • This section appears at the bottom of the My Profile page and is accessible only to Agency Owner, Admin, and Project Manager roles. • Editor, Supervising Editor, and Contractor roles do not see this section in their My Profile view. • All date and time preferences are user-specific, meaning each user can have their own display format without affecting other users in the agency.
#45
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Date Format Options**
~181 tok
#### **Date Format Options** • The system provides five date format options to accommodate regional preferences: **Format** **Display Example** **Region / Audience** DD/MM/YYYY 26/08/2025 UK, Europe, Australia, India MM/DD/YYYY 08/26/2025 United States, Philippines YYYY/MM/DD 2025/08/26 ISO 8601, Japan, international use DD MMM YYYY 26 Aug 2025 Readable, common in emails/docs MMM DD, YYYY Aug 26, 2025 U.S. readable format • The default date format for new users is MMM DD, YYYY (e.g., Aug 26, 2025). • The Date Format dropdown displays all five options, and the user can select one at a time. • Changes to the date format require clicking "Save changes" before they take effect across the platform.
#46
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Date Formatting Guide Modal**
~116 tok
#### **Date Formatting Guide Modal** • Clicking the "Date Formatting Guide" link opens an informational modal displaying all available date formats. • The modal presents each format with its display example and the regions or audiences where that format is commonly used. • The modal includes a "Got it" button that closes the modal and returns the user to the Date & Time Preferences section. • The modal is informational only and does not change any settings.
#47
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Include Day of the Week**
~199 tok
#### **Include Day of the Week** • The "Include day of the week (Sat, Sun etc)" checkbox allows users to display the full day name alongside the selected date format. • When enabled, dates display with the full day name as a prefix, for example: "Saturday, Aug 26, 2025" instead of "Aug 26, 2025". • The day name format applies consistently with all five date format options: * DD/MM/YYYY with day: Saturday, 26/08/2025 * MM/DD/YYYY with day: Saturday, 08/26/2025 * YYYY/MM/DD with day: Saturday, 2025/08/26 * DD MMM YYYY with day: Saturday, 26 Aug 2025 * MMM DD, YYYY with day: Saturday, Aug 26, 2025 • The checkbox is checked by default for new users, displaying the full day name with all dates. • The setting applies to all areas where the user-selected date format is used.
#48
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Time Format Options**
~107 tok
#### **Time Format Options** • The system provides two time format options displayed as radio buttons: * **12 hour (AM/PM):** Displays time as 2:30 PM * **24 hour:** Displays time as 14:30 • The default time format for new users is 12 hours (AM/PM). • Only one time format option can be selected at a time. • The selected time format will apply only to areas where time is used and the user-selected format is supported.
#49
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Fixed Format Areas**
~181 tok
#### **Fixed Format Areas** • Certain areas of the platform use a fixed date and time format regardless of user preferences to ensure consistency in formal documents and shared views: **Area** **Fixed Date Format** **Fixed Time Format** Contracts MMM DD, YYYY 12-hour (AM/PM) Service Agreements MMM DD, YYYY 12-hour (AM/PM) Client Invoices MMM DD, YYYY 12-hour (AM/PM) Calendar (List View) MMM DD, YYYY 12-hour (AM/PM) Email Notifications MMM DD, YYYY 12-hour (AM/PM) • The "Include day of the week" setting does not apply to fixed format areas. • These fixed formats ensure that client-facing documents, legally-binding documents, and email communications maintain a consistent, professional appearance.
#50
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **User-Selected Format Areas**
~134 tok
#### **User-Selected Format Areas** • All other areas of the platform display dates and times based on the user's selected preferences: * Dashboard dates * Project dates and deadlines * Task due dates * Activity logs and timestamps * In-app Notifications * Reports * Event dates * File upload timestamps * Comments and notes timestamps * All other date/time displays not listed in Fixed Format Areas • Changes to date and time preferences propagate immediately across all user-selected format areas after saving.
#51
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Default Values**
~86 tok
#### **Default Values** • New users are automatically assigned the following default settings without requiring any action: * Date Format: MMM DD, YYYY * Time Format: 12 hour (AM/PM) * Include day of the week: Checked (enabled) • These defaults are applied during user account creation and can be changed at any time from My Profile.
#52
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **Save and Reset Behavior**
~160 tok
#### **Save and Reset Behavior** • The "Save changes" button saves all Date & Time Preferences selections and applies them across the platform. • The "Save changes" button is enabled only when the user has made changes to any of the settings. • There is no live preview; users must save their changes to see the new format applied across the platform. • The "Reset Changes" button reverts all Date & Time Preferences to system defaults: * Date Format: MMM DD, YYYY * Time Format: 12 hour (AM/PM) * Include day of the week: Checked • After clicking "Reset Changes," the user must click "Save changes" to apply the reset values.
#53
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.6 Date & Time Preferences > **User-Specific Settings**
~116 tok
#### **User-Specific Settings** • Date and time preferences are stored at the individual user level, not at the agency level. • Each user within an agency can have different date and time format preferences. • If Agency Owner selects DD/MM/YYYY and Admin selects MM/DD/YYYY, each user sees dates displayed in their own selected format throughout their session. • User preferences do not affect how dates appear to other users or in shared/exported documents.
#54
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.7 Professional Information Section
~106 tok
### 4.7 Professional Information Section • The Professional Information section displays the user's website URL if configured. • The website field validates URL format and automatically prepends "https://" if no protocol is specified. • This section is separate from business information and available to all user roles. • The website URL appears as a clickable link in user profiles and team directories when populated.
#55
**FRD #1: My Profile Module** > **4\. Functional Logic** > 4.8 Data Validation and Persistence
~162 tok
### 4.8 Data Validation and Persistence • All form fields undergo client-side validation before submission to provide immediate feedback. • Server-side validation duplicates all client checks to ensure security and data integrity. • The Save Changes button remains disabled until at least one field has been modified from its original value. • Unsaved changes trigger a warning dialog if the user attempts to navigate away from the page. • Successful saves update the last modified timestamp and user information in the audit log. • The system performs atomic updates to ensure all changes in a single save operation succeed or fail together.
#56
**FRD #1: My Profile Module** > **5\. Field Details & Validations**
~372 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Validation Rules** **Required** First Name Text Input Max 100 chars, alphabetic + hyphen/apostrophe Yes Last Name Text Input Max 100 chars, alphabetic + hyphen/apostrophe Yes Email Address Email (Read-only) Valid email format, unique in system Yes New Email Email Input Valid format, not already registered Yes (for change) Verification Code (Old) Text Input 6 digits, matches sent code Yes (for change) Verification Code (New) Text Input 6 digits, matches sent code Yes (for change) Profile Photo File Upload JPG/PNG/JPEG, max 15MB No Business Name Text Input Max 250 chars Yes (when enabled) Business Type Dropdown Valid selection from list Yes (when enabled) Business Phone Phone Input Valid international format Yes (when enabled) Current Password Password Input Matches stored password Yes (for change) New Password Password Input Min 6 chars, 1 upper, 1 lower, 1 special Yes (for change) Repeat Password Password Input Exact match with new password Yes (for change) Date Format Dropdown Must select one of five valid options (DD/MM/YYYY, MM/DD/YYYY, YYYY/MM/DD, DD MMM YYYY, MMM DD, YYYY); Default: MMM DD, YYYY Yes Include Day of Week Checkbox Boolean true/false; Default: Checked (true) No Time Format Radio Button Must select one option (12 hour AM/PM or 24 hour); Default: 12 hour (AM/PM) Yes Website URL URL Input Valid URL format No
#57
**FRD #1: My Profile Module** > **6\. Success Message Handling**
~282 tok
## **6\. Success Message Handling** **Operation** **Success Message** **Post-Success Action** **Duration** Profile Information Save "Profile updated successfully" Refresh display with new data 3 seconds Profile Photo Upload "Profile photo updated successfully" Display new photo immediately 3 seconds Email Change Initiated "Verification codes sent to both email addresses" Show verification modal Persistent Email Change Complete "Email address updated successfully. Please log in with your new email" Force logout 5 seconds Password Change "Password changed successfully. Please log in again" Force logout 5 seconds Business Info Update "Business information updated successfully" Refresh business fields 3 seconds Date & Time Preferences Save "Date & time preferences saved successfully." Apply format changes across all applicable platform areas 3 seconds Date & Time Preferences Reset "Date & time preferences reset to defaults." Revert all fields to system default values 3 seconds Website URL Update "Professional information updated successfully" Update website display 3 seconds
#58
**FRD #1: My Profile Module** > **7\. Error Message Handling**
~518 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **User Action Required** Invalid Name Characters "Name can only contain letters, hyphens, and apostrophes" Remove invalid characters Name Too Long "Name cannot exceed 100 characters" Shorten the name Email Already Registered "This email is already registered to another account" Use different email Invalid Email Format "Please enter a valid email address" Correct email format Incorrect Verification Code "Invalid verification code. Please try again" Re-enter correct code Verification Code Expired "Verification code has expired. Please request a new one" Request new codes Photo File Too Large "File size must be less than 15MB" Select smaller file Invalid Photo Format "Only JPG, PNG, and JPEG formats are accepted" Choose valid format Business Name Too Long "Business name cannot exceed 250 characters" Shorten business name Invalid Phone Format "Please enter a valid phone number" Correct phone format Current Password Wrong "Current password is incorrect" Enter correct password Weak Password "Password must contain at least 6 characters, including uppercase, lowercase, and special character" Create stronger password Passwords Don't Match "Passwords do not match" Re-enter matching passwords Invalid URL Format "Please enter a valid website URL" Correct URL format No Date Format Selected "Please select a date format." Select an option from dropdown No Time Format Selected "Please select a time format." Select 12 hour or 24 hour option Date Preferences Save Failed "Unable to save preferences. Please check your connection and try again." Retry save operation Invalid Format Selection "Invalid format selection. Please refresh and try again." Refresh page and reselect Session Expired "Your session has expired. Please refresh and try again" Refresh page Network Error "Connection error. Please check your internet and try again" Check connection Save Failed "Unable to save changes. Please try again" Retry save operation
#59
**FRD #1: My Profile Module** > **8\. Edge Cases**
~624 tok
## **8\. Edge Cases** **Scenario** **System Behavior** **Mitigation** Upload corrupted image file System rejects file, maintains previous photo Display specific error about file corruption Email service down during verification Codes not delivered Provide retry option with backoff User loses access to old email Cannot complete email change Contact support for manual verification Simultaneous email change attempts First request proceeds, second blocked Show email change already in progress Browser doesn't support file upload Upload button non-functional Provide alternative upload method Special characters in business name Some characters may not display correctly Sanitize and validate input Password manager conflicts Auto-fill may interfere with password change Disable autocomplete on password fields Multiple tabs open during profile edit Changes may conflict Implement optimistic locking Phone number from unsupported country Validation may fail Allow manual entry with warning Image upload during poor connection Upload may timeout Implement resumable upload Clock skew affecting verification Codes may expire prematurely Use server time with tolerance Attempting to use recently changed email Email may still be in cooldown Show cooldown period message User changes date format mid-session New format applies immediately after save across all open tabs upon refresh WebSocket notification or refresh prompt User views shared report while another user has different format Each user sees dates in their own selected format User-specific rendering User exports data to PDF/Excel Export uses the exporting user's date/time format preferences Format applied at export time User downgrades from Admin to Editor role Date & Time Preferences section becomes hidden; existing preferences are retained but not editable Preserve settings for potential re-upgrade Browser cache shows old format after save Force refresh of date displays after successful save Cache invalidation on save User selects format then navigates away without saving Changes are discarded; original settings retained Unsaved changes warning (if implemented) Multiple users editing same project see different date formats Each user sees their own format; no conflict as display is user-specific Isolated user preferences Date format change affects historical data display Historical dates re-render in new format; stored data unchanged Display-only change
#60
**FRD #1: My Profile Module** > **9\. Acceptance Criteria**
~8 tok
## **9\. Acceptance Criteria**
#61
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.1 Personal Information
~69 tok
### 9.1 Personal Information • Users can successfully update their first and last names with immediate reflection in the interface. • Name fields properly validate character restrictions and length limits. • Email address displays correctly but cannot be directly edited.
#62
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.2 Email Change Process
~73 tok
### 9.2 Email Change Process • Email change requires successful verification from both old and new addresses. • System prevents registration of duplicate email addresses. • User is properly logged out after successful email change. • Audit trail maintains record of old email addresses.
#63
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.3 Profile Photo
~60 tok
### 9.3 Profile Photo • Users can upload photos in JPG, PNG, and JPEG formats. • File size validation prevents uploads over 15MB. • Photos display correctly in circular frame format. • System maintains aspect ratio without distortion.
#64
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.4 Business Information
~64 tok
### 9.4 Business Information • Toggle only appears for Agency Owner and Admin roles. • Business fields validate according to their specific requirements. • Phone numbers format correctly for international entries. • Changes persist across user sessions.
#65
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.5 Password Management
~61 tok
### 9.5 Password Management • Current password verification prevents unauthorized changes. • Password complexity requirements are enforced. • Successful change forces re-authentication. • Security notifications are sent for password changes.
#66
**FRD #1: My Profile Module** > **9\. Acceptance Criteria** > 9.6 Date & Time Preferences
~392 tok
### 9.6 Date & Time Preferences • The Date & Time Preferences section is visible only to Agency Owner, Admin, and Project Manager roles. • Editor, Supervising Editor, and Contractor roles do not see the Date & Time Preferences section. • The Date Format dropdown displays all five format options correctly. • The "Date Formatting Guide" link opens a modal with format examples and regional usage information. • The modal closes when the user clicks "Got it." • Selecting a date format and saving applies the format to all user-selected format areas. • Enabling "Include day of the week" displays the full day name (e.g., Saturday) as a prefix to the date. • The Time Format radio buttons allow selection of either 12 hour (AM/PM) or 24 hour format. • Time displays as "2:30 PM" for 12-hour format and "14:30" for 24-hour format. • Contracts, Service Agreements, Invoices, Calendar (List View), and Email Notifications always display in MMM DD, YYYY format with 12-hour time regardless of user settings. • New users receive default settings of MMM DD, YYYY, 12-hour format, and day of week enabled without any action required. • The "Reset Changes" button reverts all settings to system defaults. • The "Save changes" button saves preferences and applies them across the platform. • Date and time preferences are user-specific and do not affect other users' displays. • Changes require saving before they take effect; no live preview is provided. • Email Notifications always display in MMM DD, YYYY format with 12-hour time regardless of user settings.
#67
**FRD #1: My Profile Module** > **10\. Manual Test Cases**
~20 tok
## **10\. Manual Test Cases** \[My\_Profile\_Comprehensive\_Test\_Cases.xlsx\]
#68
**FRD #1: My Profile Module** > **11\. Dependencies**
~495 tok
## **11\. Dependencies** **Dependency Type** **Dependency Name** **Description** **Impact if Unavailable** External Service Email Service Provider Sends verification codes and notifications Cannot change email or send alerts External Service Image Processing Service Handles photo upload and optimization Cannot update profile photos External Service CDN/Storage Service Stores profile photos Photos cannot be saved or retrieved Internal Module Authentication Service Validates passwords and sessions Cannot change passwords or verify users Internal Module User Management System Maintains user records and roles Cannot update user information Internal Module Audit Service Logs all profile changes No audit trail for compliance Internal Module Dashboard Displays dates using user-selected format Dates show in default format Internal Module Projects Project dates use user-selected format Dates show in default format Internal Module Tasks Task due dates use user-selected format Dates show in default format Internal Module Contracts Uses fixed MMM DD, YYYY format N/A - fixed format Internal Module Invoices Uses fixed MMM DD, YYYY format N/A - fixed format Internal Module Calendar (List View) Uses fixed MMM DD, YYYY format N/A - fixed format Internal Module Email Notifications Uses fixed MMM DD, YYYY format N/A - fixed format Internal Module Reports Report dates use user-selected format Dates show in default format Internal Module In-app Notifications Notification timestamps use user-selected format Dates show in default format Configuration File Upload Limits Defines maximum file sizes May accept oversized files Configuration Password Policy Defines complexity requirements Weak passwords may be accepted Library Image Processing Library Client-side image validation No preview before upload Library Phone Number Formatter Formats international numbers Phone numbers display unformatted
#69
**FRD #1: My Profile Module** > **12\. References**
~95 tok
## **12\. References**
* **Figma Designs:** \[Figma Link\]
* **Related FRDs:**
* \[General\_Settings\_FRD.md\] — Agency Global Settings
* \[Business\_Payment\_Details\_FRD.md\] — Agency Global Settings
* \[Two\_Step\_Verification\_FRD.md\] — Agency Global Settings
* \[Data\_Management\_FRD.md\] — Agency Global Settings
2\. General Settings Module#70
**FRD #2: General Settings Module**
~9 tok
# **FRD #2: General Settings Module**
#71
**FRD #2: General Settings Module** > **1\. Module Overview**
~190 tok
## **1\. Module Overview** **Module Name:** General Settings **Purpose:** The General Settings module manages agency-wide configurations including company information, regional preferences, measurement systems, travel policies, signatory defaults, and event display settings that affect all users and operations within the system. **Business Goals:** * Establish consistent operational parameters across the entire agency * Configure regional and measurement preferences for global compatibility * Define travel fee policies that automatically apply to contractor payments * Set a default signatory that is automatically applied when sending client-facing agreements * Customize visual elements for improved user experience and calendar management
#72
**FRD #2: General Settings Module** > **2\. User Roles & Permissions**
~177 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Permissions** Agency Owner Full access All settings Can modify currency, company name, and primary signatory Admin Full access Most settings Cannot modify currency, company name, or primary signatory Project Manager View all settings Event colors, personal preferences Read-only for agency settings (including primary signatory) Editor View limited settings Event colors only No access to financial settings Supervising Editor View limited settings Event colors only No access to financial settings Contractor View minimal settings Personal preferences only No access to agency configurations
#73
**FRD #2: General Settings Module** > **3\. User Flow**
~631 tok
## **3\. User Flow** 3.1 The user navigates to Settings from the left sidebar and clicks on General Settings. 3.2 The system loads the General Settings page displaying all configuration options based on user role. 3.3 The user views the Company Name field which shows the current agency name. 3.4 The user with appropriate permissions edits the Company Name field if changes are needed. 3.5 The system validates the company name length and characters as the user types. 3.6 The user selects their country from the Country dropdown menu. 3.7 The system updates regional defaults based on the selected country. 3.8 The user selects the preferred currency from the Currency dropdown if they have permission. 3.9 The system displays a warning that currency changes affect all financial displays. 3.10 The user toggles between Imperial and Metric measurement systems. 3.11 The system shows a notification that measurement changes apply only to future projects. 3.12 The user selects the minimum travel distance from the dropdown menu. 3.13 The system displays the increments in 25-mile steps up to 500 miles or "any" for no minimum. 3.14 The user views the Primary Signatory field, which displays the current default signatory role (Agency Owner by default). 3.15 If the user is the Agency Owner, they select a signatory role — Agency Owner, Admin, or Project Owner — from the dropdown; all other roles see the field as read-only and, on hover, a tooltip explaining that only the Agency Owner can change it. 3.16 The system stores the selected role, to be resolved to a specific person at the time a contract, Service Agreement, or proposal is sent. 3.17 The user navigates to the QR codes section to view agency-specific codes. 3.18 The system displays generated QR codes for quick access and sharing purposes. 3.19 The user clicks on the Event Color Settings section. 3.20 The system displays all event types with their current assigned colors. 3.21 The user clicks on a color picker for a specific event type. 3.22 The system opens the color selection interface with hex color options. 3.23 The user selects a new color and confirms the selection. 3.24 The system immediately applies the color change to the preview. 3.25 The user optionally clicks Reset Changes to revert to default colors. 3.26 The user reviews all changes made in the General Settings. 3.27 The user clicks Save Changes to persist all modifications. 3.28 The system saves the settings and displays a success confirmation message.
#74
**FRD #2: General Settings Module** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#75
**FRD #2: General Settings Module** > **4\. Functional Logic** > 4.1 Main Settings
~746 tok
### 4.1 Main Settings **4.1.1 Timezone Configuration** * The Timezone dropdown allows the agency to set the default timezone for the system. * The system defaults to EST (Eastern Standard Time) for new agencies. * The selected timezone applies to all system-wide scheduling, timestamps, and calendar displays. * During event creation, Agency Owners and Admins can override the default timezone and set a specific timezone for that particular event. **4.1.2 Country and Regional Settings** * The Country dropdown determines default formats for addresses, phone numbers, and postal codes throughout the system. * Selecting a country automatically updates related regional options to match that country's administrative divisions. * The country setting affects how addresses are formatted in invoices, proposals, and contractor agreements. * Changes to country settings apply to new entries going forward and do not retroactively modify existing address data. **4.1.3 Measurement System Configuration** * The Measurement System dropdown determines whether distances display in Imperial (miles) or Metric (kilometers) throughout the system. * Measurement system selection affects travel fee calculations, distance displays, and contractor payment computations. * The system uses Google Maps API with the selected measurement unit to calculate accurate travel distances. * The measurement preference applies agency-wide regardless of individual user locations or preferences. * Changes to distance settings apply to new entries going forward and do not retroactively modify existing project data. **4.1.4 Currency Configuration** * The Currency dropdown sets the currency used for all monetary displays, including invoices, proposals, payments, and financial reports. * The system supports major international currencies with proper symbol placement and decimal formatting. * The selected currency synchronizes with payment processors like Stripe to ensure transaction compatibility. **4.1.5 Travel Fee Policy Settings** * The "Contractors will be paid a travel fee starting at" dropdown configures the one-way distance threshold before travel fees apply to contractors. * Distance options allow the agency to define the minimum miles a contractor must travel before travel compensation is triggered. * When a minimum is set, contractors receive travel compensation only for trips exceeding that one-way distance. **4.1.6 Rate Per Mile Configuration** * The Rate per Mile / Rate per km field allows the agency to set the compensation rate per mile for contractor travel fees. * The rate is displayed in the selected currency (e.g., 20.00 USD). * This rate is used to calculate the total travel fee based on the distance traveled beyond the minimum threshold. * Changes to the rate per mile apply to future bookings and do not affect existing contracted agreements. **4.1.7 Primary Signatory Configuration** _Empty / default state_
#76
**FRD #2: General Settings Module** > **4\. Functional Logic** > 4.1 Main Settings
~657 tok
* The Primary Signatory field is a single-select dropdown located in General → Main Settings, directly below the Rate per Mile / Rate per km field. * The field is required and must always hold a value; it can never be saved empty. * For new agencies, the field defaults to **Agency Owner**. _Available options_ * Agency Owner * Admin * Project Owner _Purpose and scope_ * The Primary Signatory sets the default signatory that is automatically applied when sending a **client contract, Service Agreement, or proposal**. * These three document types are the complete scope of this setting. No other document types (for example, invoices, receipts, or internal documents) use the Primary Signatory. * The stored value is a **role**, not a specific person. The role is resolved to an actual signer at send-time. _Permissions and display_ * Only the Agency Owner can change the Primary Signatory. For all other roles the field is displayed as read-only / disabled. * When a non-owner hovers over the disabled field, the system shows the tooltip: "Only the Agency Owner can change the primary signatory." _Role resolution at send-time_ * **Agency Owner** selected → the agency owner is applied as the signatory. * **Admin** selected → the admin attached to that specific project is applied as the signatory. * **Project Owner** selected → the person assigned as project owner on that project is applied. Every project must have exactly one project owner. This is normally an admin or a project manager attached to the project; if no project manager and no admin is attached, the Agency Owner automatically becomes the project owner by default. _Send-time override_ * When sending a contract, Service Agreement, or proposal, the sender can override the signatory for that single document. * The override is limited to the same three roles (Agency Owner, Admin, Project Owner). * An override applies only to that one document and does **not** change the saved default. _Change impact_ * Changes to the Primary Signatory apply to future documents only and are non-retroactive. * Documents that have already been sent retain the signatory that was resolved at the time they were sent. * Because the role is resolved at send-time, documents that are prepared but not yet sent will use whichever default (or override) is in effect at the moment they are actually sent. * Changes to this setting are captured in the settings change history (who changed it, when, and the previous/new value), consistent with other Main Settings. _Fallback behavior (summary; see Section 8 for detail)_
#77
**FRD #2: General Settings Module** > **4\. Functional Logic** > 4.1 Main Settings
~429 tok
* Every project must have exactly one project owner. If no project manager and no admin is attached to a project, the Agency Owner automatically becomes the project owner by default. As a result, the **Agency Owner** and **Project Owner** signatory options always resolve to a valid signer, and no fallback is required for them. * The only case requiring a fallback is when **Admin** is selected as the signatory but no admin is attached to the project. In that case, the system falls back to Agency Owner and prompts the sender to confirm or override the signatory before the document is sent. **4.1.8 Save and Reset Actions** * The "Save Changes" button saves all modifications made to the Main Settings. * The "Reset Changes" button reverts all unsaved changes back to the previously saved values. * Both buttons remain disabled until the user makes a change to any field. **4.1.9 Event Color Customization** * The Event Color Settings allow users to assign unique colors to different event types for improved calendar visibility. * Each event type (Wedding, Birthday, Corporate, etc.) can have a distinct color selected through the color picker interface. * Color changes apply immediately to all calendar views, schedules, and timeline displays across the system. * The color picker supports hex color codes, RGB values, and a visual palette for flexible color selection. * Users can reset individual colors or all colors to system defaults using the Reset Changes functionality. * Color preferences are stored at the agency level and apply to all users viewing the calendar. * The system ensures sufficient contrast between text and background colors for accessibility compliance.
#78
**FRD #2: General Settings Module** > **4\. Functional Logic** > 4.2 Settings Synchronization
~134 tok
### 4.2 Settings Synchronization * All General Settings changes trigger real-time synchronization across active user sessions. * The system broadcasts configuration updates to ensure all users see consistent information immediately. * Critical changes like currency or measurement system updates display notifications to all affected users. * Settings are backed up automatically before each change to enable rollback if issues occur. * The system maintains a change history log showing what was modified, when, and by whom.
#79
**FRD #2: General Settings Module** > **5\. Field Details & Validations**
~205 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Validation Rules** **Required** Company Name Text Input Max 250 chars, alphanumeric + common symbols Yes Country Dropdown Valid country from ISO list Yes Currency Dropdown Valid ISO currency code Yes Measurement System Toggle Imperial or Metric only Yes Travel Fee Minimum Dropdown 25-mile increments, 0–500 or "any" Yes Rate per Mile / km Numeric Input Positive number, displayed in selected currency Yes Primary Signatory Dropdown (single-select) One of: Agency Owner, Admin, Project Owner; cannot be empty; editable by Agency Owner only Yes Event Colors Color Picker Valid hex code (#RRGGBB) Yes Imperial Distance Radio Button Miles or Kilometers Yes QR Code URL Display Only System-generated URL N/A
#80
**FRD #2: General Settings Module** > **6\. Success Message Handling**
~251 tok
## **6\. Success Message Handling** **Operation** **Success Message** **Post-Success Action** **Duration** Company Name Update "Company name updated successfully" Update all displays 3 seconds Country Change "Country settings updated successfully" Refresh regional options 3 seconds Currency Change "Currency updated successfully. All amounts will display in \[currency\]" Update financial displays 5 seconds Measurement Change "Measurement system updated to \[Imperial/Metric\]" Apply to new projects 3 seconds Travel Fee Update "Travel fee minimum set to \[distance\]" Update contractor policies 3 seconds Primary Signatory Update "Primary signatory updated successfully" Apply to future documents 3 seconds Event Color Change "Event colors updated successfully" Refresh calendar displays 3 seconds Reset Colors "Event colors reset to defaults" Apply default palette 3 seconds Save All Settings "General settings saved successfully" Apply all changes 3 seconds
#81
**FRD #2: General Settings Module** > **7\. Error Message Handling**
~339 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **User Action Required** Company Name Too Long "Company name cannot exceed 250 characters" Shorten the name Invalid Company Characters "Company name contains invalid characters" Remove special characters Currency Change Blocked "Only Agency Owners can change currency" Contact Agency Owner Primary Signatory Cleared "Please select a primary signatory." Select a signatory before saving Signatory Edit Blocked (non-owner) Tooltip: "Only the Agency Owner can change the primary signatory." Contact the Agency Owner Admin Signatory Unavailable (send-time) "No admin is attached to this project. The Agency Owner will sign unless you select a different signatory." Confirm or override the signatory before sending Invalid Color Format "Please enter a valid color code" Use color picker or valid hex Network Save Error "Unable to save settings. Please try again" Retry save operation Permission Denied "You don't have permission to modify this setting" Request access from admin Concurrent Edit Conflict "Settings were modified by another user. Please refresh" Refresh and retry Invalid Travel Distance "Please select a valid travel distance option" Choose from dropdown Session Timeout "Your session has expired. Please log in again" Re-authenticate
#82
**FRD #2: General Settings Module** > **8\. Edge Cases**
~503 tok
## **8\. Edge Cases** **Scenario** **System Behavior** **Mitigation** Multiple users editing simultaneously Last save wins Implement optimistic locking Country with no states/provinces State field hidden Adjust form dynamically Unsupported currency selected Default to USD Show supported currencies only Project has no project manager or admin attached Agency Owner automatically becomes the project owner (every project must have exactly one) Enforce mandatory project owner; Project Owner and Agency Owner signatory options always resolve Admin selected as signatory but no admin attached to project Falls back to Agency Owner as signatory Prompt sender to confirm or override before sending Multiple admins attached to a project when "Admin" is the signatory Ambiguous which admin signs Define a tiebreaker rule (e.g., project-designated primary admin) — see open question Resolved signatory (person) deactivated or removed before send Person can no longer sign Treat as unassigned — fall back to Agency Owner and allow override Default signatory changed while a document is drafted but not yet sent Send-time resolution uses the new default Confirm intended behavior; optionally lock signatory at draft creation Sender overrides signatory to Admin but no admin is attached Selected override cannot resolve Re-validate at send; fall back to Agency Owner and re-prompt Color picker browser incompatibility Fallback to text input Provide hex code field Travel distance in metric confusion Show conversion tooltip Display both units temporarily Company name with Unicode characters May display incorrectly Validate and sanitize input QR code generation failure Display error message Provide retry mechanism Event type deleted after color set Orphaned color setting Clean up unused colors Measurement change during active project Confusion in calculations Show warning before change Currency symbol rendering issues Display currency code Use fallback text display
#83
**FRD #2: General Settings Module** > **9\. Acceptance Criteria**
~8 tok
## **9\. Acceptance Criteria**
#84
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Company Settings
~47 tok
### Company Settings * Company name updates successfully with proper validation * Only authorized roles can modify restricted fields * Changes reflect immediately across the system
#85
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Regional Configuration
~46 tok
### Regional Configuration * Country selection properly updates dependent fields * Currency changes require appropriate permissions * Regional settings apply to new data entry
#86
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Measurement System
~42 tok
### Measurement System * Toggle between Imperial and Metric works correctly * Distance calculations use selected system * No retroactive changes to existing data
#87
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Travel Policy
~40 tok
### Travel Policy * Minimum distance configuration saves properly * Travel fee calculations respect the threshold * Settings apply to future projects only
#88
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Primary Signatory
~200 tok
### Primary Signatory * Field defaults to Agency Owner and can never be saved empty * Only the Agency Owner can change the field; all other roles see it read-only with a tooltip on hover * The saved role is correctly resolved to the right person at send-time, for contracts, Service Agreements, and proposals only * Send-time override applies to a single document without altering the saved default * Changes apply to future documents only and are not retroactive * Every project always has exactly one project owner (the Agency Owner by default when no project manager or admin is attached), so Project Owner and Agency Owner always resolve * When Admin is selected but no admin is attached to the project, the system falls back to Agency Owner and prompts the sender before sending
#89
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Event Colors
~39 tok
### Event Colors * Color picker allows custom color selection * Changes apply immediately to calendar views * Reset functionality restores defaults
#90
**FRD #2: General Settings Module** > **9\. Acceptance Criteria** > Data Persistence
~34 tok
### Data Persistence * All settings save successfully * Changes persist across sessions * Audit trail captures all modifications
#91
**FRD #2: General Settings Module** > **10\. Manual Test Cases**
~56 tok
## **10\. Manual Test Cases** [General\_Settings\_Comprehensive\_Test\_Cases.xlsx](https://docs.google.com/spreadsheets/d/1foosgBYFcePE6v5z5ptO0OcPYYK8KmFz/edit?usp=drive_link&ouid=105170312247554220827&rtpof=true&sd=true)
#92
**FRD #2: General Settings Module** > **11\. Dependencies**
~334 tok
## **11\. Dependencies** **Dependency Type** **Dependency Name** **Description** **Impact if Unavailable** External Service Google Maps API Calculate travel distances Manual distance entry required External Service Currency Exchange API Validate currency codes Limited to hardcoded currencies External Service Country Database API Provide country/state lists Use static country list Internal Module Calendar Module Display event colors Colors won't apply to calendar Internal Module Financial Module Apply currency settings Currency display errors Internal Module Contractor Module Enforce travel policies Travel fees miscalculated Internal Module Reporting Module Use measurement units Incorrect distance reports Internal Module Document / E-Signature Module Apply the resolved signatory to outgoing contracts, Service Agreements, and proposals Signatory cannot be applied; documents cannot be sent for signature Internal Module Projects Module Resolve Admin / Project Owner assignments per project at send-time Role resolution fails; falls back to Agency Owner Configuration Localization Files Regional format rules Default to US formats Library Color Picker Library Provide color selection UI Fallback to text input Library QR Code Generator Create QR codes No QR code functionality
#93
**FRD #2: General Settings Module** > **12\. References**
~6 tok
## **12\. References**
#94
**FRD #2: General Settings Module** > **12\. References** > 12.1 Figma Designs: [Figma](https://www.figma.com/design/ej0kxwP45mDKmZCZfAJ5O8/Pixally?node-id=29490-142367&t=hlJPZKI33RrWvjz0-0)
~43 tok
### 12.1 Figma Designs: [Figma](https://www.figma.com/design/ej0kxwP45mDKmZCZfAJ5O8/Pixally?node-id=29490-142367&t=hlJPZKI33RrWvjz0-0) 3\. Business & Payment Details Module
#95
**FRD #3: Business & Payment Details Module**
~35 tok
# **FRD #3: Business & Payment Details Module** **Module Name:** Business & Payment Details **Version:** 3.0 **Date:** April 08, 2026
#96
**FRD #3: Business & Payment Details Module** > **1\. Module Overview**
~266 tok
## **1\. Module Overview** **Module Name:** Business & Payment Details **Purpose:** The Business & Payment Details module enables agencies to configure payment processing by connecting each brand to a Stripe account. Brands can either create a new Stripe account or link to an existing Stripe account already connected to another brand. This flexible model allows agencies to receive client payments with automatic fee deduction based on their subscription plan. **Business Goals:** * Enable agencies to receive client payments through Stripe Connect integration on a per-brand basis. * Provide flexibility for brands to share a single Stripe account or maintain independent accounts. * Facilitate secure Stripe onboarding with identity verification and bank account linking. * Support subscription-based platform fee structure for sustainable revenue model. * Ensure compliance with payment processor requirements through proper verification workflows. * Support scalable growth by allowing agencies to add new brands with quick account linking.
#97
**FRD #3: Business & Payment Details Module** > **2\. User Roles & Permissions**
~210 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Permissions** Agency Owner Full access All fields Can connect/disconnect Stripe, manage all brand connections Admin View only None Read-only access to all connection statuses Project Manager No access None Section not visible Editor No access None Section not visible Supervising Editor No access None Section not visible Contractor No access None Section not visible **Access Rule:** The Business & Payment Details module is accessible to the Agency Owner with full control and to Admins in read-only mode. All other roles cannot view or access this section. If an unauthorized role attempts to navigate to this section, the system does not display the Business & Payment Details menu item in the left sidebar navigation.
#98
**FRD #3: Business & Payment Details Module** > **3\. User Flow**
~5 tok
## **3\. User Flow**
#99
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Initial Access
~125 tok
### Initial Access 3.1 The Agency Owner navigates to the Agency Global Settings from the left sidebar menu and clicks on "Business & Payment Details." 3.2 The system checks whether the agency has any brands configured. 3.3 If the agency has zero brands configured, the system displays an empty state with a message prompting the user to create a brand first before configuring payment settings. 3.4 If the agency has one or more brands, the system displays the Business and Payment Details page.
#100
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Page Display
~191 tok
### Page Display 3.5 The system displays the page with the heading "Business and Payment Details" and the subtitle "Connect each brand to your Stripe account to receive payments from all your clients." 3.6 The system displays the "Connect with Stripe" card with the subtitle "One account per brand" and a connection counter badge showing "\[X\] of \[Y\] connected" (e.g., "2 of 3 connected"). 3.7 The system displays four benefit checkmarks that are always visible: * Separate accounts per brand * Per-brand reporting * Independent payouts * Scale with new brands 3.8 Below the benefits, the system displays the "Your brands" section listing all agency brands as collapsible accordion rows with their connection status and appropriate action buttons.
#101
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Brand Accordion Display
~93 tok
### Brand Accordion Display 3.9 Each brand row is a collapsible accordion displaying: * Brand logo/avatar * Brand name * Connection status text * Status badge (when applicable) * Action button 3.10 When expanded, the accordion reveals: * Connected bank account details (e.g., "Bank Of America \*\*\*\* 4829") * "Disconnect" button (for connected brands)
#102
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Brand Connection States
~240 tok
### Brand Connection States 3.11 Each brand displays one of the following states: **Not Connected State:** * Status text: "Not connected" (red) * Action button: "Connect" (yellow filled button) * Accordion is not expandable **Connected State:** * Status text: "Connected" (green) with checkmark * Accordion expandable to show bank details and "Disconnect" button **Under Review State:** * Status text: Shows bank account info (e.g., "Bank of America (\*\*\*\* 4829)") * Status badge: "Under Review" (yellow badge) * Action button: "Review" (outlined button) * Expandable section with message: "Your stripe account is under verification. It could take up to 24-48 hours" **Restricted State:** * Status text: "Verification failed - \[X\] errors found" (red) * Status badge: "Restricted" (red badge with warning icon) * Action button: "Retry" (yellow filled button) * Expandable section with specific error messages from Stripe
#103
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Connect Flow — Connection Type Selection
~150 tok
### Connect Flow — Connection Type Selection 3.12 The Agency Owner clicks the "Connect" button next to a brand. 3.13 The system displays the "Connect Stripe account" modal with: * **Title:** "Connect Stripe account" * **Subtitle:** "How would you like to connect \[Brand Name\]?" * **Option 1:** "Create new account" — "Set up a new Stripe account" (radio button) * **Option 2:** "Use existing account" — "Link to another brand's account" (radio button) * **Button:** "Cancel" 3.14 If no other brands have Stripe connected yet, the "Use existing account" option is disabled or hidden.
#104
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Connect Flow — Create New Account
~256 tok
### Connect Flow — Create New Account 3.15 The Agency Owner selects "Create new account" in the modal. 3.16 The system closes the modal and redirects the Agency Owner to the Stripe OAuth authorization page (external Stripe page). 3.17 The Agency Owner completes the Stripe Connect onboarding process, including: * Business information entry * Identity verification * Bank account linking 3.18 Upon successful authorization, Stripe redirects the Agency Owner back to the Pixally Business & Payment Details page. 3.19 The system stores the Stripe account connection data for that brand. 3.20 The system displays a success message: "Stripe account connected successfully for \[Brand Name\]." 3.21 The brand status updates based on Stripe's verification response: * If immediately verified: Status changes to "Connected" * If pending verification: Status changes to "Under Review" * If verification issues: Status changes to "Restricted" 3.22 The connection counter badge updates to reflect the new count.
#105
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Connect Flow — Use Existing Account
~261 tok
### Connect Flow — Use Existing Account 3.23 The Agency Owner selects "Use existing account" in the modal. 3.24 The system displays the "Select account" modal with: * **Title:** "Select account" * **Subtitle:** "Choose which account to use for \[Brand Name\]" * List of brands that already have Stripe connected, showing brand name and "Stripe account" label * **Buttons:** "Cancel" | "Link account" (disabled until selection made) 3.25 The Agency Owner selects one of the existing connected brands. 3.26 The Agency Owner clicks the "Link account" button. 3.27 The system links the selected Stripe account to the current brand. 3.28 The brand immediately shows as "Connected" status (no verification required since the Stripe account is already verified). 3.29 The brand shares the same bank account and payout configuration as the selected source brand. 3.30 The system displays a success message: "Stripe account connected successfully for \[Brand Name\]." 3.31 The connection counter badge updates to reflect the new count.
#106
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Review Flow (Under Review State)
~176 tok
### Review Flow (Under Review State) 3.32 When a brand is in "Under Review" status, the Agency Owner clicks the "Review" button. 3.33 The system opens a modal displaying the submitted business and bank account details. 3.34 The Agency Owner can view and edit the submitted information within the modal. 3.35 If the Agency Owner makes changes and saves, the system submits the updated information to Stripe. 3.36 The verification process restarts and may take an additional 24-48 hours. 3.37 If the Agency Owner clicks "Cancel" or closes the modal without saving, no changes are made. 3.38 The verification status automatically updates when Stripe completes verification (reflected on page refresh).
#107
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Retry Flow (Restricted State)
~192 tok
### Retry Flow (Restricted State) 3.39 When a brand is in "Restricted" status, the Agency Owner can expand the brand row to view specific error details. 3.40 The expanded section displays: * Error count: "Verification failed - \[X\] errors found" * Individual error messages in red boxes (pulled from Stripe API) * Footer message: "There was an issue completing your onboarding. Please review the highlighted details and try again." 3.41 The Agency Owner clicks the "Retry" button. 3.42 The system redirects the Agency Owner to the Stripe OAuth flow to restart the connection process. 3.43 The Agency Owner completes the Stripe onboarding again with corrected information. 3.44 Upon return, the brand status updates based on the new verification response.
#108
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Disconnect Flow
~413 tok
### Disconnect Flow 3.45 The Agency Owner expands a connected brand's accordion row. 3.46 The Agency Owner clicks the "Disconnect" button within the expanded section. 3.47 The system checks whether any payments are currently in processing for that brand. 3.48 If NO payments are in processing, the system displays a confirmation dialog with the following content: * **Title:** "Disconnect Stripe Account" * **Message:** "Are you sure you want to disconnect Stripe for \[Brand Name\]? You will no longer be able to receive payments for this brand until you reconnect." * **Buttons:** "Cancel" (secondary) | "Disconnect" (primary/destructive) 3.49 If the Agency Owner clicks "Disconnect," the system disconnects the Stripe account for that brand only. 3.50 Other brands sharing the same Stripe account remain connected and unaffected. 3.51 The brand status changes to "Not connected" with the "Connect" button. 3.52 The system displays a success message: "Stripe account disconnected for \[Brand Name\]." 3.53 The connection counter badge updates to reflect the new count. 3.54 If the Agency Owner clicks "Cancel," the system closes the dialog and no changes are made. 3.55 If payments ARE in processing, the system displays an informational dialog with the following content: * **Title:** "Cannot Disconnect Stripe Account" * **Message:** "Unable to disconnect Stripe account. Payments are currently being processed for \[Brand Name\]. Please try again once all payments are complete." * **Buttons:** "Close" only 3.56 The Agency Owner clicks "Close" to dismiss the dialog; no changes are made and the account remains connected.
#109
**FRD #3: Business & Payment Details Module** > **3\. User Flow** > Admin View Flow
~83 tok
### Admin View Flow 3.57 When an Admin navigates to Business & Payment Details, the system displays the same page layout. 3.58 All action buttons (Connect, Disconnect, Review, Retry) are hidden or disabled for Admin users. 3.59 The Admin can view all brand connection statuses and expand accordions but cannot make any changes.
#110
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#111
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.1 Stripe Connect Architecture
~165 tok
### 4.1 Stripe Connect Architecture • The Business & Payment Details module uses Stripe Connect to enable agencies to receive client payments on a per-brand basis. • Each brand within an agency can either create a new Stripe account or link to an existing Stripe account from another brand. • Multiple brands can share the same Stripe account, allowing flexible payment configuration. • When brands share a Stripe account, they share the same bank account and payout configuration. • Client payments are processed through Stripe and transferred to the agency's connected bank account. • Platform fees are deducted based on the agency's subscription plan.
#112
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.2 Brand Connection Options
~180 tok
### 4.2 Brand Connection Options **Create New Account:** • Initiates a new Stripe Connect OAuth flow. • User completes full Stripe onboarding including business info, identity verification, and bank account setup. • Results in a new, independent Stripe account for that brand. • Subject to Stripe's verification process (immediate, under review, or restricted). **Use Existing Account:** • Links the brand to a Stripe account already connected to another brand. • No Stripe OAuth flow required. • Brand immediately becomes "Connected" since the Stripe account is already verified. • Brand shares the same bank account and payouts as the source brand. • Available only when at least one other brand has Stripe connected.
#113
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.3 Shared Stripe Account Behavior
~120 tok
### 4.3 Shared Stripe Account Behavior • When multiple brands share a Stripe account, they share: * The same Stripe account credentials * The same connected bank account * The same payout schedule and configuration • Disconnecting one brand does NOT affect other brands sharing the same Stripe account. • Each brand maintains independent transaction history and reporting within Pixally. • Payouts from Stripe combine all transactions from brands sharing the account.
#114
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.4 Connection Counter Logic
~90 tok
### 4.4 Connection Counter Logic • The connection counter displays as "\[X\] of \[Y\] connected" format. • X = Number of brands with "Connected" status only. • Y = Total number of brands in the agency. • Brands in "Under Review" or "Restricted" status are NOT counted as connected. • Counter updates immediately when brands are connected or disconnected.
#115
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.5 Connection Status Definitions
~307 tok
### 4.5 Connection Status Definitions **Not Connected:** • No Stripe account has been linked to this brand. • The brand cannot receive any client payments. • Invoices and proposals can be created as templates but cannot be sent to clients. • Accordion is not expandable. **Connected:** • Stripe account is fully verified and active. • The brand can receive all types of client payments (ACH, Credit Card). • Invoices and proposals can be created and sent. • Automatic payouts to the connected bank account are active. • Accordion expandable to show bank details and Disconnect button. **Under Review:** • Stripe account connection is complete but verification is pending. • Verification typically takes 24-48 hours. • The brand CAN receive payments while under review. • The submitted bank account information is displayed (masked format). • The status automatically updates when Stripe completes verification (on page refresh). **Restricted:** • Stripe verification has failed due to one or more errors. • The brand CANNOT receive payments until issues are resolved. • Specific error messages from Stripe API are displayed in an expandable section. • The user must retry the connection process with corrected information.
#116
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.6 Platform Fee Structure
~342 tok
### 4.6 Platform Fee Structure Platform fees are determined by the agency's subscription plan and are deducted from each transaction. **Credit Card Fees by Plan:** **Subscription Plan** **Total CC Fee** **Stripe Portion** **Pixally Portion** Free 3.3% + 30¢ 2.9% + 30¢ 0.4% Basic 2.9% + 30¢ 2.9% + 30¢ $0 Essentials 2.9% + 30¢ 2.9% + 30¢ $0 Studio 2.9% + 30¢ 2.9% + 30¢ $0 **ACH Fees by Plan:** **Subscription Plan** **Total ACH Fee to Agency** **Stripe Portion** **Pixally Platform Fee** Free 1% (no cap) $0 (waived) 1% of transaction Basic Stripe fee + 1% 0.8% with $5 cap 1% of transaction Essentials 0.8% with $12 cap 0.8% with $5 cap Up to $7 Studio 0.8% with $8 cap 0.8% with $5 cap Up to $3 **Fee Calculation Logic:** • **Free Plan:** Pixally absorbs/waives the Stripe ACH fee. Agency pays only 1% platform fee to Pixally (no cap). • **Basic Plan:** Agency pays Stripe's standard ACH fee (0.8% with $5 cap) PLUS 1% platform fee to Pixally (no cap). Total = Stripe fee + 1%. • **Essentials Plan:** Combined ACH fee cap is $12. Stripe takes up to $5, Pixally takes the remainder up to $7. • **Studio Plan:** Combined ACH fee cap is $8. Stripe takes up to $5, Pixally takes the remainder up to $3. • Platform fees are not displayed in this module but appear under Expenses and QuickBooks integration if connected.
#117
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.7 Payment Processing Flow
~166 tok
### 4.7 Payment Processing Flow **Step 1: Client Payment Initiation** • Client pays an invoice through the client portal or payment link. • The payment is associated with a specific brand based on the invoice. **Step 2: Fee Calculation** • Stripe processing fees are applied based on the payment method. • Pixally platform fee is applied based on the agency's subscription plan. **Step 3: Fund Transfer** • Payment is received in the brand's connected Stripe account. • Fees are automatically deducted. • Net amount is available for payout to the agency's bank account. **Calculation:** agency\_receives = payment\_amount - stripe\_fee - pixally\_platform\_fee
#118
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.8 Blocked Actions for Unconnected Brands
~192 tok
### 4.8 Blocked Actions for Unconnected Brands • Brands without a connected Stripe account (status: "Not connected" or "Restricted") have restrictions on payment-related actions. • **Invoices:** Can be created as templates but cannot be sent to clients. When attempting to send, the system displays: "Please connect your Stripe account for \[Brand Name\] before sending invoices." • **Proposals:** Can be created as templates but cannot be sent to clients. When attempting to send, the system displays: "Please connect your Stripe account for \[Brand Name\] before sending proposals." • **Payment Links:** Cannot be generated for brands without active Stripe connection. • These restrictions do not apply to "Under Review" status, which allows payment processing.
#119
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.9 Stripe Verification Error Handling
~156 tok
### 4.9 Stripe Verification Error Handling • When Stripe verification fails, the brand enters "Restricted" status. • The system retrieves error details from the Stripe API and displays them in an expandable section. • Common verification errors include: * Identity document not readable * Address mismatch between document and account * Expired government ID * Unsupported business type or country * Missing required information • Each error is displayed in a red-highlighted box with clear instructions for resolution. • The "Retry" button initiates a new Stripe OAuth flow to restart the onboarding process.
#120
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.10 Review Modal Functionality
~117 tok
### 4.10 Review Modal Functionality • The Review modal appears when the user clicks "Review" on an "Under Review" brand. • The modal displays all submitted business and bank account details. • Fields are editable, allowing the user to correct any information before verification completes. • Saving changes submits the updated information to Stripe and restarts the verification process (24-48 hours). • Closing without saving preserves the original submission.
#121
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.11 Disconnect Process
~162 tok
### 4.11 Disconnect Process • Disconnection is available for "Connected" brands via the expanded accordion section. • Disconnecting a Stripe account for a brand does NOT affect other brands sharing the same Stripe account. • Disconnecting does not delete the Stripe account itself, only removes the connection for that specific brand. • After disconnection: * The brand cannot receive new payments * Pending/scheduled payments for that brand are blocked * Historical payment data remains in the system * The brand can be reconnected later • Disconnection is blocked if any payments are currently in "processing" status for that brand.
#122
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.12 Onboarding Integration
~143 tok
### 4.12 Onboarding Integration • The Business & Payment Details module is part of the agency onboarding process. • New agencies see an onboarding wizard with 8 steps, including "Connect to Stripe." • Clicking "Connect to Stripe" in the onboarding wizard navigates to the Business & Payment Details page. • The "Connect to Stripe" step is optional and can be skipped during initial onboarding. • The onboarding wizard remains visible until all steps are completed, including Stripe connection. • Agencies can complete Stripe connection later from the Settings menu.
#123
**FRD #3: Business & Payment Details Module** > **4\. Functional Logic** > 4.13 Real-Time Updates
~77 tok
### 4.13 Real-Time Updates • The connection counter updates immediately when brands are connected or disconnected. • Verification status changes from Stripe (via webhooks) are reflected on page refresh. • Brand statuses update automatically without requiring a full page reload for user-initiated actions.
#124
**FRD #3: Business & Payment Details Module** > **5\. Field Details & Validations**
~473 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Description** **Display Location** Page Title Display Text "Business and Payment Details" Page header Page Subtitle Display Text "Connect each brand to your Stripe account to receive payments from all your clients" Below page title Card Title Display Text "Connect with Stripe" Card header Card Subtitle Display Text "One account per brand" Below card title Connection Counter Badge "\[X\] of \[Y\] connected" format; counts only "Connected" status Top-right of card Benefit 1 Checkbox Text "Separate accounts per brand" Benefits section Benefit 2 Checkbox Text "Per-brand reporting" Benefits section Benefit 3 Checkbox Text "Independent payouts" Benefits section Benefit 4 Checkbox Text "Scale with new brands" Benefits section Brand Logo Image/Avatar Brand logo or initials Brand accordion row Brand Name Display Text Name of the brand Brand accordion row Connection Status Status Text "Not connected" / "Connected" / Bank info Brand accordion row Status Badge Badge "Under Review" (yellow) / "Restricted" (red) Brand accordion row (when applicable) Action Button Button "Connect" / "Review" / "Retry" Brand accordion row Bank Account (Expanded) Display Text Masked format: "Bank Of America \*\*\*\* 4829" Expanded accordion section Disconnect Button Button "Disconnect" (red outlined) Expanded accordion section Error Count Display Text "Verification failed - \[X\] errors found" Expanded restricted section Error Message Alert Box Specific error from Stripe API Expanded restricted section Error Footer Display Text "There was an issue completing your onboarding..." Expanded restricted section Under Review Message Info Text "Your stripe account is under verification. It could take up to 24-48 hours" Expanded under review section
#125
**FRD #3: Business & Payment Details Module** > **5\. Field Details & Validations** > Modal Fields
~236 tok
### Modal Fields **Field Name** **Field Type** **Description** **Modal** Modal Title Display Text "Connect Stripe account" Connect Stripe account modal Modal Subtitle Display Text "How would you like to connect \[Brand Name\]?" Connect Stripe account modal Create New Account Radio Option "Set up a new Stripe account" Connect Stripe account modal Use Existing Account Radio Option "Link to another brand's account" Connect Stripe account modal Cancel Button Button Closes modal Connect Stripe account modal Select Account Title Display Text "Select account" Select account modal Select Account Subtitle Display Text "Choose which account to use for \[Brand Name\]" Select account modal Brand List Item Radio Option Brand name + "Stripe account" Select account modal Cancel Button Button Closes modal Select account modal Link Account Button Button Links selected account to brand Select account modal
#126
**FRD #3: Business & Payment Details Module** > **6\. Success Message Handling**
~247 tok
## **6\. Success Message Handling** **Action** **Success Message** **Trigger Condition** **Post-Success Behaviour** Stripe Connected (New) "Stripe account connected successfully for \[Brand Name\]." Stripe OAuth completes and returns account data Brand status updates; counter updates Stripe Connected (Existing) "Stripe account connected successfully for \[Brand Name\]." User links existing account via Select account modal Brand shows "Connected"; counter updates Stripe Disconnected "Stripe account disconnected for \[Brand Name\]." User confirms disconnection; no payments processing Brand status changes to "Not connected"; counter updates Review Info Updated "Information updated successfully. Verification will restart." User saves changes in Review modal Modal closes; verification restarts (24-48 hrs) Verification Complete "Stripe verification completed for \[Brand Name\]." Stripe webhook indicates successful verification Status changes to "Connected"
#127
**FRD #3: Business & Payment Details Module** > **7\. Error Message Handling**
~502 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **Trigger Condition** **Required Action / System Response** No brands configured "Please create at least one brand before configuring payment settings." User navigates to page with zero brands Display empty state; link to Brand creation Stripe OAuth cancelled "Stripe connection was cancelled. Please try again to connect your account." User closes or cancels Stripe OAuth flow User returns to page; brand remains "Not connected" Stripe OAuth failed "Unable to connect to Stripe. Please check your internet connection and try again." Network error during OAuth User returns to page; can retry Disconnect blocked - processing "Unable to disconnect Stripe account. Payments are currently being processed for \[Brand Name\]. Please try again once all payments are complete." User tries to disconnect while payments processing Display dialog with "Close" button only Verification rejected "Verification failed - \[X\] errors found" + specific Stripe errors Stripe returns verification errors Display errors in expandable section; show "Retry" button Send invoice blocked "Please connect your Stripe account for \[Brand Name\] before sending invoices." User tries to send invoice for brand without Stripe Block send action; prompt to connect Send proposal blocked "Please connect your Stripe account for \[Brand Name\] before sending proposals." User tries to send proposal for brand without Stripe Block send action; prompt to connect Permission denied "You don't have permission to modify payment settings." Non-owner user attempts to connect/disconnect Display error; no action taken Network error "Unable to load payment configuration. Please refresh the page or try again later." Network failure when loading page data Display error with retry option No existing accounts available (Option disabled) User clicks Connect but no other brands have Stripe "Use existing account" option is disabled
#128
**FRD #3: Business & Payment Details Module** > **8\. Edge Cases**
~618 tok
## **8\. Edge Cases** **Scenario** **System Behaviour** **Mitigation** No brands configured Display empty state with message to create brand first Link to Brand Management All brands connected Counter shows "X of X connected"; all brands show expanded accordions with Disconnect Normal operation All brands not connected Counter shows "0 of X connected"; all brands show "Connect" button Onboarding wizard prompts connection New brand added Automatically appears in list as "Not connected" No user action required Brand deleted Removed from list; Stripe connection preserved in Stripe Historical payment data retained First brand connecting "Use existing account" option is disabled/hidden Only "Create new account" available Multiple brands share same Stripe All share same bank and payouts Disconnect affects only selected brand Disconnect shared account brand Only that brand disconnects; others remain connected Clear confirmation message All brands using shared account disconnect Stripe account remains active in Stripe dashboard User can reconnect any brand Stripe service outage OAuth flow fails; display error message Queue for retry; show maintenance message Webhook delivery failure Status not updated automatically Manual refresh required; implement webhook retry Concurrent edit attempts Data conflict possible Session locking; last save wins Browser blocks OAuth redirect OAuth flow interrupted Provide manual connection instructions Verification takes longer than 48 hours User may be concerned Display "taking longer than expected" message User retries during Under Review May cause duplicate submissions Disable Retry during Under Review; only show Review Admin attempts to connect Action buttons hidden/disabled View-only access enforced Disconnect then reconnect same account Can link via "Use existing account" if another brand still uses it Or create new connection via OAuth Payment initiated during disconnect attempt Disconnect blocked Show "Cannot Disconnect" dialog Multiple errors from Stripe All errors displayed in expandable section Each error in separate red box Restricted brand added to invoice Cannot send invoice Block at send time with clear message Under Review brand receives payment Payment processed normally Under Review allows payments Link to existing account that becomes restricted Linked brand also becomes restricted Status syncs from source Stripe account
#129
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria**
~8 tok
## **9\. Acceptance Criteria**
#130
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Access Control
~75 tok
### Access Control • Agency Owners can view and modify all brand Stripe connections. • Admins can view all connection statuses and expand accordions but cannot connect, disconnect, review, or retry. • Other roles (Project Manager, Editor, Supervising Editor, Contractor) cannot access this section.
#131
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Page Display
~94 tok
### Page Display • Page heading displays "Business and Payment Details" with correct subtitle. • "Connect with Stripe" card displays with "One account per brand" subtitle. • Connection counter shows accurate count of connected brands (not including Under Review). • All four benefits display with checkmarks. • All agency brands are listed as collapsible accordion rows.
#132
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Connect Flow — Create New Account
~94 tok
### Connect Flow — Create New Account • Clicking "Connect" opens "Connect Stripe account" modal with two options. • Selecting "Create new account" redirects to Stripe OAuth flow. • After successful OAuth, user returns to Pixally with success message. • Brand status updates appropriately (Connected, Under Review, or Restricted). • Connection counter updates immediately.
#133
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Connect Flow — Use Existing Account
~120 tok
### Connect Flow — Use Existing Account • "Use existing account" option is disabled when no other brands have Stripe connected. • Selecting "Use existing account" opens "Select account" modal. • Modal lists all brands with connected Stripe accounts. • Selecting a brand and clicking "Link account" connects the current brand immediately. • Brand shows "Connected" status without verification (already verified). • Brand shares same bank account and payouts as source brand.
#134
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Status States
~119 tok
### Status States • "Not connected" brands show red status text and yellow "Connect" button. • "Connected" brands show green "Connected" text with checkmark; accordion expandable. • Expanded accordion shows bank account details and "Disconnect" button. • "Under Review" brands show bank info, yellow badge, "Review" button, and expandable info message. • "Restricted" brands show red error text, red badge with warning icon, "Retry" button, and expandable error details.
#135
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Shared Account Behavior
~60 tok
### Shared Account Behavior • Multiple brands can successfully link to the same Stripe account. • Disconnecting one brand does not affect other brands sharing the account. • All brands sharing an account display the same bank information.
#136
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Review Flow
~48 tok
### Review Flow • Clicking "Review" opens modal with editable business/bank details. • Saving changes restarts verification process. • Closing without saving preserves original submission.
#137
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Retry Flow
~37 tok
### Retry Flow • Clicking "Retry" redirects to Stripe OAuth to restart onboarding. • After successful retry, brand status updates appropriately.
#138
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Disconnect Flow
~107 tok
### Disconnect Flow • Disconnect button is inside expanded accordion section. • Clicking "Disconnect" shows confirmation dialog with brand name. • Confirming disconnection changes status to "Not connected" and updates counter. • Other brands sharing the same Stripe account remain unaffected. • Cancelling closes dialog with no changes. • If payments processing, "Cannot Disconnect" dialog appears with only "Close" button.
#139
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Blocked Actions
~64 tok
### Blocked Actions • Brands without active Stripe (Not connected or Restricted) cannot send invoices or proposals. • Templates can be created but send action is blocked with appropriate message. • "Under Review" brands CAN send invoices and proposals.
#140
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Platform Fees
~55 tok
### Platform Fees • Fees are calculated based on agency's subscription plan. • Credit card and ACH fees follow the defined structure per plan. • Fees are not displayed in this module but appear in Expenses/QuickBooks.
#141
**FRD #3: Business & Payment Details Module** > **9\. Acceptance Criteria** > Onboarding Integration
~49 tok
### Onboarding Integration • "Connect to Stripe" step in onboarding wizard navigates to this page. • Step is optional and can be skipped. • Onboarding wizard persists until all steps completed.
#142
**FRD #3: Business & Payment Details Module** > **10\. Manual Test Cases**
~61 tok
## **10\. Manual Test Cases** The comprehensive test cases for the Business & Payment Details module are provided in a separate Excel file for upload to the project management system. **File:** \[Business\_Payment\_Details\_Test\_Cases.xlsx\]
#143
**FRD #3: Business & Payment Details Module** > **11\. Dependencies**
~335 tok
## **11\. Dependencies** **Module / System** **Dependency Type** **Description** **Impact if Unavailable** Stripe Connect API External Service OAuth authorization, account management, verification Cannot connect Stripe accounts; no payment processing Stripe OAuth External Service Account connection authorization flow Cannot initiate new connections Stripe Webhooks External Service Verification status updates Manual status checks required; delayed updates Brand Management Internal Module Provides list of agency brands Cannot display brands; no connections possible Invoice Module Internal Module Creates payable invoices Invoice creation works but send blocked without Stripe Proposal Module Internal Module Creates payable proposals Proposal creation works but send blocked without Stripe Subscription Module Internal Module Determines platform fee rates Default fee structure applied Onboarding Wizard Internal Module Initial agency setup flow Connection step unavailable in onboarding Authentication Service Internal Service Validates user roles and permissions Unauthorized access possible QuickBooks Integration External Service Expense tracking for platform fees Fee tracking unavailable Expenses Module Internal Module Displays platform fee deductions Fee visibility unavailable
#144
**FRD #3: Business & Payment Details Module** > **12\. References**
~176 tok
## **12\. References**
* **Figma Designs:** \[Figma Link\]
* **Related FRDs:**
* \[My\_Profile\_FRD.md\] — Agency Global Settings
* \[General\_Settings\_FRD.md\] — Agency Global Settings
* \[Accepted\_Payment\_Methods\_FRD.md\] — Agency Global Settings
* \[Two\_Step\_Verification\_FRD.md\] — Agency Global Settings
* \[Data\_Management\_FRD.md\] — Agency Global Settings
* \[Stripe\_Integration\_FRD.md\] — Agency Global Settings (Contractor Payments)
* \[Subscription\_Module\_FRD.md\] — Subscription Management
* \[Invoice\_Module\_FRD.md\] — Finance Module
* \[Proposal\_Module\_FRD.md\] — Projects Module
4\. Accepted Payment Methods Module#145
**FRD #4: Accepted Payment Methods Module**
~11 tok
# **FRD #4: Accepted Payment Methods Module**
#146
**FRD #4: Accepted Payment Methods Module** > **1\. Module Overview**
~154 tok
## **1\. Module Overview** **Module Name:** Accepted Payment Methods **Purpose:** The Accepted Payment Methods module enables agencies to configure which payment options are available to clients on invoices and proposals, including processing fee management and payment method availability controls. **Business Goals:** * Provide flexibility in payment acceptance based on business needs * Display transparent processing fees to understand cost structure * Ensure at least one payment method is always available for client transactions * Integrate seamlessly with Stripe payment processing capabilities
#147
**FRD #4: Accepted Payment Methods Module** > **2\. User Roles & Permissions**
~112 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Permissions** Agency Owner Full access All settings Can enable/disable payment methods Admin View only None Can view settings and fees Project Manager View only None Can view enabled methods Editor No access None Section not visible Supervising Editor No access None Section not visible Contractor No access None Section not visible
#148
**FRD #4: Accepted Payment Methods Module** > **3\. User Flow**
~477 tok
## **3\. User Flow** 3.1 The Agency Owner navigates to Settings and clicks on Accepted Payment Methods. 3.2 The system displays the current payment method configuration and processing fees. 3.3 The user views the Card Payments section showing credit card acceptance options. 3.4 The user reads the description explaining that card payments work with major credit cards. 3.5 The system displays the current processing fee percentage based on the subscription plan. 3.6 The user toggles the Card Payments switch to enable or disable this method. 3.7 The system immediately updates the toggle state and shows visual feedback. 3.8 The user views the ACH Bank Transfers section below Card Payments. 3.9 The user reads the description about direct bank account payments. 3.10 The system displays the lower processing fee for ACH transfers. 3.11 The user toggles the ACH Bank Transfers switch as needed. 3.12 The system validates that at least one payment method remains enabled. 3.13 The user reviews the processing fee information for both methods. 3.14 The system shows how fees are calculated based on the current subscription tier. 3.15 The user attempts to disable all payment methods to test validation. 3.16 The system prevents disabling the last active payment method. 3.17 The user receives an error message about minimum requirements. 3.18 The system maintains at least one payment method as active. 3.19 The user makes final adjustments to payment method selections. 3.20 The user clicks Save to apply the payment method configuration. 3.21 The system saves the settings and confirms the changes. 3.22 The user navigates away knowing the settings are applied. 3.23 The system applies these payment options to all future invoices. 3.24 The user can return to modify settings as business needs change. 3.25 The system maintains the configuration across all brands under the agency.
#149
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#150
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Payment Method Configuration
~178 tok
### Payment Method Configuration * The Accepted Payment Methods section controls which payment options appear on client-facing invoices and proposals. * Two primary payment methods are supported in Phase 1: Card Payments and ACH Bank Transfers. * Each payment method can be independently enabled or disabled based on business preferences and client needs. * The system enforces that at least one payment method must remain active to ensure clients can always make payments. * Changes to payment methods apply immediately to all new invoices and proposals but do not affect existing unpaid documents. * The configuration applies at the agency level and affects all brands under the agency umbrella.
#151
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Card Payments Processing
~176 tok
### Card Payments Processing * Card Payments, when enabled, accepts all major credit cards including Visa, Mastercard, American Express, and Discover. * The processing fee for card payments displays dynamically based on the agency's current subscription plan. * Standard card processing fees typically show as a percentage (e.g., 2.9%) plus a fixed amount (e.g., $0.30) per transaction. * The system clearly displays these fees to help agencies understand their cost structure for accepting card payments. * Card payment processing occurs through the connected Stripe account with automatic fund transfers. * Enabling card payments requires an active and verified Stripe account connection.
#152
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > ACH Bank Transfer Processing
~161 tok
### ACH Bank Transfer Processing * ACH Bank Transfers enable clients to pay directly from their bank accounts with lower processing fees. * The ACH processing fee is typically lower than card payments, often showing as a smaller percentage or flat fee. * ACH payments may take longer to process (3-5 business days) compared to instant card payments. * The system displays clear information about ACH processing times to set proper expectations. * ACH transfers require additional client verification for security and fraud prevention. * This payment method is ideal for larger invoices where lower fees provide significant savings.
#153
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Processing Fee Management
~145 tok
### Processing Fee Management * Processing fees are determined by the agency's subscription plan and cannot be manually modified. * The system automatically updates fee displays when subscription plans change. * Fees are shown as informational only and do not affect the invoice amounts sent to clients. * Agencies absorb processing fees unless explicitly added to invoices as separate line items. * The fee structure helps agencies calculate true revenue after payment processing costs. * Different subscription tiers may offer reduced processing fees as a benefit.
#154
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Payment Method Validation
~129 tok
### Payment Method Validation * The system prevents users from disabling all payment methods simultaneously. * When attempting to disable the last active method, an error message appears explaining the requirement. * The validation occurs both client-side for immediate feedback and server-side for security. * If Stripe is disconnected, all payment methods become unavailable regardless of toggle states. * The system checks Stripe account capabilities to ensure selected methods are actually available.
#155
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Subscription Plan Integration
~114 tok
### Subscription Plan Integration * The displayed processing fees automatically adjust based on the current subscription plan. * Higher-tier subscriptions typically offer lower processing fees as an added benefit. * The system retrieves current fee rates from the subscription configuration. * Changes to subscription plans immediately reflect in the fee display. * Downgrading subscriptions may result in higher processing fees going forward.
#156
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Invoice and Proposal Integration
~110 tok
### Invoice and Proposal Integration * Enabled payment methods automatically appear as options on all new invoices and proposals. * Clients see only the enabled methods when viewing payment options. * The system generates appropriate payment buttons and forms based on the configuration. * Disabled methods are completely hidden from client-facing documents. * Changes do not retroactively affect invoices already sent to clients.
#157
**FRD #4: Accepted Payment Methods Module** > **4\. Functional Logic** > Multi-Brand Considerations
~82 tok
### Multi-Brand Considerations * Payment method settings apply globally to all brands under the agency. * Individual brands cannot have different payment method configurations. * All brands must share the same Stripe account for payment processing. * This ensures consistent payment experience across all agency brands.
#158
**FRD #4: Accepted Payment Methods Module** > **5\. Field Details & Validations**
~104 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Validation Rules** **Required** Card Payments Toggle Switch Boolean on/off No Card Processing Fee Display Read-only, percentage + fixed N/A ACH Transfers Toggle Switch Boolean on/off No ACH Processing Fee Display Read-only, percentage or flat N/A Minimum Active Methods System Rule At least 1 method must be enabled Yes
#159
**FRD #4: Accepted Payment Methods Module** > **6\. Success Message Handling**
~149 tok
## **6\. Success Message Handling** **Operation** **Success Message** **Post-Success Action** **Duration** Enable Card Payments "Card payments enabled successfully" Update invoice options 3 seconds Disable Card Payments "Card payments disabled successfully" Remove from invoices 3 seconds Enable ACH Transfers "ACH bank transfers enabled successfully" Update invoice options 3 seconds Disable ACH Transfers "ACH bank transfers disabled successfully" Remove from invoices 3 seconds Save Configuration "Payment methods updated successfully" Apply to new invoices 3 seconds
#160
**FRD #4: Accepted Payment Methods Module** > **7\. Error Message Handling**
~193 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **User Action Required** Disable All Methods "At least one payment method must be enabled" Keep one method active No Stripe Connected "Please connect Stripe account before configuring payment methods" Connect Stripe first Stripe Not Verified "Stripe verification pending. Payment methods unavailable" Wait for verification Permission Denied "Only Agency Owners can modify payment methods" Contact Agency Owner Save Failed "Unable to save payment configuration. Please try again" Retry save operation Network Error "Connection error. Please check your internet and try again" Check connection Invalid Configuration "Invalid payment configuration detected" Refresh and reconfigure
#161
**FRD #4: Accepted Payment Methods Module** > **8\. Edge Cases**
~159 tok
## **8\. Edge Cases** **Scenario** **System Behavior** **Mitigation** Stripe capabilities mismatch Selected method not available in Stripe Sync with Stripe capabilities Subscription plan expired Fee rates unavailable Default to standard rates Multiple users editing Configuration conflicts Last save wins Browser compatibility issues Toggle switches may not work Provide fallback checkboxes Payment method deprecated Old method still showing Hide deprecated options Fee calculation errors Incorrect fees displayed Validate against source Rapid toggle switching State synchronization issues Debounce toggle actions
#162
**FRD #4: Accepted Payment Methods Module** > **9\. Acceptance Criteria**
~8 tok
## **9\. Acceptance Criteria**
#163
**FRD #4: Accepted Payment Methods Module** > **9\. Acceptance Criteria** > Payment Method Controls
~55 tok
### Payment Method Controls * Toggles enable/disable payment methods correctly * At least one method always remains active * Changes save and persist properly * Configuration applies to new invoices immediately
#164
**FRD #4: Accepted Payment Methods Module** > **9\. Acceptance Criteria** > Processing Fee Display
~51 tok
### Processing Fee Display * Fees display accurately based on subscription * Fee updates reflect plan changes * Information is clearly presented * Both percentage and fixed fees shown correctly
#165
**FRD #4: Accepted Payment Methods Module** > **9\. Acceptance Criteria** > Access Control
~49 tok
### Access Control * Only Agency Owners can modify settings * Other roles have appropriate view access * Permission errors display correctly * Unauthorized users cannot bypass restrictions
#166
**FRD #4: Accepted Payment Methods Module** > **9\. Acceptance Criteria** > Integration
~50 tok
### Integration * Settings work with connected Stripe account * Payment options appear correctly on invoices * Configuration syncs across all brands * Changes don't affect existing invoices
#167
**FRD #4: Accepted Payment Methods Module** > **10\. Manual Test Cases**
~56 tok
## **10\. Manual Test Cases** [Payment\_Methods\_Comprehensive\_Test\_Cases.xlsx](https://docs.google.com/spreadsheets/d/1NVT9islh9xxrR9rk59n3FlMCpcIYDmlj/edit?usp=drive_link&ouid=105170312247554220827&rtpof=true&sd=true)
#168
**FRD #4: Accepted Payment Methods Module** > **11\. Dependencies**
~161 tok
## **11\. Dependencies** **Dependency Type** **Dependency Name** **Description** **Impact if Unavailable** External Service Stripe API Payment processing No payments possible Internal Module Business & Payment Details Stripe account connection Cannot configure methods Internal Module Invoice Module Display payment options Methods won't appear on invoices Internal Module Proposal Module Display payment options Methods won't appear on proposals Internal Module Subscription Module Determine processing fees Default fees applied Configuration Payment Method List Available payment types Limited to hardcoded options
#169
**FRD #4: Accepted Payment Methods Module** > **12\. References**
~6 tok
## **12\. References**
#170
**FRD #4: Accepted Payment Methods Module** > **12\. References** > 12.1 Figma Designs: [Figma](https://www.figma.com/design/ej0kxwP45mDKmZCZfAJ5O8/Pixally?node-id=33604-20860&t=hlJPZKI33RrWvjz0-0)
~41 tok
### 12.1 Figma Designs: [Figma](https://www.figma.com/design/ej0kxwP45mDKmZCZfAJ5O8/Pixally?node-id=33604-20860&t=hlJPZKI33RrWvjz0-0) 5\. 2-Step Verification Module
#171
**2-Step Verification (Global Settings)**
~11 tok
# **2-Step Verification (Global Settings)**
#172
**2-Step Verification (Global Settings)** > **1\. Module Overview**
~309 tok
## **1\. Module Overview**
* **Module Name:** 2-Step Verification (Settings)
* **Purpose:** Provide users an in-app Settings page to view their 2FA status, verify contact methods (email & phone), and enable, disable, or combine Email and SMS as 2FA methods.
* **Business Goal:** Give users ongoing control over their 2FA configuration with clear status visibility, easy management, and a consistent password-confirmation security gate for all changes.
* **Scope:** This FRD covers:
* Settings page UI ("Verification Required" + "Enable 2FA" sections)
* Verifying email and phone number from Settings
* Changing the verified phone number
* Enabling and disabling each 2FA method (Email and SMS) **independently**
* Per-action password confirmation as the security gate for all state changes
* Auto-activation of SMS 2FA when the verified phone number is changed (if previously active)
* Lost access / recovery path (high-level)
* Note: First-login 2FA setup, login OTP verification (including dual-channel delivery when both methods are active), and login-time contact verification are covered in the **Agency Auth – Two-Factor Authentication (2FA) Setup** FRD.#173
**2-Step Verification (Global Settings)** > **2\. User Roles & Permissions**
~135 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Notes** User Own 2FA settings Own 2FA settings Password confirmation required for each change Google User Own 2FA settings Own 2FA settings (SMS only) Email 2FA not available; no prompt required for actions (relies on Google OAuth session) Agency Admin Own 2FA settings Own 2FA settings Same as User; personal phone changes do not affect agency master data All Other Roles Own settings only Own settings only Standard 2FA flows apply
#174
**2-Step Verification (Global Settings)** > **3\. User Flow**
~5 tok
## **3\. User Flow**
#175
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.1. Page Entry
~82 tok
### 3.1. Page Entry * User navigates to **Settings → 2-Step Verification** * The page loads immediately using the user's existing login session; no additional authentication is required to view the page * All state-changing actions trigger a password confirmation modal (regular users) or execute directly (Google users)
#176
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.2. Viewing the Settings Page
~208 tok
### 3.2. Viewing the Settings Page The page shows two sections: **Section A — Verification Required** * Caption: "Both email and phone number must be verified to secure the account." * **Email Address Verification:** shows the registered email + status badge (**Verified** / **Not Verified**) + "Verify Email" button (if not verified) * **Phone Number Verification:** shows masked phone (e.g., (\*\*\*) \*\*\*\*-6888) + status badge + "Change Phone Number" (if verified) or "Verify Phone Number" (if not verified) **Section B — Enable 2FA** * **2FA with Email Address:** row with description + "Enable" or "Disable" button + "Activated" badge when active * **2FA with Phone Number:** row with description + "Enable" or "Disable" button + "Activated" badge when active * Each row's state is independent of the other
#177
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.3. Verifying Email (Regular User)
~105 tok
### 3.3. Verifying Email (Regular User) * User clicks "Verify Email" * Password confirmation modal appears * User enters password and clicks Confirm * On successful password validation, the email is marked as verified * Status badge updates to "Verified"; the "Enable" button on the 2FA with Email row becomes active * **Google users:** email is already verified via OAuth; "Verify Email" button is not shown
#178
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.4. Verifying / Changing Phone Number (Regular User)
~195 tok
### 3.4. Verifying / Changing Phone Number (Regular User) * User clicks "Verify Phone Number" or "Change Phone Number" * Modal prompts for country code + phone number (pre-filled with current value when changing) * User enters the new number and clicks Save * Password confirmation modal appears * User enters password and clicks Confirm * On successful password validation, the phone number is saved to the user master as personal mobile and marked as verified * Status badge updates to "Verified" * **Auto-activation rule:** If SMS 2FA was previously active on the old number, it **automatically remains active** on the new number — no separate "Enable" step is required * **Google users:** password prompt is skipped; phone number is updated directly on Save
#179
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.5. Enabling 2FA — Email (Regular User)
~151 tok
### 3.5. Enabling 2FA — Email (Regular User) **Pre-condition:** Email must be verified. If not, the "Enable" button is disabled and prompts verification first. * User clicks "Enable" on the **2FA with Email Address** row * Password confirmation modal appears * User enters password and clicks Confirm * On successful password validation, Email 2FA is activated * Badge changes to "Activated"; button changes to "Disable" * SMS 2FA state is **not** affected * Success toast: "Email verification enabled successfully" * **Google users:** Email 2FA is not available (row hidden or disabled)
#180
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.6. Enabling 2FA — SMS (Regular User)
~153 tok
### 3.6. Enabling 2FA — SMS (Regular User) **Pre-condition:** Phone must be verified. If not, the "Enable" button is disabled and prompts verification first. * User clicks "Enable" on the **2FA with Phone Number** row * Password confirmation modal appears * User enters password and clicks Confirm * On successful password validation, SMS 2FA is activated * Badge changes to "Activated"; button changes to "Disable" * Email 2FA state is **not** affected * Success toast: "SMS verification enabled successfully" * **Google users:** password prompt is skipped; SMS 2FA activates directly on click
#181
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.7. Disabling a Method (Regular User)
~200 tok
### 3.7. Disabling a Method (Regular User)
* User clicks "Disable" on a currently active method
* Password confirmation modal appears
* User enters password and clicks Confirm
* On successful password validation, the method is deactivated
* The other method's state is unchanged
* **If the disabled method was the only active 2FA method**, 2FA is now off entirely:
* Toast: "Two-factor authentication disabled."
* Persistent warning banner: "Your account is less secure without 2FA. We recommend re-enabling."
* **If the other method remains active**, 2FA is still on overall:
* Toast: "Email/SMS verification disabled. \[Other method\] is still active."
* No warning banner
* **Google users:** password prompt is skipped; method deactivates directly on click#182
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.8. Both Methods Active
~74 tok
### 3.8. Both Methods Active * A user can have both Email and SMS 2FA active simultaneously * At each login, the system sends the **same OTP to both channels** (covered in the Agency Auth FRD, Section 3.4) * Either code (from email or SMS) is accepted; entering one completes verification
#183
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.9. Google User Behavior (Summary)
~161 tok
### 3.9. Google User Behavior (Summary) * **Email Address Verification row:** shows "Verified" automatically; no action button visible * **2FA with Email Address row:** "Enable" button is **hidden or disabled with a tooltip**: "Email 2FA is not available for Google-authenticated accounts." * **2FA with Phone Number row:** fully functional * **All Settings actions for Google users execute without a password prompt** — the existing Google OAuth session is the authorization * If the Google OAuth session has expired, the user is returned to the Google sign-in flow by the core authentication layer (not handled within this module)
#184
**2-Step Verification (Global Settings)** > **3\. User Flow** > 3.10. Lost Access Recovery
~163 tok
### 3.10. Lost Access Recovery * **If only SMS is active and the phone is unreachable:** the user should use the login-time verification flow (see Agency Auth FRD) to update the phone number, or contact Pixally support * **If both methods are active:** the inaccessible channel is automatically mitigated — the user can complete login via the other channel, then disable or change the affected method from Settings * **If all channels are unreachable:** user must contact Pixally support. Support verifies identity through alternate means and disables 2FA from backend administrative tools * All recovery actions are logged in the audit trail
#185
**2-Step Verification (Global Settings)** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#186
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.1 Per-Action Password Confirmation (Security Gate)
~159 tok
### 4.1 Per-Action Password Confirmation (Security Gate)
* Every state-changing action in Settings requires a password confirmation modal for regular users:
* Verify Email
* Verify Phone Number (first-time)
* Change Phone Number
* Enable Email 2FA
* Enable SMS 2FA
* Disable Email 2FA
* Disable SMS 2FA
* The password modal is the **only** security gate for these actions — no OTP is sent or required
* **Google users** bypass the password prompt entirely; actions execute based on the active OAuth session
* Password validation is server-side against the user's current password hash#187
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.2 Password Attempt Limits
~95 tok
### 4.2 Password Attempt Limits * Users have a maximum of **5 password entry attempts** per session within Settings * After 5 wrong attempts: 2FA actions are restricted for **1 hour** * Automatic unlock after exactly 1 hour from the lockout time * The lockout is specific to 2FA-related actions and does not terminate the application session for unrelated functionality
#188
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.3 Independent Method Activation (Both Methods Allowed)
~106 tok
### 4.3 Independent Method Activation (Both Methods Allowed) * Email 2FA and SMS 2FA are activated and disabled **independently** * A user may have: only Email active, only SMS active, both active, or neither active * Enabling one method has no effect on the state of the other; disabling one does not affect the other * Login behavior when both are active is governed by the Agency Auth FRD: same OTP, dual delivery
#189
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.4 Verification Required Before 2FA Activation
~85 tok
### 4.4 Verification Required Before 2FA Activation * A method (email or phone) must be verified before 2FA can be enabled on it * Until verified, the corresponding "Enable" button is disabled/grayed out, with a prompt to verify first * Verification of email or phone from Settings uses the **password** as the security gate (not OTP)
#190
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.5 Phone Number Management & Auto-Activation on Change
~166 tok
### 4.5 Phone Number Management & Auto-Activation on Change * User enters phone number during verification/change; saved to user master as personal mobile * Independent of agency-registered phone number * The same phone can be used across multiple user accounts; rate limit applies per phone number globally * **Auto-activation:** if SMS 2FA was active on the old number, it remains active on the new number immediately after the phone change is confirmed — the user does not need to click "Enable" again * If SMS 2FA was not active at the time of the change, its status remains off; the user must separately click "Enable" if they want to activate it
#191
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.6 Status Display Logic
~90 tok
### 4.6 Status Display Logic * **"Verified"** badge: shown when the contact method is flagged as verified in user master * **"Not Verified"** badge: shown when no verification flag exists * **"Activated"** badge: shown on each 2FA row that is currently active (both rows can show "Activated" simultaneously) * UI updates synchronously on API success
#192
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.7 Audit Logging
~72 tok
### 4.7 Audit Logging * All state changes recorded with: user ID, timestamp, IP, action type (verify / change-phone / enable / disable / support-disable), target method, and source (settings / support) * Includes password-challenge results (success/failure) for security monitoring
#193
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.8 Post-Disable Behavior
~103 tok
### 4.8 Post-Disable Behavior
* User retains full access immediately
* If at least one 2FA method remains active, no warning banner is shown
* If 2FA is now fully off:
* Persistent warning banner shown in Settings until at least one method is re-enabled
* No automatic re-prompt is shown at login (the first-login pop-up does **not** reappear — this is one-time-only per the Agency Auth FRD)#194
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.9 Lost Access / Fallback Logic
~145 tok
### 4.9 Lost Access / Fallback Logic
* **Single-method active + that channel unreachable:**
* SMS-only and phone unreachable → user can update phone via login-time verification (Agency Auth FRD) or contact support
* Email-only and email unreachable → contact support
* **Both methods active:** the inaccessible channel is automatically bypassed — the working channel handles login
* **All available channels inaccessible:** support intervention only
* Support-initiated disable notifies the user via available contact channels and is recorded in the audit log#195
**2-Step Verification (Global Settings)** > **4\. Functional Logic** > 4.10 Impact
~137 tok
### 4.10 Impact * Changes in Settings take effect immediately for subsequent logins * Disabling all 2FA removes the login OTP step on the next session * Adding a second method does not increase login friction (single OTP, dual delivery — see Agency Auth FRD) * Changing a verified phone while SMS 2FA is active preserves the 2FA-active state without requiring re-activation * With password-only confirmation (and no OTP), anyone with the user's password can modify 2FA settings; the password itself is the sole gate for Settings actions
#196
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations**
~10 tok
## **5\. Field Details & Validations**
#197
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Page Entry
~28 tok
### Page Entry No input fields required. The page loads directly from the user's existing authenticated session.
#198
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Verification Required – Email
~78 tok
### Verification Required – Email **Field Name** **Type** **Required** **Validation Rules** Email Address Display N/A Read-only display of registered email Status Badge Display N/A "Verified" / "Not Verified" Verify Email Button Conditional Visible only if Not Verified; hidden for Google users
#199
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Verification Required – Phone
~79 tok
### Verification Required – Phone **Field Name** **Type** **Required** **Validation Rules** Phone Number Display N/A Masked format (e.g., (\*\*\*) \*\*\*\*-6888) Status Badge Display N/A "Verified" / "Not Verified" Verify / Change Phone Number Button Yes "Verify" if not verified; "Change" if verified
#200
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Verify / Change Phone Modal
~95 tok
### Verify / Change Phone Modal **Field Name** **Type** **Required** **Validation Rules** Country Code Dropdown Yes Valid E.164 country code Phone Number Text Yes Numeric only, max 15 digits, format-valid, not on blocked list Save Button Yes Triggers password confirmation (regular users); updates user master on success Cancel Button Optional Discards changes
#201
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Enable 2FA Section – Email Row
~92 tok
### Enable 2FA Section – Email Row **Field Name** **Type** **Required** **Validation Rules** Method Label Display N/A "2FA with Email Address" + description Activated Badge Display Conditional Shown only when Email 2FA is active Enable / Disable Button Yes "Enable" disabled if email not verified; **hidden/disabled for Google users** (tooltip explains)
#202
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Enable 2FA Section – SMS Row
~77 tok
### Enable 2FA Section – SMS Row **Field Name** **Type** **Required** **Validation Rules** Method Label Display N/A "2FA with Phone Number" + description Activated Badge Display Conditional Shown only when SMS 2FA is active Enable / Disable Button Yes "Enable" disabled if phone not verified
#203
**2-Step Verification (Global Settings)** > **5\. Field Details & Validations** > Password Confirmation Modal (All Settings Actions — Regular Users Only)
~127 tok
### Password Confirmation Modal (All Settings Actions — Regular Users Only) **Field Name** **Type** **Required** **Validation Rules** Info Text Display Yes "Please enter your password to confirm this change." Password Password Yes Must match current password; 6–20 chars; no spaces Eye Icon Toggle Toggle Optional Show/hide password; default hidden Confirm Button Yes Validates password; on success, performs the action Cancel Button Optional Closes modal without performing the action
#204
**2-Step Verification (Global Settings)** > **6\. Error Message Handling**
~216 tok
## **6\. Error Message Handling** **Field** **Validation Scenario** **Error Message** Password Empty "Please enter your password." Password Incorrect "Incorrect password. Please try again." Password 5 wrong attempts "You have entered an incorrect password multiple times. Please try again after one hour." Phone Number Empty "Please enter your phone number." Phone Number Invalid format "Please enter a valid phone number." Phone Number Blocked/unsupported number "This phone number cannot be used for verification." Enable 2FA Method not verified "Please verify your \[email/phone\] before enabling 2FA." General Service unavailable "Something went wrong. Please try again." General Network timeout "Something went wrong. Please try again." General Concurrent state conflict "The settings have changed. Please refresh the page."
#205
**2-Step Verification (Global Settings)** > **7\. Edge Cases**
~475 tok
## **7\. Edge Cases** **Scenario** **Expected Behavior** User refreshes the page Page reloads using existing session; any in-flight modal is discarded User disables both methods then closes the browser 2FA is fully off; no first-login pop-up reappears at next login; warning banner shown when user returns to Settings User changes phone while SMS 2FA is active After password confirm, new phone saved and verified; SMS 2FA remains active on the new number (no re-enable required) User changes phone while SMS 2FA is NOT active After password confirm, new phone saved and verified; SMS 2FA status remains off User loses SMS access (only SMS active) Recovery via login-time verification (change phone) or support intervention User loses both email and SMS access Must contact support for manual intervention Google user signs out of Google mid-session Application session terminates; handled by core authentication layer User clicks Enable on Email while SMS already active Email 2FA activates independently; SMS remains active; both rows show "Activated" User clicks Disable on a method that is not currently active Button not shown; defensive server check returns: "Method is not currently active." Concurrent sessions (two tabs) Last successful action wins; the other tab displays stale state until refreshed User clicks Confirm in password modal with wrong password 5 times Account is locked out of 2FA actions for 1 hour; other app functionality unaffected User cancels the password modal No action is performed; Settings state unchanged User closes password modal mid-entry No action is performed; Settings state unchanged Support-initiated 2FA disable User notified via available contact channels; recorded in audit log User tries to verify a phone already verified on another account Allowed (same phone across accounts is permitted); rate limit still enforced
#206
**2-Step Verification (Global Settings)** > **8\. Acceptance Criteria**
~447 tok
## **8\. Acceptance Criteria** * **Accurate Status Display:** Settings page shows correct "Verified / Not Verified / Activated" statuses at all times; both 2FA rows can show "Activated" simultaneously * **Per-Action Password:** Every state-changing action (Verify Email, Verify/Change Phone, Enable 2FA, Disable 2FA) requires a password confirmation for regular users; no OTP is involved * **Google Users – No Prompt:** Google users execute all actions without a password prompt (rely on Google OAuth session) * **Verification Before Activation:** Email verification is required before Email 2FA can be enabled; phone verification required before SMS 2FA * **Google Restriction:** Google users do not see or cannot activate the Email 2FA Enable option * **Independent Methods:** Email and SMS 2FA can be enabled and disabled independently; either or both can be active * **Phone Change Auto-Activation:** If SMS 2FA was active on the old phone, it remains active on the new phone immediately after change (no re-enable) * **Post-Disable Behavior:** If 2FA remains on (other method active), no warning/banner; if fully off, warning banner appears in Settings * **Phone Storage Separation:** Phone changes save to the user master as personal mobile, not agency contact * **Support Recovery:** Support recovery path is available when all available channels are unreachable * **Audit Logging:** All state changes (including password challenge results) are recorded in the audit log * **Password Lockout:** 5 wrong password attempts trigger a 1-hour lockout on 2FA actions; auto-unlock after exactly 1 hour * **Rate Limiting:** SMS rate limiting per phone number across all accounts remains enforced for any future SMS-based actions (e.g., support-triggered notices)
#207
**2-Step Verification (Global Settings)** > **9\. Dependencies**
~247 tok
## **9\. Dependencies** **Module/System** **Dependency Type** **Impact if Unavailable** User Authentication System Internal Dependency Cannot validate passwords or session state; page inaccessible or actions fail Google OAuth Service External Integration Google users cannot maintain an authenticated session to reach or use the page User Master Database Data Dependency Cannot read/write 2FA state, verification status, or phone number Agency Master Database Data Dependency Cannot suggest agency phone numbers for pre-fill Session Management Internal Dependency Application-level session handling Audit Log Service Internal Dependency Changes not recorded; compliance impacted Rate Limiting Service Internal Dependency Cannot enforce password-attempt lockouts Phone Number Validation Service External Integration Cannot validate numbers or check blocked list Support/Admin Tooling Internal Dependency Cannot perform manual 2FA reset for lost-access users
#208
**2-Step Verification (Global Settings)** > **10\. References**
~95 tok
## **10\. References** * **Figma Designs:** [2-Step Verification Settings](https://www.figma.com/design/ej0kxwP45mDKmZCZfAJ5O8/Pixally?node-id=29490-143171&t=hlJPZKI33RrWvjz0-0) * **Related FRD:** Agency Auth – Two-Factor Authentication (2FA) Setup (first-login setup, login verification with dual-channel delivery, login-time contact verification) 6\. Data Management Module
#209
**FRD #6: Data Management Module**
~29 tok
# **FRD #6: Data Management Module** **Module Name:** Data Management **Version:** 2.1 **Date:** April 30, 2026
#210
**FRD #6: Data Management Module** > **1\. Module Overview**
~268 tok
## **1\. Module Overview** **Module Name:** Data Management **Purpose:** The Data Management module provides centralized configuration for system-wide dropdown options, custom fields, tags, and data structures that ensure consistency across all projects and modules. **Business Goals:** * Enable customization of data collection fields without code changes * Maintain data integrity through controlled dropdown management * Provide flexible tagging and categorization capabilities with parent-child hierarchy support * Ensure consistent data structures across all system modules * Support tag management at project, event, and task levels with proper inheritance rules **Page Structure:** * **Data Management** page contains two tabs: "Company Data" and "Custom Fields" * **Company Data tab** displays Lead Sources, Tags, Service Area, and Events sections * **Custom Fields tab** displays the custom fields list with creation capability * **Tag Management** is accessed via the "Edit" button on the Tags row, opening a sub-page with back navigation
#211
**FRD #6: Data Management Module** > **2\. User Roles & Permissions**
~109 tok
## **2\. User Roles & Permissions** **Role** **View Access** **Edit Access** **Special Permissions** Agency Owner Full access All settings Can delete any data element Admin Full access All settings Can delete any data element Project Manager View only None Read-only access Editor View only None Read-only access Supervising Editor View only None Read-only access Contractor No access None Section not visible
#212
**FRD #6: Data Management Module** > **3\. User Flow**
~5 tok
## **3\. User Flow**
#213
**FRD #6: Data Management Module** > **3\. User Flow** > Data Management Page Access
~100 tok
### Data Management Page Access 3.1 The user navigates to Settings and clicks on Data Management. 3.2 The system displays the Data Management page with the heading "Data Management" and subtitle "Easily organize and customize project, contact, and lead information with flexible fields, tags, and sources." 3.3 The system displays two tabs: "Company Data" (selected by default) and "Custom Fields".
#214
**FRD #6: Data Management Module** > **3\. User Flow** > Company Data Tab Display
~154 tok
### Company Data Tab Display 3.4 The Company Data tab displays four sections in a list format: * **Lead Sources** — Shows example text (e.g., "Instagram, Referral, Google Ads"), count badge (e.g., "15 Sources"), and "Edit" button * **Tags** — Shows description "Organize and categorize items with tags", count badge (e.g., "27 Tags" or "0 Tags"), and "Edit" button * **Service Area** — Shows "These are managed under the brand settings", count badge (e.g., "33 Areas"), and "View" button * **Events** — Shows "These are managed under the brand settings", count badge (e.g., "22 Events"), and "Edit" button
#215
**FRD #6: Data Management Module** > **3\. User Flow** > Lead Source Management Flow
~487 tok
### Lead Source Management Flow 3.5 The user clicks the "Edit" button on the Lead Sources row. 3.6 The system opens the Lead Source management sub-page with back arrow navigation. 3.7 The user views the Lead Sources section showing current source options including system-locked defaults. 3.8 The user clicks the "Add" button to create a new lead source. 3.9 The system opens an input field for entering the source name. 3.10 The user enters a unique lead source name up to 100 characters. 3.11 The system validates uniqueness in real-time as the user types. 3.12 The user clicks Save to add the new lead source. 3.13 The system adds the source to the list and makes it available system-wide. 3.14 The user clicks the Delete icon next to a lead source to remove it. 3.15 The system checks if the lead source is attached to any projects. 3.16 If the lead source is NOT attached to any projects, the system displays a confirmation dialog titled "Delete Lead Source" with the message "Are you sure you want to delete this lead source? This action cannot be undone." and "Cancel" / "Delete" buttons. 3.17 If the lead source IS attached to one or more projects, the system displays a warning dialog titled "Delete Lead Source" with a warning icon and the message "This lead source is attached to one or more projects. Deleting it will remove the lead source from all associated projects, and the lead source field will become blank in those projects. This action cannot be undone." with "Cancel" / "Delete Anyway" buttons. 3.18 The user clicks "Delete" or "Delete Anyway" to confirm deletion, or "Cancel" to abort. 3.19 Upon confirmation, the system deletes the lead source and removes it from all associated projects, leaving the lead source field blank in those projects. 3.20 The system displays a success message confirming the deletion. 3.21 The user clicks the back arrow (←) to return to the Data Management > Company Data tab.
#216
**FRD #6: Data Management Module** > **3\. User Flow** > Tag Management Flow
~510 tok
### Tag Management Flow 3.22 The user clicks the "Edit" button on the Tags row in the Company Data tab. 3.23 The system opens the Tag Management sub-page with: * Back arrow (←) for navigation * Title: "Tag Management" * Subtitle: "Tags help you identify where your leads originate" * Input field with placeholder "Type to add a new tag" * "Add New" button * List of existing tags (or empty state if no tags exist) 3.24 If no tags exist, the system displays the empty state message: "No tags yet. Add your first one above." 3.25 The user creates a new tag by entering a name in the input field and clicking the "Add New" button. 3.26 The system validates the tag name for uniqueness and adds the tag to the agency-level Tag Management repository. 3.27 The system makes the newly created tag available across all projects, events, and tasks within the agency. 3.28 The user clicks the Delete icon next to a tag to remove it. 3.29 The system checks if the tag is attached to any projects, events, or tasks. 3.30 If the tag is NOT attached to anything, the system displays a confirmation dialog titled "Delete Tag" with the message "Are you sure you want to delete this tag? This action cannot be undone." and "Cancel" / "Delete" buttons. 3.31 If the tag IS attached to one or more projects, events, or tasks, the system displays a warning dialog titled "Delete Tag" with a warning icon and the message "This tag is attached to one or more projects, events, or tasks. Deleting it will remove the tag from all associated items. Other tags on those items will remain unaffected. This action cannot be undone." with "Cancel" / "Delete Anyway" buttons. 3.32 The user clicks "Delete" or "Delete Anyway" to confirm deletion, or "Cancel" to abort. 3.33 Upon confirmation, the system deletes the tag and removes it from all associated projects, events, and tasks. 3.34 The system displays a success message confirming the deletion. 3.35 The user clicks the back arrow (←) to return to the Data Management > Company Data tab.
#217
**FRD #6: Data Management Module** > **3\. User Flow** > Custom Fields Tab Flow
~582 tok
### Custom Fields Tab Flow 3.36 The user clicks the "Custom Fields" tab. 3.37 The system displays the Custom Fields tab with: * Helper text: "These fields will show up in your project details" * List of existing custom fields (or empty state if no custom fields exist) 3.38 If no custom fields exist, the system displays the empty state: * Icon graphic with avatars * Title: "No Custom Fields Yet" * Message: "Create custom fields to track the information that matters most to you." * Button: "+ Add Custom Field" 3.39 The user clicks "+ Add Custom Field" button (or "+ New Custom Field" if fields already exist). 3.40 The system opens the custom field configuration modal. 3.41 The user enters the field name and selects the field type from the dropdown. 3.42 The system shows configuration options based on selected field type. 3.43 The user sets visibility options by checking Client or Contractor boxes. 3.44 The system ensures Agency checkbox remains checked and disabled. 3.45 The user assigns the field to specific event-service combinations. 3.46 The system validates that all required field properties are configured. 3.47 The user clicks Save to create the custom field. 3.48 The system applies the field to all matching projects immediately. 3.49 The user clicks the Delete icon next to a custom field to remove it. 3.50 The system checks if the custom field is attached to any projects. 3.51 If the custom field is NOT attached to any projects, the system displays a confirmation dialog titled "Delete Custom Field" with the message "Are you sure you want to delete this custom field? This action cannot be undone." and "Cancel" / "Delete" buttons. 3.52 If the custom field IS attached to one or more projects, the system displays a warning dialog titled "Delete Custom Field" with a warning icon and the message "This custom field is attached to one or more projects. Deleting it will remove the field and its data from all associated projects. This action cannot be undone." with "Cancel" / "Delete Anyway" buttons. 3.53 The user clicks "Delete" or "Delete Anyway" to confirm deletion, or "Cancel" to abort. 3.54 Upon confirmation, the system deletes the custom field and removes it from all associated projects. 3.55 The system displays a success message confirming the deletion.
#218
**FRD #6: Data Management Module** > **3\. User Flow** > Tag Application Flow (Projects, Events, Tasks)
~434 tok
### Tag Application Flow (Projects, Events, Tasks) 3.56 The user navigates to a Project and opens the Overview tab to view and manage project-level tags. 3.57 The user clicks on the Tags field in the Project Overview and selects or creates a tag. 3.58 The system automatically applies the selected tag to all events within that project following the parent-child inheritance rule. 3.59 The user navigates to an individual Event within the project to manage event-specific tags. 3.60 The user adds a tag directly to the event from the Event Details view. 3.61 The system applies the tag only to that specific event and makes it visible in the project-level Overview tab under that event's tag list. 3.62 The user removes a tag from an individual event by clicking the remove icon next to the tag. 3.63 The system removes the tag only from that specific event without affecting other events or the project-level tag visibility. 3.64 The user removes a tag from the project-level Overview tab. 3.65 The system removes the tag from the project and cascades the removal to all events under that project. 3.66 The user navigates to the Tasks module and creates a new task. 3.67 The user adds tags to the task by selecting from existing tags or typing a new tag name in the Tags field. 3.68 The system displays the tags in the task form but does not create new tags in the repository until the task is saved. 3.69 The user clicks the Create or Save button to save the task. 3.70 The system creates any new tags in the agency-level Tag Management repository and associates all selected tags with the task. 3.71 The user returns to Tag Management Settings to view all tags including those created from projects, events, and tasks.
#219
**FRD #6: Data Management Module** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#220
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.1 Page Structure
~154 tok
### 4.1 Page Structure • The Data Management page contains two tabs: "Company Data" and "Custom Fields". • The "Company Data" tab is selected by default when navigating to Data Management. • The Company Data tab displays four sections: Lead Sources, Tags, Service Area, and Events. • Each section row shows a description/example, count badge, and action button (Edit or View). • The Custom Fields tab displays the list of custom fields or the empty state if no fields exist. • Sub-pages (Lead Source Management, Tag Management) include a back arrow (←) that returns to the Data Management > Company Data tab.
#221
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.2 Empty States
~288 tok
### 4.2 Empty States **Tags Empty State (Tag Management Sub-page):** • When no tags exist in the agency, the system displays an empty state below the input field. • Empty state message: "No tags yet. Add your first one above." • The input field and "Add New" button remain visible above the empty state message. • Once a tag is added, the empty state disappears and the tag list appears. **Custom Fields Empty State (Custom Fields Tab):** • When no custom fields exist, the system displays a centered empty state UI. • The empty state includes: * Icon graphic with decorative avatars * Title: "No Custom Fields Yet" * Message: "Create custom fields to track the information that matters most to you." * Button: "+ Add Custom Field" (yellow/primary button) • Once a custom field is created, the empty state is replaced by the custom fields list. • The helper text "These fields will show up in your project details" remains visible above the content area. **Lead Sources:** • Lead Sources always contain system-locked defaults (e.g., Client Referral, Other) and never display an empty state. • System-locked lead sources cannot be deleted.
#222
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.3 Count Display
~85 tok
### 4.3 Count Display • Each section in the Company Data tab displays a count badge showing the number of items. • Count format examples: * Lead Sources: "15 Sources" * Tags: "27 Tags" or "0 Tags" (when empty) * Service Area: "33 Areas" * Events: "22 Events" • The Tags count updates immediately when tags are added or deleted.
#223
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.4 Lead Source Management
~784 tok
### 4.4 Lead Source Management **Lead Sources:** • Lead sources define the origins of business leads and are essential for marketing analytics and ROI tracking. • The system provides default lead sources including Google, Facebook, Instagram, Referral, Website, Email, Phone Call, Walk-in, and Other. • Users can add unlimited custom lead sources to match their specific marketing channels and business needs. **Adding Lead Source:** • To add a new lead source, the user types the name in the input field and clicks the "Add" button. • The "Add" button remains disabled until the user types at least one character in the input field. • Each lead source name must be unique within the system and can contain up to 100 characters. • If the user tries to add a lead source with a name that already exists, the system displays a validation message: "Lead source already exists." **Editing Lead Source:** • Each lead source has an "Edit" action available. • When the user clicks "Edit," the lead source name becomes an editable text field with "Save" and "Cancel" options. • Clicking "Save" updates the lead source name; clicking "Cancel" discards changes and reverts to view mode. • Changes to lead source names update the display but maintain the underlying ID for data consistency. • The system validates uniqueness in real-time to prevent duplicate entries. **"Other" Lead Source Option:** • "Other" is a default lead source option that allows users to enter custom values during project creation or editing. • When a user selects "Other" as the lead source in the project lead source dropdown, a text field appears allowing them to enter a custom value. • The custom value entered is stored at the project level only and is displayed as the lead source for that specific project. • The custom value entered for "Other" is NOT added to the Lead Sources list in Data Management. • Each "Other" entry remains project-specific and does not create a new reusable lead source option in the master list. • When viewing the project, the system displays the custom value only (not "Other" or "Other - \[value\]"). • For reporting purposes, custom values entered under "Other" are displayed separately, allowing for granular analytics while keeping the master Lead Sources list clean and controlled. • Users who want a custom lead source to be reusable across multiple projects must add it to the Lead Sources list in Data Management. **Deleting Lead Source:** • Users can delete any lead source from the system by clicking the Delete icon. • The system checks whether the lead source is currently attached to any projects before displaying the appropriate confirmation message. **When Lead Source is NOT Attached to Any Projects:** • The system displays a confirmation dialog with the following content: * Title: "Delete Lead Source" * Message: "Are you sure you want to delete this lead source? This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete" (primary) • Clicking "Delete" removes the lead source from the system immediately. • Clicking "Cancel" closes the dialog with no changes made.
#224
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.4 Lead Source Management
~293 tok
**When Lead Source IS Attached to One or More Projects:** • The system displays a warning dialog with the following content: * Title: "Delete Lead Source" * Message: "This lead source is attached to one or more projects. Deleting it will remove the lead source from all associated projects, and the lead source field will become blank in those projects. This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete Anyway" (primary/destructive) • Clicking "Delete Anyway" removes the lead source from the system and sets the lead source field to blank in all affected projects. • Clicking "Cancel" closes the dialog with no changes made. • Deletion is permanent and cannot be undone. • Note: The "Other" lead source option cannot be deleted as it is a system default. **General Behavior:** • The lead source list appears in dropdown menus throughout the system for consistent selection. • When a lead source is deleted, all projects that had that lead source assigned will have their lead source field become blank/empty. • Custom values entered via "Other" are preserved at the project level even if other lead sources are modified or deleted.
#225
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.5 Custom Field Creation
~402 tok
### 4.5 Custom Field Creation • Custom fields act as a mini form builder allowing agencies to display additional project or event-specific information to clients or contractors. • The system supports multiple field types including Short Text, Long Text, Single Select, Multi-select, Number field, Datepicker, and Link. • Custom field names must be unique within the same field type. Two fields can have the same name if they are different field types (e.g., "Notes" as Short Text and "Notes" as Long Text are allowed, but two Short Text fields named "Notes" are not allowed). • If a user attempts to create a custom field with a name that already exists for the selected field type, the system displays an inline error message: "A field with this name already exists for the selected field type. Change the field type or the field name to continue." • Field types determine the display format and data presentation when showing information to clients or contractors. • Each custom field can be configured as either optional or mandatory, and this setting applies universally across all projects within the agency. • Dropdown fields require defining the available options that can be displayed. • Number fields support decimal values and allow negative numbers. No minimum or maximum value restrictions are enforced. • Date fields allow display of past, present, and future dates with no restrictions on date ranges. • Short Text fields have a maximum character limit of 100 characters. Long Text fields have a maximum character limit of 5,000 characters. All character types are permitted for both.
#226
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.5.1 Custom Field Value Entry
~151 tok
### 4.5.1 Custom Field Value Entry • Custom field values can only be entered and edited by agency-side users. Clients and contractors cannot enter or modify custom field values. • The following roles can enter/edit custom field values: * Agency Owner: Can enter/edit values for all projects * Admin: Can enter/edit values for all projects * Project Manager: Can enter/edit values only for projects they are assigned to • Custom field values are entered from the Project Details page within each project. • Editors, Supervising Editors, and Contractors cannot enter or edit custom field values.
#227
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.5.2 Custom Field Display for Clients and Contractors
~155 tok
### 4.5.2 Custom Field Display for Clients and Contractors • Custom fields appear as read-only in both the Client Portal and Contractor Portal. • Clients and contractors can view custom field values but cannot edit them. • If a custom field has no value entered by the agency, the field displays the field label with a blank/empty value (no placeholder text). • Example: A field labeled "Wedding Theme" with no value entered displays as "Wedding Theme: " (blank after the colon). • The visibility of each custom field to clients and contractors is controlled by the visibility checkboxes during field configuration.
#228
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.6 Custom Field Visibility Controls
~173 tok
### 4.6 Custom Field Visibility Controls • Visibility settings determine who can view the custom field values across the system. • The Agency checkbox is always selected and cannot be disabled, ensuring internal visibility. • The Client checkbox controls whether the field appears in client-facing portals. • The Contractor checkbox determines if contractors can view the field in their project assignments. • Visibility settings apply immediately to all existing and future instances of the field. • Hidden fields still collect and store data but are not displayed to restricted user types. • Changes to visibility do not delete existing data but only affect its display permissions.
#229
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.7 Custom Field Assignment
~177 tok
### 4.7 Custom Field Assignment • Custom fields can be assigned to specific combinations of event types and service categories. • This granular assignment ensures relevant fields appear only where they make business sense. • A wedding photography project might have different custom fields than a corporate headshot session. • Fields automatically appear on projects matching the assigned event-service combinations. • The system applies fields to existing projects immediately upon configuration. • Removing field assignments hides the field from future projects but preserves existing data. • Multiple fields can be assigned to the same event-service combination for comprehensive data collection.
#230
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.8 Custom Field Deletion
~338 tok
### 4.8 Custom Field Deletion • Users can delete any custom field from the system by clicking the Delete icon. • The system checks whether the custom field is currently attached to any projects before displaying the appropriate confirmation message. **When Custom Field is NOT Attached to Any Projects:** • The system displays a confirmation dialog with the following content: * Title: "Delete Custom Field" * Message: "Are you sure you want to delete this custom field? This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete" (primary) • Clicking "Delete" removes the custom field from the system immediately. • Clicking "Cancel" closes the dialog with no changes made. **When Custom Field IS Attached to One or More Projects:** • The system displays a warning dialog with the following content: * Title: "Delete Custom Field" * Message: "This custom field is attached to one or more projects. Deleting it will remove the field and its data from all associated projects. This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete Anyway" (primary/destructive) • Clicking "Delete Anyway" removes the custom field from the system and removes the field and its data from all affected projects. • Clicking "Cancel" closes the dialog with no changes made. • Deletion is permanent and cannot be undone.
#231
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.9 Event Types and Service Areas
~131 tok
### 4.9 Event Types and Service Areas • Event types and service areas are read-only in Data Management and redirect to Brand Management for editing. • This separation ensures brand-specific configurations remain isolated from global data settings. • The read-only display shows current options for reference when configuring custom fields. • Users must navigate to Brand Management to add, edit, or delete event types and service areas. • This architectural decision prevents accidental cross-brand data modifications.
#232
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.10 Tag Management
~782 tok
### 4.10 Tag Management **Agency-Level Tag Repository:** • Tags are managed at the agency level under Settings → Data Management → Tags (Edit) and are not brand-specific. • When a new tag is created from any location including project overview, event details, or task creation, the tag is automatically added to the agency-level Tag Management repository. • Tags can only be permanently deleted from the Tag Management sub-page; they cannot be deleted from Projects, Events, or Tasks (only removed/unassigned). • Tags support special characters, numbers, and spaces, allowing natural language labels such as "VIP Client" or "Rush Order - 2024". • The system maintains a central tag repository to ensure consistency and enable filtering across all modules. • Tag names must be unique within the agency, and the system validates uniqueness in real-time during tag creation. • Tags have a maximum character limit of 50 characters. **Deleting Tags:** • Users with the Owner or Admin role can permanently delete a tag from the Tag Management sub-page. • The system checks whether the tag is currently attached to any projects, events, or tasks before displaying the appropriate confirmation message. **When Tag is NOT Attached to Anything:** • The system displays a confirmation dialog with the following content: * Title: "Delete Tag" * Message: "Are you sure you want to delete this tag? This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete" (primary) • Clicking "Delete" removes the tag from the system immediately. • Clicking "Cancel" closes the dialog with no changes made. **When Tag IS Attached to One or More Projects, Events, or Tasks:** • The system displays a warning dialog with the following content: * Title: "Delete Tag" * Message: "This tag is attached to one or more projects, events, or tasks. Deleting it will remove the tag from all associated items. Other tags on those items will remain unaffected. This action cannot be undone." * Buttons: "Cancel" (secondary) | "Delete Anyway" (primary/destructive) • Clicking "Delete Anyway" removes the tag from the system and removes it from all associated projects, events, and tasks. Other tags on those items remain unaffected. • Clicking "Cancel" closes the dialog with no changes made. • Deletion is permanent and cannot be undone. **Parent-Child Hierarchy (Project → Events):** • Tags managed at the project level through the Overview tab are treated as the master set for that project. • When a tag is added at the project level, the system automatically applies that tag to all events under the project. • When a tag is removed from the project level, the system cascades the removal to all events under that project. • This parent-child inheritance ensures consistent tagging across the entire project scope without requiring manual updates to each event. • The cascade operation happens immediately and does not require page refresh for changes to take effect. **Event-Level Tag Isolation:** • Event-level tag changes are isolated and do not cascade sideways to other events or upward to the project level.
#233
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.10 Tag Management
~786 tok
• If a tag exists in the project and is applied to multiple events, removing that tag from one specific event does not remove it from other events within the same project. • Removing a tag at the event level does not remove it from the project-level tag list or affect its visibility in the project Overview tab. • If a new tag is created inside an event, the tag becomes visible in the project Overview tab under that specific event's tag list. • If an event-created tag is later removed from that event, the tag remains visible in the project-level view because event-level removal does not delete the tag from project-level visibility. • This isolation ensures that event-specific tagging decisions do not unintentionally impact other events or the overall project taxonomy. **Project Overview Tag Selection and Promotion:** • Tags that are visible in the project Overview tab include both project-level tags and tags that were originally created via individual events. • When a user selects a tag from the project Overview tab, the system applies that tag across all events in the project regardless of where the tag was originally created. • This functionality allows users to promote event-specific tags to project-wide tags through the Overview interface without navigating to each event individually. • The tag promotion is immediate and applies to all current events under the project. **Single-Event Projects:** • Projects with only one event follow the same parent-child rules as multi-event projects. • No special logic or exceptions exist for single-event projects. • Adding a tag at the project level applies it to the single event, and adding a tag at the event level makes it visible in the project Overview. • This consistency ensures predictable behavior regardless of project structure. **Task Module Tag Creation Rules:** • In the Tasks module, tags are created in the agency-level Tag Management repository only when the task is saved. • This rule applies to both the Create Task operation and the Edit Task operation. • Until the user clicks Save or Create to save the task, any new tags entered in the tag field exist only in the form and are not created in the system. • Once the task is saved, the system simultaneously creates any new tags in the Tag Management repository and associates all selected tags with the task. • If the user closes the task form without saving, any new tags that were typed but not saved are discarded and not created in the system. • Users can select from existing tags in the repository or type new tag names during task creation and editing. • This save-dependent creation prevents orphan tags from being created when users abandon task creation. **Tag Application Scope Summary:** • Tags added from the Project Overview tab apply to the entire project and cascade to all events within that project. • Tags added from an individual Event Details view apply only to that specific event and become visible in the project Overview without affecting other events. • Tags added to Tasks are associated only with that specific task and do not affect project or event tags.
#234
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.10 Tag Management
~81 tok
• All tag changes propagate immediately across the platform through WebSocket connections without requiring page refreshes. • Tags created from any location (Data Management, project, event, or task) are stored centrally in the agency-level Tag Management repository and become available for selection across all modules.
#235
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.11 Data Validation and Integrity
~137 tok
### 4.11 Data Validation and Integrity • All data modifications undergo validation before saving to prevent corruption or conflicts. • The system prevents creation of duplicate entries through real-time validation. • Unique name constraints are enforced at the database level for absolute consistency. • Changes are logged with timestamps and user information for audit compliance. • The system performs referential integrity checks before allowing deletions. • Bulk operations are wrapped in transactions to ensure all-or-nothing execution.
#236
**FRD #6: Data Management Module** > **4\. Functional Logic** > 4.12 Real-time Propagation
~125 tok
### 4.12 Real-time Propagation • All data management changes propagate immediately across active user sessions. • The system uses WebSocket connections to push updates to connected clients. • Dropdown lists refresh automatically when new options are added or removed. • Custom field changes apply instantly without requiring page refreshes. • Cache invalidation ensures all users see the most current configuration. • Background jobs handle updating large datasets when structural changes occur.
#237
**FRD #6: Data Management Module** > **5\. Field Details & Validations**
~264 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Validation Rules** **Required** Lead Source Name Text Input Max 100 chars, unique Yes Lead Source "Other" Custom Value Text Input Max 100 chars, stored at project level only, not added to Data Management list No Custom Field Name Text Input Max 100 chars, unique within same field type Yes Custom Field Type Dropdown Valid type selection Yes Field Options Text List Required for dropdowns Conditional Agency Visibility Checkbox Always checked, disabled Yes Client Visibility Checkbox Boolean true/false No Contractor Visibility Checkbox Boolean true/false No Event Assignment Multi-select Valid event types Yes Service Assignment Multi-select Valid service types Yes Tag Name Text Input Max 50 chars, unique within agency Yes Tag Assignment Level System-Determined Project-level, Event-level, or Task-level based on creation context Yes Field Required Checkbox Boolean true/false No Default Value Varies Based on field type No
#238
**FRD #6: Data Management Module** > **6\. Success Message Handling**
~443 tok
## **6\. Success Message Handling** **Operation** **Success Message** **Post-Success Action** **Duration** Add Lead Source "Lead source added successfully" Refresh dropdown lists 3 seconds Edit Lead Source "Lead source updated successfully" Update all dropdowns 3 seconds Delete Lead Source (not attached) "Lead source deleted successfully" Remove from list 3 seconds Delete Lead Source (attached) "Lead source deleted successfully. It has been removed from all associated projects." Remove from list, clear field in affected projects 3 seconds Create Custom Field "Custom field created successfully" Apply to projects 3 seconds Update Custom Field "Custom field updated successfully" Refresh field instances 3 seconds Delete Custom Field (not attached) "Custom field deleted successfully" Remove from list 3 seconds Delete Custom Field (attached) "Custom field deleted successfully. It has been removed from all associated projects." Remove from list and all project instances 3 seconds Create Tag "Tag created successfully" Add to tag list 3 seconds Delete Tag (not attached) "Tag deleted successfully" Remove from list 3 seconds Delete Tag (attached) "Tag deleted successfully. It has been removed from all associated projects, events, and tasks." Remove from list and all associations 3 seconds Tag Added to Project "Tag added successfully" Cascade to all events 3 seconds Tag Removed from Project "Tag removed successfully" Cascade removal 3 seconds Tag Added to Event "Tag added successfully " Update event and project view 3 seconds Tag Removed from Event "Tag removed successfully" Update event only 3 seconds Task Saved with New Tags "Task saved successfully" Create tags and save task 3 seconds
#239
**FRD #6: Data Management Module** > **7\. Error Message Handling**
~410 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **User Action Required** Duplicate Lead Source "A lead source with this name already exists" Choose unique name Duplicate Field Name "A field with this name already exists for the selected field type. Change the field type or the field name to continue." Change field type or choose unique name Invalid Field Type "Please select a valid field type" Select from dropdown No Options Provided "Dropdown fields require at least one option" Add options Tag Too Long "Tag name cannot exceed 50 characters" Shorten tag Duplicate Tag Name "A tag with this name already exists" Use the existing tag or choose a different name Tag Cascade Failure "Unable to apply tag changes to all events. Please try again." Retry operation Tag Creation Pending "Tags will be created when the task is saved." Save the task to create tags Tag Removal Cascade Failure "Unable to remove tag from all events. Please try again." Retry operation Lead Source Deletion Failed "Unable to delete lead source. Please try again." Retry operation Custom Field Deletion Failed "Unable to delete custom field. Please try again." Retry operation Tag Deletion Failed "Unable to delete tag. Please try again." Retry operation Cannot Delete "Other" "The 'Other' lead source is a system default and cannot be deleted." N/A Permission Denied "You don't have permission to modify data settings" Contact admin Network Error "Unable to save changes. Please try again" Retry operation Validation Failed "Please correct the errors before saving" Fix highlighted fields
#240
**FRD #6: Data Management Module** > **8\. Edge Cases**
~797 tok
## **8\. Edge Cases** **Scenario** **System Behavior** **Mitigation** Circular field dependencies Validation prevents creation Check dependencies Mass deletion attempt Confirmation required for each item Batch validation Special characters in names Some may cause issues Sanitize input Field type change after data exists Blocked to prevent data loss Create new field Dropdown with 100+ options Performance impact Implement search Simultaneous field creation Possible duplicates Real-time validation Import/export conflicts Data mapping issues Validation on import Cache synchronization Stale data possible Force refresh option Lead source deleted while user is editing a project Project saves with blank lead source Real-time sync notification Custom field deleted while user is editing a project Field disappears from project form Real-time sync via WebSocket Tag deleted while user is viewing project with that tag Tag disappears from project view Real-time sync via WebSocket Tag removed from one event while project-level tag exists Tag is removed only from that specific event; other events and project-level retain the tag Parent-child isolation rule Tag created in event then deleted from that event Tag remains visible in project Overview tab; event removal does not delete from project visibility Visibility preservation rule Task form closed without saving after adding new tags New tags are not created in the system; only saved tasks create tags Save-dependent creation rule Same tag selected at both project and event level Single tag instance maintained; no duplicate associations created Uniqueness validation at assignment Project-level tag removal with large number of events (50+) System cascades removal to all events using background processing Batch processing with progress indicator Tag renamed in Tag Management Settings Updated name reflects immediately across all associated projects, events, and tasks Referential integrity maintained via tag ID User adds tag to project while another user adds same tag to event System prevents duplicate; first save wins and second user sees existing tag Real-time uniqueness validation Network failure during tag cascade operation System rolls back partial changes and displays error Transaction-based operations with retry option User cancels deletion after viewing warning No changes made; dialog closes Cancel button available Multiple users attempt to delete same lead source/tag/custom field First deletion succeeds; second user sees "not found" error Real-time sync User selects "Other" and enters custom value matching existing lead source Custom value is stored at project level only; does not affect Data Management list Project-level isolation User attempts to delete "Other" lead source System prevents deletion with error message "Other" is protected as system default Multiple projects use "Other" with same custom value Each project stores its own instance; no consolidation occurs Project-level storage Report generated with multiple "Other" custom values Each custom value displayed separately in reports Granular analytics support
#241
**FRD #6: Data Management Module** > **8\. Edge Cases**
~261 tok
Tags empty state displayed "No tags yet. Add your first one above." message shown Input field remains visible above message Custom fields empty state displayed "No Custom Fields Yet" with button displayed "+ Add Custom Field" button available Tags count shows 0 "0 Tags" displayed in Company Data tab Clicking Edit opens Tag Management sub-page with empty state Same custom field name with different field types System allows creation; both fields exist independently Names are unique per field type, not globally Same custom field name with same field type System blocks creation; displays inline error message User must change name or field type Custom field with no value viewed by client Field displays with label and blank value No placeholder shown Project Manager tries to edit custom field on unassigned project Edit action blocked or field not editable Permission restricted to assigned projects Client attempts to edit custom field value Field is read-only; no edit option available Read-only display enforced
#242
**FRD #6: Data Management Module** > **9\. Acceptance Criteria**
~8 tok
## **9\. Acceptance Criteria**
#243
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.1 Page Structure
~113 tok
### 9.1 Page Structure • Data Management page displays with two tabs: "Company Data" and "Custom Fields". • Company Data tab is selected by default. • Company Data tab shows Lead Sources, Tags, Service Area, and Events sections with count badges and action buttons. • Custom Fields tab shows the list of custom fields or empty state. • Sub-pages (Lead Source Management, Tag Management) include back arrow navigation returning to Company Data tab.
#244
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.2 Empty States
~125 tok
### 9.2 Empty States • When no tags exist, Tag Management sub-page displays: "No tags yet. Add your first one above." • The tag input field and "Add New" button remain visible above the empty state message. • When no custom fields exist, Custom Fields tab displays: * Title: "No Custom Fields Yet" * Message: "Create custom fields to track the information that matters most to you." * Button: "+ Add Custom Field" • Lead Sources never display an empty state as system defaults always exist.
#245
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.3 Lead Source Management
~170 tok
### 9.3 Lead Source Management • Users can add, edit, and delete lead sources. • Uniqueness is enforced for lead source names. • When deleting a lead source not attached to any projects, a confirmation dialog is displayed with title "Delete Lead Source" and "Cancel" / "Delete" buttons. • When deleting a lead source attached to projects, a warning dialog is displayed with title "Delete Lead Source" explaining the impact, with "Cancel" / "Delete Anyway" buttons. • Upon deletion of an attached lead source, the lead source field becomes blank in all affected projects. • The "Other" lead source option cannot be deleted. • Changes reflect immediately across the platform.
#246
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.4 Lead Source "Other" Option
~141 tok
### 9.4 Lead Source "Other" Option • When "Other" is selected as the lead source during project creation/editing, a text field appears for custom value entry. • Custom values entered for "Other" are stored at the project level only. • Custom values entered for "Other" do NOT appear in the Lead Sources list in Data Management. • The project displays the custom value only (not "Other" or "Other - \[value\]"). • Reports display "Other" custom values separately for granular analytics. • Users who want reusable lead sources must add them to Data Management.
#247
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.5 Custom Field Configuration
~137 tok
### 9.5 Custom Field Configuration • All field types work correctly. • Custom field names must be unique within the same field type. • Duplicate names are allowed across different field types. • When a duplicate name is entered for the same field type, an inline error message displays: "A field with this name already exists for the selected field type. Change the field type or the field name to continue." • Visibility controls function properly. • Assignment to event-service combinations works. • Fields appear on appropriate projects.
#248
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.5.1 Custom Field Value Entry
~76 tok
### 9.5.1 Custom Field Value Entry • Custom field values can only be entered by Agency Owner, Admin, and Project Manager (on assigned projects). • Custom field values are entered from the Project Details page. • Editors, Supervising Editors, and Contractors cannot enter or edit custom field values.
#249
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.5.2 Custom Field Display
~71 tok
### 9.5.2 Custom Field Display • Custom fields appear as read-only in both Client Portal and Contractor Portal. • Clients and contractors can view but cannot edit custom field values. • If no value is entered, the field displays the field label with a blank value (no placeholder).
#250
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.6 Custom Field Deletion
~132 tok
### 9.6 Custom Field Deletion • When deleting a custom field not attached to any projects, a confirmation dialog is displayed with title "Delete Custom Field" and "Cancel" / "Delete" buttons. • When deleting a custom field attached to projects, a warning dialog is displayed with title "Delete Custom Field" explaining the impact, with "Cancel" / "Delete Anyway" buttons. • Upon deletion of an attached custom field, the field and its data are removed from all affected projects. • Deletion is permanent and cannot be undone.
#251
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.7 Tag Hierarchy Management
~247 tok
### 9.7 Tag Hierarchy Management • Tags added at the project level through the Overview tab automatically apply to all events within that project. • Tags removed at the project level cascade removal to all events under that project. • Tags added at the event level apply only to that specific event and do not affect other events. • Tags removed at the event level do not affect other events or project-level tag visibility. • Tags created within an event are visible in the project Overview tab under that event's tag list. • Event-level tag deletion does not remove the tag from project-level visibility. • Selecting a tag from the project Overview applies it across all events in the project. • Tags in the Task module are created in the system only when the task is saved, not during form entry. • All tag hierarchy rules apply consistently regardless of the number of events in a project. • Tags created from any module appear in the agency-level Tag Management Settings.
#252
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.8 Tag Deletion
~145 tok
### 9.8 Tag Deletion • Tags can only be permanently deleted from the Tag Management sub-page. • When deleting a tag not attached to anything, a confirmation dialog is displayed with title "Delete Tag" and "Cancel" / "Delete" buttons. • When deleting a tag attached to projects, events, or tasks, a warning dialog is displayed with title "Delete Tag" explaining the impact, with "Cancel" / "Delete Anyway" buttons. • Upon deletion of an attached tag, the tag is removed from all associated items while other tags remain unaffected. • Deletion is permanent and cannot be undone.
#253
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.9 Data Integrity
~55 tok
### 9.9 Data Integrity • Deletion protection displays appropriate warnings for attached items. • Unique constraints are enforced. • Changes propagate correctly across all modules. • Audit trail captures modifications.
#254
**FRD #6: Data Management Module** > **9\. Acceptance Criteria** > 9.10 User Experience
~108 tok
### 9.10 User Experience • Real-time validation provides clear feedback. • Error messages are helpful and actionable. • Success confirmations display after each operation. • Delete dialogs use consistent title format "Delete \[Item Type\]" without question marks. • Delete dialogs clearly explain the impact of deletions. • Interface remains responsive during operations. • Empty states provide clear guidance on next steps.
#255
**FRD #6: Data Management Module** > **10\. Manual Test Cases**
~60 tok
## **10\. Manual Test Cases** The comprehensive test cases for the Data Management module are provided in a separate Excel file for upload to the project management system. **File:** \[Data\_Management\_Comprehensive\_Test\_Cases.xlsx\]
#256
**FRD #6: Data Management Module** > **11\. Dependencies**
~284 tok
## **11\. Dependencies** **Dependency Type** **Dependency Name** **Description** **Impact if Unavailable** Internal Module Project Module Uses configured data fields; Lead sources, custom fields, and tags applied at project level Fields won't appear; Lead source, custom field, and tag management unavailable Internal Module Event Module Tags applied at event level with isolation rules Event tagging unavailable Internal Module Task Module Tasks use tags from Tag Management; new tags created on task save Tags cannot be assigned to tasks; task-created tags not available Internal Module Brand Management Event and service types Cannot assign custom fields Internal Module Reporting Module Uses lead sources for analytics; Displays "Other" custom values separately Reports incomplete without lead source data Internal Module Client Portal Shows visible custom fields Fields hidden Internal Module Contractor Portal Shows permitted fields Fields hidden Configuration Database Schema Stores configurations Cannot save changes Library Form Builder Library Renders custom fields Manual field creation
#257
**FRD #6: Data Management Module** > **12\. References**
~110 tok
## **12\. References**
* **Figma Designs:** \[Figma Link\]
* **Related FRDs:**
* \[My\_Profile\_FRD.md\] — Agency Global Settings
* \[General\_Settings\_FRD.md\] — Agency Global Settings
* \[Business\_Payment\_Details\_FRD.md\] — Agency Global Settings
* \[Accepted\_Payment\_Methods\_FRD.md\] — Agency Global Settings
* \[Two\_Step\_Verification\_FRD.md\] — Agency Global Settings
7\. Stripe Integration#258
**Stripe Integration — Agency Global Settings - FRD**
~33 tok
# **Stripe Integration — Agency Global Settings - FRD** **Module Name:** Stripe Integration **Version:** 1.5 **Date:** June 25, 2026
#259
**Stripe Integration — Agency Global Settings - FRD** > **1\. Module Overview**
~298 tok
## **1\. Module Overview**
**Module Name:** Stripe Integration
**Purpose:** The Stripe Integration module enables agencies to connect their Stripe account(s) to the Pixally CRM platform in order to automate contractor payments. This module provides a flexible configuration system that supports both unified (single Stripe account for all brands) and individual (separate Stripe account per brand) setups, allowing agencies to manage payment infrastructure at the brand level as they scale.
**Business Goals:**
* Enable agencies to connect Stripe for automated contractor payment processing, eliminating the need for manual payment workflows.
* Provide flexible brand-level Stripe configuration to support agencies operating multiple brands with distinct or shared financial operations.
* Facilitate secure bank account linking via Stripe Financial Connections for reliable payout processing.
* Ensure transactional integrity by enforcing configuration change restrictions during active payment processing.
* Support seamless brand growth by automatically inheriting Stripe credentials for newly created brands under the shared configuration model.#260
**Stripe Integration — Agency Global Settings - FRD** > **2\. User Roles & Permissions**
~190 tok
## **2\. User Roles & Permissions** **Role** **Access Level** **Permissions** Agency Owner Full Access View, configure, edit, switch, disconnect, and manage all Stripe Integration settings including Stripe keys, bank accounts, and configuration mode switching Admin No Access Cannot view or access the Stripe Integration section Project Manager No Access Cannot view or access the Stripe Integration section **Access Rule:** The Stripe Integration module is exclusively accessible to the Agency Owner. No other role within the agency can view, access, or modify any Stripe Integration settings. If a non-owner role attempts to navigate to this section, the system does not display the Stripe Integration menu item in the left sidebar navigation.
#261
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow**
~5 tok
## **3\. User Flow**
#262
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Initial Access & Setup Mode Selection
~475 tok
### Initial Access & Setup Mode Selection 3.1 The Agency Owner navigates to the Agency Global Settings from the left sidebar menu and clicks on "Stripe Integration." 3.2 The system loads the Stripe Integration page with the heading "Stripe Integration" and the subtitle "Connect your Stripe account to automate payment to your contractors and manage agency billing seamlessly." 3.3 The system displays a persistent yellow helper banner at the top titled "Need Your Stripe Keys?" with descriptive text and an "Open Stripe Dashboard" button that opens the Stripe dashboard in a new browser tab. 3.3a If the Agency Owner navigates to Stripe Integration and the agency has zero brands configured, the system displays the "No Brands Found" empty state. The Agency Owner clicks the "+ Create Brand" button which redirects them to the Brand Creation module. No further steps in the Stripe Integration flow are accessible until at least one brand is created. 3.4 The system checks whether the agency has more than one brand configured in the system. 3.5 If the agency has only one brand, the system skips the setup mode selection and directly displays the Stripe key entry screen for that single brand (proceed to Step 3.10). 3.6 If the agency has more than one brand, the system displays two selectable cards: "One Account for All" (use the same Stripe account across all brands) and "Separate Accounts" (each brand has its own Stripe account). 3.7 The Agency Owner selects one of the two configuration options by clicking on the respective card, which highlights with a border to indicate selection. 3.8 The Agency Owner clicks the "Continue to Next Step →" button to proceed with the selected configuration mode. 3.9 If the user clicks "Continue to Next Step" without selecting a configuration mode, the system displays an error message prompting the user to select an option before proceeding.
#263
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > One Account for All — Stripe Key Entry
~453 tok
### One Account for All — Stripe Key Entry 3.10 The system displays the "Connect Your Payment Account" page with the subtitle "Let's set up Stripe so you can pay your freelancers and contractors automatically." 3.11 The system displays a 3-step instruction guide within a bordered section titled "Enter Your Stripe Keys" explaining how to find Stripe API keys: (1) Log in to Stripe dashboard and click "Developers," (2) Click "API Keys" from the sidebar, and (3) Copy both keys ensuring "Live keys" are used, not "Test keys." 3.12 The Agency Owner enters the Publishable Key in the first input field (placeholder: "pk\_live\_your\_stripe\_publishable\_key"). 3.13 The Agency Owner enters the Secret Key in the second input field (placeholder: masked with asterisks). 3.14 The Agency Owner clicks the "Save" button to submit the Stripe keys for validation, or clicks "Cancel" to discard and return to the previous screen. 3.15 The system sends the entered keys to the Stripe API for real-time validation. 3.16 If validation fails, the system displays an error message indicating the keys are invalid and prompts the user to verify and re-enter the correct keys. 3.17 If validation succeeds, the system displays a "✓ Verified & Active" badge next to "Your Connected Credentials," shows all connected brand chips at the top of the section, and displays the Publishable Key (partially masked) and Secret Key (fully masked) in read-only fields. 3.18 The system displays a yellow informational banner stating "Future Brands Automatically Connected — Great news! Any new brands you create in the future will automatically be connected to this Stripe account. No need to set it up again!" 3.19 The system displays two action buttons below the credentials: "Update Credentials" and "Switch to Individual Setup."
#264
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > One Account for All — Bank Account Connection (First Brand)
~453 tok
### One Account for All — Bank Account Connection (First Brand) 3.20 The system displays the bank account section(s) below the credentials section, with structure and informational messages based on the current connection state (see Section 4.5 for detailed logic). 3.21 The system lists all agency brands with their logo, name, and a "Connect" button for each brand that does not yet have a bank account connected. 3.22 The Agency Owner clicks the "Connect" button next to the first brand to initiate bank account linking. 3.23 The system launches the Stripe Financial Connections external modal, which displays a bank selection interface with a search field and a list of available banks. 3.24 The Agency Owner selects a bank from the Stripe-provided list, completes the authentication and account linking process within the Stripe Financial Connections interface. 3.25 Upon successful bank account connection, the system closes the Stripe modal and updates the display to show the bank name and last four digits of the account number (e.g., "Bank of America (\*\*\*\* 6021)") with brands grouped under the bank accordion, each with a trash icon and "Delete" label for removal. 3.26 The system displays a popup titled "Complete your bank account setup" asking the Agency Owner "Would you like to use this bank account for all your brands?" with "No" and "Yes" buttons. 3.27 If the Agency Owner selects "Yes" in the popup, the system automatically populates the same bank account details for all remaining brands, and the bank accordion updates to show all brands grouped under the same bank. 3.28 If the Agency Owner selects "No" in the popup, the system keeps the bank account connected only for the selected brand, and other brands remain in the "Bank Account Setup" section with "Connect" buttons.
#265
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > One Account for All — Bank Account Connection (Subsequent Brands)
~363 tok
### One Account for All — Bank Account Connection (Subsequent Brands) 3.29 For any brand that needs bank connection after the first brand has been connected (either because the user selected "No" in the first popup, or a new brand was added later), the Agency Owner clicks the "Connect" button next to that brand. 3.30 The system displays the "Connect your Bank account" modal with two radio button options: "Use existing Bank account" (selected by default) and "Create a new Bank account", along with "Cancel" and "Connect Bank" buttons. 3.31 If the Agency Owner selects "Use existing Bank account" and clicks "Connect Bank," the system displays a list of banks already connected to other brands for selection. 3.32 The Agency Owner selects an existing bank from the list and confirms. 3.33 The system immediately connects the selected bank to the brand and moves the brand under that bank's accordion in the "Connected Bank Accounts" section. 3.34 If the Agency Owner selects "Create a new Bank account" and clicks "Connect Bank," the system launches the Stripe Financial Connections external modal for a new bank connection. 3.35 The Agency Owner completes the new bank connection through Stripe Financial Connections. 3.36 Upon successful connection, the system creates a new bank accordion (if different from existing banks) and places the brand under it. 3.37 If the Agency Owner clicks "Cancel," the modal closes and no changes are made.
#266
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Update Credentials Flow (Shared Mode)
~135 tok
### Update Credentials Flow (Shared Mode) 3.38 The Agency Owner clicks the "Update Credentials" button on the connected state screen. 3.39 The system makes the Publishable Key and Secret Key fields editable, allowing the user to enter new Stripe keys. 3.40 The Agency Owner enters the new keys and clicks "Save" to re-validate, or clicks "Cancel" to discard changes. 3.41 The system validates the new keys with the Stripe API and updates the credentials upon successful validation, displaying the updated "✓ Verified & Active" status.
#267
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Switch to Individual Setup Flow
~423 tok
### Switch to Individual Setup Flow 3.42 The Agency Owner clicks the "Switch to Individual Setup" button on the shared mode connected state screen. 3.43 The system displays a modal titled "Where Should These Credentials Be Transferred?" with a warning banner stating "Important: You're About to Change Your Setup" and explaining that by switching to individual setup, each brand will need its own Stripe account. 3.44 The modal lists all agency brands under "Your Connected Credentials" with a checkbox next to each brand, allowing the Agency Owner to select which brands should retain the current Stripe credentials. 3.45 The modal displays an informational section titled "What Happens to Your Current Credentials?" explaining three key points: credentials can be kept for selected brands, new credentials must be set up for other brands, and bank accounts connected to selected brands will also be transferred. 3.46 The Agency Owner selects one or more brands to retain the existing credentials by checking the corresponding checkboxes. 3.47 The Agency Owner clicks "Confirm & Continue" to execute the switch, or "Cancel" to abort and return to the shared configuration screen. 3.48 The system processes the configuration switch: selected brands retain the existing Stripe keys and associated bank accounts; unselected brands are set to "Not Connected" status requiring separate key entry. 3.49 The system triggers an automatic contractor re-onboarding notification for all contractors associated with brands whose Stripe keys have changed as a result of the switch. 3.50 The system redirects the Agency Owner to the Individual Setup screen showing the per-brand accordion layout.
#268
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Individual/Separate Accounts — Setup Flow
~430 tok
### Individual/Separate Accounts — Setup Flow
3.51 The system displays the "Connect Your Payment Account" page with the heading "Set Up Each Brand Separately" and the subtitle "Its Stripe keys and connect a bank account. You can set them up one at a time."
3.52 The system lists all agency brands as collapsible accordion cards, each displaying the brand logo, brand name, and a connection status badge ("✓ Stripe Connected" in green or "Not Connected" in red).
3.53 The system displays an informational message appropriate to the current bank connection state (see Section 4.8 for detailed logic).
3.54 The system also displays a "Switch to One Account" button on this screen to allow the reverse configuration switch.
3.55 The Agency Owner clicks on a brand accordion card to expand it and view the Stripe key entry fields for that specific brand.
3.56 For a brand that is not connected, the expanded section displays "Stripe Keys" heading, empty Publishable Key and Secret Key input fields, and a "Connect Stripe" button.
3.57 The Agency Owner enters the Publishable Key and Secret Key for the selected brand and clicks "Connect Stripe."
3.58 The system validates the entered keys with the Stripe API for that specific brand.
3.59 If validation succeeds, the system updates the brand's status to "✓ Stripe Connected," displays a "✓ Connected" badge next to the Stripe Keys heading, shows the keys in partially masked read-only fields, and replaces the "Connect Stripe" button with a "Connect Bank Account →" button and a red "Disconnect Stripe" button.
3.60 If validation fails, the system displays an error message indicating invalid keys for that brand and prompts the user to re-enter valid credentials.#269
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Individual Setup — Bank Account Connection
~133 tok
### Individual Setup — Bank Account Connection 3.61 The Agency Owner clicks the "Connect Bank Account →" button for a connected brand. 3.62 The system launches the Stripe Financial Connections external modal for bank selection and authentication (no "Use existing / Create new" modal appears in Individual mode). 3.63 Upon successful connection, the system displays the connected bank account details (bank name and last four digits) within the brand's accordion section, along with a trash icon with "Delete" label for removal.
#270
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Individual Setup — Disconnect Stripe
~192 tok
### Individual Setup — Disconnect Stripe 3.64 The Agency Owner clicks the red "Disconnect Stripe" button within a connected brand's expanded accordion section. 3.65 The system displays a confirmation dialog asking the Agency Owner to confirm the disconnection of Stripe for the selected brand. 3.66 If the Agency Owner confirms, the system disconnects the Stripe keys for that specific brand, reverts the brand's status to "Not Connected," and restores the empty key entry fields with the "Connect Stripe" button. 3.67 The system preserves any previously connected bank account for that brand; the bank account is not disconnected when Stripe keys are removed. 3.68 If the Agency Owner cancels, the system closes the confirmation dialog and no changes are made.
#271
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Switch to One Account (Reverse Flow)
~283 tok
### Switch to One Account (Reverse Flow) 3.69 The Agency Owner clicks the "Switch to One Account" button on the Individual Setup screen. 3.70 The system displays a modal similar to the forward switch, asking the Agency Owner which existing credentials they want to use for all brands, or whether they want to enter entirely new Stripe keys. 3.71 The Agency Owner selects the brand whose credentials should be applied to all brands, or chooses to enter new keys. 3.72 For brands that are not selected to retain their bank accounts, the system performs a soft delete of the bank account from the UI display while preserving the data in the backend database. 3.73 The Agency Owner clicks "Confirm & Continue" to execute the reverse switch, or "Cancel" to abort. 3.74 The system processes the configuration change, applies the selected or new Stripe keys to all brands, and redirects the Agency Owner to the shared configuration connected state screen. 3.75 The system triggers an automatic contractor re-onboarding notification for all contractors associated with brands whose Stripe keys have changed during the reverse switch.
#272
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Bank Account Deletion
~346 tok
### Bank Account Deletion
3.76 The Agency Owner clicks the trash icon with "Delete" label next to a connected bank account (available in both shared and individual modes).
3.77 The system checks whether any payments are currently in processing for that brand.
3.78 If NO payments are in processing, the system displays a confirmation dialog with the following content:
* **Title:** "Delete Bank Account"
* **Message:** "Are you sure you want to delete this bank account?"
* **Buttons:** "Cancel" (secondary) | "Delete" (primary)
3.79 If the Agency Owner clicks "Delete," the system deletes the bank account from the brand and updates the display accordingly (brand moves to "Bank Account Setup" section in shared mode, or shows "Connect Bank Account" button in individual mode).
3.80 If the Agency Owner clicks "Cancel," the system closes the confirmation dialog and no changes are made.
3.81 If payments ARE in processing, the system displays an informational dialog with the following content:
* **Title:** "Cannot Delete Bank Account"
* **Message:** "Unable to delete bank account. Payments are currently being processed. Please try again once all payments are complete."
* **Buttons:** "Close" only
3.82 The Agency Owner clicks "Close" to dismiss the dialog; no changes are made and the bank account remains connected.#273
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Bank Account Verification (Micro-Deposit Fallback)
~393 tok
### Bank Account Verification (Micro-Deposit Fallback) 3.83 If a bank account cannot be linked instantly through Stripe Financial Connections, the Agency Owner is offered manual verification. Stripe sends a micro-deposit to the bank account and the system displays a verification code field with a "Verify" button. Verification is by bank-statement descriptor code only — there is no OTP. 3.84 The system displays the on-screen instruction: "Check your bank statement for a $0.01 deposit from ACCTVERIFY. The deposit contains a 6-character code." The micro-deposit can take 1-2 business days to appear on the statement. 3.85 The Agency Owner enters the 6-character descriptor code and clicks "Verify." 3.86 If the code is correct, the bank account connects immediately, the system displays "Bank account connected successfully," and the bank moves to the "Connected" state with no pending wait. 3.87 If the code is incorrect, the system displays "Invalid verification code. Please check your bank statement and try again." and the Agency Owner may retry, up to Stripe's attempt limit. 3.88 If Stripe's attempt limit (10 attempts) is reached, the system displays "Bank account verification failed. Please delete this payment method and add it again," disables the "Verify" button, and keeps the Delete (trash icon) enabled so the Agency Owner can delete and re-add the bank account. This applies to both the per-brand (Individual) and unified (One Account for All) verification steps; in the unified step only the failed account(s) are affected while others proceed.
#274
**Stripe Integration — Agency Global Settings - FRD** > **3\. User Flow** > Disconnect Stripe (Connected Credentials)
~271 tok
### Disconnect Stripe (Connected Credentials) 3.89 The Agency Owner clicks "Disconnect" in the "Your Connected Credentials" section. 3.90 If Stripe is "Verified & Active" and at least one bank account is connected, the system displays the full "Disconnect Stripe?" confirmation modal listing the consequences (stop all payment processing for connected brands, re-authentication required to reconnect, linked bank accounts disconnected), with "Cancel" and "Yes, disconnect" buttons. 3.91 If the Agency Owner chose manual verification and verification is still pending (no bank fully connected), the system instead displays the simple "Disconnect Stripe?" modal stating that the pending bank verification will not be completed, with "Cancel" and "Yes, disconnect" buttons and no consequence bullets. 3.92 If the Agency Owner clicks "Yes, disconnect," the system removes the Stripe connection (and any linked bank accounts, in the full-modal case) and displays "Stripe account disconnected successfully." If the Agency Owner clicks "Cancel," the modal closes and no changes are made.
#275
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic**
~7 tok
## **4\. Functional Logic**
#276
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.1 Empty State & Initial Setup
~417 tok
### 4.1 Empty State & Initial Setup
* When the Agency Owner navigates to Stripe Integration for the first time and no Stripe account has been configured, the system displays the setup mode selection screen if the agency has multiple brands, or the direct key entry screen if the agency has only one brand.
* If the agency has exactly one brand, the system bypasses the mode selection entirely and presents the "Connect Your Payment Account" screen with the Stripe key entry form for the single brand.
* If a user who is not the Agency Owner attempts to initiate a contractor payment and no Stripe account is connected, the system displays a popup message informing them that the Stripe account must be connected first by the Agency Owner before any online payment can be processed.
* The "Need Your Stripe Keys?" helper banner remains visible at the top of the Stripe Integration page across all states (empty, setup, connected) to provide persistent access to the Stripe Dashboard via the "Open Stripe Dashboard" button.
* The "Open Stripe Dashboard" button opens the Stripe dashboard (https://dashboard.stripe.com) in a new browser tab when clicked.
* If the Agency Owner navigates to Stripe Integration and the agency has no brands configured at all, the system displays an empty state screen with the message "No Brands Found" and the subtitle "Create at least one brand before connecting Stripe credentials." A "+ Create Brand" button is displayed which redirects the Agency Owner to the Brand Creation module. The Stripe key entry and setup mode selection screens are not accessible until at least one brand exists.#277
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.2 Setup Mode Selection (Multi-Brand Agencies)
~295 tok
### 4.2 Setup Mode Selection (Multi-Brand Agencies)
* The setup mode selection screen presents two mutually exclusive card options: "One Account for All" and "Separate Accounts."
* The "One Account for All" card displays a play icon with the description "Use the same Stripe account across all your brands. Simpler to manage!" to indicate a unified configuration.
* The "Separate Accounts" card displays a grid icon with the description "Each brand has its own Stripe account. Better for tracking finances separately." to indicate per-brand configuration.
* When the user clicks on a card, the selected card receives a highlighted border (orange/yellow dashed border) to visually indicate the active selection, while the other card reverts to the default unselected state.
* Only one card can be selected at a time; clicking one card automatically deselects the other.
* The "Continue to Next Step →" button at the bottom of the screen remains disabled or triggers an error if no card has been selected.
* The system persists the selected configuration mode and uses it to determine the subsequent setup flow and UI layout.#278
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.3 One Account for All — Key Entry & Validation
~547 tok
### 4.3 One Account for All — Key Entry & Validation
* The key entry screen displays under the heading "Enter Your Stripe Keys" with a 3-step instructional guide that walks the user through finding their Stripe API keys.
* Step 1 instructs the user to log in to their Stripe dashboard and click on "Developers" in the top menu.
* Step 2 instructs the user to click on "API Keys" from the left sidebar within the Stripe Developers section.
* Step 3 instructs the user to copy both the Publishable Key and Secret Key, with an explicit warning to use "Live keys" and not "Test keys."
* The Publishable Key input field accepts text input with a placeholder value of "pk\_live\_your\_stripe\_publishable\_key" to guide the user on the expected format.
* The Secret Key input field accepts text input with the value masked using asterisks to maintain security, with a placeholder of "lk\_live\_your\_stripe\_secret\_key."
* The system performs client-side format validation to check that the Publishable Key begins with the "pk\_live\_" prefix and the Secret Key begins with the "sk\_live\_" prefix before sending the keys for server-side validation.
* If the user enters keys with "pk\_test\_" or "sk\_test\_" prefixes, the system displays a warning message informing the user that test keys are not accepted and that live keys are required for production payment processing.
* Upon clicking "Save," the system sends both keys to the Stripe API for real-time server-side validation to confirm the keys are valid, active, and associated with a legitimate Stripe account.
* If the Stripe API returns a successful validation response, the system stores the encrypted keys in the database and transitions the UI to the connected state.
* If the Stripe API returns a validation failure, the system displays an error message and the key entry fields remain editable for the user to correct and re-submit.
* The "Cancel" button discards any entered key values and returns the user to the previous screen (setup mode selection for multi-brand agencies, or the empty state for single-brand agencies).#279
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.4 One Account for All — Connected State
~411 tok
### 4.4 One Account for All — Connected State
* Upon successful key validation, the system displays all agency brands as chips at the top of the "Enter Your Stripe Keys" section, visually confirming that all brands are linked to the single Stripe account.
* The system displays a "✓ Verified & Active" badge in green next to the "Your Connected Credentials" heading to indicate the active connection status.
* The Publishable Key is displayed in a read-only field with partial masking (e.g., "pk\_live\_\*\*\*\*\*\*\*\*\*\*\*\*\*6666...") showing only the prefix and last few characters for identification purposes.
* The Secret Key is displayed in a read-only field with full masking (e.g., "sk\_live\_\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*") to protect the sensitive key value.
* A yellow informational banner appears below the brand chips stating "Future Brands Automatically Connected" with the message that any new brands created in the future will automatically be connected to this Stripe account without requiring manual setup.
* When a new brand is created in the Brands module while the shared configuration is active, the system automatically associates the new brand with the existing Stripe credentials and adds a new chip for that brand on the Stripe Integration screen.
* The "Update Credentials" button allows the Agency Owner to modify the existing Stripe keys while maintaining the shared configuration mode.
* The "Switch to Individual Setup" button allows the Agency Owner to transition from the shared configuration to per-brand individual Stripe setups.#280
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode
~76 tok
### 4.5 Bank Account Connection — Shared Mode The Bank Accounts area appears below the Stripe credentials section and is only visible after the Stripe keys have been successfully validated and connected. The section structure and informational messages vary based on the current bank connection state.
#281
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **Section Structure Logic**
~104 tok
#### **Section Structure Logic** **Connection State** **Sections Displayed** All brands have the SAME bank connected Single section: "Connected Bank Accounts" Brands have DIFFERENT banks connected Single section: "Connected Bank Accounts" Mixed state (some connected, some not) Two sections: "Connected Bank Accounts" + "Bank Account Setup" NO brands have bank connected Single section: "Bank Account Setup"
#282
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **Bank Grouping Display**
~133 tok
#### **Bank Grouping Display**
* Connected banks are displayed as collapsible accordion headers showing the bank name and last four digits (e.g., "Bank of America \*\*\*\* 6021").
* Brands using the same bank are grouped under that bank's accordion.
* Each brand row within a bank accordion displays the brand logo, brand name, and a trash icon with "Delete" label for removal.
* When multiple brands use different banks, each bank gets its own accordion with its respective brands listed underneath.#283
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **Informational Messages by State**
~346 tok
#### **Informational Messages by State**
**Scenario 1: All Brands → SAME Bank Connected**
* Section: "Connected Bank Accounts" (single section) • Info Message: "Please Note: All your brands are currently using the same bank account for payouts. If you ever need to use different bank accounts, you can switch to Individual Setup."
**Scenario 2: Brands → DIFFERENT Banks Connected**
* Section: "Connected Bank Accounts" (single section) • Info Message: "Please Note: These are the bank accounts currently connected to your brands. Brands using the same bank account are grouped together."
**Scenario 3: Mixed State (Some Connected, Some Not)**
* Section 1: "Connected Bank Accounts" • Connected Section Info Message: "Please Note: These are the bank accounts currently connected to your brands. Brands using the same bank account are grouped together."
* Section 2: "Bank Account Setup" • Setup Section Info Message: "Please Note: To receive payouts, you'll need to connect bank details for these brands. You can use an existing bank account or connect a new one."
**Scenario 4: NO Brands Have Bank Connected Yet**
* Section: "Bank Account Setup" (single section) • Info Message: "Please Note: To receive payouts, you'll need to connect bank details for each brand. You can use the same bank account for multiple brands or connect different accounts."#284
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **First Brand Connection**
~402 tok
#### **First Brand Connection**
* When connecting a bank account for the very first brand under the shared configuration, clicking the "Connect" button launches the Stripe Financial Connections external interface directly.
* The Stripe Financial Connections modal displays options including various bank types (OAuth, Non-OAuth, Ownership Accounts, etc.) and a search field for the user to find their specific bank.
* The bank connection process, including authentication and account verification, is handled entirely by Stripe's external service; the Pixally system does not manage any bank authentication logic.
* Upon successful bank account connection via Stripe Financial Connections, the system receives the bank name and masked account number from Stripe and creates a bank accordion with the brand listed underneath.
* After the first successful bank connection, the system displays a popup titled "Complete your bank account setup" with the message "Would you like to use this bank account for all your brands?" and "No" / "Yes" buttons.
* If the Agency Owner selects "Yes," the system automatically applies the same bank account details to all remaining brands, groups all brands under the same bank accordion, and updates the info message to Scenario 1.
* If the Agency Owner selects "No," the system retains the bank account connection only for the brand that was just configured. The section structure changes to Scenario 3 (mixed state) with the connected brand in "Connected Bank Accounts" and remaining brands in "Bank Account Setup."#285
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **Subsequent Brand Connections (After "No" or New Brands)**
~340 tok
#### **Subsequent Brand Connections (After "No" or New Brands)**
* For any brand connection after the first (when the user selected "No" in the first popup) or for newly added brands, clicking the "Connect" button displays the "Connect your Bank account" modal.
* The modal presents two radio button options:
* **"Use existing Bank account"** (selected by default) — Lists bank accounts already connected to other brands
* **"Create a new Bank account"** — Opens Stripe Financial Connections for a new bank
* The modal includes "Cancel" and "Connect Bank" buttons.
* If the Agency Owner selects "Use existing Bank account," the system displays a list of banks already in use across other brands.
* Selecting an existing bank and clicking "Connect Bank" immediately connects that bank to the brand without launching Stripe Financial Connections. The brand is moved under that bank's accordion.
* If the Agency Owner selects "Create a new Bank account" and clicks "Connect Bank," the system launches the Stripe Financial Connections external modal for a new bank connection.
* Upon successful new bank connection, the system creates a new bank accordion (if different from existing banks) and places the brand under it.
* Clicking "Cancel" closes the modal with no changes made.#286
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.5 Bank Account Connection — Shared Mode > **Modal Availability**
~131 tok
#### **Modal Availability**
* The "Connect your Bank account" modal (with "Use existing / Create new" options) only appears in "One Account for All" mode when at least one brand already has a bank connected.
* In "Individual/Separate Accounts" mode, clicking "Connect Bank Account →" launches Stripe Financial Connections directly without the intermediate modal.
* Each brand can have only one bank account connected at a time; connecting a new bank account replaces the existing one after confirmation.#287
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.6 Update Credentials — Shared Mode
~363 tok
### 4.6 Update Credentials — Shared Mode
* Clicking the "Update Credentials" button transitions the Publishable Key and Secret Key fields from read-only to editable mode, allowing the Agency Owner to enter new Stripe API keys.
* The system pre-clears the existing key values in the editable fields to ensure the user enters fresh credentials rather than modifying partially masked values.
* Upon clicking "Save," the system re-validates the newly entered keys with the Stripe API using the same validation process as the initial key entry.
* If the new keys pass validation, the system updates the stored credentials, refreshes the "✓ Verified & Active" status, and returns the fields to read-only mode with the new partially masked values.
* If the new keys fail validation, the system displays an error message and the fields remain editable for correction.
* Clicking "Cancel" during the update process discards the changes and restores the previously saved credentials in read-only mode.
* Updating Stripe credentials does not affect the connected bank accounts; bank accounts remain linked regardless of credential changes.
* If the updated Stripe keys belong to a different Stripe account than the original, the system triggers a contractor re-onboarding notification for all contractors associated with the agency's brands, as the underlying payment infrastructure has changed.#288
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.7 Switch to Individual Setup
~596 tok
### 4.7 Switch to Individual Setup
* The switch modal displays with the title "Where Should These Credentials Be Transferred?" and includes a warning banner titled "Important: You're About to Change Your Setup" explaining the impact of the transition.
* The modal presents all agency brands in a list with a checkbox next to each, accompanied by the brand logo, brand name, and the bank account information (if connected) for context.
* Brands that currently have bank accounts connected display the bank name and masked account number next to the brand name within the modal.
* The Agency Owner selects one or more brands by checking the corresponding checkboxes to indicate which brands should retain the existing shared Stripe credentials after the switch.
* An informational section at the bottom of the modal titled "What Happens to Your Current Credentials?" explains three rules: (1) the current credentials can be kept for one or more specific brands, (2) new credentials must be set up for the other brands, and (3) bank accounts connected to selected brands will also be transferred.
* Clicking "Confirm & Continue" executes the switch: selected brands retain their Stripe keys and bank accounts; unselected brands transition to "Not Connected" status.
* Clicking "Cancel" closes the modal with no changes applied to the existing shared configuration.
* After the switch is confirmed, the system transitions the UI to the Individual Setup view, displaying the per-brand accordion layout with the appropriate connection statuses.
* The system triggers automatic contractor re-onboarding notifications specifically for contractors associated with brands whose Stripe keys have changed (i.e., brands that were not selected to retain the existing credentials).
* Contractors associated with brands that retained the existing credentials are not affected and do not receive re-onboarding notifications.
* The switch operation is blocked and cannot be initiated if any contractor payments are currently in the processing stage to prevent transactional integrity issues.
* If the Agency Owner attempts to switch while payments are processing, the system displays an error message explaining that the configuration cannot be changed until all in-progress payments are completed.#289
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management
~203 tok
### 4.8 Individual/Separate Accounts — Setup & Management
* The Individual Setup screen displays under the heading "Set Up Each Brand Separately" with the subtitle "Its Stripe keys and connect a bank account. You can set them up one at a time."
* Each agency brand is displayed as a collapsible accordion card with the brand logo, brand name, and a connection status badge.
* Connected brands display a "✓ Stripe Connected" badge in green, while unconnected brands display a "Not Connected" badge in red.
* Accordion cards are collapsed by default; clicking on a card expands it to reveal the Stripe key fields and bank account section for that specific brand.
* Only one accordion card can be expanded at a time; expanding a new card collapses the previously expanded card.#290
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management > **Bank Account Display in Individual Mode**
~132 tok
#### **Bank Account Display in Individual Mode**
* In Individual mode, bank account details are displayed INSIDE each brand's accordion (not as a separate grouped section).
* Each brand's expanded accordion shows its own Stripe credentials and bank account status independently.
* If the brand has a bank connected, the bank name and last four digits are displayed with a trash icon and "Delete" label.
* If the brand does not have a bank connected, a "Connect Bank Account →" button is displayed.#291
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management > **Informational Messages by State**
~162 tok
#### **Informational Messages by State** **Scenario 5: All Brands Have Bank Connected** * Info Message (displayed above the brand accordions): "Please Note: Each brand has its own Stripe account and bank details for independent payout processing." **Scenario 6: Mixed State (Some Connected, Some Not)** * Info Message: "Please Note: Each brand requires its own bank account for payouts. Connect bank details within each brand's settings below." **Scenario 7: NO Brands Have Bank Connected Yet** * Info Message: "Please Note: Each brand requires its own bank account for payouts. Connect bank details within each brand's settings below."
#292
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management > **Key Entry & Validation**
~168 tok
#### **Key Entry & Validation**
* For an unconnected brand, the expanded section displays the "Stripe Keys" heading, empty Publishable Key and Secret Key input fields with placeholder text, and a "Connect Stripe" button.
* The key validation process for individual brands follows the same logic as the shared mode: client-side prefix validation followed by server-side Stripe API validation.
* Upon successful validation for an individual brand, the system updates that brand's accordion to display: "✓ Connected" badge, partially masked Publishable Key, fully masked Secret Key, a "Connect Bank Account →" button, and a red "Disconnect Stripe" button.#293
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management > **Bank Connection**
~98 tok
#### **Bank Connection**
* The "Connect Bank Account →" button launches the Stripe Financial Connections modal directly for that specific brand (no "Use existing / Create new" modal in Individual mode).
* Upon successful bank connection, the bank details (bank name and last four digits) appear within the brand's accordion section with a trash icon and "Delete" label for removal.#294
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.8 Individual/Separate Accounts — Setup & Management > **Disconnect Stripe**
~173 tok
#### **Disconnect Stripe**
* The "Disconnect Stripe" button displays a confirmation dialog before disconnecting the Stripe keys for the selected brand.
* Upon confirmed disconnection, the brand's status reverts to "Not Connected," the Stripe keys are removed, and the empty key entry fields with the "Connect Stripe" button are restored.
* Disconnecting Stripe keys for a brand does NOT disconnect or remove the bank account that was previously connected for that brand; the bank account data is preserved.
* A "Switch to One Account" button is displayed on the Individual Setup screen to allow the Agency Owner to reverse the configuration back to shared mode.#295
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.9 Switch to One Account (Reverse Flow)
~393 tok
### 4.9 Switch to One Account (Reverse Flow)
* The reverse switch modal functions similarly to the forward switch modal, allowing the Agency Owner to select which existing brand credentials should be applied across all brands.
* The modal presents all brands with their current connection status and credentials, allowing the Agency Owner to choose one set of existing credentials to use as the shared Stripe keys.
* Alternatively, the Agency Owner can opt to enter entirely new Stripe keys for the shared configuration rather than using any existing brand's credentials.
* For brands whose bank accounts are not selected to be retained during the reverse switch, the system performs a soft delete of the bank account from the UI display while preserving the bank account data in the backend database for potential future restoration.
* Brands that require new bank account configuration after the reverse switch display the standard "Connect" button in the Bank Accounts section.
* The system triggers automatic contractor re-onboarding notifications for contractors associated with brands whose Stripe keys changed during the reverse switch.
* The reverse switch is also blocked if any contractor payments are currently in the processing stage, following the same transactional integrity rule as the forward switch.
* After confirmation, the system redirects the Agency Owner to the shared configuration connected state screen with all brands linked to the selected or newly entered Stripe credentials.#296
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.10 Bank Account Deletion
~577 tok
### 4.10 Bank Account Deletion
* Clicking the trash icon with "Delete" label next to a connected bank account initiates the deletion process.
* The system first checks whether any payments are currently in processing for the brand associated with the bank account.
**When NO Payments Are in Processing (Deletion Allowed):**
* The system displays a confirmation dialog with the following content:
* **Title:** "Delete Bank Account"
* **Message:** "Are you sure you want to delete this bank account?"
* **Buttons:** "Cancel" (secondary) | "Delete" (primary)
* Clicking "Delete" removes the bank account association for that specific brand and updates the UI accordingly:
* In Shared mode: Brand moves from "Connected Bank Accounts" section to "Bank Account Setup" section (if applicable), and the section structure/info messages update based on new state
* In Individual mode: Brand's accordion updates to show "Connect Bank Account →" button
* Clicking "Cancel" closes the dialog and retains the bank account connection with no changes.
* Note: Unpaid invoices do NOT block bank account deletion. The confirmation dialog is shown regardless of whether the brand has unpaid invoices.
**When Payments ARE in Processing (Deletion Blocked):**
* The system displays an informational dialog with the following content:
* **Title:** "Cannot Delete Bank Account"
* **Message:** "Unable to delete bank account. Payments are currently being processed. Please try again once all payments are complete."
* **Buttons:** "Close" only
* Clicking "Close" dismisses the dialog; no changes are made and the bank account remains connected.
* The user must wait until all in-progress payments are completed before attempting to delete the bank account again.
**Post-Deletion Behavior:**
* After successful deletion, the brand returns to a Stripe-connected state without bank details.
* The appropriate section/accordion displays the "Connect" button allowing the Agency Owner to link a new bank account.
* If the brand has scheduled (but not yet processing) contractor payments, those payments will be blocked until a new bank account is connected.#297
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.11 Single-Brand Agency Flow
~292 tok
### 4.11 Single-Brand Agency Flow
* Agencies with exactly one brand configured in the system bypass the setup mode selection screen entirely upon navigating to Stripe Integration.
* The system directly presents the "Connect Your Payment Account" key entry screen for the single brand, following the same validation and connection flow as the shared mode.
* After successful Stripe key validation, the Bank Accounts section displays only the single brand with a "Connect" button for bank account linking.
* The info message displayed is: "Please Note: To receive payouts, you'll need to connect bank details for each brand. You can use the same bank account for multiple brands or connect different accounts."
* The first-connection bank account popup ("Would you like to use this bank account for all your brands?") does not appear for single-brand agencies since there is only one brand.
* If a single-brand agency later adds a second brand, the system dynamically updates the Stripe Integration screen to reflect the multi-brand configuration, and the new brand automatically inherits the existing Stripe credentials.#298
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.12 Contractor Re-Onboarding Trigger
~187 tok
### 4.12 Contractor Re-Onboarding Trigger
* When an agency switches from shared to individual Stripe configuration or from individual to shared configuration, the system identifies all contractors associated with brands whose Stripe keys have changed.
* An automatic system notification is sent to each affected contractor informing them that they need to complete the Stripe re-onboarding process for the changed brand(s).
* Contractors associated with brands that retained their existing Stripe keys during the switch are not notified and do not need to re-onboard.
* The re-onboarding requirement ensures that contractor payment flows are correctly aligned with the updated Stripe account credentials for each brand.#299
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.13 Payment Processing Restrictions
~240 tok
### 4.13 Payment Processing Restrictions
* The system prevents the Agency Owner from switching between shared and individual Stripe configurations (in either direction) if any contractor payments are currently in the "processing" stage.
* Before displaying the switch modal, the system checks for any active processing payments across all agency brands.
* If processing payments are detected, the system displays an error message stating that the configuration cannot be changed until all in-progress payments have been completed or cancelled.
* This restriction enforces transactional integrity and prevents payment failures or misrouting that could occur if Stripe credentials change mid-transaction.
* If a contractor has not connected their Stripe account for onboarding, the agency is unable to process online payments to that contractor; the system displays an appropriate notification when a payment is attempted.#300
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.14 Dynamic Brand Syncing
~313 tok
### 4.14 Dynamic Brand Syncing
* When a new brand is created in the Brands module while the shared Stripe configuration is active, the new brand is automatically associated with the existing shared Stripe credentials without requiring any manual action from the Agency Owner.
* The new brand appears as an additional chip on the Stripe Integration connected state screen and is listed in the "Bank Account Setup" section with a "Connect" button for bank account setup.
* When connecting a bank for a newly added brand in shared mode, the "Connect your Bank account" modal appears (with "Use existing / Create new" options) since at least one brand already has a bank connected.
* When a new brand is created while the individual Stripe configuration is active, the new brand appears as a new accordion card with "Not Connected" status, requiring separate Stripe key entry.
* When a brand is removed or deactivated from the Brands module, the system updates the Stripe Integration screen to remove the corresponding brand from the brand list, chips, or accordion cards.
* All dynamic brand additions and removals are reflected in real-time on the Stripe Integration screen without requiring a page refresh.#301
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.15 Helper Banner & Instructions
~201 tok
### 4.15 Helper Banner & Instructions
* The "Need Your Stripe Keys?" helper banner is displayed persistently across all states of the Stripe Integration page (empty, setup mode selection, key entry, connected state, individual setup).
* The banner includes a warning icon, the title text, descriptive text ("Don't worry! We'll show you exactly where to find them. It's simple and takes less than 2 minutes."), and the "Open Stripe Dashboard" button.
* The "Open Stripe Dashboard" button opens the Stripe dashboard at https://dashboard.stripe.com in a new browser tab using target="\_blank."
* The 3-step instruction guide within the key entry section provides visual step numbers (circled 1, 2, 3) with clear instructions for locating API keys within the Stripe dashboard.#302
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.16 Bank Account Verification — Micro-Deposit / Descriptor Code
~505 tok
### 4.16 Bank Account Verification — Micro-Deposit / Descriptor Code
* This logic applies to bank account verification in BOTH configuration modes: the unified "One Account for All" step and the per-brand "Individual/Separate Accounts" step.
* Default behavior: Bank accounts typically connect instantly via Stripe Financial Connections. When a bank connects instantly, no manual verification step is required and the account moves straight to the "Connected" state.
* There is NO OTP-based verification. When manual verification is needed, it is performed exclusively via the bank-statement descriptor code (micro-deposit), not a one-time passcode.
* Manual fallback: If an account cannot be connected instantly and the user opts for manual verification, Stripe sends a micro-deposit to the bank account and the system displays a verification code field with a "Verify" button.
* On-screen instruction: "Check your bank statement for a $0.01 deposit from ACCTVERIFY. The deposit contains a 6-character code."
* The Agency Owner enters the 6-character descriptor code and clicks "Verify."
* On successful code entry, the bank account connects immediately — there is no extended pending wait or "under verification" hold. The bank moves to the "Connected" state and the system displays "Bank account connected successfully."
* Timing note: Micro-deposits can take 1-2 business days to appear on the customer's bank statement; the descriptor code can only be entered once the deposit is visible.
* Per-brand (Individual) step: Each brand completes its own micro-deposit verification independently within its accordion; the verification code field and "Verify" button appear inline next to that brand's bank entry.
* Unified (One Account for All) step: Accounts verify independently. Only the account(s) that fail verification display the disabled "Verify" button and the failure message; all other accounts proceed to "Connected" normally.#303
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.17 Verification Attempt Limit (Stripe-Handled)
~239 tok
### 4.17 Verification Attempt Limit (Stripe-Handled)
* The verification attempt limit is enforced by Stripe, not by the Pixally platform; it is documented here for awareness.
* The user is allowed up to 10 attempts to enter the descriptor code for micro-deposit verification.
* When the attempt limit is reached, Stripe blocks further verification for that bank account, and the account cannot be reused.
* On limit reached, the system displays Stripe's failure message: "Bank account verification failed. Please delete this payment method and add it again."
* Resulting UI behavior: the "Verify" button is DISABLED, while the Delete (trash icon) action remains ENABLED, giving the user a delete-and-re-add path.
* The user deletes the blocked bank account and adds it again; re-adding repeats the same micro-deposit verification flow described in Section 4.16. There is no separate reverification journey.#304
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.18 Reverification
~86 tok
### 4.18 Reverification
* There is no separate reverification flow. If a bank account's verification is incomplete, the user completes it through the same micro-deposit / descriptor-code process described in Section 4.16.
* No distinct reverification status, screen, or UI is required; the standard verification code field is reused.#305
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.19 Post-Verification Pending State
~54 tok
### 4.19 Post-Verification Pending State * Bank accounts connect instantly on confirmation; there is no post-verification pending state, so no "under verification" or wait-time message is displayed at any point.
#306
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.20 Disconnect Stripe — Confirmation Modals
~62 tok
### 4.20 Disconnect Stripe — Confirmation Modals * When the Agency Owner clicks "Disconnect" in the "Your Connected Credentials" section, the system displays one of two confirmation modals depending on the current connection/verification state.
#307
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.20 Disconnect Stripe — Confirmation Modals > **Full Modal — Stripe Verified & Active**
~200 tok
#### **Full Modal — Stripe Verified & Active**
* Triggered when Stripe is "Verified & Active" and at least one bank account is actively connected.
* Title: "Disconnect Stripe?"
* Description: "Are you sure you want to disconnect your Stripe account? This will:" followed by three consequence points: (1) Stop all payment processing for connected brands; (2) Require re-authentication to reconnect; (3) Disconnect linked bank accounts.
* CTAs: "Cancel" (secondary) | "Yes, disconnect" (primary/destructive).
* On confirm: Stripe is disconnected, all linked bank accounts are removed, reconnection requires full re-authentication, and the system displays "Stripe account disconnected successfully."
* On "Cancel": the modal closes and no changes are made.#308
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.20 Disconnect Stripe — Confirmation Modals > **Simple Modal — Manual Verification Pending**
~216 tok
#### **Simple Modal — Manual Verification Pending**
* Triggered when the user chose manual (micro-deposit) verification, the bank verification is not yet complete (bank not fully connected), and the user clicks "Disconnect" before verifying.
* Because no bank account is fully connected, the payment-processing and linked-bank consequence points are intentionally omitted.
* Title: "Disconnect Stripe?"
* Description: "Are you sure you want to disconnect? Your bank verification is still pending and will not be completed."
* CTAs: "Cancel" (secondary) | "Yes, disconnect" (primary/destructive).
* On confirm: the pending verification is abandoned, the Stripe connection is removed, and the system displays "Stripe account disconnected successfully."
* On "Cancel": the modal closes and no changes are made.#309
**Stripe Integration — Agency Global Settings - FRD** > **4\. Functional Logic** > 4.20 Disconnect Stripe — Confirmation Modals > **Modal Selection in the Unified Step (Mixed State)**
~187 tok
#### **Modal Selection in the Unified Step (Mixed State)**
* If the Agency Owner clicks "Disconnect" during a unified bank-verification step in which some accounts are verified/connected and others are still pending, the system displays the FULL modal, because at least one bank account is actively connected and the disconnect therefore carries the full payment-processing and linked-account consequences.
* Note: This account-level "Disconnect" (in the Connected Credentials section) is distinct from the per-brand "Disconnect Stripe" action in Section 4.8, which removes only a single brand's Stripe keys and preserves that brand's bank account. The account-level disconnect removes the Stripe connection and all linked bank accounts.#310
**Stripe Integration — Agency Global Settings - FRD** > **5\. Field Details & Validations**
~391 tok
## **5\. Field Details & Validations** **Field Name** **Field Type** **Validation Rules** **Section** Publishable Key Text Input Required; Must start with "pk\_live\_" prefix; Cannot start with "pk\_test\_"; Maximum 255 characters; No whitespace allowed; Validated against Stripe API Key Entry (Shared & Individual) Secret Key Text Input (Masked) Required; Must start with "sk\_live\_" prefix; Cannot start with "sk\_test\_"; Maximum 255 characters; No whitespace allowed; Validated against Stripe API Key Entry (Shared & Individual) Configuration Mode Card Selection (Radio) Required for multi-brand agencies; Exactly one option must be selected before proceeding; Options: "One Account for All" or "Separate Accounts" Setup Mode Selection Brand Checkbox (Switch Modal) Checkbox Optional; At least one brand may be selected; Multiple selections allowed Switch Configuration Modal Bank Account Selection Radio Button Required when "Connect your Bank account" modal is shown; Options: "Use existing Bank account" or "Create a new Bank account"; Default: "Use existing Bank account" Bank Connection Modal (Shared Mode Only) Bank Account External (Stripe Financial Connections) Managed entirely by Stripe; One bank account per brand; Connection requires successful Stripe Financial Connections authentication Bank Accounts Section Bank Verification Code Text Input Required for manual (micro-deposit) verification; 6 characters; Validated by Stripe; Up to 10 attempts (Stripe-enforced) Bank Account Verification (Shared & Individual)
#311
**Stripe Integration — Agency Global Settings - FRD** > **6\. Success Message Handling**
~786 tok
## **6\. Success Message Handling** **Action** **Success Message** **Trigger Condition** **Post-Success Behaviour** Stripe keys validated (Shared Mode) "Stripe account connected successfully. All brands are now linked to this account." Stripe API returns successful validation for entered Publishable Key and Secret Key UI transitions to connected state; brand chips displayed; "✓ Verified & Active" badge shown Stripe keys validated (Individual Mode) "Stripe account connected successfully for \[Brand Name\]." Stripe API returns successful validation for a specific brand's keys Brand accordion updates to connected state; "✓ Connected" badge shown Stripe credentials updated "Stripe credentials have been updated successfully." Agency Owner updates existing keys and Stripe API validates the new keys UI refreshes with new masked key values; "✓ Verified & Active" status retained Bank account connected "Bank account connected successfully for \[Brand Name\]." Stripe Financial Connections returns successful bank linking Brand moves to "Connected Bank Accounts" section under appropriate bank accordion; info message updates Bank account connected via existing "Bank account connected successfully for \[Brand Name\]." Agency Owner selects existing bank from "Connect your Bank account" modal Brand moves under selected bank's accordion; section structure updates if needed Bank account applied to all brands "Bank account has been applied to all brands successfully." Agency Owner selects "Yes" when prompted to use the same bank for all brands All brands grouped under single bank accordion; info message updates to Scenario 1 Configuration switched to Individual "Configuration switched to individual setup successfully. Please set up Stripe keys for brands marked as 'Not Connected'." Agency Owner confirms the switch from shared to individual via the modal UI transitions to individual setup accordion view Configuration switched to One Account "Configuration switched to one account for all brands successfully." Agency Owner confirms the reverse switch from individual to shared via the modal UI transitions to shared connected state view Stripe disconnected (Individual Mode) "Stripe has been disconnected for \[Brand Name\]." Agency Owner confirms disconnection of a specific brand's Stripe keys Brand reverts to "Not Connected" status with empty key entry fields Bank account deleted "Bank account has been deleted for \[Brand Name\]." Agency Owner confirms deletion of a bank account via the confirmation dialog Brand moves to "Bank Account Setup" section (shared) or shows "Connect" button (individual); section structure/info messages update Bank account connected (micro-deposit verified) "Bank account connected successfully" Agency Owner enters the correct micro-deposit descriptor code and clicks "Verify," or the bank connects instantly via Stripe Financial Connections Toast displayed for 3 seconds; bank account moves to the "Connected" state; applies to both the verified and instant-connect cases Stripe account disconnected "Stripe account disconnected successfully"
#312
**Stripe Integration — Agency Global Settings - FRD** > **6\. Success Message Handling**
~64 tok
Agency Owner confirms disconnection via the "Yes, disconnect" button in either the full (Verified & Active) or simple (verification pending) modal Toast displayed for 3 seconds; Stripe connection removed; linked bank accounts removed in the full-modal case
#313
**Stripe Integration — Agency Global Settings - FRD** > **7\. Error Message Handling**
~792 tok
## **7\. Error Message Handling** **Error Scenario** **Error Message** **Trigger Condition** **Required Action / System Response** No configuration mode selected "Please select a configuration option before proceeding." Agency Owner clicks "Continue to Next Step" without selecting "One Account for All" or "Separate Accounts" System highlights the selection area; user must select an option Empty Publishable Key "Publishable Key is required. Please enter your Stripe Publishable Key." Agency Owner clicks "Save" or "Connect Stripe" with the Publishable Key field empty System highlights the Publishable Key field; user must enter a valid key Empty Secret Key "Secret Key is required. Please enter your Stripe Secret Key." Agency Owner clicks "Save" or "Connect Stripe" with the Secret Key field empty System highlights the Secret Key field; user must enter a valid key Invalid key prefix — Test keys entered "Test keys are not accepted. Please enter your Live Stripe keys (starting with pk\_live\_ and sk\_live\_)." System detects that the entered Publishable Key starts with "pk\_test\_" or the Secret Key starts with "sk\_test\_" Client-side validation prevents submission; user must enter live keys Invalid key format "The entered key format is invalid. Please verify your Stripe API key and try again." System detects that the key does not match expected Stripe key format patterns Client-side validation prevents submission; user must correct the key format Stripe API validation failure "The entered Stripe keys are invalid or could not be verified. Please check your keys and try again." Stripe API returns an authentication or validation error for the submitted keys System keeps fields editable; user must re-enter valid keys Stripe API connection timeout "Unable to connect to Stripe at this time. Please check your internet connection and try again." System cannot reach the Stripe API due to network or service unavailability System retains entered values; user may retry after connectivity is restored Switch blocked — payments processing "Configuration cannot be changed while payments are being processed. Please wait until all in-progress payments are completed." Agency Owner attempts to switch configuration (either direction) while contractor payments are in "processing" stage System blocks the switch modal from opening; no changes permitted Bank account deletion blocked — payments processing (Displayed in dialog) "Unable to delete bank account. Payments are currently being processed. Please try again once all payments are complete." Agency Owner attempts to delete a bank account while payments are in "processing" stage for that brand System displays informational dialog with "Close" button; no deletion permitted Payment blocked — contractor not onboarded "Payment cannot be processed. \[Contractor Name\] has not completed Stripe onboarding for \[Brand Name\]. Please contact the contractor to complete their setup." Agency attempts to process a payment to a contractor who has not completed Stripe onboarding System blocks the payment initiation; agency must wait for contractor onboarding
#314
**Stripe Integration — Agency Global Settings - FRD** > **7\. Error Message Handling**
~456 tok
Payment blocked — no Stripe connected "Please connect your Stripe account first to initiate contractor payments." Any user attempts to process a contractor payment when no Stripe account is connected for the brand System displays popup message; user must navigate to Stripe Integration to connect Payment blocked — no bank account "Bank account is not connected for \[Brand Name\]. Please connect a bank account before processing payments." Agency attempts to process a payment for a brand that has Stripe keys but no bank account connected System blocks payment; user must connect bank account Bank connection failed "Bank account connection was unsuccessful. Please try again or select a different bank." Stripe Financial Connections returns a failure response during bank account linking System retains current state; user may retry the connection Duplicate Stripe key across brands "These Stripe keys are already in use by \[Brand Name\]. Each brand requires unique Stripe credentials in Individual Setup mode." Agency Owner enters Stripe keys for a brand in individual mode that match keys already assigned to another brand System prevents saving; user must enter unique keys for each brand Bank verification attempt limit reached "Bank account verification failed. Please delete this payment method and add it again." Stripe blocks the bank account after the 10-attempt descriptor-code limit is reached System disables the "Verify" button and keeps Delete (trash icon) enabled; user must delete the payment method and add it again Invalid bank verification code "Invalid verification code. Please check your bank statement and try again." Agency Owner enters a descriptor code that does not match the micro-deposit code System keeps the code field editable for retry within Stripe's attempt limit
#315
**Stripe Integration — Agency Global Settings - FRD** > **8\. Edge Cases**
~770 tok
## **8\. Edge Cases** **Edge Case** **Scenario Description** **Expected System Behaviour** Single brand becomes multi-brand Agency has one brand with Stripe connected, then creates a second brand in the Brands module System dynamically updates Stripe Integration to reflect multi-brand status; new brand auto-inherits existing Stripe keys; new brand appears in "Bank Account Setup" section with "Connect" button New brand added — bank connection Agency has multiple brands with banks connected via "One Account for All," then adds a new brand New brand shows in "Bank Account Setup" section; clicking "Connect" displays "Connect your Bank account" modal with "Use existing / Create new" options; section structure changes to mixed state All brands disconnected in Individual mode Agency Owner disconnects Stripe for every brand in individual setup mode System displays all brands as "Not Connected"; the "Switch to One Account" button remains available; no payments can be processed Brand deleted with active Stripe connection A brand that has Stripe keys and a bank account connected is deleted from the Brands module System removes the brand from the Stripe Integration screen; associated Stripe and bank data is archived; no impact on other brands; section structure/info messages update accordingly Concurrent session — configuration change Agency Owner has Stripe Integration open in two browser tabs and makes changes in one System applies the last saved change; the other tab should reflect updated state upon refresh or display a stale data warning Network failure during key validation Internet connection drops while the system is validating Stripe keys with the API System displays a timeout error message; entered key values are preserved in the fields; user can retry when connectivity is restored Network failure during bank connection Internet connection drops while the Stripe Financial Connections modal is active Stripe's external modal handles the error; upon failure, the system retains the previous bank connection state; user can retry Switch attempted with zero brands selected Agency Owner opens the switch-to-individual modal but does not select any brand to retain credentials and clicks "Confirm & Continue" System allows the switch; all brands transition to "Not Connected" status; Agency Owner must enter new keys for every brand Rapid repeated key validation Agency Owner clicks "Save" or "Connect Stripe" multiple times in quick succession System disables the button after the first click to prevent duplicate API calls; button re-enables after the validation response is received Stripe account deactivated externally The connected Stripe account is deactivated or suspended directly on the Stripe dashboard System should detect the invalid status on the next API interaction and display a warning to the Agency Owner to reconnect with valid credentials Keys changed via Update Credentials to a different Stripe account Agency Owner uses "Update Credentials" to enter keys from an entirely different Stripe account
#316
**Stripe Integration — Agency Global Settings - FRD** > **8\. Edge Cases**
~768 tok
System validates new keys, updates credentials, and triggers contractor re-onboarding notifications since the underlying Stripe account has changed Bank account deletion attempted while payment is processing Agency Owner attempts to delete a bank account for a brand that has payments currently in "processing" stage System displays "Cannot Delete Bank Account" dialog with explanation that payments are processing; deletion is blocked until payments complete Bank account deletion with unpaid invoices Agency Owner attempts to delete a bank account for a brand that has unpaid invoices (but no processing payments) System allows deletion; displays standard confirmation dialog "Are you sure you want to delete this bank account?" with "Cancel" / "Delete" buttons Bank account deleted while payment is scheduled Agency Owner deletes a bank account for a brand that has scheduled (but not yet processing) contractor payments System displays confirmation dialog; upon confirmation, the bank is deleted and scheduled payments are blocked until a new bank is connected Soft-deleted bank account during reverse switch Bank account was soft-deleted from the UI during an Individual-to-Shared switch but preserved in the backend Data remains in the backend database; if the user switches back to individual setup later, the bank account data is not automatically restored to the UI — the user must reconnect manually Agency Owner role transferred Agency ownership is transferred to a new user while Stripe is configured New Agency Owner inherits full access to the Stripe Integration module and can view/modify all existing configurations No brands configured Agency Owner navigates to Stripe Integration before creating any brand System displays the "No Brands Found" empty state with a "+ Create Brand" button; all Stripe configuration options are hidden until at least one brand is created; clicking the button redirects to the Brand Creation module User selects "Use existing" with multiple banks available Multiple brands have different banks connected; user connecting new brand selects "Use existing Bank account" System displays list of all unique banks connected across brands; user can select any one; selected brand moves under chosen bank's accordion User cancels bank connection modal User clicks "Cancel" on "Connect your Bank account" modal Modal closes; no changes made; brand retains "Connect" button in current section Last connected brand's bank deleted Only one brand had bank connected; user deletes that bank System transitions from Scenario 3 (mixed) to Scenario 4 (none connected); section changes from two sections to single "Bank Account Setup" section All brands get bank connected User connects banks for all remaining brands in "Bank Account Setup" "Bank Account Setup" section disappears; only "Connected Bank Accounts" section remains; info message updates to Scenario 1 or 2 depending on bank variety Bank verification attempt limit reached Agency Owner exhausts the 10 descriptor-code attempts for a bank account
#317
**Stripe Integration — Agency Global Settings - FRD** > **8\. Edge Cases**
~142 tok
Stripe blocks the account (cannot be reused); system shows "Bank account verification failed. Please delete this payment method and add it again," disables "Verify," and keeps Delete enabled for a delete-and-re-add path Disconnect during unified step with mixed verification states In the unified (One Account for All) step, some bank accounts are verified/connected and others are still pending when the Agency Owner clicks "Disconnect" System displays the FULL disconnect modal (with consequence bullets), because at least one bank account is actively connected
#318
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria**
~578 tok
## **9\. Acceptance Criteria**
* The Stripe Integration module must be accessible exclusively to the Agency Owner role; no other role should be able to view, access, or modify any Stripe settings.
* Agencies with a single brand must bypass the setup mode selection screen and be directed to the Stripe key entry screen immediately.
* Agencies with multiple brands must be presented with the "One Account for All" and "Separate Accounts" selection options before proceeding to key entry.
* Stripe Publishable Key and Secret Key fields must enforce client-side format validation (prefix check for "pk\_live\_" and "sk\_live\_") before server-side API validation.
* Keys with "pk\_test\_" or "sk\_test\_" prefixes must be rejected with an appropriate error message informing the user to use live keys.
* Successfully validated Stripe keys must display the "✓ Verified & Active" status, and key values must be masked appropriately in read-only mode.
* In shared mode, all existing brands must be automatically linked to the validated Stripe account, and future brands must automatically inherit the same credentials.
* The first bank account connection in shared mode must trigger a popup ("Would you like to use this bank account for all your brands?") with "No" / "Yes" buttons.
* Subsequent bank connections in shared mode (after "No" or for new brands) must display the "Connect your Bank account" modal with "Use existing Bank account" and "Create a new Bank account" options.
* Selecting "Use existing Bank account" must immediately connect the selected bank without launching Stripe Financial Connections.
* Selecting "Create a new Bank account" must launch Stripe Financial Connections for a new bank setup.
* The "Connect your Bank account" modal must NOT appear in Individual/Separate Accounts mode; Stripe Financial Connections should launch directly.
* Bank account connection must be handled entirely by Stripe Financial Connections, with the system receiving and displaying bank name and last four account digits upon success.
* Each brand must support exactly one bank account at a time.
* Connected bank accounts must display a trash icon with "Delete" label for removal.#319
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria** > Bank Account Section Structure (Shared Mode)
~172 tok
### Bank Account Section Structure (Shared Mode)
* When all brands have the SAME bank connected, display single "Connected Bank Accounts" section with appropriate info message.
* When brands have DIFFERENT banks connected, display single "Connected Bank Accounts" section with banks grouped as accordions.
* When some brands connected and some not (mixed state), display TWO sections: "Connected Bank Accounts" and "Bank Account Setup" with respective info messages.
* When NO brands have bank connected, display single "Bank Account Setup" section with appropriate info message.
* Info messages must update dynamically when connection state changes.#320
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria** > Bank Account Display (Individual Mode)
~136 tok
### Bank Account Display (Individual Mode)
* Bank details must appear INSIDE each brand's accordion (not as a separate grouped section).
* Info message must display above brand accordions based on current connection state.
* When all brands connected: "Please Note: Each brand has its own Stripe account and bank details for independent payout processing."
* When mixed or none connected: "Please Note: Each brand requires its own bank account for payouts. Connect bank details within each brand's settings below."#321
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria** > General Acceptance Criteria (Continued)
~11 tok
### General Acceptance Criteria (Continued)
#322
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria** > General Acceptance Criteria (Continued)
~800 tok
* The "Update Credentials" flow must allow re-entry and re-validation of Stripe keys without changing the configuration mode.
* The "Switch to Individual Setup" flow must display a modal allowing brand-level credential transfer selection with clear informational messaging.
* The "Switch to One Account" reverse flow must be available on the Individual Setup screen and function symmetrically to the forward switch.
* Configuration switches (both directions) must be blocked if any contractor payments are in the "processing" stage, with a clear error message displayed.
* Switching configurations must trigger automatic contractor re-onboarding notifications only for contractors associated with brands whose Stripe keys have changed.
* Disconnecting Stripe in individual mode must revert the brand to "Not Connected" status while preserving the connected bank account.
* Bank account deletion must display a confirmation dialog titled "Delete Bank Account" with "Cancel" / "Delete" buttons when no payments are processing.
* Bank account deletion must be blocked with an informational dialog titled "Cannot Delete Bank Account" when payments are in processing, showing only a "Close" button.
* Unpaid invoices must NOT block bank account deletion; only payments in processing stage block deletion.
* After successful bank account deletion, the brand must move to appropriate section (shared) or show "Connect" button (individual).
* All dynamic brand additions and removals from the Brands module must be reflected on the Stripe Integration screen in real-time.
* All success, error, and warning messages must be displayed as defined in the Success Message Handling and Error Message Handling sections.
* The helper banner with "Open Stripe Dashboard" must persist across all Stripe Integration states.
* If the agency has no brands configured, the Stripe Integration page must display the "No Brands Found" empty state with a "+ Create Brand" button that redirects to the Brand Creation module; no Stripe setup options should be visible in this state.
* Bank account verification must use the micro-deposit / descriptor-code method only (no OTP). The on-screen instruction must reference the $0.01 ACCTVERIFY deposit and the 6-character code, and a correct code must connect the bank immediately with no pending wait.
* The system must not display any post-verification pending or "under verification / 24-48 hours" message; bank accounts connect instantly on confirmation.
* On reaching Stripe's verification attempt limit (10 attempts), the "Verify" button must be disabled while Delete (trash icon) remains enabled, supporting a delete-and-re-add path. Incomplete verification must be completed through the same micro-deposit process (no separate reverification flow).
* The Disconnect action in the Connected Credentials section must show the full modal (with consequence bullets) when Stripe is Verified & Active or at least one bank is connected, and the simple modal (no consequence bullets) when manual verification is still pending.#323
**Stripe Integration — Agency Global Settings - FRD** > **9\. Acceptance Criteria** > General Acceptance Criteria (Continued)
~48 tok
In a unified step with mixed states, the full modal must be shown.
* These behaviors must apply to both the per-brand (Individual) and unified (One Account for All) verification steps.#324
**Stripe Integration — Agency Global Settings - FRD** > **10\. Manual Test Cases**
~57 tok
## **10\. Manual Test Cases** The comprehensive test cases for the Stripe Integration module are provided in a separate Excel file for upload to the project management system. **File:** \[Stripe\_Integration\_Test\_Cases.xlsx\]
#325
**Stripe Integration — Agency Global Settings - FRD** > **11\. Dependencies**
~660 tok
## **11\. Dependencies** **Module / System** **Dependency Type** **Description** **Impact if Unavailable** Stripe API External Service Real-time validation of Publishable Key and Secret Key; authentication and account verification Stripe keys cannot be validated; connection cannot be established; all payment processing is blocked Stripe Financial Connections External Service Bank account selection, authentication, and linking for payout processing Bank accounts cannot be connected; payments cannot be processed even with valid Stripe keys Brands Module Internal Module Provides the list of agency brands, brand logos, and brand names displayed on the Stripe Integration screen; triggers dynamic updates when brands are added or removed Brand list cannot be populated; setup mode selection cannot determine single vs. multi-brand; new brands cannot auto-inherit credentials. If no brands exist, Stripe Integration is completely inaccessible beyond the empty state screen. Contractor Payment Module Internal Module Relies on Stripe Integration configuration to process contractor payments; checks for active Stripe and bank account connections before initiating payments Payments cannot be processed if Stripe is not connected; payment module must validate connection status before each transaction Accepted Payment Methods Module Internal Module Works alongside Stripe Integration to define which payment methods are available for contractor payments; may share Stripe credential dependencies Payment method configuration may be incomplete without Stripe Integration; invoice generation may be affected Authentication Service Internal Service Validates that the current user is the Agency Owner before granting access to the Stripe Integration module Unauthorized users may access sensitive financial configurations if role validation fails Notification System Internal Service Sends automatic contractor re-onboarding notifications when Stripe configurations change; sends payment-related alerts Contractors may not be notified of required re-onboarding; delayed payment processing Invoice Module Internal Module Uses Stripe configuration for payment processing on contractor invoices; references the connected Stripe account for transaction execution Invoice payments cannot be processed; manual payment workflows may be required as fallback Brands Management — Brand Creation/Deletion Internal Process Triggers dynamic updates to the Stripe Integration screen when brands are created or removed New brands may not appear on the Stripe Integration screen; deleted brands may persist in the UI
#326
**Stripe Integration — Agency Global Settings - FRD** > **12\. References**
~135 tok
## **12\. References**
* **Figma Designs:** \[Figma Link\]
* **Related FRDs:
**
* \[My\_Profile\_FRD.md\] — Agency Global Settings
* \[General\_Settings\_FRD.md\] — Agency Global Settings
* \[Business\_Payment\_Details\_FRD.md\] — Agency Global Settings
* \[Accepted\_Payment\_Methods\_FRD.md\] — Agency Global Settings
* \[Two\_Step\_Verification\_FRD.md\] — Agency Global Settings
* \[Data\_Management\_FRD.md\] — Agency Global Settings
8\. Placeholder FRD Documents#327
**FRD #7: Placeholder FRD Documents**
~10 tok
# **FRD #7: Placeholder FRD Documents**
#328
**FRD #7: Placeholder FRD Documents** > The following modules require separate, dedicated FRD documents. This file contains placeholders for reference.
~29 tok
### The following modules require separate, dedicated FRD documents. This file contains placeholders for reference.
#329
**FRD #7: Placeholder FRD Documents** >
~1 tok
###
#330
**FRD #7: Placeholder FRD Documents** > **Team Management Module**
~7 tok
## **Team Management Module**
#331
**FRD #7: Placeholder FRD Documents** > **Team Management Module** > Status: Separate FRD Required
~38 tok
### Status: Separate FRD Required Link: [28\. Team Management](https://drive.google.com/drive/folders/1P0h9VI2L246XK_7_6yn--QX3EPXq1zA8?usp=drive_link)
#332
**FRD #7: Placeholder FRD Documents** > **Team Management Module** >
~1 tok
###
#333
**FRD #7: Placeholder FRD Documents** > **Referral System Module**
~7 tok
## **Referral System Module**
#334
**FRD #7: Placeholder FRD Documents** > **Referral System Module** > Status: Separate FRD Required
~38 tok
### Status: Separate FRD Required Link: [Referral](https://docs.google.com/document/d/1ufd4KylxqdQnM8FF7UOwZvEEskqmTZHofZ8YujvNpRk/edit?usp=sharing)
#335
**FRD #7: Placeholder FRD Documents** > **Referral System Module** >
~1 tok
###
#336
**FRD #7: Placeholder FRD Documents** > **Notifications Module**
~7 tok
## **Notifications Module**
#337
**FRD #7: Placeholder FRD Documents** > **Notifications Module** > Status: Separate FRD Required
~38 tok
### Status: Separate FRD Required Link: [27\. Notifications](https://drive.google.com/drive/folders/1p3mgymFA-DuVQZfJZFmTbz9L2hAxbYV9?usp=drive_link)
#338
**FRD #7: Placeholder FRD Documents** > **Notifications Module** >
~1 tok
###
#339
**FRD #7: Placeholder FRD Documents** > **Brands Module**
~5 tok
## **Brands Module**
#340
**FRD #7: Placeholder FRD Documents** > **Brands Module** > Status: Separate FRD Required
~10 tok
### Status: Separate FRD Required Link:
#341
**FRD #7: Placeholder FRD Documents** > **Brands Module** >
~1 tok
###
#342
**FRD #7: Placeholder FRD Documents** > **Subscription Module**
~7 tok
## **Subscription Module**
#343
**FRD #7: Placeholder FRD Documents** > **Subscription Module** > Status: Separate FRD Required
~12 tok
### Status: Separate FRD Required Link: ###