Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
233db29
Merge pull request #95100 from Expensify/main
stephanieelliott Jul 1, 2026
fa2d5c6
Reorganize Billing & Subscriptions hub into subfolders.
stephanieelliott Jul 1, 2026
5111e99
Create How-Subscriptions-Plans-and-Billing-Work.md
stephanieelliott Jul 1, 2026
f60b52e
Create Understand-Billing-Terms-and-Definitions.md
stephanieelliott Jul 1, 2026
a5743b4
Create Understand-Workspace-Ownership.md
stephanieelliott Jul 1, 2026
f66b27b
Update links in Understand Workspace Ownership article
stephanieelliott Jul 1, 2026
fffced4
Update Understand-Billing-Terms-and-Definitions.md
stephanieelliott Jul 2, 2026
6954637
Update billing responsibilities and ownership terminology
stephanieelliott Jul 2, 2026
cab53f7
Update How-Subscriptions-Plans-and-Billing-Work.md
stephanieelliott Jul 2, 2026
c55b019
Update Understand-Billing-Terms-and-Definitions.md
stephanieelliott Jul 2, 2026
c3c1771
Update and rename Add-a-payment-card-and-view-your-subscription.md to…
stephanieelliott Jul 2, 2026
9fda5b9
Update and rename Changing-Your-Workspace-Plan.md to Change-Your-Work…
stephanieelliott Jul 2, 2026
74d6497
Update and rename Plan-types-and-pricing.md to Compare-Collect-and-Co…
stephanieelliott Jul 2, 2026
837a8cb
Update and rename Tax-Exemption.md to Request-Tax-Exemption.md
stephanieelliott Jul 2, 2026
1a2d304
Revise Expensify pricing details and billing information
stephanieelliott Jul 2, 2026
eff09db
Update How-Subscriptions-Plans-and-Billing-Work.md
stephanieelliott Jul 2, 2026
c098efc
Update Understand-Billing-Terms-and-Definitions.md
stephanieelliott Jul 2, 2026
b4a7aaf
Update Understand-Workspace-Ownership.md
stephanieelliott Jul 2, 2026
c7a15ae
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 2, 2026
4d25973
Update Understand-Expensify-Pricing.md
stephanieelliott Jul 2, 2026
ad26c16
Update Request-Tax-Exemption.md
stephanieelliott Jul 2, 2026
8fce9d4
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 2, 2026
4f42ccb
Update View-Your-Plan-and-Subscription.md
stephanieelliott Jul 2, 2026
a758c03
Update How-Subscriptions-Plans-and-Billing-Work.md
stephanieelliott Jul 2, 2026
a32774c
Update redirects.csv
stephanieelliott Jul 2, 2026
2c2049f
Update redirects.csv
stephanieelliott Jul 2, 2026
b93162b
Create Understand-Why-Billing-Issues-Occur.md
stephanieelliott Jul 2, 2026
ab58ced
Create Fix-a-Billing-Issue.md
stephanieelliott Jul 2, 2026
fd1d92a
Clarify billing issue explanations and add links
stephanieelliott Jul 2, 2026
ec766f0
Update redirects.csv
stephanieelliott Jul 2, 2026
6746a87
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 2, 2026
3f93791
Rename learn-about-plans section to learn-about-plans-subscriptions-a…
stephanieelliott Jul 2, 2026
9166c5f
Add default handling for hub articles and sections in lhn-template.html
stephanieelliott Jul 2, 2026
66b30be
Update and rename How-Subscriptions-Plans-and-Billing-Work.md to Over…
stephanieelliott Jul 2, 2026
376c08d
Update and rename Understand-Workspace-Ownership.md to Understand-Wor…
stephanieelliott Jul 2, 2026
90a4487
Update View-Your-Plan-and-Subscription.md
stephanieelliott Jul 2, 2026
f276a9d
Order billing hub content and fix links after article renames.
stephanieelliott Jul 2, 2026
e357d6a
Fix pricing currency selector and update section title.
stephanieelliott Jul 2, 2026
7baf0fb
Update Understand-Expensify-Pricing.md
stephanieelliott Jul 2, 2026
aba3f5a
Fix link format for Fix a Billing Issue article
stephanieelliott Jul 2, 2026
e2e30c2
Update Understand-Expensify-Pricing.md
stephanieelliott Jul 2, 2026
7db3ac8
Update View-Your-Plan-and-Subscription.md
stephanieelliott Jul 2, 2026
84eebaf
Revert hub sorting to title and remove unused article order fields.
stephanieelliott Jul 2, 2026
4359787
Enable custom hub ordering for root-level billing articles.
stephanieelliott Jul 2, 2026
1c0b6c4
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 2, 2026
105f3b2
Reorganize billing hub articles and restructure manage sections.
stephanieelliott Jul 3, 2026
36f124b
Update billing hub display order for articles and sections.
stephanieelliott Jul 3, 2026
ec0f16e
Rename Manage Subscription section to Manage Your Plan and Subscription.
stephanieelliott Jul 3, 2026
80c292c
Fix empty nested billing sections in hub and sidebar.
stephanieelliott Jul 3, 2026
e7c043f
Update Fix-a-Billing-Issue.md
stephanieelliott Jul 3, 2026
02eb0a4
Update Fix-a-Billing-Issue.md
stephanieelliott Jul 3, 2026
f7f6e7d
Delete docs/articles/new-expensify/billing-and-subscriptions/manage-y…
stephanieelliott Jul 3, 2026
e41860a
Delete docs/articles/new-expensify/billing-and-subscriptions/manage-y…
stephanieelliott Jul 3, 2026
f41fb8a
Create Fix-a-Billing-Issue.md
stephanieelliott Jul 3, 2026
0b3ec90
Update Learn-How-Billing-and-Subscriptions-Work.md
stephanieelliott Jul 3, 2026
f587a48
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 3, 2026
1ff5505
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 3, 2026
4398f41
Update Understand-Expensify-Pricing.md
stephanieelliott Jul 3, 2026
36414bf
Update Learn-About-Billing-Permissions.md
stephanieelliott Jul 6, 2026
9602f01
Update Learn-About-Billing-Terms-and-Definitions.md
stephanieelliott Jul 6, 2026
a19f054
Update Request-Tax-Exemption.md
stephanieelliott Jul 6, 2026
094be75
Standardize capitalization of 'Workspace'
stephanieelliott Jul 6, 2026
84cacad
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 6, 2026
396d433
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 6, 2026
c90d974
Update Learn-About-Billing-Permissions.md
stephanieelliott Jul 6, 2026
1a7cd71
Update Learn-How-Billing-and-Subscriptions-Work.md
stephanieelliott Jul 6, 2026
06a3662
Update Compare-Collect-and-Control-Plans.md
stephanieelliott Jul 6, 2026
4d063ec
Fix formatting in Expensify Pricing document
stephanieelliott Jul 6, 2026
c0ae455
Update Learn-About-Billing-Terms-and-Definitions.md
stephanieelliott Jul 6, 2026
472580e
Create Learn-How-Subscriptions-Work.md
stephanieelliott Jul 6, 2026
1c69096
Update and rename Learn-How-Subscriptions-Work.md to Learn-About-Subs…
stephanieelliott Jul 6, 2026
d15f81f
Create Learn-About-Plan-and-Subscription-Management.md
stephanieelliott Jul 6, 2026
f2abdf0
Create Manage-Annual-Subscription-Settings.md
stephanieelliott Jul 6, 2026
916cabe
Create Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 6, 2026
a7ac6f4
Create Review -Your Expensify Billing Receipt.md
stephanieelliott Jul 6, 2026
efc9034
Create Transfer-Workspace-Ownership.md
stephanieelliott Jul 6, 2026
e797358
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 6, 2026
5ce8ba0
Update Review -Your Expensify Billing Receipt.md
stephanieelliott Jul 6, 2026
4f62665
Update Transfer-Workspace-Ownership.md
stephanieelliott Jul 7, 2026
9f16234
Update Learn-About-Subscriptions.md
stephanieelliott Jul 7, 2026
b9bbb4b
Fix capitalization in subscription management document
stephanieelliott Jul 7, 2026
2986ba3
Update Manage-Annual-Subscription-Settings.md
stephanieelliott Jul 7, 2026
eafc760
Rename Review -Your Expensify Billing Receipt.md to Review-Your-Expen…
stephanieelliott Jul 7, 2026
4338c23
Update Learn-About-Subscriptions.md
stephanieelliott Jul 7, 2026
7862113
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
2968ec3
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
9415fb9
Update link text for workspace ownership transfer
stephanieelliott Jul 7, 2026
80c5012
Update Transfer-Workspace-Ownership.md
stephanieelliott Jul 7, 2026
b0535a3
Update Manage-Annual-Subscription-Settings.md
stephanieelliott Jul 7, 2026
e6c3e0d
Update Review-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
f0919fa
Update Learn-About-Plan-and-Subscription-Management.md
stephanieelliott Jul 7, 2026
3f25889
Update View-Your-Plan-and-Subscription.md
stephanieelliott Jul 7, 2026
fb4dbaa
Update Manage-Annual-Subscription-Settings.md
stephanieelliott Jul 7, 2026
d419228
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 7, 2026
2ecc66b
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 7, 2026
bfc371f
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
8a44eca
Update Request-Tax-Exemption.md
stephanieelliott Jul 7, 2026
ab130a7
Update Review-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
0eb6b04
Update Learn-About-Subscriptions.md
stephanieelliott Jul 7, 2026
e60c802
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 7, 2026
3f650d0
Update Learn-About-Plan-and-Subscription-Management.md
stephanieelliott Jul 7, 2026
2e7a261
Update Transfer-Workspace-Ownership.md
stephanieelliott Jul 7, 2026
a9cfed1
Update Learn-How-Billing-and-Subscriptions-Work.md
stephanieelliott Jul 8, 2026
c765ddc
Update Change-Your-Workspace-Plan.md
stephanieelliott Jul 9, 2026
68b49c3
Update Learn-About-Plan-and-Subscription-Management.md
stephanieelliott Jul 9, 2026
fd7753d
Update Manage-Annual-Subscription-Settings.md
stephanieelliott Jul 9, 2026
c914b0a
Update View-Your-Plan-and-Subscription.md
stephanieelliott Jul 9, 2026
b504476
Update Find-Your-Expensify-Billing-Receipt.md
stephanieelliott Jul 9, 2026
831bec3
Update Fix-a-Billing-Issue.md
stephanieelliott Jul 9, 2026
6135961
Update Request-Tax-Exemption.md
stephanieelliott Jul 9, 2026
ab294d3
Update Request-Tax-Exemption.md
stephanieelliott Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions .github/scripts/createDocsRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type Article = {
type Section = {
href: string;
title: string;
order?: number;
articles?: Article[];
sections?: Section[];
};
Expand Down Expand Up @@ -115,17 +116,39 @@ function getOrderFromArticleFrontMatter(path: string): number | undefined {
}
}

