Overview
Your upload journey
flowchart TD
A[Etsy purchase] --> B[Confirmation email with upload link]
B --> C[upload.html — one form]
C --> D[Order # + package tier]
C --> E[One place Phase 0 or multi-place tables]
C --> F[Photo .zip]
C --> G[Optional: custom narrative, placements, passcode]
D --> H[We package slug.zip]
E --> H
F --> H
G --> H
H --> I[Dashboard build — 5–7 business days]
I --> J[Private link via Etsy Messages]
J --> K[You review --> final delivery]
How each photo is included on your dashboard
flowchart TD
P[Photo in your zip] --> Q{Has GPS location data?}
Q -->|Yes| R[Included — placed on map near matching stop]
Q -->|No| S{Listed in photo placements?}
S -->|Yes| T[We look up your place name on the map]
T --> U[Included — attached to nearest stop on your route]
S -->|No| V[Excluded — not shown on dashboard]
How to use the sample forms
The samples on sample-forms.html (and in your Etsy download) show which fields to fill and which to skip. They are not a trip you can submit.
- Open the one-place sample if you stayed in one town or area. Use the multi-place sample only if you traveled between cities.
- Keep it next to the upload form. Prefer the confirmation-email link so order # and package are already filled.
- Copy the pattern. Enter your Etsy order number -- never
3789123456-- plus your destination, dates, and geotagged zip. - For Phase 0: pick One place and skip trip phases and route legs. Optional: a short custom narrative.
Live Phase 0 dashboard: Harpers Ferry weekend.
One-place trips (Phase 0)
A weekend in one town, a residency, or photos from a single area. Pick One place on the form. You do not fill trip phases or route legs. We map geotagged photos as Phase 0 GPS clusters.
Minimum: order #, package, trip title, destination, dates, geotagged zip. Start/end places default to the destination. A custom trip narrative is optional -- we write the Phase 0 card from GPS and place names if you skip it.
Copy this path from the one-place sample. A second Phase 0 pattern (Seoul conference week) is under more test cases.
How we rank your inputs
Your text and placement tables always win over automated guesses. We use geotagged photo timestamps and locations to build a timeline first, then look up city and landmark names on the map where you did not provide them. Photos without GPS need a placement row with a place name (city or landmark) — not exact coordinates.
What takes priority when building your dashboard
flowchart TD
subgraph trip["Trip story — legs, days, map route"]
T1["1st — Upload form\nphases + route legs"]
T2["2nd — Photo GPS timeline\n(sorted by date, grouped by location)"]
T3["3rd — AI trip plan\n(leg names + title from Mapbox;\nor format your markdown)"]
T1 --> T2 --> T3
end
subgraph pics["Which photos appear"]
P1["1st — Your photo-placements table"]
P2["2nd — Automatic GPS match to stops"]
P3["3rd — Excluded if no GPS and no row"]
P1 --> P2 --> P3
end
| You provide | We use it for | Rank |
|---|---|---|
| Trip phases + route legs + day titles | Phase names, dates, map route | Highest |
| Photo placements table | Non-GPS images — place name looked up on map | Highest (photos) |
| Geotagged photo zip | Stop order, coordinates, map labels | Structure |
| Waypoint names without coordinates | Map lookup fills Lon/Lat for routes | Fills gaps |
| One-place / Phase 0 (destination + geotagged zip) | GPS clusters become map pins; optional custom narrative on the phase card | First-class path |
| Custom trip narrative + story voice | Your wording on phase cards — available on one-place and multi-place | Optional, kept |
Place names & map lookup
You usually do not need to look up coordinates. Type place names the way you would in a map app.
Paris, Colmar, Eiffel Tower, Versailles, Richmond, Virginia
| Your input | What we do |
|---|---|
| Geotagged photos | Read GPS --> group stops --> look up city/landmark names |
| Photo placement (no GPS) | Look up place name --> attach photo to nearest route stop |
| Waypoint name, Lon/Lat blank | Look up place --> fill coordinates for driving route |
| Trip legs & day titles you wrote | Always kept — automation only fills gaps |
Placement rows do not need to match stop names character-for-character. Use the city, neighborhood, or landmark where the photo belongs.
Before you start
| Item | Required? | Notes |
|---|---|---|
| Etsy order number | Yes | From receipt or confirmation email |
| Package (Essential / Signature / Legacy) | Yes | Must match the listing you bought |
| Trip title | Yes | Dashboard headline — e.g. Spring Break 2026 |
| Subtitle | No | Optional banner under title — e.g. Dad and Mae |
| Trip kind | Yes | One place (Phase 0) or Multi-place |
| Main destination + dates | Yes | One-place: the town/area. Multi-place: primary region |
| Start/end places | Multi-place | Optional on one-place — defaults to destination |
| Trip phases table | Multi-place | Skipped for Phase 0 — see route table guide |
| Route legs table | Multi-place | Not required for one-place stays |
| Custom trip narrative | Optional | Your own story — available on both paths. Story voice, tone, and length are on the same form |
| Basecamps / overnight stays | Optional | Extra lodging detail — skip for transit-only trips |
| Day-by-day plans | Optional | Rough daily notes |
Photo .zip | Yes | How to zip geotagged photos |
| Photo placements | Optional | Only for images without GPS |
| Dashboard URL name | Optional | Auto-filled from trip title |
| Extra notes | Optional | Flights, hotels, companions |
| Dashboard passcode | If ordered | At least 8 characters |
All trip structure is entered on the upload form. One-place (Phase 0) trips skip the phase and route tables. You can still add a custom narrative. Your photo zip should contain photos only.
Your dashboard
Authoritative layout: the live trip page matches
templates/index.html and templates/app-template.js in our build.
If any description here disagrees with a deployed dashboard, trust what you see on the page.
Dashboard layout (top to bottom)
flowchart TB
TB["Top bar — trip title, theme toggle"]
H["Hero — title, optional subtitle, stats row"]
M["Map — route, photo pins, legend, phase filters"]
G["Phase cards — grid below the map"]
TB --> H --> M --> G
| Area | What you see |
|---|---|
| Top bar | Trip title only (brand + name) — not the subtitle. Light/dark theme. Iceland trips also show road-condition links. |
| Hero | Large trip title; optional subtitle below when provided; stats for km mapped, baseline drive time, and phases · dates. |
| Map | Full-width interactive map: colored route by phase, photo pins, legend, All / Phase 1 / … filter buttons. |
| Phase cards | Grid below the map — click a card or filter button to focus the map on that phase. |
Phase card header (colored bar): headline on the left; earliest local sunrise · sunset for that phase’s dates on the right when available.
Headlines: departure transit Phase 1: Depart Mar 10; return transit Phase 4: Return Mar 19–20; stay phases show location only (e.g. Phase 2: Paris, FR) — lodging names appear in the narrative body, not the headline.
Card body: one narrative paragraph per phase (no sunrise/sunset in the text — those appear in the header). Map pins open stop popups with photos; optional passcode gate when ordered.
Upload form fields
Open upload.html. Fields marked required on the form must be filled unless noted.
Upload form layout (top to bottom)
flowchart TB
subgraph order["1 · Order"]
O1["Etsy order # — required"]
O2["Package tier — required"]
end
subgraph trip["2 · Trip details"]
T1["Trip title — required"]
T2["Subtitle — optional"]
T3["Main destination — required"]
T4["Start / end dates — required"]
T5["Trip kind — one place or multi-place"]
T6["Trip phases — multi-place"]
T7["Route legs — multi-place"]
T8["Custom narrative — optional"]
end
subgraph optTrip["Optional trip settings"]
OT1["Timezone"]
OT2["Primary travel mode"]
end
subgraph itin["3 · Optional on form"]
I1["Day-by-day plans — optional"]
end
subgraph photos["4 · Photos"]
P1["Photo zip — required"]
P2["EXIF location consent — required"]
P3["EXIF time consent — required"]
P4["Custom dashboard URL name — optional"]
end
subgraph extra["5 · Optional extras"]
E1["Photo placements"]
E2["Notes"]
E3["Dashboard passcode — if ordered"]
end
C["Confirm paid and Upload trip — required"]
order --> trip --> optTrip --> itin --> photos --> extra --> C
Order reference required
Your Etsy order number. If the order is unknown or already uploaded, the form explains why.
Package required
| Tier | Photos | Stops | Revisions | First draft |
|---|---|---|---|---|
| Essential | 100 | 20 | 1 | 5–7 business days |
| Signature | 300 | 50 | 2 | 5–7 business days |
| Legacy | 700 | 100 | 2 | 3–5 business days |
Form values stay basic / standard / premium so existing orders still match. We do not sell a stand-alone consultation call from this form.
Trip title required
Dashboard headline — the name of the trip (e.g. Spring Break 2026). Also used to suggest your URL slug (mushinsolutions.com/trips/your-trip/).
Subtitle optional
Optional banner line under the title — who traveled (e.g. Dad and Mae, The Johnson family). Leave blank if the trip title alone is enough.
Trip kind required
Pick One place (Phase 0) or Multi-place. One-place: all photos in one town or area — skip the phase and route tables. Multi-place: you traveled between cities.
On either path you can add a custom trip narrative and set story voice, tone, and length. We use your wording on the phase cards.
Main destination, dates, start/end
Primary region (e.g. Paris, France) and first/last day of the trip. Start/end places are required for multi-place trips and optional for one-place (they default to the destination).
Trip phases multi-place
Major blocks — one table row per phase. Pick a label (single location / Phase 0 when all photos are in one area and there is no depart/arrive bookend, transit, basecamp, day trip, residency), then name, dates, and location (location blank for transit). Phase 0 does not need a route leg. If you already have Richmond --> destination (or any bookend), use stay + transit phases instead of Phase 0.
Toolbar: + Add phase · Suggest starter phases (uses trip dates, destination, and basecamp rows if any).
The form stores ### lines behind the scenes. Example serialized output:
### 1 | Departure Transit | Mar 10 | In transit | #0c6fa8
### 2 | Paris Residency | Mar 11–15 | Paris, FR — AirBnB | #148b63
### 4 | Return Transit | Mar 19–20 | In transit | #8f3d97
Actual route / transit legs multi-place
One row per movement — flights, trains, ferries, drives. Pick a Phase on each row from your trip phases table. Use --> for a direct leg or , then for comma-style station chains. Set mode on every non-driving leg.
Full column reference: ROUTE_TABLE_INPUTS.md · click Insert starter legs from trip start/end after start/end places and dates are filled.
Serialized example:
Mar 10 | 1 — Richmond, VA --> Alexandria, VA (train)
Mar 10 | 1 — Washington, DC (DCA) --> Paris, FR (flight)
Mar 11–15 | 2 — Paris --> Colmar (basecamp)
Basecamps / overnight stays optional
Optional extra lodging detail — one row per anchor. Optional detail after —:
Paris, FR — AirBnB
La Wantzenau — Omar's house, 24 Rue de Madrid
Transit-only trips can skip this table.
Day-by-day plans optional
One block per travel day:
### <date> | <phase #> | <day title>
What you did or plan to do. Optional: **Drive**: distance and time.
Example:
### 2026-03-12 | 2 | Arrive Paris
Check in Montmartre Airbnb, evening walk.
### 2026-03-13 | 2 | Left Bank & Seine
Classic sights along the river.
Dates can be 2026-03-13 or Mar 13 (include the year somewhere if you use short dates).
Photo zip required
- One
.zipwith all trip photos - iPhone HEIC and JPEG supported
- Location Services on when photos were taken — we place geotagged images automatically
- Visual step-by-step: How to create your photo zip
Dashboard URL name optional
Lowercase letters, numbers, hyphens. Usually auto-derived from your trip title.
Photo placements optional
Open Optional photo fixes on the form when some pictures lack location data (screenshots, exports, Location Services off).
One row per file — use the exact filename inside your zip (e.g. Day2.png, IMG_6261.HEIC).
| Filename | Stop or place | Phase | Day (optional) |
|----------|---------------|-------|----------------|
| Day2.png | Paris — Montmartre | 2 | Mar 13 |
| IMG_6199.HEIC | Colmar — Petite Venise | 3 | 2026-03-16 |
Plain-text alternative:
Day2.png | Paris — Montmartre | phase 2 | Mar 13
IMG_6199.HEIC | Colmar | phase 3 | 2026-03-16
- Phase = number from your Trip phases
- Stop or place = city, neighborhood, or landmark — we look it up on the map; exact spelling match to your legs is not required
- Day = optional but helps group photos on the right travel day
Only list exceptions — geotagged photos are placed automatically. Click Insert starter template on the form for a prefilled table. See also Place names & map lookup.
Custom trip narrative optional
Available on both one-place and multi-place uploads. Write your own trip story, daily notes, or phase-card wording. Set story voice, tone, tense, and length under Optional trip settings. We keep your wording when writing phase cards.
Flight numbers, hotel names, and travel companions can go in the same notes field.
Password protection
If your order includes it, choose a passcode (8–128 characters). Share the dashboard link and passcode separately with viewers you trust.
Trip plan — web form only
Pick One place or Multi-place on upload.html. One-place trips skip the tables. Multi-place trips use Suggest starter phases and Insert starter legs. Optional custom trip narrative is available on both paths.
How your form inputs become the dashboard route
flowchart LR
A[Upload form\none-place or phases + legs + optional narrative] --> B[trip-plan.md + order.json]
C[Photo zip] --> D[Intake package]
B --> D
D --> E[Dashboard route + days]
| Form section | Required? |
|---|---|
| Trip kind | Yes — one place (Phase 0) or multi-place |
| Trip phases table | Multi-place only |
| Route legs table | Multi-place only |
| Custom trip narrative | Optional on both paths |
| Basecamps | Optional |
If you have notes in a spreadsheet elsewhere, retype phases and legs into the form tables. Do not submit a separate trip-plan file in your zip instead of filling the form.
Photo zip — requirements
- At least two geotagged photos, or two placed photos in your placements table, or enough route detail in your trip plan
- Photos in subfolders inside the zip are fine
- Do not password-protect the zip file itself
Geotagging on iPhone
- Settings --> Privacy & Security --> Location Services — On
- Camera — allow location (While Using or Always)
- Take photos during the trip — location is stored in the file
What we exclude
| Situation | Result |
|---|---|
| Photo has GPS | Included on map (city name from map lookup) |
| No GPS + placement row | Included — place name looked up, attached to nearest stop |
| No GPS + no placement row | Excluded |
| PDF or PNG itinerary screenshot | Not read — retype into the upload form |
| Wrong filename in placements | Row skipped; noted at delivery |
| Place name not near your route | Row skipped — try a city on your trip |
We do not read text inside screenshot images — put place names in the placements table.
After you upload
- Form confirms success — we do not send a separate “processing received” email
- We build your dashboard (typically 5–7 business days)
- Private link arrives via Etsy Messages when ready for review
- After you approve, we send final delivery (URL + summary of included/excluded photos)
Troubleshooting
| Problem | What to do |
|---|---|
| “Zip too large” | Reduce size or upgrade Etsy tier |
| “Order not found” | Check Etsy order #; wait for confirmation email |
| Photos missing on map | Confirm GPS was on, or add placement rows with a city/landmark |
| Placement row skipped | Match filename exactly; use a place on your route (e.g. Paris) |
| Screenshot itinerary ignored | Retype schedule into phase + route tables on the form |
| Wrong package | Select tier matching your Etsy listing |
| Passcode rejected | Use at least 8 characters |