diff --git a/help/_plugins/SitePostRender.rb b/help/_plugins/SitePostRender.rb
index cfc06404436ca..8d341bad4bd46 100644
--- a/help/_plugins/SitePostRender.rb
+++ b/help/_plugins/SitePostRender.rb
@@ -83,7 +83,7 @@ def self.generate_help_content(site)
output_dir = File.join(site.source, "_src")
FileUtils.mkdir_p(output_dir) unless Dir.exist?(output_dir)
-
+
output_file = File.join(output_dir, "helpContentMap.tsx")
help_content_tree = generate_help_content_tree()
@@ -91,46 +91,46 @@ def self.generate_help_content(site)
help_content_string = to_ts_object(help_content_tree)
components = analyze_used_components(help_content_string)
-
+
# Generate the import block
import_block = generate_imports(components)
ts_output = generate_ts_output(import_block, help_content_string)
-
+
File.write(output_file, ts_output)
puts "✅ Successfully generated helpContent.tsx"
end
- def self.analyze_used_components(content)
- components = {
- 'View' => content.include?(' content.include?(' content.include?(' content.include?(' content.include?(' content.include?(' content.include?(' content.include?(' (
#{jsx_content}
)
TS
end
-
+
current = current[:children][part_key]
end
end
-
+
tree[:content] = <<~JSX
() => null
JSX
tree
end
-
+
def self.html_node_to_RN(node, indent_level = 0)
node_processors = {
'div' => method(:process_div),
@@ -227,12 +228,12 @@ def self.process_div(node, indent_level)
next if child.text? && child.text.strip.empty?
html_node_to_RN(child, indent_level + 1)
end.compact.join("\n")
-
+
"#{' ' * indent_level}\n#{children}\n#{' ' * indent_level}"
end
def self.process_heading(node, indent_level)
- return "#{' ' * indent_level}#{node.text.strip}"
+ return "#{' ' * indent_level}#{CGI.escapeHTML(node.text).strip}"
end
def self.process_unordered_list(node, indent_level)
@@ -240,13 +241,13 @@ def self.process_unordered_list(node, indent_level)
contains_ul = li.xpath('.//ul').any?
li_parts = li.children.map { |child| html_node_to_RN(child, 0) }
-
+
if contains_ul
indented_li_parts = li_parts.map do |part|
part.lines.map { |line| "#{' ' * (indent_level + 3)}#{line.rstrip}" }.join("\n")
end.join("\n")
-
+
"#{' ' * (indent_level + 2)}<>\n#{indented_li_parts}\n#{' ' * (indent_level + 2)}>"
else
"#{' ' * (indent_level + 2)}#{li_parts.join}"
@@ -269,20 +270,20 @@ def self.process_list_item(node, indent_level)
def self.process_paragraph(node, indent_level)
inner = node.children.map { |c| html_node_to_RN(c, indent_level + 1) }.join
-
+
style_classes = ['styles.textNormal']
style_classes << 'styles.mt4' if node.previous_element&.name == 'ul'
style_classes << 'styles.mb4' if node.next_element&.name == 'p'
-
+
"#{' ' * indent_level}#{inner.strip}"
end
def self.process_bold(node, indent_level)
- "#{node.text}"
+ "#{CGI.escapeHTML(node.text)}"
end
def self.process_italic(node, indent_level)
- "#{node.text}"
+ "#{CGI.escapeHTML(node.text)}"
end
def self.process_link(node, indent_level)
@@ -292,7 +293,7 @@ def self.process_link(node, indent_level)
end
def self.process_text(node, indent_level)
- node.text
+ CGI.escapeHTML(node.text)
end
def self.process_default(node, indent_level)
@@ -311,16 +312,16 @@ def self.to_ts_object(obj, indent = 0)
if obj.is_a?(Array)
items = obj.map { |item| to_ts_object(item, indent + 1) }
return "[]" if items.empty?
-
- return "[\n" +
- items.map { |item| "#{spacing} #{item}" }.join(",\n") +
+
+ return "[\n" +
+ items.map { |item| "#{spacing} #{item}" }.join(",\n") +
"\n#{spacing}]"
end
-
+
obj.each do |key, value|
key_str = key.is_a?(Symbol) ? key.to_s : key.inspect
key_line_prefix = ' ' * (indent + 1) + "#{key_str}: "
-
+
if value.is_a?(Hash) || value.is_a?(Array)
nested = to_ts_object(value, indent + 1)
lines << key_line_prefix + nested + ","
@@ -333,11 +334,11 @@ def self.to_ts_object(obj, indent = 0)
lines << key_line_prefix + value.inspect + ","
end
end
-
+
lines << ' ' * indent + "}"
lines.join("\n")
end
-
+
end
end
diff --git a/help/ref/search/index.md b/help/ref/search/index.md
index 88d3e1c0c7fb6..240965237c50d 100644
--- a/help/ref/search/index.md
+++ b/help/ref/search/index.md
@@ -1,9 +1,8 @@
---
layout: product
-title: Expensify Chat
+title: Reports
---
-
# Reports
Virtually all data can be analyzed and reported upon in the Reports page. The major elements of this page include:
diff --git a/help/ref/settings/index.md b/help/ref/settings/index.md
deleted file mode 100644
index a5d82e8071732..0000000000000
--- a/help/ref/settings/index.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: product
-title: Expensify Chat
----
-
-# Settings
-
-Here is where you configure Expensify exactly to your specifications:
-
-- **Profile** - Configure how you appear to others.
-- **Wallet** - See and manage your credit cards and bank accounts.
-- **Preferences** - Adjust how the app works for you.
-- **Security** - Lock down how you and others access your account.
-- **Workspaces** - Organize expenses for yourself and share with others.
-- **Subscriptions** - Manage payment details and history.
-- **Domains** - Advanced security and corporate card configuration.
-- **Switch to Expensify Classic** - Battle tested and reliable.
-- **Save the World** - Let Expensify.org help your favorite teacher!
diff --git a/help/ref/settings/profile/index.md b/help/ref/settings/profile/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/settings/profile/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/settings/security/index.md b/help/ref/settings/security/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/settings/security/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/settings/subscription/index.md b/help/ref/settings/subscription/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/settings/subscription/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/categories/index.md b/help/ref/workspaces/:policyID/categories/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/categories/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/company-cards/index.md b/help/ref/workspaces/:policyID/company-cards/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/company-cards/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/distance-rates/index.md b/help/ref/workspaces/:policyID/distance-rates/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/distance-rates/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/expensify-card/index.md b/help/ref/workspaces/:policyID/expensify-card/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/expensify-card/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/invoices/index.md b/help/ref/workspaces/:policyID/invoices/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/invoices/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/more-features/index.md b/help/ref/workspaces/:policyID/more-features/index.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/help/ref/workspaces/:policyID/overview/index.md b/help/ref/workspaces/:policyID/overview/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/overview/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/per-diem/index.md b/help/ref/workspaces/:policyID/per-diem/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/per-diem/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/reportFields/index.md b/help/ref/workspaces/:policyID/reportFields/index.md
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/help/ref/workspaces/:policyID/rules/index.md b/help/ref/workspaces/:policyID/rules/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/rules/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/tags/index.md b/help/ref/workspaces/:policyID/tags/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/tags/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/taxes/index.md b/help/ref/workspaces/:policyID/taxes/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/taxes/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/:policyID/workflows/index.md b/help/ref/workspaces/:policyID/workflows/index.md
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/help/ref/workspaces/:policyID/workflows/index.md
@@ -0,0 +1 @@
+
diff --git a/help/ref/workspaces/index.md b/help/ref/workspaces/index.md
index 0642446b89e47..52eaf6a26a0e0 100644
--- a/help/ref/workspaces/index.md
+++ b/help/ref/workspaces/index.md
@@ -1,73 +1,29 @@
---
layout: product
-title: Expensify Chat
+title: Workspaces
---
-# Workspaces
+# Workspaces 101
-Workspaces help you manage company expenses, enforce policies, and integrate with accounting software. Each workspace has its own rules, settings, and features.
+Think of a workspace as mission control for your company’s expenses. It’s where you set the rules, invite the team, and connect to your accounting tools. Each workspace runs independently, so you can keep things tidy across departments, entities, or clients.
-## Creating a Workspace
+## Create a new workspace
+Hit the **New workspace** button to get started. Add a name, set a default currency, and you’re ready to get started customizing the workspace settings!
-**To create a new workspace:**
-1. In the left-hand menu, select **Workspaces**
-2. Click **New workspace**
-3. Click **Name** to give your workspace a name
-4. Click **Default Currency** to set your preferred currency
+## Invite your team
+Add teammates to your workspace to manage expenses and approvals in one central place:
+- Members can submit and approve reports they’re assigned to.
+- Admins can approve all reports and manage workspace settings.
-**Your first workspace includes:**
-- Free 30-day trial
-- Access to Setup Specialist via #admins chat room
-- Help from Concierge in your Inbox
+## Automate approvals
+Toggle on **Add Approvals** under **Workflows** to set a default first approver. Create custom approval flows for individual team members if needed.
-## Managing Members
+## Connect your accounting system
+Link your workspace with QuickBooks Online, Xero, NetSuite, or Sage Intacct to sync expenses like a pro.
-**To invite team members:**
-1. Click **Members** in the left-hand menu
-2. Click **Invite member**
-3. Enter names, emails, or phone numbers
-4. Click **Next**, add an optional message, and click **Invite**
-
-**Member vs Admin roles:**
-- **Members** can submit their own reports and approve assigned reports
-- **Admins** can approve all workspace reports, view all reports, and edit workspace settings
-
-**To assign admin roles:**
-1. Select **Members** in the left-hand menu
-2. Click a member's name
-3. Click **Role** and select **Admin**
-
-## Key Features
-
-**Categories** - Organize and track expenses (imported automatically if connected to accounting software)
-
-**Approval Workflows** - Automate expense report reviews:
-- Toggle **Add Approvals** on under **Workflows**
-- Set a default first approver for all expenses
-- Create custom workflows for specific members
-
-**Accounting Integrations** - Connect to:
-- QuickBooks Online
-- Xero
-- NetSuite
-- Sage Intacct
-
-**Additional Features** (enable via **More Features**):
-- Expensify Cards for company spending
-- Distance tracking for mileage
-- Tags for detailed expense coding
-- Company card connections
-
-## Workspace Settings
-
-Access all workspace configuration from the **Workspaces** tab:
-- **Overview** - Name, currency, description, and sharing options
-- **Members** - Invite, remove, and manage member roles
-- **Categories** - Add and organize expense categories
-- **Workflows** - Set up approval and payment processes
-- **More Features** - Enable additional workspace capabilities
+## Enhance your workspace with extra features
+Under **More Features**, enable extras like the Expensify Card, distance rates, custom categories and tags, and company card connections.
---
-**Tip:** Use the **Share** option on your workspace profile to get an invite link or QR code for easy member onboarding.
-
+**Tip:** If you manage multiple departments, clients, or entities, consider creating multiple workspaces. Separate workspaces can help keep settings, approvals, and payments organized and more automated.
diff --git a/src/components/SidePanel/HelpContent/helpContentMap.tsx b/src/components/SidePanel/HelpContent/helpContentMap.tsx
index 79228e32923f6..1b212702f12ee 100644
--- a/src/components/SidePanel/HelpContent/helpContentMap.tsx
+++ b/src/components/SidePanel/HelpContent/helpContentMap.tsx
@@ -24,160 +24,6 @@ type HelpContent = {
const helpContentMap: HelpContent = {
children: {
- ':action': {
- children: {
- ':iouType': {
- children: {
- start: {
- children: {
- ':transactionID': {
- children: {
- ':reportID': {
- children: {
- scan: {
- children: {
- ':backToReport': {
- content: ({styles}: {styles: ThemeStyles}) => (
-
- Scan Receipt
- SmartScan automatically extracts expense details from receipt images.
- How to Scan
-
- What SmartScan Detects
-
- Amount and currency
- ,
-
- Merchant name and location
- ,
-
- Date of purchase
- ,
-
- Tax information (when visible)
- ,
-
- Category suggestions based on merchant type
- ,
- ]}
- />
- Supported Receipt Types
-
- Photos - Take with your device camera
- ,
-
- Email receipts - Forward to receipts@expensify.com
- ,
-
- PDF receipts - Upload from your device
- ,
-
- Screenshots - From apps or websites
- ,
- ]}
- />
- Tips for Best Results
- Ensure receipt text is clear and readable,
- Include the full receipt in the image,
- Good lighting improves accuracy,
- Straight angles work better than tilted photos,
- ]}
- />
- After Scanning
- Review extracted details for accuracy,
- Add description, category, or tags as needed,
- SmartScan learns from your corrections,
- ]}
- />
- Related Links
-
-
- Create an Expense
-
- ,
-
-
- Free Features in Expensify
-
- ,
- ]}
- />
-
- ),
- },
- },
- },
- distance: {
- children: {
- ':backToReport': {
- content: ({styles}: {styles: ThemeStyles}) => (
-
- Distance Expense
-
- Easily track mileage costs using Expensify’s built-in map feature. Create and submit distance-based expenses right
- from the web, desktop, or mobile app.
-
-
-
- Create distance expenses: Click the green + button and choose Create
- expense, then select Distance. Enter your starting point and destination. You can also add stops if
- needed.
-
- ,
-
-
- Submit for approval: Choose your workspace and confirm the distance,
- amount, and date. Add optional notes or categories, then click Create expense to submit the mileage
- expense for approval.
-
- ,
-
-
- Log a round-trip: To log a round-trip, use the same location for both
- start and finish, and include any stops along the way.
-
- ,
- ]}
- />
-
- ),
- },
- },
- },
- },
- },
- },
- },
- },
- },
- },
- },
- },
- },
r: {
children: {
':concierge': {
@@ -398,8 +244,8 @@ const helpContentMap: HelpContent = {
Text – Rich text messages stored securely and delivered via web, app, email, or SMS.
,
- Images & Documents – Insert photos, screenshots, movies, PDFs, or more, using copy/paste, drag/drop, or the attach
- button.
+ Images & Documents – Insert photos, screenshots, movies, PDFs, or more, using copy/paste, drag/drop, or the
+ attach button.
,
Expenses – Share an expense in the chat, either to simply track and document it, or to submit for reimbursement.
@@ -614,44 +460,6 @@ const helpContentMap: HelpContent = {
),
},
},
- content: ({styles}: {styles: ThemeStyles}) => (
-
- Settings
- Here is where you configure Expensify exactly to your specifications:
-
- Profile - Configure how you appear to others.
- ,
-
- Wallet - See and manage your credit cards and bank accounts.
- ,
-
- Preferences - Adjust how the app works for you.
- ,
-
- Security - Lock down how you and others access your account.
- ,
-
- Workspaces - Organize expenses for yourself and share with others.
- ,
-
- Subscriptions - Manage payment details and history.
- ,
-
- Domains - Advanced security and corporate card configuration.
- ,
-
- Switch to Expensify Classic - Battle tested and reliable.
- ,
-
- Save the World - Let Expensify.org help your favorite teacher!
- ,
- ]}
- />
-
- ),
},
workspaces: {
children: {
@@ -822,7 +630,7 @@ const helpContentMap: HelpContent = {
Alternative: Share workspace URL or QR code from{' '}
- Settings > Profile > Share
+ Settings > Profile > Share
Managing Members
@@ -937,118 +745,41 @@ const helpContentMap: HelpContent = {
},
content: ({styles}: {styles: ThemeStyles}) => (
- Workspaces
-
- Workspaces help you manage company expenses, enforce policies, and integrate with accounting software. Each workspace has its own rules, settings, and features.
-
- Creating a Workspace
+ Workspaces 101
- To create a new workspace:
+ Think of a workspace as mission control for your company’s expenses. It’s where you set the rules, invite the team, and connect to your accounting tools. Each
+ workspace runs independently, so you can keep things tidy across departments, entities, or clients.
-
+ Create a new workspace
- Your first workspace includes:
+ Hit the New workspace button to get started. Add a name, set a default currency, and you’re ready to get started customizing the
+ workspace settings!
+ Invite your team
+ Add teammates to your workspace to manage expenses and approvals in one central place:
Free 30-day trial,
- Access to Setup Specialist via #admins chat room,
- Help from Concierge in your Inbox,
+ Members can submit and approve reports they’re assigned to.,
+ Admins can approve all reports and manage workspace settings.,
]}
/>
- Managing Members
+ Automate approvals
- To invite team members:
+ Toggle on Add Approvals under Workflows to set a default first approver. Create custom
+ approval flows for individual team members if needed.
-
+ Connect your accounting system
+ Link your workspace with QuickBooks Online, Xero, NetSuite, or Sage Intacct to sync expenses like a pro.
+ Enhance your workspace with extra features
- Member vs Admin roles:
-
-
- Members can submit their own reports and approve assigned reports
- ,
-
- Admins can approve all workspace reports, view all reports, and edit workspace settings
- ,
- ]}
- />
-
- To assign admin roles:
+ Under More Features, enable extras like the Expensify Card, distance rates, custom categories and tags, and company card
+ connections.
- Key Features
-
- Categories - Organize and track expenses (imported automatically if connected to accounting software)
-
- Approval Workflows - Automate expense report reviews:
-
-
- Toggle Add Approvals on under Workflows
- ,
- Set a default first approver for all expenses,
- Create custom workflows for specific members,
- ]}
- />
-
- Accounting Integrations - Connect to:
-
- QuickBooks Online,
- Xero,
- NetSuite,
- Sage Intacct,
- ]}
- />
-
- Additional Features (enable via More Features):
-
- Expensify Cards for company spending,
- Distance tracking for mileage,
- Tags for detailed expense coding,
- Company card connections,
- ]}
- />
- Workspace Settings
-
- Access all workspace configuration from the Workspaces tab:
-
-
- Overview - Name, currency, description, and sharing options
- ,
-
- Members - Invite, remove, and manage member roles
- ,
-
- Categories - Add and organize expense categories
- ,
-
- Workflows - Set up approval and payment processes
- ,
-
- More Features - Enable additional workspace capabilities
- ,
- ]}
- />
-
-
- Tip: Use the Share option on your workspace profile to get an invite link or QR code for
- easy member onboarding.
+ Tip: If you manage multiple departments, clients, or entities, consider creating multiple workspaces. Separate workspaces can
+ help keep settings, approvals, and payments organized and more automated.
),
@@ -1236,7 +967,7 @@ const helpContentMap: HelpContent = {
Text messages with rich formatting support
,
- Images & Documents via copy/paste, drag/drop, or attach button
+ Images & Documents via copy/paste, drag/drop, or attach button
,
Expenses to track and submit for reimbursement
@@ -1284,6 +1015,160 @@ const helpContentMap: HelpContent = {
),
},
+ ':action': {
+ children: {
+ ':iouType': {
+ children: {
+ start: {
+ children: {
+ ':transactionID': {
+ children: {
+ ':reportID': {
+ children: {
+ distance: {
+ children: {
+ ':backToReport': {
+ content: ({styles}: {styles: ThemeStyles}) => (
+
+ Distance Expense
+
+ Easily track mileage costs using Expensify’s built-in map feature. Create and submit distance-based expenses right
+ from the web, desktop, or mobile app.
+
+
+
+ Create distance expenses: Click the green + button and choose Create
+ expense, then select Distance. Enter your starting point and destination. You can also add stops if
+ needed.
+
+ ,
+
+
+ Submit for approval: Choose your workspace and confirm the distance,
+ amount, and date. Add optional notes or categories, then click Create expense to submit the mileage
+ expense for approval.
+
+ ,
+
+
+ Log a round-trip: To log a round-trip, use the same location for both
+ start and finish, and include any stops along the way.
+
+ ,
+ ]}
+ />
+
+ ),
+ },
+ },
+ },
+ scan: {
+ children: {
+ ':backToReport': {
+ content: ({styles}: {styles: ThemeStyles}) => (
+
+ Scan Receipt
+ SmartScan automatically extracts expense details from receipt images.
+ How to Scan
+
+ What SmartScan Detects
+
+ Amount and currency
+ ,
+
+ Merchant name and location
+ ,
+
+ Date of purchase
+ ,
+
+ Tax information (when visible)
+ ,
+
+ Category suggestions based on merchant type
+ ,
+ ]}
+ />
+ Supported Receipt Types
+
+ Photos - Take with your device camera
+ ,
+
+ Email receipts - Forward to receipts@expensify.com
+ ,
+
+ PDF receipts - Upload from your device
+ ,
+
+ Screenshots - From apps or websites
+ ,
+ ]}
+ />
+ Tips for Best Results
+ Ensure receipt text is clear and readable,
+ Include the full receipt in the image,
+ Good lighting improves accuracy,
+ Straight angles work better than tilted photos,
+ ]}
+ />
+ After Scanning
+ Review extracted details for accuracy,
+ Add description, category, or tags as needed,
+ SmartScan learns from your corrections,
+ ]}
+ />
+ Related Links
+
+
+ Create an Expense
+
+ ,
+
+
+ Free Features in Expensify
+
+ ,
+ ]}
+ />
+
+ ),
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
},
content: () => null,
};