Skip to content

[No QA] merge main with my branch #85286

Merged
stephanieelliott merged 848 commits intoclaude-refineCardReconciliationArticlesfrom
main
Mar 14, 2026
Merged

[No QA] merge main with my branch #85286
stephanieelliott merged 848 commits intoclaude-refineCardReconciliationArticlesfrom
main

Conversation

@stephanieelliott
Copy link
Contributor

Explanation of Change

Fixed Issues

$
PROPOSAL:

Tests

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

// TODO: These must be filled out, or the issue title must include "[No QA]."

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

mountiny and others added 30 commits March 12, 2026 11:16
…laredAllReportsViolations

[NoQA] Revert "Fix undeclared allReportsViolations in hasVisibleReportFieldViolations"
[CP Staging] Revert "fix: GBR appears when there is report field error"
…-in-as-delegate

Fix transition from OD to ND as delegate
Fix: Android crash std::__ndk1::default_delete<T>::operator() [abi:ne180000]
…ry-logs

[No QA][Sentry] Stop sending activeSpans logs to sentry
…84317-cristi_measure-scan-shortcut"

This reverts commit 4c39ec6, reversing
changes made to be2f7bc.
…roperty-in-type

[No QA] Remove unused property `isCheckingDomain`
…rtcut

[CP Staging] Revert "[No QA] Re-add the "Sentry logs for Scan shortcut" after being reverted"
The sign-in page had multiple elements all rendered as h1
(via accessibilityRole="header" without an explicit aria-level).
This adds aria-level={2} to the footer section titles (Features,
Resources, Learn More, Get Started) and the welcome header, keeping
only the hero text as the sole h1 on the page.

