Skip to content

[$175] [UseDot] Add a Join modal with Terms of Service and Privacy Policy to all sign-up paths #106366

Closed

Description

@melvin-bot

Problem

Sign-up paths on use.expensify.com (UseDot) should consistently show the Terms of Service and Privacy Policy alongside a sign-up CTA before the user creates an account. Add a Join-style pop-up modal, mirroring the experience on expensify.com, across every UseDot page with a sign-up path.

Proposed plan

  1. Audit every UseDot page and sign-up entry point, including hero and closing forms, inline forms, sign-up links/buttons, existing sign-up modals, and Google sign-up options. Cover all pages, not only the new landing page.
  2. Route these entry points through a consistent Join-style modal. Update existing sign-up modals rather than opening a second modal on top of them.
  3. Show the email field, a Join CTA, any supported Google sign-up option, and this footer:

    By logging in, you agree to our terms of service and privacy policy.
    Link the relevant text to https://www.expensify.com/terms and https://www.expensify.com/privacy.

  4. Do not include the “I want to” qualifier. Remove the question and its client-side validation so no selection is required for email or Google sign-up.
  5. Carry any email already entered on the page into the modal.
  6. Opening the modal must not submit the sign-up form or initiate Google OAuth. Only the corresponding CTA inside the modal, with the footer visible, should continue sign-up.
  7. Preserve existing tracking, attribution, referral information, and supported sign-up parameters when moving from the page to the modal and completing sign-up.
  8. Ensure future sign-up entry points, including in-article fields, use the same modal experience.

Scope

This is frontend work for the UseDot website, not a change to the NewDot app's sign-in UI. Keep existing account-creation and Google authentication behavior; no backend changes are expected for the proposed experience. Storing a server-side record of terms acceptance is outside this scope.

Acceptance criteria

  • Every UseDot page with a sign-up path presents the Join-style modal before account creation.
  • All sign-up entry points are covered, including inline/email forms, links/buttons, existing modals, and Google sign-up options where supported.
  • The modal displays the existing Join footer alongside its CTAs, with working Terms of Service and Privacy Policy links.
  • No “I want to” question is shown or required for either email or Google sign-up.
  • Previously entered email addresses are prefilled in the modal.
  • Neither account creation nor Google OAuth starts until the user clicks its corresponding CTA inside the modal.
  • Existing tracking, attribution, referral information, and supported sign-up parameters are retained.
  • Existing modals are reused or updated without nested/duplicate modal steps.

Suggested verification

  • Exercise each distinct sign-up entry point across UseDot pages on desktop and mobile layouts.
  • Confirm the footer is visible before either email sign-up or Google OAuth starts.
  • Confirm sign-up works without a qualifier selection.
  • Confirm email prefill and attribution/referral parameters survive the modal transition.
  • Confirm closing the modal does not create an account or start OAuth, and reopening it remains usable.
Upwork Automation - Do Not Edit
Issue OwnerCurrent Issue Owner: @roryabraham

