Daily on-site visits briefing in Slack with mapped addresses

Every weekday at 7am, get one Slack DM listing today's in-person meetings with cleaned addresses, map links, and the order to drive them.

Agentic Task
Google CalendarOpenStreetMap NominatimSlackSalesPersonal ProductivityDaily DigestsMeeting Workflows

Every weekday at 7am in my local time zone, send me one Slack DM that briefs me on today's in-person, on-site customer visits — and only those.

Trigger: cron, every weekday (Monday through Friday) at 7am local.

Step 1 — Pull today's events. Use Google Calendar's List Events on my primary calendar, scoped to today (start of day through end of day in my local time zone). Expand recurring events into single instances so each visit shows up on its own. Skip events I have declined and skip all-day events.

Step 2 — Decide which events are real on-site visits. Look at each event's location field and reason about whether it is an actual physical address. Keep it only if it looks like a street address (street + city, a venue with a real address, a postal code, etc.). Drop it if the location is a Zoom / Google Meet / Microsoft Teams / Webex link, a phone number or dial-in, an empty string, a meeting room name, or anything else that is clearly not a place I would drive to. If the location field is empty but the description contains an obvious mailing address, treat that as the address. When in doubt, drop the event rather than geocode noise.

Step 3 — Geocode each surviving address. For every kept event, call OpenStreetMap Nominatim's Search (Forward Geocode) operation with the address. Set a descriptive User-Agent that identifies this workflow and includes a contact email. Important: pace the calls at no more than one per second to stay inside Nominatim's fair-use limit — sleep at least 1000ms between requests. If Nominatim returns no match for an address, gracefully drop that single event and keep going; do not fail the whole run. Capture the cleaned display name (display_name from the response) and the lat/lon for each match.

Step 4 — Sort and number the visits. Order the kept events by start time, earliest first, and number them 1, 2, 3, … so I can see the order I'll hit them across the day.

Step 5 — Build the message. Send one consolidated Slack DM to me using Slack's Send a Message operation (open a DM with my own user first if needed). Use Slack mrkdwn formatting (single asterisks for bold, <url|text> for links). The message should have:

  • A short header like *Today's on-site visits — Tue, Jun 3* with the count of stops.

  • One block per visit, in order, showing: the stop number, the event title, the start time in my local time zone, the primary external attendee's name (or company) if one is on the invite, the cleaned address from Nominatim, and a Google Maps link built from the returned coordinates using https://www.google.com/maps/search/?api=1&query=<lat>,<lon>.

  • A one-line footer if any events were skipped because Nominatim could not match the address, so I know to double-check them manually.

If there are zero on-site visits today, send a single short DM that says I have no in-person visits today so I know the workflow ran. Do not send a message on weekends.

Integrations: Google Calendar (List Events), OpenStreetMap Nominatim (Search / Forward Geocode), Slack (Send a Message).

Additional information

What does this prompt do?
  • Scans today's Google Calendar and pulls out only the meetings with a real street address, skipping Zoom links, phone numbers, and virtual rooms.
  • Cleans each address and adds a tap-to-open Google Maps link so you can route straight from the message.
  • Sorts the day in visit order with start times and attendee names, so you know who is first and what is next.
  • Sends the whole rundown as a single Slack DM, so you walk into the day already mapped out.
What do I need to use this?
  • A Google account with the calendar that holds your customer visits.
  • A Slack workspace where the briefing can be sent to you as a direct message.
  • A list of meetings with the location filled in (street address). Zoom links and phone numbers are ignored automatically.
How can I customize it?
  • Change the send time or days. Run it at 6am, push it to weekends, or skip Fridays.
  • Pick which calendar to read. Personal, shared team calendar, or a dedicated field calendar.
  • Decide what counts as on-site. By default it ignores Zoom, Google Meet, Teams, and phone numbers. Tighten or loosen the filter to your taste.
  • Swap the destination. Send the briefing to a partner, an assistant, or a shared field-ops channel instead of your own DM.

Frequently asked questions

What if a meeting has no address, just a Zoom link?
It is skipped. The briefing only lists meetings that have a real street address in the location field, so virtual meetings, phone calls, and meeting room names stay out.
What happens if an address cannot be found on a map?
That meeting is quietly dropped from the briefing. You will still see the rest of the day so you are never left without a rundown.
Does this work for personal calendars, not just work?
Yes. Point it at any Google Calendar you can see. Field sales reps, account managers, consultants, home service providers, and real estate agents all use the same setup.
Can I send it somewhere other than my Slack DM?
Yes. The same briefing can go to a Slack channel, a partner's DM, or your assistant. Just say where you want it delivered when you set it up.
What time zone does the schedule use?
Your local time zone. If you set it for 7am, it fires at 7am where you are, every weekday.

Walk into every customer visit already mapped.

Connect Google Calendar and Slack once, and Geni will send you a clean, in-order on-site briefing every weekday at 7am.