Co-authored-by: Rushat Gabhane <rushatgabhane@users.noreply.github.com>
const halfWidths = labelWidths.map((w) => w / 2);
let additionalOffset = 0;
if (angleRad > 0 && angleRad < DIAGONAL_ANGLE_RADIAN_THRESHOLD) {
additionalOffset = variables.iconSizeExtraSmall / 1.5;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ CONSISTENCY-2 (docs)

The divisor 1.5 is a magic number used for computing the label geometry offset. This value also appears identically in LineChartContent.tsx line 56. Extract it to a named constant in constants.ts to document its purpose and avoid duplication.

// In constants.ts:
/** Divisor for diagonal label additional offset */
const DIAGONAL_LABEL_OFFSET_DIVISOR = 1.5;

// Then use:
additionalOffset = variables.iconSizeExtraSmall / DIAGONAL_LABEL_OFFSET_DIVISOR;

Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

* Labels are start-anchored at the tick: the 45° parallelogram's upper-right corner is
* offset by (iconSize/3 * sinA) left and down, placing the box just below the axis line.
*/
const computeLineLabelGeometry: ComputeGeometryFn = ({ascent, descent, sinA, angleRad, labelWidths, padding}) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ CONSISTENCY-3 (docs)

The computeLineLabelGeometry function (lines 52-70) contains duplicated logic from computeBarLabelGeometry in BarChartContent.tsx (lines 46-68). The additionalOffset calculation (lines 54-59) is identical in both files:

let additionalOffset = 0;
if (angleRad > 0 && angleRad < DIAGONAL_ANGLE_RADIAN_THRESHOLD) {
    additionalOffset = variables.iconSizeExtraSmall / 1.5;
} else if (angleRad > 1) {
    additionalOffset = variables.iconSizeExtraSmall / 3;
}

Extract the shared additionalOffset calculation into a shared utility in Charts/utils.ts to eliminate duplication.


Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

} else if (isAnyTransactionOnHold) {
setSelectedVBBAToPayFromHoldMenu(type === CONST.IOU.PAYMENT_TYPE.VBBA ? methodID : undefined);
if (getPlatform() === CONST.PLATFORM.IOS) {
// eslint-disable-next-line @typescript-eslint/no-deprecated
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ CONSISTENCY-5 (docs)

The eslint-disable-next-line @typescript-eslint/no-deprecated directive lacks a comment explaining why the deprecated API is being used. Add a justification comment.

// eslint-disable-next-line @typescript-eslint/no-deprecated -- InteractionManager.runAfterInteractions is needed to defer modal display on iOS to avoid UI glitches
InteractionManager.runAfterInteractions(() => setIsHoldMenuVisible(true));

Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

@github-actions github-actions bot changed the title merge main with my branch [No QA] merge main with my branch Mar 14, 2026
@OSBotify
Copy link
Contributor

A preview of your ExpensifyHelp changes have been deployed to https://f328a0c1.helpdot.pages.dev ⚡️

Updated articles:

@@ -0,0 +1,66 @@
---

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Structure violation: The YAML frontmatter has a blank line between the opening --- and the title field. Per TEMPLATE.md, the frontmatter should begin immediately after the opening --- with no blank lines inside the YAML block.

Suggested change
title: Connecting Perk to Expensify


title: Connecting Perk to Expensify
description: Learn how to integrate Perk with Expensify to automate travel expense tracking.
keywords: [Expensify Classic, Perk integration, connect Perk to Expensify, Travel Perk, travel booking sync, receipts@expensify.com, travel expenses, Receipt upload problem]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI readiness / metadata issue: The keyword "Receipt upload problem" does not align with this article's content, which covers connecting Perk to Expensify. Including unrelated keywords reduces retrieval precision. Consider replacing it with a keyword that matches the actual workflow, such as "automatic expense creation" or "travel booking integration".


## Can I add out-of-pocket expenses to a Perk travel report?

Yes, if you have additional travel costs (such as meals or transportation not booked through Perk), you can include them in the same expense report. [Learn how to add expenses to a report](https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Link format violation: Per HELP_AUTHORING_GUIDELINES.md, "Use relative links only. Do not use full URLs." This link should use a relative path instead of the full https://help.expensify.com/ URL.

Suggested change
Yes, if you have additional travel costs (such as meals or transportation not booked through Perk), you can include them in the same expense report. [Learn how to add expenses to a report](https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense).
Yes, if you have additional travel costs (such as meals or transportation not booked through Perk), you can include them in the same expense report. [Learn how to add expenses to a report](/articles/expensify-classic/expenses/Add-an-expense).

6. Enter the spending limit
7. Name the card for easier tracking
8. Click **Issue card** to confirm
7. (Optional for virtual cards) Toggle **Set expiration date** to define:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test: expiration content line

7. Name the card for easier tracking
8. Click **Issue card** to confirm
7. (Optional for virtual cards) Toggle **Set expiration date** to define:
- **Start date**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

8. Click **Issue card** to confirm
7. (Optional for virtual cards) Toggle **Set expiration date** to define:
- **Start date**
- **End date**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

7. (Optional for virtual cards) Toggle **Set expiration date** to define:
- **Start date**
- **End date**
- **When enabled:** Both dates are required. The card activates at 12:00 AM local time on the Start date and expires at 11:59 PM local time on the End date.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

- **Start date**
- **End date**
- **When enabled:** Both dates are required. The card activates at 12:00 AM local time on the Start date and expires at 11:59 PM local time on the End date.
- **When disabled:** The card does not expire automatically.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

- **End date**
- **When enabled:** Both dates are required. The card activates at 12:00 AM local time on the Start date and expires at 11:59 PM local time on the End date.
- **When disabled:** The card does not expire automatically.
8. Name the card for easier tracking
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

- **When enabled:** Both dates are required. The card activates at 12:00 AM local time on the Start date and expires at 11:59 PM local time on the End date.
- **When disabled:** The card does not expire automatically.
8. Name the card for easier tracking
9. Click **Issue card** to confirm
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

- **When disabled:** The card does not expire automatically.
8. Name the card for easier tracking
9. Click **Issue card** to confirm

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

9. Click **Issue card** to confirm

![Click issue card to confirm and issue the card]({{site.url}}/assets/images/ExpensifyHelp-WorkspaceFeeds_04.png){:width="100%"}
![Choose a Smart limit type]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_03.png){:width="100%"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test


![Click issue card to confirm and issue the card]({{site.url}}/assets/images/ExpensifyHelp-WorkspaceFeeds_04.png){:width="100%"}
![Choose a Smart limit type]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_03.png){:width="100%"}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

![Click issue card to confirm and issue the card]({{site.url}}/assets/images/ExpensifyHelp-WorkspaceFeeds_04.png){:width="100%"}
![Choose a Smart limit type]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_03.png){:width="100%"}

![Click issue card to confirm and issue the card]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_04.png){:width="100%"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

![Choose a Smart limit type]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_03.png){:width="100%"}

![Click issue card to confirm and issue the card]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_04.png){:width="100%"}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

- **Smart limit**: Spend up to a threshold before needing approval
- **Monthly limit**: Capped monthly spend
- **Fixed limit**: One-time cap, card closes when reached
- **Monthly limit**: Limit renews monthly
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

@@ -49,15 +50,23 @@ You can issue virtual or physical cards to employees:
2. Click **Issue new card**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

## What happens when a card reaches its expiration date?

The card automatically deactivates at 11:59 PM local time on the selected End date and declines new transactions.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

## What is a Single-use Expensify Card?

A Single-use virtual card automatically deactivates after its first successful authorization. It's ideal for one-time purchases like flights, vendor payments, or event registration.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

