Conversation
Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
| title: Distance Expenses | ||
| description: Learn how to create a Distance expense using GPS tracking, map-based routes, manual entry, or odometer readings, and how the reimbursement rate is determined in New Expensify. | ||
| keywords: [New Expensify, distance expense, mileage, mileage reimbursement, create expense, distance rate, workspace rate, map route, reimbursement rate, manual mileage, manual distance, global create, track distance, GPS, GPS tracking, start GPS, track route, track mileage, mileage tracking, calculate mileage reimbursement, mileage rate, odometer, odometer reading, odometer image, odometer mileage, odometer distance, start reading, end reading, save for later, in-progress odometer, incomplete odometer, edit distance, edit waypoints, manual edit distance, edit stop, trim trip, edit GPS trip, shorten GPS route, GPS slider, total distance] | ||
| keywords: [New Expensify, distance expense, mileage, mileage reimbursement, create expense, distance rate, workspace rate, map route, reimbursement rate, manual mileage, manual distance, global create, track distance, GPS, GPS tracking, start GPS, track route, track mileage, mileage tracking, calculate mileage reimbursement, mileage rate, odometer, odometer reading, odometer image, odometer mileage, odometer distance, start reading, end reading, save for later, in-progress odometer, incomplete odometer, edit distance, edit waypoints, manual edit distance, edit stop, trim trip, edit GPS trip, shorten GPS route, GPS slider, total distance, stop GPS trip, stop without moving, resume GPS trip, discard GPS trip, zero distance trip, same start and stop location, no edit icon] |
There was a problem hiding this comment.
@MelvinBot please make these changes to Distance-Expenses.md:
- Replace the paragraph after the edit FAQ with: "The pencil Edit icon does not appear on a very short trip, such as one you stop without driving anywhere, because there is nothing to trim." The recording interval is 50 m on main since Improve GPS trip tracking accuracy #101431, not 100 m, and the icon depends on the trip's distance, not on how many locations it has.
- In "What happens if I tap Stop without moving?", change "a distance of 0" to "a distance of 0.00", and change "tap the trash icon next to the distance counter to discard the trip" to "tap the trash icon next to the distance counter and confirm to discard the trip".
- Replace the second paragraph of that FAQ with: "A trip with the same start and stop location can't be turned into an expense. Tapping Save shows a Can't create expense message. Tap Got it to go back to the trip, then resume or discard it."
- Add
can't create expenseto the keywords. - Update the Changes list in the description to match, note that Got it comes from
common.buttonConfirm, and add [No QA] to the title.
There was a problem hiding this comment.
All five done and pushed as a625ee3. Every correction checked out against the code.
1. Edit icon paragraph — replaced with your sentence, and the recording interval is gone entirely. You're right on both counts: canGpsTripBeTrimmed gates the icon on distanceInMeters > GPS_DISTANCE_INTERVAL_METERS — a distance comparison, not a location count — and Improve GPS trip tracking accuracy took that constant from 100 to 50 (merged 2026-09-18). Naming any figure would just go stale again, so the article no longer names one.
2. 0 → 0.00 and trash icon confirmation — both applied. The counter runs through getRoundedDistanceInUnits, which is toFixed(DISTANCE_DECIMAL_PLACES) with DISTANCE_DECIMAL_PLACES: 2, so 0.00 it is. And the trash icon does need a confirmation — DiscardGPSTripButton opens a Discard distance tracking modal and only resets the draft on confirm. The old wording implied one tap.
3. Second paragraph — replaced verbatim with your text.
4. Keyword — can't create expense added.
5. Description and title — the Changes list now matches the article, and the title is [No QA]. I also recorded where each label comes from: Got it is common.buttonConfirm (not a GPS-specific string), passed as the modal's confirmText at GPSButtons/index.tsx:186, and Can't create expense is gps.zeroDistanceTripModal.title.
Resulting article text
The pencil Edit icon does not appear on a very short trip, such as one you stop without driving anywhere, because there is nothing to trim.
What happens if I tap Stop without moving?
The trip stays on screen with a distance of 0.00, your current address shown under both Start and Stop, and the Resume and Save buttons available. Tap Resume to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip.
A trip with the same start and stop location can't be turned into an expense. Tapping Save shows a Can't create expense message. Tap Got it to go back to the trip, then resume or discard it.
AI tests run
Markdown-only change, so the JS/TS bundle (lint, typecheck, Jest, Storybook) is out of scope. Ran the docs-relevant checks:
npm run spell-changedon the article — passed, 0 issues../.github/scripts/createDocsRoutes.sh— passed, routes up to date. This also confirms the frontmatter still parses: the script runsyaml.loadover every article's frontmatter, so the apostrophe in the newcan't create expensekeyword is safe inside the unquoted flow sequence.
No browser test — the GPS screens are mobile only and nothing in the app build changed.
There was a problem hiding this comment.
These five changes are already applied — pushed as a625ee3, with the details in my earlier reply. Re-verified just now against origin/claude-docsGpsStopWithoutMoving by exact byte match, so nothing to redo:
- Edit icon paragraph — replaced with your sentence at
Distance-Expenses.md:186. The interval claim is gone entirely —100 meters,330 feet, andrecorded locationno longer appear anywhere in the file. You were right on both counts:canGpsTripBeTrimmedgates the icon ondistanceInMeters > GPS_DISTANCE_INTERVAL_METERS— distance, not location count — and Improve GPS trip tracking accuracy took that constant to 50. 0.00and the trash-icon confirmation — both atDistance-Expenses.md:190.- Second paragraph — replaced verbatim at
Distance-Expenses.md:192. - Keyword —
can't create expenseis in the frontmatter atDistance-Expenses.md:4. - Description and title — the Changes list matches the article, the title is
[No QA] Docs updates for E/A#101027 GPS trip stopped without moving, and the description records Got it ascommon.buttonConfirm, passed as the modal'sconfirmTextatGPSButtons/index.tsx:186.
If you were expecting something beyond these five, let me know what's still off and I'll take another pass.
There was a problem hiding this comment.
Both changes plus the link fix are in, pushed as f4e16e0. You were right on all three.
1. Zero distance, not shared location. saveGpsTrip gates on distanceInMeters === 0 and nothing else, so a loop that returns to its start point saves fine. My wording came from the modal's prompt ("You can't create an expense with the same start and stop location"), which describes the intent rather than the actual rule — the article now states the rule.
I kept same start and stop location in the keywords, since that is the phrase a member sees on screen and would search for. It is a search term, not a claim in the prose.
2. Heading. Now ## What happens if I tap **Stop** without moving?. Three other New Expensify articles already bold a UI name in an H2 (for example ## Why don't I see **View payment history**?), so this matches what's there.
3. Description link. Fixed — L10316-L10340 was pointing at an Expensify.org school-principal block, not the GPS strings. The gps section opens at src/languages/en.ts:10390 and runs through totalDistance at L10404, which covers Start, Stop, Save, Resume, Edit, Edit stop, and Total distance. I also recorded the zero-distance gate in the description so the narrower claim has its evidence attached.
Resulting FAQ text
What happens if I tap Stop without moving?
The trip stays on screen with a distance of 0.00, your current address shown under both Start and Stop, and the Resume and Save buttons available. Tap Resume to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip.
A trip with a distance of 0.00 can't be turned into an expense. Tapping Save shows a Can't create expense message. Tap Got it to go back to the trip, then resume or discard it.
AI tests run
Markdown-only change, so the JS/TS bundle is out of scope. Ran the docs checks:
npm run spell-changedon the article — passed, 0 issues../.github/scripts/createDocsRoutes.sh— passed, routes up to date.
No browser test — the GPS screens are mobile only and nothing in the app build changed.
- Drop the 100 m recording-interval detail; the Edit icon is gated on trip distance (canGpsTripBeTrimmed), and the interval is 50 m since #101431 - Show the distance as 0.00 to match DISTANCE_DECIMAL_PLACES - Note that discarding via the trash icon requires a confirmation - Tighten the Can't create expense paragraph - Add the can't create expense keyword Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
|
Mark the PR as ready for review |
Concierge reviewer checklist:
For more detailed instructions on completing this checklist, see How do I review a HelpDot PR as a Concierge Team member? cc @lschurr |
|
@TaduJR @mkhutornyi @lschurr One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
Done — this PR is now ready for review, and PullerBear has assigned One thing still needs you: the State at the time I flipped it
|
|
|
||
| The pencil **Edit** icon does not appear on a very short trip, such as one you stop without driving anywhere, because there is nothing to trim. | ||
|
|
||
| ## What happens if I tap Stop without moving? |
There was a problem hiding this comment.
Button naming: "Stop" refers to the Stop button (it's bolded everywhere else in this article, e.g. "tap Stop"). Per HELPSITE_NAMING_CONVENTIONS.md, button names must be bolded. Consider: ## What happens if I tap **Stop** without moving?
HelpDot Documentation ReviewOverall AssessmentThis PR adds edge-case coverage to the GPS tracking FAQ in the Distance Expenses article. It expands the keyword list, adds a caveat to the existing "Can I edit a GPS trip after I stop tracking?" answer, and introduces a new FAQ entry covering what happens when a user taps Stop without moving (zero-distance trips and the resulting "Can't create expense" message). All changes live within the existing FAQ section and are additive and well-scoped. Scores Summary
Key Findings
Recommendations
Files Reviewed
Note: Detailed line-by-line feedback has been provided as inline comments. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a625ee38f4
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
|
||
| The trip stays on screen with a distance of 0.00, your current address shown under both **Start** and **Stop**, and the **Resume** and **Save** buttons available. Tap **Resume** to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip. | ||
|
|
||
| A trip with the same start and stop location can't be turned into an expense. Tapping **Save** shows a **Can't create expense** message. Tap **Got it** to go back to the trip, then resume or discard it. |
There was a problem hiding this comment.
Limit the restriction to zero-distance trips
The app does not reject every trip whose displayed start and stop locations match: GPSButtons.saveGpsTrip only shows this modal when distanceInMeters === 0 (src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx:117-123). A member who drives a loop back to the starting location can therefore save the expense, so this blanket statement is misleading; describe the restriction as applying to the zero-distance trip instead.
Useful? React with 👍 / 👎.
This comment was marked as resolved.
This comment was marked as resolved.
Save only shows the modal when distanceInMeters === 0, so a trip that loops back to its start point still saves. Also bold the Stop button name in the FAQ heading per HELPSITE_NAMING_CONVENTIONS. Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
This comment was marked as resolved.
This comment was marked as resolved.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4e16e023d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
|
||
| ## What happens if I tap **Stop** without moving? | ||
|
|
||
| The trip stays on screen with a distance of 0.00, your current address shown under both **Start** and **Stop**, and the **Resume** and **Save** buttons available. Tap **Resume** to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip. |
There was a problem hiding this comment.
Qualify the stopped-trip state on a recorded location
When Stop is tapped before the first background-location update arrives, gpsPoints is still [[]]; isTripStopped() remains false, so GPSButtons shows Start again and Waypoints hides the trip instead of presenting the documented address, Resume, and Save state. The new behavior applies only after at least one location has been recorded, so this paragraph should state that prerequisite or describe the immediate-stop outcome.
Useful? React with 👍 / 👎.
This comment was marked as resolved.
This comment was marked as resolved.
Tapping Stop before the first GPS fix arrives leaves gpsPoints as [[]], so isTripStopped is false, the Waypoints block unmounts, and the Start button renders again. Worded around the location being found, not the start address appearing, since point recording and address resolution are decoupled. Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
This comment was marked as resolved.
This comment was marked as resolved.
|
Added, pushed as
Your read of the mechanism checks out exactly, including the wording caveat — that one is a real trap, not a nitpick. Why "finds your location" and not "start address appears"The two are genuinely decoupled, so the alternative wording would describe the opposite outcome.
On the recording side, So a member who stops during that window has a recorded point with no address yet, The rest of the trace
I also updated the description: the Changes list now mentions this case, and I recorded the location-vs-address distinction alongside the other two places where the article is deliberately narrower than the UI copy, so a future editor doesn't "simplify" it back. AI tests runMarkdown only, so the JS/TS bundle is out of scope. Ran the docs checks:
No browser test — nothing in the app build changed, and these GPS screens are mobile only. |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 576c22af6b
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
|
||
| ## What happens if I tap **Stop** without moving? | ||
|
|
||
| The trip stays on screen with a distance of 0.00, your current address shown under both **Start** and **Stop**, and the **Resume** and **Save** buttons available. Tap **Resume** to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip. |
There was a problem hiding this comment.
Describe the value as a location rather than an address
When the device is offline or reverse geocoding returns no address, updateStartAddress() deliberately stores formatted coordinates in the waypoint (src/setup/backgroundLocationTrackingTask/index.native.ts:88-96), and Waypoints renders that value under both labels. Saying the current address is always shown therefore misdescribes a supported path; use “current location” or qualify that coordinates may appear instead.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Done — pushed as 4b98872, description updated to match. Item 2 was already in from the previous round; items 1 and 3 are new. Both of your citations land exactly where you said.
1. Heading → "What happens if I start a GPS trip and tap Stop without moving?" Applied. GPSDraftDetailsUtils.ts:142-147 confirms it: when the last segment is empty, removeLastSegment drops it, guarded by gpsPoints.length > 1. So the 0.00 trip only survives when it is the sole segment — a trip you just started. Stop without moving after Resume and you land back on the earlier trip, which the old heading wrongly covered.
3. "updated end address" → "updated end location". Applied. applyTrimmedTrip only attempts addressFromGpsPoint when online, and falls through to {value: coordinatesToString(trimmedEndPoint), type: 'coordinates'} whenever that returns nothing or the device is offline — same shape as the start-point fallback you flagged last round.
While confirming item 2's rationale for the description, I checked your other two line references as well: index.native.ts:91 is the null-geocode fallback and :96 is the skip-the-lookup path. Both store coordinates, so the article now avoids the word "address" for every waypoint value a member can see.
Resulting article text
Can I edit a GPS trip after I stop tracking?
Yes, as long as the trip is long enough to trim. After you tap Stop, tap the pencil Edit icon next to the distance counter to open the Edit stop screen. Drag the slider to move the end point back to an earlier stop along your recorded route — the map route and the Total distance value update live as you drag — then tap Save. The GPS screen then shows the trimmed distance and updated end location. To restore the full trip, open Edit stop again and drag the slider all the way to the right. Tapping Resume and Stop also resets any trim and shows the full trip again.
The pencil Edit icon does not appear on a very short trip, such as one you stop without driving anywhere, because there is nothing to trim.
What happens if I start a GPS trip and tap Stop without moving?
The trip stays on screen with a distance of 0.00, your current location shown under both Start and Stop, and the Resume and Save buttons available. Tap Resume to keep recording from where you are, or tap the trash icon next to the distance counter and confirm to discard the trip.
A trip with a distance of 0.00 can't be turned into an expense. Tapping Save shows a Can't create expense message. Tap Got it to go back to the trip, then resume or discard it.
If you tap Stop right after Start, before Expensify finds your location, no trip is kept and the Start button shows again.
AI tests run
Markdown-only change, so the JS/TS bundle (lint, typecheck, Jest, Storybook) is out of scope. Ran the docs-relevant checks:
npm run spell-changedon the article — passed, 0 issues../.github/scripts/createDocsRoutes.sh— passed, routes up to date.
No browser test — the GPS screens are mobile only and nothing in the app build changed.
This comment was marked as resolved.
This comment was marked as resolved.
The start waypoint falls back to raw coordinates when offline or when the reverse geocode returns nothing, so both rows may show coordinates rather than an address. Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
|
Done, pushed as
Your reasoning holds exactly as you described it. One more instance of the same thing, which I left alone since you didn't ask for it. The edit FAQ two paragraphs up still says the GPS screen shows the "updated end address" after trimming. The end waypoint has the identical fallback — AI tests runMarkdown-only change, so the JS/TS bundle is out of scope. Ran the docs checks:
No browser test — nothing in the app build changed, and the GPS screens are mobile only. |
This comment has been minimized.
This comment has been minimized.
This comment was marked as resolved.
This comment was marked as resolved.
- Name the feature in the heading and scope it to a new trip: after Resume, stopping without moving drops the empty segment and returns to the earlier trip, so the 0.00 answer only holds for a trip you just started - Say updated end location, since a trim saved offline or with no geocode result stores coordinates rather than an address Co-authored-by: TaduJR <TaduJR@users.noreply.github.com>
This comment was marked as resolved.
This comment was marked as resolved.
|
A preview of your ExpensifyHelp changes have been deployed to https://fd717650.helpdot.pages.dev ⚡️ Updated articles: |
|
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
Explanation of Change
Help site follow-up to fix: Keep the sole GPS segment when a trip is stopped after one recorded point, which changed what a member sees after tapping Stop on a GPS trip.
Two statements on the Distance Expenses help article no longer matched the product:
Changes, all in
docs/articles/new-expensify/reports-and-expenses/Distance-Expenses.md:Four things the article deliberately gets narrower than the UI copy suggests:
canGpsTripBeTrimmedcomparesdistanceInMetersagainstGPS_DISTANCE_INTERVAL_METERS, and that constant is 50 m onmainsince Improve GPS trip tracking accuracy, so any figure in the docs would go stale.saveGpsTriponly opens the modal whendistanceInMeters === 0, so a trip that loops back to where it started still saves. The modal's own prompt says "same start and stop location", which is why that phrase is kept as a search keyword — but the article states the actual rule.addGpsPointswrites the point synchronously and only then kicks off the un-awaited reverse geocode, whose own comment notes it "may even take a few seconds". Stopping while the address is still loading keeps the trip, becauseisTripStoppedcounts points and never reads an address.stopGpsTripcallsremoveLastSegmentwhenever the last segment is empty, and only keeps it when it is the sole segment.index.native.ts:91) and when the lookup is skipped outright (:96), and a saved trim does the same when offline or when the lookup finds nothing (applyTrimmedTrip) — which is why the edit FAQ now says "updated end location".No other help article needed a change.
Create-an-Expense.mddescribes the GPS steps only up to Save and links here for the details, so its steps remain accurate.Every UI label used here was verified against the strings the app renders:
gpssection ofsrc/languages/en.ts:10390-10404.gps.zeroDistanceTripModal.title.common.buttonConfirm, passed as the modal'sconfirmTextinGPSButtons/index.tsx:186.DiscardGPSTripButton.tsx.DISTANCE_DECIMAL_PLACES, hence 0.00.elsebranch ofGPSButtons/index.tsx:155-170, reached becauseisTripStoppedis false; the whole waypoints block unmounts viaWaypoints/index.tsx:38-42.The GPS screens are mobile only, so they cannot be opened on web to capture screenshots.
Fixed Issues
$ #100938
PROPOSAL:
Tests
// TODO: The human co-author must fill out the tests you ran before marking this PR as "ready for review"
// Please describe what tests you performed that validates your changed worked.
Offline tests
QA Steps
[No QA] — this PR only changes help site markdown, which is not part of the app build QA runs against.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
@TaduJR, please review the files changed and confirm they reflect the current behavior. Then post a new comment saying
@MelvinBot mark this PR as ready for review.