# Visits and location

> The visit list, detail page, map and the team's day; arriving with "I'm here", the exit location on save, distance to the company, visit duration — modes, privacy, company location.

The **Visits** page shows every activity day by day, and each visit has its own detail page. When an admin turns on **visit location**, the salesperson taps **I'm here** on arrival and the exit location is added when the visit is saved — the distance to the company and the visit duration are recorded automatically.

:::note
Location is taken at two moments only: when **I'm here** is tapped and when the visit is saved. There is no all-day tracking, background location or route recording.
:::

## Visits page {#list}

**Visits** in the left menu (on mobile *Menu › Visits*). Three tabs:

| Tab | What it shows |
|---|---|
| **List** | Visits day by day: time (and duration), company, type · topic · person · salesperson, note → result, next step, location badge |
| **Map** | The period's visits on a map — the colour shows the location status; click a row in the side list to open it on the map |
| **Team's day** | Admins only — each salesperson's stops for the day, a mini map, first–last time, time on site, distance travelled |

Filters: **Mine / Team**, period (today, this week, this month, last 30 / 90 days, all), type, salesperson, search (company, note, result), **Awaiting action**, **No location** (on-site visits saved without a location) and **Away from company**. The summary at the top shows the number of visits, the face-to-face share, and the share of on-site visits with a location and at the company. **Excel** downloads the filtered visits with location columns.

## Visit detail {#detail}

Opens when you click a row: the note and result, opportunity / product / line, the **next step** (opens the action card), the **Location** card and the company's previous visits. **Edit** and **Delete** are here; Record ID links land on this page too.

## Visit location {#location}

**Settings → Visits and location** (admins):

| Mode | Behaviour |
|---|---|
| **Off** | No location is taken; I'm here is hidden |
| **Optional** (default) | Salespeople can tap I'm here; a location is added on save if permission is granted; saving without one is fine |
| **Required for face-to-face visits** | An on-site visit can't be saved without a location — if none can be taken, the salesperson picks a reason |

**At-company radius** (100 m – 2 km, default 300 m): if the arrival point is within this distance of the company's location the visit counts as **At the company**, otherwise **Away from the company**. Choose 500 m – 1 km for large plant sites.

Location is only handled for **Face to face** and **Trial** visits saved **with today's date**. Phone and online meetings and back-dated entries don't take a location.

### I'm here {#checkin}

:::steps
### When you arrive
On the web, **I'm here** on the **Visits** page or on the company card; on mobile on the company card, on **Today** or in Visits. The browser / phone asks for location permission.

### Pick the company
Opened from a company card, it's that company. Otherwise nearby companies (with a known location, by distance — those within the radius say *here*) and the ones you visited recently are listed; you can also search.