/**
* Build a section from a directory path, with optional parent path for nested href
*/
function getSectionMeta(sectionPath: string): {title?: string; order?: number} {
try {
const metaPath = `${sectionPath}/_meta.yml`;
if (!fs.existsSync(metaPath)) {
return {};
}
const meta = yaml.load(fs.readFileSync(metaPath, 'utf8')) as Record<string, unknown>;
return {
title: meta.title as string | undefined,
order: meta.order as number | undefined,
};
} catch {
return {};
}
}

function sortSectionsByOrder(sections: Section[]) {
sections.sort((a, b) => (a.order ?? Number.POSITIVE_INFINITY) - (b.order ?? Number.POSITIVE_INFINITY));
}

function buildSection(platformName: string, hub: string, sectionPath: string, parentHref: string): Section {
const sectionName = sectionPath.split('/').pop() ?? sectionPath;
const fullPath = `${docsDir}/articles/${platformName}/${hub}/${sectionPath}`;
const meta = getSectionMeta(fullPath);
const articles: Article[] = [];
const childSections: Section[] = [];
const href = parentHref ? `${parentHref}/${sectionName}` : sectionName;

for (const entry of fs.readdirSync(fullPath)) {
if (entry === '_meta.yml') {
continue;
}

const entryPath = `${fullPath}/${entry}`;
if (entry.endsWith('.md')) {
const order = getOrderFromArticleFrontMatter(entryPath);
Expand All @@ -139,9 +162,12 @@ function buildSection(platformName: string, hub: string, sectionPath: string, pa
// The sort is stable, so articles without an `order` keep their relative position and fall after ordered ones.
articles.sort((a, b) => (a.order ?? Number.POSITIVE_INFINITY) - (b.order ?? Number.POSITIVE_INFINITY));

sortSectionsByOrder(childSections);

const section: Section = {
href,
title: toTitleCase(sectionName.replaceAll('-', ' ')),
title: meta.title ?? toTitleCase(sectionName.replaceAll('-', ' ')),
...(meta.order !== undefined && {order: meta.order}),
...(articles.length > 0 && {articles}),
...(childSections.length > 0 && {sections: childSections}),
};
Expand Down Expand Up @@ -174,7 +200,9 @@ function createHubsWithArticles(hubs: string[], platformName: ValueOf<typeof pla

for (const fileOrFolder of fs.readdirSync(basePath)) {
if (fileOrFolder.endsWith('.md')) {
const articleObj = getArticleObj(fileOrFolder);
const entryPath = `${basePath}/${fileOrFolder}`;
const order = getOrderFromArticleFrontMatter(entryPath);
const articleObj = getArticleObj(fileOrFolder, order);
pushOrCreateEntry(routeHubs, hub, 'articles', articleObj);
continue;
}
Expand All @@ -187,6 +215,7 @@ function createHubsWithArticles(hubs: string[], platformName: ValueOf<typeof pla
// Add flat section list for nested section page lookup
const hubObj = routeHubs.find((obj) => obj.href === hub);
if (hubObj?.sections?.length) {
sortSectionsByOrder(hubObj.sections);
(hubObj as Hub & {flatSections?: Section[]}).flatSections = flattenSections(hubObj.sections);
}
}
Expand Down
2 changes: 1 addition & 1 deletion docs/_data/_routes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ platforms:
description: Manage profile settings and notifications.

- href: billing-and-subscriptions
title: Expensify Billing & Subscriptions
title: Billing & Subscriptions
icon: /assets/images/subscription-annual.svg
description: Review Expensify's subscription options, plan types, and payment methods.

Expand Down
6 changes: 3 additions & 3 deletions docs/_includes/hub.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ <h1 class="title">{{ hub.title }}</h1>
{% assign hubSections = hub.sections | default: emptyItems %}

{% if hub.articles %}
{% assign sortedSectionsAndArticles = hubSections | concat: hubArticles | sort: 'title' %}
{% assign sortedSectionsAndArticles = hubSections | concat: hubArticles | sort: 'order' %}
{% else %}
{% assign sortedSectionsAndArticles = hubSections | sort: 'title' %}
{% assign sortedSectionsAndArticles = hubSections | sort: 'order' %}
{% endif%}

<section>
<div class="cards-group">
{% for item in sortedSectionsAndArticles %}
{% if item.articles %}
{% if item.articles or item.sections %}
{% include section-card.html platform=activePlatform hub=hub.href section=item.href title=item.title %}
{% else %}
{% include article-card.html hub=hub.href href=item.href title=item.title platform=activePlatform %}
Expand Down
63 changes: 60 additions & 3 deletions docs/_includes/lhn-template.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,13 @@
<span>{{ hub.title }}</span>
</div>
<ul class="nested-treeview">
{% assign emptyItems = "" | split: "," %}
{% assign hubArticles = hub.articles | default: emptyItems %}
{% assign hubSections = hub.sections | default: emptyItems %}
{% if hub.articles %}
{% assign sortedSectionsAndArticles = hub.sections | concat: hub.articles | sort: 'title' %}
{% assign sortedSectionsAndArticles = hubSections | concat: hubArticles | sort: 'order' %}
{% else %}
{% assign sortedSectionsAndArticles = hub.sections | sort: 'title' %}
{% assign sortedSectionsAndArticles = hubSections | sort: 'order' %}
{% endif%}
{% for item in sortedSectionsAndArticles %}
{% if item.articles %}
Expand Down Expand Up @@ -151,7 +154,61 @@
{% endif %}
</ul>
{% else %}
<a href="{{ item.href }}" class="icon-with-link link">
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}/{{ item.href }}" class="icon-with-link link">
<img src="/assets/images/arrow-right.svg" class="base-icon"></img>
{{ item.title }}
</a>
{% endif %}
</li>
{% elsif item.sections %}
<li>
{% assign lhnSectionActive = false %}
{% if page.url contains item.href %}
{% assign lhnSectionActive = true %}
{% endif %}
{% if lhnSectionActive %}
<div class="icon-with-link selected">
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}"><img src="/assets/images/down.svg" class="base-icon"></img></a>
<span>{{ item.title }}</span>
</div>
<ul>
{% assign lhnSortedSubsections = item.sections | sort: 'order' %}
{% for subsection in lhnSortedSubsections %}
<li>
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}/{{ subsection.href }}" class="icon-with-link link">
<img src="/assets/images/arrow-right.svg" class="base-icon"></img>
{{ subsection.title }}
</a>
{% if subsection.articles %}
<ul>
{% for article in subsection.articles %}
{% assign article_href = subsection.href | append: '/' | append: article.href %}
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=article_href title=article.title %}
{% endfor %}
</ul>
{% endif %}
{% if subsection.sections %}
<ul>
{% for subsubsection in subsection.sections %}
<li>
<span class="icon-with-link">{{ subsubsection.title }}</span>
{% if subsubsection.articles %}
<ul>
{% for article in subsubsection.articles %}
{% assign article_href = subsubsection.href | append: '/' | append: article.href %}
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=article_href title=article.title %}
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}/{{ item.href }}" class="icon-with-link link">
<img src="/assets/images/arrow-right.svg" class="base-icon"></img>
{{ item.title }}
</a>
Expand Down
6 changes: 4 additions & 2 deletions docs/_includes/section.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ <h1 class="title">
<section>
<div class="cards-group">
{% if section.sections %}
{% for subsection in section.sections %}
{% assign sortedSubsections = section.sections | sort: 'order' %}
{% for subsection in sortedSubsections %}
{% include section-card.html platform=activePlatform hub=hub.href section=subsection.href title=subsection.title %}
{% endfor %}
{% endif %}
{% assign sortedArticles = section.articles | default: empty %}
{% assign emptyItems = "" | split: "," %}
{% assign sortedArticles = section.articles | default: emptyItems %}
{% for article in sortedArticles %}
{% assign article_href = section.href | append: '/' | append: article.href %}
{% include article-card.html hub=hub.href href=article_href title=article.title platform=activePlatform %}
Expand Down

This file was deleted.

Loading
Loading