# esri/webhooks-samples architecture

> Architecture diagram of the GitHub repository esri/webhooks-samples, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/esri/webhooks-samples
- Repository: https://github.com/esri/webhooks-samples

## Overview

This repository is a catalog of ArcGIS webhook receiver samples and end-to-end automation examples, rather than one deployed application. The common workflow is an ArcGIS event delivered to a receiver, which may validate or process its payload and trigger an outcome such as email, change retrieval, Slack notification, or table storage. The graph includes documented receiver options and sampled workflow components. Several listed receivers and commercial integrations are represented only by their documented directories; their internal behavior and wiring were not inspected.

Main entry points: [`sample-workflows/slack/admin_assistant.py`](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/admin_assistant.py) (Slack Assistant), [`Developer/typescript/node.js/src/app.ts`](https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/app.ts) (Feature Service Receiver), [`sample-workflows/azure-write-table/Hook/__init__.py`](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/azure-write-table/Hook/__init__.py) (Azure Table Workflow), [`Developer/azure/function.python/Hook/__init__.py`](https://github.com/Esri/webhooks-samples/blob/master/Developer/azure/function.python/Hook/__init__.py) (Azure Receiver)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_receivers["Webhook Receivers"]
  node_node_receiver["Node Receiver<br/>[server.js]"]
  node_python_receiver["Flask Receiver<br/>[webhookListener.py]"]
  node_java_receiver["Java Receiver"]
  node_azure_receiver["Azure Receiver<br/>[__init__.py]"]
  node_notebook_receiver["Notebook Receiver"]
  node_feature_receiver["Feature Service Receiver<br/>[app.ts]"]
end

subgraph group_processing["Payload Processing"]
  node_payload_types["Payload Types<br/>[interfaces.ts]"]
  node_job_states["Change Types<br/>[enums.ts]"]
  node_signature_check["Signature Checks<br/>[hash_check.py]"]
end

subgraph group_workflows["Workflow Samples"]
  node_email_listener["Email Listener<br/>[webhookListener.py]"]
  node_email_sender["Email Sender<br/>[sendEmail.py]"]
  node_extract_listener["Extract Listener<br/>[webhookListener.py]"]
  node_extract_manager["Extract Changes Manager<br/>[ec.py]"]
  node_table_writer["Azure Table Workflow<br/>[__init__.py]"]
  node_slack_assistant["Slack Assistant<br/>[admin_assistant.py]"]
  node_slack_config["Slack Configuration<br/>[config.py]"]
  node_slack_listener["Slack File Listener<br/>[file_listener.py]"]
end

subgraph group_integrations["Automation Integrations"]
  node_email_service["SMTP Service"]
  node_gis_portal["ArcGIS Portal"]
  node_azure_table[("Azure Table")]
  node_slack_service["Slack"]
  node_commercial_receivers["Commercial Receivers"]
end

node_arcgis(("ArcGIS Webhooks"))

node_arcgis -->|"sends webhook"| node_node_receiver
node_arcgis -->|"sends webhook"| node_python_receiver
node_arcgis -->|"sends webhook"| node_java_receiver
node_arcgis -->|"sends webhook"| node_azure_receiver
node_arcgis -->|"sends payload"| node_notebook_receiver
node_arcgis -->|"sends webhook"| node_feature_receiver
node_feature_receiver -->|"uses types"| node_payload_types
node_feature_receiver -->|"checks states"| node_job_states
node_azure_receiver -->|"verifies signature"| node_signature_check
node_arcgis -->|"sends webhook"| node_email_listener
node_email_listener -->|"sends payload"| node_email_sender
node_email_sender -->|"sends email"| node_email_service
node_arcgis -->|"sends webhook"| node_extract_listener
node_extract_listener -->|"retrieves changes"| node_extract_manager
node_extract_manager -->|"requests changes"| node_gis_portal
node_arcgis -->|"sends webhook"| node_table_writer
node_table_writer -->|"checks signature"| node_signature_check
node_table_writer -->|"writes records"| node_azure_table
node_slack_listener -->|"invokes"| node_slack_assistant
node_slack_assistant -->|"imports settings"| node_slack_config
node_slack_assistant -->|"reads item data"| node_gis_portal
node_slack_assistant -->|"posts messages"| node_slack_service
node_arcgis -.->|"sends webhook"| node_commercial_receivers

click node_node_receiver "https://github.com/Esri/webhooks-samples/blob/master/Developer/javascript/node.js/server.js"
click node_python_receiver "https://github.com/Esri/webhooks-samples/blob/master/Developer/python/flask/webhookListener.py"
click node_java_receiver "https://github.com/Esri/webhooks-samples/blob/master/Developer/java/src/main/java/WebhookListener.java"
click node_azure_receiver "https://github.com/Esri/webhooks-samples/blob/master/Developer/azure/function.python/Hook/__init__.py"
click node_notebook_receiver "https://github.com/Esri/webhooks-samples/tree/master/Developer/notebookserver"
click node_feature_receiver "https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/app.ts"
click node_payload_types "https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/interfaces.ts"
click node_job_states "https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/enums.ts"
click node_signature_check "https://github.com/Esri/webhooks-samples/blob/master/Developer/azure/function.python/Hook/hash_check.py"
click node_email_listener "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-email/webhookListener.py"
click node_email_sender "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-email/sendEmail.py"
click node_extract_listener "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-extract-changes/webhookListener.py"
click node_extract_manager "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-extract-changes/ec.py"
click node_table_writer "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/azure-write-table/Hook/__init__.py"
click node_slack_assistant "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/admin_assistant.py"
click node_slack_config "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/config.py"
click node_slack_listener "https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/file_listener.py"
click node_commercial_receivers "https://github.com/Esri/webhooks-samples/tree/master/3rdParty"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_node_receiver,node_python_receiver,node_java_receiver,node_azure_receiver,node_notebook_receiver,node_feature_receiver toneBlue
class node_payload_types,node_job_states,node_signature_check toneAmber
class node_email_listener,node_email_sender,node_extract_listener,node_extract_manager,node_table_writer,node_slack_assistant,node_slack_config,node_slack_listener,node_arcgis toneMint
class node_email_service,node_gis_portal,node_azure_table,node_slack_service,node_commercial_receivers toneRose
```

## Components

### Webhook Receivers

- [Node Receiver](https://github.com/Esri/webhooks-samples/blob/master/Developer/javascript/node.js/server.js): `Developer/javascript/node.js/server.js`
- [Flask Receiver](https://github.com/Esri/webhooks-samples/blob/master/Developer/python/flask/webhookListener.py): `Developer/python/flask/webhookListener.py`
- [Java Receiver](https://github.com/Esri/webhooks-samples/blob/master/Developer/java/src/main/java/WebhookListener.java): `Developer/java/src/main/java/WebhookListener.java`
- [Azure Receiver](https://github.com/Esri/webhooks-samples/blob/master/Developer/azure/function.python/Hook/__init__.py): `Developer/azure/function.python/Hook/__init__.py`
- [Notebook Receiver](https://github.com/Esri/webhooks-samples/tree/master/Developer/notebookserver): `Developer/notebookserver`
- [Feature Service Receiver](https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/app.ts): `Developer/typescript/node.js/src/app.ts`

### Payload Processing

- [Payload Types](https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/interfaces.ts): `Developer/typescript/node.js/src/interfaces.ts`
- [Change Types](https://github.com/Esri/webhooks-samples/blob/master/Developer/typescript/node.js/src/enums.ts): `Developer/typescript/node.js/src/enums.ts`
- [Signature Checks](https://github.com/Esri/webhooks-samples/blob/master/Developer/azure/function.python/Hook/hash_check.py): `Developer/azure/function.python/Hook/hash_check.py`

### Workflow Samples

- [Email Listener](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-email/webhookListener.py): `sample-workflows/python-email/webhookListener.py`
- [Email Sender](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-email/sendEmail.py): `sample-workflows/python-email/sendEmail.py`
- [Extract Listener](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-extract-changes/webhookListener.py): `sample-workflows/python-extract-changes/webhookListener.py`
- [Extract Changes Manager](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/python-extract-changes/ec.py): `sample-workflows/python-extract-changes/ec.py`
- [Azure Table Workflow](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/azure-write-table/Hook/__init__.py): `sample-workflows/azure-write-table/Hook/__init__.py`
- [Slack Assistant](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/admin_assistant.py): `sample-workflows/slack/admin_assistant.py`
- [Slack Configuration](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/config.py): `sample-workflows/slack/config.py`
- [Slack File Listener](https://github.com/Esri/webhooks-samples/blob/master/sample-workflows/slack/file_listener.py): `sample-workflows/slack/file_listener.py`

### Automation Integrations

- **SMTP Service**
- **ArcGIS Portal**
- **Azure Table**
- **Slack**
- [Commercial Receivers](https://github.com/Esri/webhooks-samples/tree/master/3rdParty): `3rdParty`

### Other components

- **ArcGIS Webhooks**

## Connections

- ArcGIS Webhooks → Node Receiver: sends webhook (evidence: `README.md`)
- ArcGIS Webhooks → Flask Receiver: sends webhook (evidence: `README.md`)
- ArcGIS Webhooks → Java Receiver: sends webhook (evidence: `README.md`)
- ArcGIS Webhooks → Azure Receiver: sends webhook (evidence: `README.md`)
- ArcGIS Webhooks → Notebook Receiver: sends payload (evidence: `README.md`)
- ArcGIS Webhooks → Feature Service Receiver: sends webhook (evidence: `README.md`)
- Feature Service Receiver → Payload Types: uses types (evidence: `Developer/typescript/node.js/src/app.ts`)
- Feature Service Receiver → Change Types: checks states (evidence: `Developer/typescript/node.js/src/app.ts`)
- Azure Receiver → Signature Checks: verifies signature (evidence: `Developer/azure/function.python/Hook/__init__.py`)
- ArcGIS Webhooks → Email Listener: sends webhook (evidence: `README.md`)
- Email Listener → Email Sender: sends payload (evidence: `sample-workflows/python-email/webhookListener.py`)
- Email Sender → SMTP Service: sends email (evidence: `sample-workflows/python-email/sendEmail.py`)
- ArcGIS Webhooks → Extract Listener: sends webhook (evidence: `README.md`)
- Extract Listener → Extract Changes Manager: retrieves changes (evidence: `sample-workflows/python-extract-changes/webhookListener.py`)
- Extract Changes Manager → ArcGIS Portal: requests changes (evidence: `sample-workflows/python-extract-changes/ec.py`)
- ArcGIS Webhooks → Azure Table Workflow: sends webhook (evidence: `README.md`)
- Azure Table Workflow → Signature Checks: checks signature (evidence: `sample-workflows/azure-write-table/Hook/__init__.py`)
- Azure Table Workflow → Azure Table: writes records (evidence: `sample-workflows/azure-write-table/Hook/__init__.py`)
- Slack File Listener → Slack Assistant: invokes (evidence: `sample-workflows/slack/file_listener.py`)
- Slack Assistant → Slack Configuration: imports settings (evidence: `sample-workflows/slack/admin_assistant.py`)
- Slack Assistant → ArcGIS Portal: reads item data (evidence: `sample-workflows/slack/admin_assistant.py`)
- Slack Assistant → Slack: posts messages (evidence: `sample-workflows/slack/admin_assistant.py`)
- ArcGIS Webhooks → Commercial Receivers: sends webhook (evidence: `README.md`)