### Result
*You're at the company (40 m)*, *You're 1.2 km away from the company*, *You're 70 km from the company's address* (when the company has no saved location — [by address](#address)) or *Company location saved*. A slim strip stays at the top of the pages (company · time elapsed · status): **Save** opens Quick Entry with the company selected, **⋯ › Cancel check-in** removes it.
:::

An open check-in expires after 12 hours. Tapping I'm here at another company marks the previous one as *left*.

### Exit and duration {#checkout}

When the visit is saved from [Quick Entry](/guides/quick-entry) or the visit form on the company card, the current location becomes the **exit**. A **Location** card shows on the form (on mobile too): with an open check-in *Arrived 10:42 · At the company*, otherwise once the location is taken the **live distance** — *You're at the company · 40 m*, *You're 8.5 km away*, *You're 70 km from the company's address* or *Consistent with the company's address*. If permission was already granted the location is taken quietly when you start using the form; otherwise **Add location** asks — the page never asks for permission as soon as it opens. With an open check-in the arrival time comes from it and the **duration** = save time − arrival. Without I'm here the location on save is both arrival and exit, and the duration stays empty.

### If no location can be taken in required mode {#reasons}

The salesperson picks a reason: *Location permission not given* · *Location unavailable (indoors / no GPS)* · *The meeting wasn't at the company* · *Other*. The visit is saved as **No location** with the reason; admins see these with the **No location** filter. Visits logged through the [Claude connector](/mcp/overview) aren't blocked; they're saved without a location, noted *entered via Claude*.

### Location permission {#permission}

When no location can be taken the form says why and how to fix it:

| Message | What to do |
|---|---|
| *Location is blocked for this site* | The site settings icon left of the address bar › **Location › Allow** (Safari: *Settings › Websites › Location*; iPhone Safari: *aA › Website Settings › Location*), then reload |
| *The site is allowed but the device gives no location* | Mac: **System Settings › Privacy & Security › Location Services** on and the browser ticked · Windows: **Settings › Privacy & security › Location** — *Location services* and *Let desktop apps access your location* on |
| *Location permission not given* | Try again and choose **Allow** in the browser's prompt |
| Mobile app: *Location permission is off* | The **Settings** button → *Location › While Using the App* |

### Location statuses {#status}

| Status | Meaning |
|---|---|
| **At the company** | Arrival within the radius of the company's location |
| **Away from the company** | Outside the radius — the distance is shown. Without a company location: *… from the company's address* |
| **Company location saved** | The company's location was unknown; this visit's location became it |
| **Location uncertain** | Accuracy worse than 1.5 km, or the company's location is unknown |
| **No location** | No location left (the reason is shown) |

## Company location {#firm}

A company's location comes from:

- **The first visit with a location** — at a company with no known location, the first arrival with better than ±250 m accuracy becomes its location.
- **Company card → ⋯ → Company location** (admins or the company's owner) — click on the map, drag the marker, **Use my current location** or **Find from address** (an approximate point from the address; drag the marker to the entrance and save). Without a location the map opens centred on the company's address. On mobile, the *Company location* row on the company card.

If a visit shows *Away from the company* because the company's location is wrong, use **Save the company location from this visit** on the visit detail.

## Distance by address {#address}

For a company with no saved location the distance is measured against the approximate point found from its **address** (address + city):

- Far from the address shows *… from the company's address* and the check-in **doesn't become the company location** — a first check-in made in the wrong place no longer becomes it.
- Consistent with the address and accuracy better than ±250 m makes the check-in the company location (the address is only approximate, so the company location still comes from the check-in).
- Addresses are often found only at street or district level, so the tolerance is wide: building 100 m · street 1 km · neighbourhood 2 km · district 8 km · province 60 km. Missing a mismatch is preferred over a wrong *away*.
- Addresses without a known province aren't looked up. If the address isn't found or there is none, the old rule applies.
- The result is stored with the company and looked up again when the address changes. The provider is set in [Maps and location from address](#provider). Only the company's address and city text is sent.

## Maps and location from address {#provider}

**Settings → Visits and location → Maps and location from address** (admins):

| Option | What happens |
|---|---|
| **Automatic** (default) | Solk's Google Maps account if it's on, otherwise OpenStreetMap |
| **Solk — Google Maps** | Addresses are looked up with Google through Solk (often to the building), web maps use Google Maps. No extra charge |
| **Your own Google keys** | Lookups and maps from your own Google Cloud account — a **server key** (Geocoding API, restricted to the server IP) + a **browser key** (Maps JavaScript API, restricted to `https://<company>.solk.app/*`). Google bills you (10,000 free per API per month) |
| **OpenStreetMap** | Free, no key; Turkish addresses are often found only to neighbourhood / district level |

**Test connection** looks up a sample address with the saved provider; **Try the map** opens the map on the page (and says if the Google key doesn't work on this address).

:::note
Google's terms allow showing a Google address point only on a Google map — that's why web maps switch to Google Maps when Google is selected. Coordinates are kept for at most 30 days, then refreshed with Google's place ID. In the company location window *Find from address* shows the address on the map; the company location is the point you click at the entrance.
:::

If Google can't be reached or Solk's monthly lookup limit is reached, that lookup uses OpenStreetMap.

## Privacy {#privacy}

- Coordinates, distance, arrival / exit times and duration are visible only to **the person who logged the visit and admins**. Teammates see the visit but not its location; on the map it's shown at the company's location.
- Location is taken only at I'm here and on save, with the device's *while using the app* permission.
- The mobile app doesn't ask for background location.
- The company's address (not personal data) is sent to the geocoding provider to be turned into coordinates.

## API {#api}

[Visits](/rest-api/activities/visits), [Visit](/rest-api/activities/visit), [Open check-in](/rest-api/activities/checkin-state), [I'm here](/rest-api/activities/checkin), [Cancel check-in](/rest-api/activities/checkin-cancel), [Nearby companies](/rest-api/activities/nearby), [Distance reference](/rest-api/activities/firm-geo), [Team's day](/rest-api/activities/team-day), [Company location](/rest-api/companies/geo). [Log an activity](/rest-api/activities/log) and [Quick Entry 2.0](/rest-api/quickentry/qe-submit) accept `geo_lat`, `geo_lng`, `geo_acc` or `geo_note`; in required mode a visit without a location returns `400 geo_required`. Check-ins and visit `geo` carry `base` (`firm` · `addr`). `/me` → `caps.visits2`, `caps.geo`, `geo66` (`set_acc`, `low_acc`, `firm_geo`).