Activity

  1. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Nov 9, 2026
  2. added theissue type on Nov 9, 2026
  3. melvin-bot commented on Nov 9, 2026

    @melvin-bot
    Author

    Triggered auto assignment to Contributor-plus team member for initial proposal review - @cretadn22 (External)

  4. changed the title [-][UseDot] Add a Join modal with Terms of Service and Privacy Policy to all sign-up paths[/-] [+][$175] [UseDot] Add a Join modal with Terms of Service and Privacy Policy to all sign-up paths[/+] on Nov 9, 2026
  5. melvin-bot commented on Nov 9, 2026

    @melvin-bot
    Author
  6. kevinjosh10 commented on Nov 9, 2026

    @kevinjosh10

    Proposal

    What is the root cause of that problem?

    Currently, sign-up entry points across use.expensify.com (UseDot) handle account creation through multiple disparate mechanisms (inline email submit forms, hero sections, article sign-up inputs, and direct Google sign-up buttons) rather than a centralized, unified Join modal. Furthermore:

    1. Some existing entry points initiate direct submissions or Google OAuth without explicitly displaying the required Terms of Service and Privacy Policy legal consent footer (By logging in, you agree to our terms of service and privacy policy.).
    2. Several sign-up modals still feature the legacy "I want to" qualifier question with required client-side selection validation, creating onboarding friction.
    3. Emails pre-entered into inline hero/footer input fields are not consistently carried over into the modal dialog, forcing duplicate user input.

    What changes do you think we should make in order to solve the problem?

    1. Centralized Join Modal Architecture:

      • Implement/update a unified Join modal component on UseDot that serves as the single target modal for all sign-up triggers (hero forms, closing forms, in-article inputs, navigation buttons, and footer forms).
      • Ensure existing sign-up modals are updated in-place rather than launching nested or duplicate modal overlays.
    2. Form Elements & Legal Footer:

      • Include the email text input field, a primary Join CTA button, and the supported Google OAuth button.
      • Attach the mandatory consent footer directly adjacent to the CTAs:

        By logging in, you agree to our terms of service and privacy policy.

      • Link the anchor text to https://www.expensify.com/terms and https://www.expensify.com/privacy with target="_blank" and rel="noopener noreferrer".
    3. Qualifier Removal:

      • Remove the "I want to" intent qualifier radio/dropdown selection and eliminate its client-side validation logic so that neither email submission nor Google OAuth is gated on qualifier selection.
    4. Prefill & State Propagation:

      • On clicking any page-level sign-up trigger, capture any value currently present in the corresponding on-page email input and pre-populate the modal's email field.
      • Opening the modal will strictly display the dialog without submitting the form or triggering Google OAuth. Form submission or OAuth redirect will occur exclusively upon clicking the primary Join CTA or Google button inside the modal dialog while the legal footer is visible.
    5. Tracking & Attribution Preservation:

      • Retain all existing URL parameters, referral tokens, UTM tracking parameters, and marketing attribution data across the transition from page to modal and pass them through to the sign-up payload.

    What alternative solutions did you explore? (Optional)

    Displaying inline Terms of Service checkboxes across every individual page section, which was rejected as it clutters individual landing pages and fails to provide a cohesive, auditable sign-up experience across mobile and desktop viewports.

  7. TassioSales commented on Nov 9, 2026

    @TassioSales

    Contributor details
    Your Expensify account email: tassiolucian.ljs@gmail.com
    Upwork Profile Link: https://www.upwork.com/freelancers/~0179cdc82689f205c7

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    Sign-up entry points across use.expensify.com (UseDot) do not consistently present the Terms of Service and Privacy Policy agreements in a standardized Join modal prior to account creation.

    What is the root cause of that problem?

    Marketing landing pages on UseDot contain disparate CTA buttons that link directly to onboarding or auth entry paths without channeling through a unified JoinModal component that enforces the standardized legal disclosure view.

    What changes do you think we should make in order to solve the problem?

    1. Create or standardize a reusable JoinModal component containing the Terms of Service, Privacy Policy, and sign-up CTA.
    2. Route all sign-up CTA button triggers on UseDot pages through this shared JoinModal component.
    3. Ensure modal state management preserves intended navigation parameters and utm tracking tags upon completion.

    What alternative solutions did you explore? (Optional)

    • Adding inline disclaimer links beneath every individual button on all pages: Rejected because a centralized modal provides a consistent, clean brand experience mirroring expensify.com.

    What automated tests can you add to prevent this from re-occurring?

    In tests/unit/JoinModalTest.ts:

    • Add unit tests verifying that JoinModal renders valid links to Terms of Service and Privacy Policy and correctly fires the sign-up submission handler.
  8. melvin-bot commented on Nov 9, 2026

    @melvin-bot
    Author

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  9. dylanexpensify commented on Nov 11, 2026

    @dylanexpensify
    Contributor

    @cretadn22 let's use Mel

  10. cretadn22 commented on Nov 11, 2026

    @cretadn22
    Contributor

    @MelvinBot Investigate this issue

  11. MelvinBot commented on Nov 11, 2026

    @MelvinBot
    Contributor

    Investigation findings

    The reported behavior is supported by UseDot’s publicly served HTML and JavaScript, but the implementation is outside the inspected App source.

    What is the root cause of that problem?

    The UseDot homepage contains an existing sign-up modal and separate inline forms. Inspection found:

    • The modal lacks the requested legal disclosure.
    • Email and Google handlers require the “I want to” selection.
    • Inline submission and Google continuation do not first present the requested Join disclosure modal.

    This is static-code evidence, not browser verification or a complete audit of every UseDot page.

    Why changing NewDot would not address this

    NewDot already renders its legal disclosure alongside the Join button in SignUpWelcomeForm.tsx:53–77, using Terms.tsx:9–16.

    UseDot serves a separate marketing-site implementation. I did not find the proposed React JoinModal implementation in App, so the existing proposals’ component and test-file suggestions are not verified implementation targets.

    What changes do you think we should make in order to solve the problem?

    Escalate to an internal engineer with access to the UseDot website source. The owning source repository was not established, so an App implementation proposal would be premature.

    The remaining investigation needs to establish:

    • Every distinct sign-up entry point across pages.
    • Email prefill, close/reopen behavior, and modal reuse.
    • Preservation of existing attribution and supported sign-up parameters.
    • That opening the modal never submits or starts OAuth.

    No code changes were made.


    view run

  12. cretadn22 commented on Nov 11, 2026

    @cretadn22
    Contributor

    UseDot isn't built from the App repo, so a JoinModal in App wouldn't affect use.expensify.com, and NewDot already shows the Terms/Privacy footer in SignUpWelcomeForm. I agree with MelvinBot's findings. @dylanexpensify, can we move this to an internal engineer with access to the UseDot website source?

    🎀👀🎀 C+ reviewed

  13. melvin-bot commented on Nov 11, 2026

    @melvin-bot
    Author

    Triggered auto assignment to @roryabraham, see https://stackoverflow.com/c/expensify/questions/7972 for more details.

  14. roryabraham commented on Nov 11, 2026

    @roryabraham
    Contributor

    @MelvinBot close this issue and reopen it in https://github.com/Expensify/Expensify

  15. MelvinBot commented on Nov 11, 2026

    @MelvinBot
    Contributor

    Closed this issue and reopened it in Expensify/Expensify: Add a Join modal with Terms of Service and Privacy Policy to all sign-up paths, assigned to roryabraham, with the requirements and investigation context preserved.


    view run

  16. dylanexpensify commented on Nov 13, 2026

    @dylanexpensify
    Contributor

    thanks @roryabraham!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

DailyKSv2ExternalAdded to denote the issue can be worked on by a contributorImprovementItem broken or needs improvement.

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions