Global operations exposure map for your sites and suppliers

By General Input

Open one board each morning to see which of your facilities, suppliers and shipping lanes are sitting near trouble in the news right now.

Integrations

  • GDELT
  • Airtable
  • Slack

Type

App

Categories

  • Operations

I run global operations and I want an exposure board I open every morning that answers one question: which of our sites, suppliers and shipping lanes are sitting in trouble right now. Build it on GDELT for the news signal, Airtable for our own register of what we depend on, and Slack for escalation. This is a board I read and act from, not a scheduled digest, so everything happens when I open it or click something.

The register is the spine of the app. On load, read our facility and supplier register from Airtable with List Records. Each row has a name, city, country, tier (tier 1 or tier 2), category (for example manufacturing, warehouse, port, carrier, component supplier) and an owner. Let me pick the base and table during setup using List Bases and Get Base Schema so I can map my real field names onto those roles instead of renaming my columns. Cache the register in app state for the session and give me a refresh control.

The main screen is a world map. Call the GDELT Geographic News Map (GEO 2.0) operation with a single query string that ORs together my risk themes, and render the returned GeoJSON as the coverage layer, sized or shaded by mention count. On top of that layer, pin every location from my Airtable register with a marker that reads clearly against the coverage layer and shows the site name, tier and category on hover. The point of the map is instant visual proximity: I want to see where coverage is clustering and whether one of our pins is sitting inside that cluster. The GEO API only covers the last seven days, so that window is fixed. Label the map explicitly, something like 'News coverage, last 7 days' right on the panel, so nobody reads it as a longer trend.

Beside the map, show a ranked side list of my own locations, scored by how noisy their country and city are this week. Compute the score from the same GEO response: count mentions whose location name matches the record's city, count mentions falling inside the record's country, and weight city matches heavier than country matches. Show both raw counts next to the score so the number is auditable rather than magic. Sorting rule that matters: tier 1 always sorts above tier 2, even when a tier 1 site is quieter than a noisy tier 2 one. Coverage volume only orders locations within a tier. Show tier as a visible badge so the grouping is obvious, and let me filter the list by category and by country.

Clicking a location opens a drill-down panel for that place. It has three things. First, the actual stories driving the noise: call Search News Articles (DOC 2.0) with a query that combines my risk themes with location operators for that record, using locationcc: for the country and the city name as a quoted phrase, and list the headlines with source, date, tone and a link out. Second, a coverage volume trend for that place from Article Volume Timeline (DOC 2.0). Third, a sentiment trend from Article Tone Timeline (DOC 2.0). Both timelines run on the DOC rolling three month window, which is the whole reason they are useful here: the map tells me something is happening, the trends tell me whether it is a one day blip or a building situation. Label the timeline window too so the difference from the map's seven days is never confusing.

Two actions live on every location, both in the drill-down and on the side list row.

The first is 'Assess this site'. It kicks off a background agent for that record. The agent reads the underlying coverage for that location and theme set (its own Search News Articles calls plus the volume and tone timelines), then writes a short exposure assessment in three parts: what happened, who or what it affects on our side given the site's category and tier, and what to watch over the next week. Keep it tight, a few short paragraphs, and make it cite the specific stories it drew from. When it finishes, log the assessment back against that record in Airtable so the history lives next to the site: either Update Record on the register row with the assessment text and an assessed date, or Create Records in a linked incidents table with the site name, date, theme, assessment and source links, whichever the user configured during setup. Prefer the incidents table when it exists so assessments accumulate as dated rows rather than overwriting each other. The app should show the run in progress on the card, then show the finished assessment inline along with any earlier assessments for that site.

The second is 'Escalate'. It takes the most recent assessment for that location, picks the top three source links from the coverage behind it, and posts them into our operations channel with the Slack Send a Message operation. Let me choose the channel during setup using List Channels. Format the message properly for Slack: site name, tier and category in the header, the assessment body, then the three links. Tag the record owner from the register in that message, reading the owner's Slack handle or member ID from the owner field on the Airtable row and rendering it as a real mention when it is a member ID. If the owner field only holds a name or email, fall back to including it as plain text rather than posting a broken mention. Stamp the escalation back onto the Airtable record too, with a timestamp and who escalated, so the board shows what has already been raised and I do not escalate the same thing twice.

Risk themes have to be editable, not hardcoded. Ship with protests, strikes, port closures, severe weather, sanctions, conflict and power outages, and give me a settings panel where I can add, remove or reword them. The theme list drives the query string for the map, the drill-down article search and both timelines, so changing it should refresh everything consistently. Persist the theme list, the Airtable base and table mapping, the incidents table choice and the Slack channel so the board comes back configured the way I left it.

Practical notes on GDELT. It is free and needs no credential, so nothing to connect there. Everything goes through one query string with operators inside it rather than separate parameters: locationcc: for country, locationadm1: for state or province, theme: for GDELT themes, and sourcelang: or sourcecountry: if I want to narrow the press. Country names on my register need mapping to the two letter codes locationcc: expects, so keep a lookup and fall back to searching the country name as a quoted phrase when a code is missing. Always request JSON or GeoJSON explicitly, keep requests serial rather than parallel, back off on rate limiting, and cache responses for a few minutes since the underlying data only refreshes every fifteen minutes. Validation problems come back with a normal success status and an error body, so read the body before trusting a response.

Keep the framing throughout on opening the board and checking exposure. Dense but legible: the map should be the largest thing on the screen, the ranked list should be readable at a glance, and I should be able to go from opening the app to escalating a real situation in under a minute.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentWin back LiveChat visitors whose chats went unansweredChat quality review board for LiveChat support leadsWin back no-show and cancelled appointments every morningLive Loop returns analytics with product-level drill-downNewsletter pre-flight and approval board for Mailjet sendsTurn a prospect spreadsheet into personalized sequence enrollmentsMailjet email delivery lookup console for support teamsCatch feature flags that never got switched on in productionKajabi customer support console for member access fixes