If a card reaches its expiration date, it automatically deactivates and declines new transactions.

---

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

![Click the card row to view the card details and make settings adjustments]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_06.png){:width="100%"}

![Click the card row to view the card details and make settings adjustments]({{site.url}}/assets/images/ExpensifyHelp-WorkspaceFeeds_06.png){:width="100%"}
![Click Settings to adjust the settlement account or frequency]({{site.url}}/assets/images/ExpensifyHelp-ExpensifyCard_08.png){:width="100%"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

@github-actions
Copy link
Contributor

HelpDot Documentation Review - PR #85286

docs/articles/expensify-classic/connections/Perk.md (new file)

Three inline comments have been posted on this file for specific violations:

  1. Line 2 - Structure violation: Blank line inside YAML frontmatter between --- and title.
  2. Line 5 - AI readiness / metadata issue: Keyword "Receipt upload problem" does not match article content.
  3. Line 66 - Link format violation: Full URL used instead of relative link for internal Expensify help cross-link.

docs/articles/new-expensify/expensify-card/Set-Up-and-Manage-the-Expensify-Card.md (modified)

The changed lines in this file add expiration-date content and are structurally sound. However, the unchanged portions of this file contain several pre-existing governance violations that should be addressed in a follow-up:

  1. Missing internalScope in YAML metadata (line 5): Per HELP_AUTHORING_GUIDELINES.md and TEMPLATE.md, every article must include an internalScope field. This field is absent.

  2. Forbidden generic headings (lines 22, 33, 43): # Step 1: Enable the Expensify Card, # Step 2: Select a Bank Account, and # Step 3: Issue Expensify Cards all use "Step N" prefixes, which are explicitly forbidden in HELP_AUTHORING_GUIDELINES.md. Replace with task-based headings like # How to enable the Expensify Card for your workspace.

  3. Non-task-based heading (line 74): # Monitor and Manage Cards should be rewritten as a "How to..." heading, e.g., # How to monitor and manage Expensify Cards.

  4. Vague navigation instruction (line 26): "From the left-hand menu" is a prohibited vague phrase per HELPSITE_NAMING_CONVENTIONS.md. Should read: "From the navigation tabs (on the left on web, and at the bottom on mobile)..."

  5. Full URLs instead of relative links (lines 18, 39): Two cross-links use https://help.expensify.com/... full URLs instead of relative paths like /articles/new-expensify/....

  6. Link inside numbered step (line 39): A cross-link is embedded directly in step 3, violating "Do not place links inside numbered step instructions."

These pre-existing issues are outside the scope of the current diff but warrant attention.

docs/redirects.csv

The added redirect from TravelPerk to Perk is consistent with the new Perk.md article.


Note: Several test/probe comments were inadvertently posted on the Expensify Card file during diff boundary detection and could not be deleted due to API restrictions. Please disregard any comments on that file with the body "test" or "probe".

@github-actions
Copy link
Contributor

HelpDot Documentation Review

Overall Assessment

This PR introduces documentation changes across three areas: (1) a new Perk.md article replacing the deleted TravelPerk.md, (2) modifications to the Expensify Card setup article, and (3) a redirect entry for the TravelPerk-to-Perk rename. The documentation is generally well-structured and readable. Several governance compliance issues were identified, detailed below.

Scores Summary

  • Readability: 8/10 - The articles are clear, scannable, and well-organized with logical flow. Step formatting is clean and action-oriented. Minor issues: the first FAQ answer in Perk.md conflates two distinct questions (when expenses are created vs. a troubleshooting scenario), which could confuse readers.

  • AI Readiness: 6/10 - Both articles include YAML metadata and task-based headings with feature names. However, the Expensify Card article is missing the required internalScope field in its YAML frontmatter. Additionally, the Expensify Card article uses forbidden generic headings ("Step 1", "Step 2", "Step 3") as primary # headings, which violates HELP_AUTHORING_GUIDELINES.md Section 2.

  • Style Compliance: 7/10 - UI terminology is mostly handled correctly with proper bolding. However, there are several specific violations of the governance files, detailed in Key Findings below.

Key Findings

Critical Issues (Must Address)

  1. Missing internalScope in Expensify Card YAML (HELP_AUTHORING_GUIDELINES.md, Section 3): The Set-Up-and-Manage-the-Expensify-Card.md frontmatter lacks the required internalScope field. Per governance, every article must include internalScope specifying audience, covered workflow, and explicit exclusions.

  2. Forbidden generic headings in Expensify Card article (HELP_AUTHORING_GUIDELINES.md, Section 2): The article uses # Step 1: Enable the Expensify Card, # Step 2: Select a Bank Account, and # Step 3: Issue Expensify Cards. "Step 1", "Step 2", "Step 3" are explicitly listed as forbidden generic headings. These should be rewritten as task-based headings, e.g., # How to enable the Expensify Card for a workspace, # How to select a settlement bank account, # How to issue Expensify Cards to employees.

  3. Full URLs used instead of relative links (HELP_AUTHORING_GUIDELINES.md, Section 7 - Link Formatting): Both articles use full https://help.expensify.com/... URLs for cross-links. The governance requires relative links only and explicitly states "Do not use full URLs." Affected locations:

    • Perk.md line 30: external link to support.perk.com (acceptable as it is a third-party site)
    • Perk.md line 66: https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense should be a relative link
    • Expensify Card lines 18, 39: https://help.expensify.com/articles/new-expensify/... should be relative links
  4. Link placed inside numbered step instruction (HELP_AUTHORING_GUIDELINES.md, Section 7): In the Expensify Card article, step 3 under "Select a Bank Account" contains an inline link: "Choose an existing account or add a new bank account as the settlement account." Governance states: "Do not place links inside numbered step instructions."

Moderate Issues

  1. Navigation phrasing inconsistency in Expensify Card article (HELPSITE_NAMING_CONVENTIONS.md): Step 1 uses "From the left-hand menu" while Steps 2, 3, and the Monitor section correctly use "From the navigation tabs (on the left on web, and at the bottom on mobile)." The first should match the governance-approved pattern for cross-platform clarity. Additionally, the approved phrasing per governance is "on the left on web, on the bottom on mobile" (without "and at the bottom").

  2. Perk.md FAQ coherence: The first FAQ answer ("When are Perk travel expenses created in Expensify?") starts by answering the question but then pivots to troubleshooting a different scenario (expenses not appearing). Consider splitting this into two FAQ entries for clarity: one for "When are expenses created?" and another for "Why didn't my Perk expense appear in Expensify?"

Positive Aspects

  • The Perk.md article has complete and well-formed YAML metadata including internalScope, which is excellent.
  • The Perk.md headings are task-based, searchable, and include the feature name throughout, which is strong for AI retrieval.
  • The redirect from TravelPerk to Perk is properly included in redirects.csv, and existing redirect chains (from the old integrations path) will continue to resolve correctly.
  • Both articles maintain a single primary workflow focus as required.
  • FAQ sections use proper ## heading format without Liquid includes or collapsible elements.
  • Button and UI element names are properly bolded throughout.
  • The Expensify Card article provides helpful cross-platform navigation instructions in most places.

Recommendations

  1. [Priority: High] Add internalScope to the Expensify Card article's YAML frontmatter. Example: internalScope: Audience is Workspace Admins. Covers enabling, issuing, and managing Expensify Cards in New Expensify. Does not cover Expensify Classic card management or card reconciliation.

  2. [Priority: High] Replace the generic "Step 1/2/3" primary headings in the Expensify Card article with task-based headings that include the feature name.

  3. [Priority: High] Convert all internal https://help.expensify.com/... links to relative paths (e.g., /articles/new-expensify/wallet-and-payments/Connect-a-Business-Bank-Account).

  4. [Priority: Medium] Move the inline link out of step 3 in the "Select a Bank Account" section. Place it after the numbered steps as a standalone note.

  5. [Priority: Medium] Standardize the navigation phrasing in the Expensify Card article's first section to match the approved cross-platform pattern used elsewhere in the article.

  6. [Priority: Low] Split the first Perk.md FAQ into two distinct questions for better scannability and AI retrieval.

Files Reviewed

File Status Summary
docs/articles/expensify-classic/connections/Perk.md NEW (66 lines) Well-structured replacement for TravelPerk.md. Strong metadata and headings. Minor issues with full URL link and FAQ coherence.
docs/articles/expensify-classic/connections/TravelPerk.md DELETED (52 lines) Properly removed; redirect added in redirects.csv.
docs/articles/new-expensify/expensify-card/Set-Up-and-Manage-the-Expensify-Card.md MODIFIED (+32/-12) Missing internalScope, uses forbidden generic headings, contains full URLs and an inline link within steps.
docs/redirects.csv MODIFIED (+1 line) Correctly redirects TravelPerk to Perk.
docs/assets/images/ExpensifyHelp-ExpensifyCard_*.png MODIFIED (8 files) Screenshot image updates for the Expensify Card article.

Note: This review covers only the documentation changes proposed in this PR. Non-docs changes were not evaluated.

@OSBotify
Copy link
Contributor

🚀 Deployed to staging by https://github.com/stephanieelliott in version: 9.3.41-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.