diff --git a/config/locales/models/account/en.yml b/config/locales/models/account/en.yml
index 4b199653c..e4c882b9c 100644
--- a/config/locales/models/account/en.yml
+++ b/config/locales/models/account/en.yml
@@ -5,8 +5,8 @@ en:
account:
balance: Balance
currency: Currency
- family: Family
- family_id: Family
+ family: "%{moniker}"
+ family_id: "%{moniker}"
name: Name
subtype: Subtype
models:
diff --git a/config/locales/models/user/en.yml b/config/locales/models/user/en.yml
index 9b66de68d..c94bbad77 100644
--- a/config/locales/models/user/en.yml
+++ b/config/locales/models/user/en.yml
@@ -4,8 +4,8 @@ en:
attributes:
user:
email: Email
- family: Family
- family_id: Family
+ family: "%{moniker}"
+ family_id: "%{moniker}"
first_name: First Name
last_name: Last Name
password: Password
diff --git a/config/locales/views/invitation_mailer/en.yml b/config/locales/views/invitation_mailer/en.yml
index abd6d22e5..02e7036d3 100644
--- a/config/locales/views/invitation_mailer/en.yml
+++ b/config/locales/views/invitation_mailer/en.yml
@@ -3,6 +3,6 @@ en:
invitation_mailer:
invite_email:
accept_button: Accept Invitation
- body: "%{inviter} has invited you to join the %{family} family on %{product_name}!"
+ body: "%{inviter} has invited you to join the %{family} %{moniker} on %{product_name}!"
expiry_notice: This invitation will expire in %{days} days
greeting: Welcome to %{product_name}!
diff --git a/config/locales/views/invitations/en.yml b/config/locales/views/invitations/en.yml
index 3a2cde81c..45c2d51a5 100644
--- a/config/locales/views/invitations/en.yml
+++ b/config/locales/views/invitations/en.yml
@@ -23,5 +23,5 @@ en:
role_label: Role
role_member: Member
submit: Send Invitation
- subtitle: Send an invitation to join your family account on %{product_name}
+ subtitle: Send an invitation to join your %{moniker} account on %{product_name}
title: Invite Someone
diff --git a/config/locales/views/merchants/en.yml b/config/locales/views/merchants/en.yml
index aeb0fead5..efd51ba76 100644
--- a/config/locales/views/merchants/en.yml
+++ b/config/locales/views/merchants/en.yml
@@ -18,10 +18,10 @@ en:
new: New merchant
merge: Merge merchants
title: Merchants
- family_title: Family merchants
- family_empty: No family merchants yet
+ family_title: "%{moniker} merchants"
+ family_empty: "No %{moniker} merchants yet"
provider_title: Provider merchants
- provider_empty: No provider merchants linked to this family yet
+ provider_empty: "No provider merchants linked to this %{moniker} yet"
provider_read_only: Provider merchants are synced from your connected institutions. They cannot be edited here.
provider_info: These merchants were automatically detected by your bank connections or AI. You can edit them to create your own copy, or remove them to unlink from your transactions.
unlinked_title: Recently unlinked
diff --git a/config/locales/views/onboardings/en.yml b/config/locales/views/onboardings/en.yml
index 296c0b80c..c265f8c64 100644
--- a/config/locales/views/onboardings/en.yml
+++ b/config/locales/views/onboardings/en.yml
@@ -16,8 +16,13 @@ en:
first_name_placeholder: First name
last_name: Last name
last_name_placeholder: Last name
+ group_name: Group name
+ group_name_placeholder: Group name
household_name: Household name
household_name_placeholder: Household name
+ moniker_prompt: "Will be using %{product_name} with ..."
+ moniker_family: Family members (just yourself or with partner, teens, etc.)
+ moniker_group: Group of people (company, club, association, any other type)
country: Country
submit: Continue
preferences:
@@ -58,4 +63,4 @@ en:
in_40_days: In 40 days (%{date})
in_40_days_description: We'll notify you to remind you to export your data.
in_45_days: In 45 days (%{date})
- in_45_days_description: We delete your data — contribute to continue using Sure here!
\ No newline at end of file
+ in_45_days_description: We delete your data — contribute to continue using Sure here!
diff --git a/config/locales/views/registrations/en.yml b/config/locales/views/registrations/en.yml
index d8f86dfea..7f61905f9 100644
--- a/config/locales/views/registrations/en.yml
+++ b/config/locales/views/registrations/en.yml
@@ -15,7 +15,7 @@ en:
success: You have signed up successfully.
new:
invitation_message: "%{inviter} has invited you to join as a %{role}"
- join_family_title: Join %{family}
+ join_family_title: Join %{family} %{moniker}
role_admin: administrator
role_guest: guest
role_member: member
diff --git a/config/locales/views/settings/en.yml b/config/locales/views/settings/en.yml
index 27d8cee29..55730d2b6 100644
--- a/config/locales/views/settings/en.yml
+++ b/config/locales/views/settings/en.yml
@@ -80,10 +80,12 @@ en:
reset_account_with_sample_data_warning: Delete all your existing data and then load fresh sample data so you can explore with a pre-filled environment.
email: Email
first_name: First Name
+ group_form_input_placeholder: Enter group name
+ group_form_label: Group name
+ group_title: Group Members
household_form_input_placeholder: Enter household name
household_form_label: Household name
- household_subtitle: Invite family members, partners and other inviduals. Invitees
- can login to your household and access your shared accounts.
+ household_subtitle: Invitees can login to your %{moniker} account and access shared resources.
household_title: Household
invitation_link: Invitation link
invite_member: Add member
diff --git a/config/locales/views/simplefin_items/en.yml b/config/locales/views/simplefin_items/en.yml
index 216f9cc2d..9929eb64c 100644
--- a/config/locales/views/simplefin_items/en.yml
+++ b/config/locales/views/simplefin_items/en.yml
@@ -87,7 +87,7 @@ en:
description: Select a SimpleFIN account to link to your existing account
cancel: Cancel
link_account: Link account
- no_accounts_found: No SimpleFIN accounts found for this family.
+ no_accounts_found: "No SimpleFIN accounts found for this %{moniker}."
wait_for_sync: If you just connected or synced, try again after the sync completes.
unlink_to_move: To move a link, first unlink it from the account’s actions menu.
all_accounts_already_linked: All SimpleFIN accounts appear to be linked already.
diff --git a/db/migrate/20260211101500_add_moniker_to_families.rb b/db/migrate/20260211101500_add_moniker_to_families.rb
new file mode 100644
index 000000000..fa79636a4
--- /dev/null
+++ b/db/migrate/20260211101500_add_moniker_to_families.rb
@@ -0,0 +1,5 @@
+class AddMonikerToFamilies < ActiveRecord::Migration[7.2]
+ def change
+ add_column :families, :moniker, :string, null: false, default: "Family"
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 785ba1fa3..fe8f6523b 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -501,6 +501,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_02_11_120001) do
t.boolean "recurring_transactions_disabled", default: false, null: false
t.integer "month_start_day", default: 1, null: false
t.string "vector_store_id"
+ t.string "moniker", default: "Family", null: false
t.check_constraint "month_start_day >= 1 AND month_start_day <= 28", name: "month_start_day_range"
end
diff --git a/test/controllers/onboardings_controller_test.rb b/test/controllers/onboardings_controller_test.rb
index a0b886c38..bb4641371 100644
--- a/test/controllers/onboardings_controller_test.rb
+++ b/test/controllers/onboardings_controller_test.rb
@@ -17,6 +17,16 @@ class OnboardingsControllerTest < ActionDispatch::IntegrationTest
assert_select "h1", text: /set up your account/i
end
+
+ test "onboarding setup includes required moniker selection" do
+ get onboarding_url
+ assert_response :success
+
+ assert_select "input[name='user[family_attributes][moniker]'][value='Family'][required]"
+ assert_select "input[name='user[family_attributes][moniker]'][value='Group'][required]"
+ assert_select "p", text: /Will be using Sure with/i
+ end
+
test "should get preferences" do
get preferences_onboarding_url
assert_response :success
diff --git a/test/models/family_test.rb b/test/models/family_test.rb
index b0fb3632e..240547c6e 100644
--- a/test/models/family_test.rb
+++ b/test/models/family_test.rb
@@ -36,6 +36,19 @@ class FamilyTest < ActiveSupport::TestCase
end
end
+
+ test "moniker helpers return expected singular and plural labels" do
+ family = families(:dylan_family)
+
+ family.update!(moniker: "Family")
+ assert_equal "Family", family.moniker_label
+ assert_equal "Families", family.moniker_label_plural
+
+ family.update!(moniker: "Group")
+ assert_equal "Group", family.moniker_label
+ assert_equal "Groups", family.moniker_label_plural
+ end
+
test "available_merchants includes family merchants without transactions" do
family = families(:dylan_family)