diff --git a/.github/workflows/config/labeler.yml b/.github/workflows/config/labeler.yml index e212b1480bafe..33cf756bda4d4 100644 --- a/.github/workflows/config/labeler.yml +++ b/.github/workflows/config/labeler.yml @@ -579,6 +579,8 @@ integration/ray: - ray/**/* integration/redisdb: - redisdb/**/* +integration/resend: +- resend/**/* integration/rethinkdb: - rethinkdb/**/* integration/riak: diff --git a/resend/CHANGELOG.md b/resend/CHANGELOG.md new file mode 100644 index 0000000000000..aeec25a6ddf74 --- /dev/null +++ b/resend/CHANGELOG.md @@ -0,0 +1,7 @@ +# CHANGELOG - Resend + +## 1.0.0 / 2025-11-21 + +***Added***: + +* Initial Release diff --git a/resend/README.md b/resend/README.md new file mode 100644 index 0000000000000..d11a55b60f2f3 --- /dev/null +++ b/resend/README.md @@ -0,0 +1,64 @@ +# Resend + +## Overview + +[Resend][1] is an email delivery service for sending broadcast and transactional emails via a developer API. + +To gain insights into Resend's broadcast and transactional message streams, integrate Resend with Datadog using [webhooks][2]. +This allows events to be received by Datadog and converted to logs. + +## Setup + +Follow the instructions below to configure this integration for your Resend account. + + +### Configuration + +#### Webhook configuration steps +Create a webhook in Resend to forward events to Datadog: +1. Log into your [Resend account][3] and navigate to the [webhooks][4] page. +2. Click the **Add webhook** button and enter the following: + - Enter the url provided by Datadog. + - Select "All Events" for the events types. +3. Click **Add**. + +#### Optional: Enable click tracking for each Resend domain +Follow these steps to enable email click and optionally open email tracking for each Resend domain: +1. Navigate to the Resend [domains][5] page. +3. For each sending domain in use: + 1. Click on the domain name to edit. + 2. In the Configuration section, enable **Click Tracking**. + 3. Optionally, enable **Open Tracking**. Though Resend [cautions against depending on open tracking](https://resend.com/docs/knowledge-base/why-are-my-open-rates-not-accurate). + +#### Optional: Surface the use of tags in transactional email in the Datadog Dashboard +The Resend API supports per-message tags for transactional email, such as a +`priority` attribute with values of _high_, _normal_, or _low_. The tag can be +defined as a template variable in the Datadog dashboard to filter results by tag value. +For an example, see the `priority` template variable in the Resend Overview dashboard provided with this integration. + +## Data Collected + +### Logs +The Resend integration converts Resend webhook events to Datadog logs. The events +contain email header and tag information which included sender and recipient email addresses. +Actual email content is not included in the events. + +### Metrics +The Resend integration does not define any metrics. + +### Service Checks +Resend does not include any service checks. + +### Events +Resend does not include any events. + +## Troubleshooting + +Need help? Contact [Datadog support][6]. + +[1]: https://resend.com/ +[2]: https://resend.com/docs/dashboard/webhooks/introduction +[3]: https://resend.com/login +[4]: https://resend.com/webhooks +[5]: https://resend.com/domains +[6]: https://docs.datadoghq.com/help/ diff --git a/resend/assets/dashboards/resend_overview.json b/resend/assets/dashboards/resend_overview.json new file mode 100644 index 0000000000000..9b1f3fa42657e --- /dev/null +++ b/resend/assets/dashboards/resend_overview.json @@ -0,0 +1,4354 @@ +{ + "title": "Resend Overview", + "description": "Track the effectiveness of Resend broadcast and transactional email.", + "widgets": [ + { + "id": 2074004104711888, + "definition": { + "type": "image", + "url": "/api/v2/images/1bba9a73-2985-400a-8c2d-a5f12b792ced", + "url_dark_theme": "/api/v2/images/a2d769f7-8400-4e0d-ba3a-cba734b093b0", + "sizing": "contain", + "has_background": true, + "has_border": false, + "vertical_align": "center", + "horizontal_align": "center" + }, + "layout": { + "x": 0, + "y": 0, + "width": 3, + "height": 1 + } + }, + { + "id": 1511984411456656, + "definition": { + "title": "Overview", + "background_color": "white", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [ + { + "id": 1383597922205404, + "definition": { + "title": "Sent", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 0, + "y": 0, + "width": 2, + "height": 1 + } + }, + { + "id": 7878012237089596, + "definition": { + "title": "Opened", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 2, + "y": 0, + "width": 2, + "height": 1 + } + }, + { + "id": 6835247829337743, + "definition": { + "title": "Failed", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.failed $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 4, + "y": 0, + "width": 2, + "height": 1 + } + }, + { + "id": 5890320592767403, + "definition": { + "title": "Delivery Delayed", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivery_delayed $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 6, + "y": 0, + "width": 3, + "height": 1 + } + }, + { + "id": 7736845146581511, + "definition": { + "title": "Delivered", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 0, + "y": 1, + "width": 2, + "height": 1 + } + }, + { + "id": 5364741650165821, + "definition": { + "title": "Clicked", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 2, + "y": 1, + "width": 2, + "height": 1 + } + }, + { + "id": 8267569285204591, + "definition": { + "title": "Complained", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 4, + "y": 1, + "width": 2, + "height": 1 + } + }, + { + "id": 5104249621174987, + "definition": { + "title": "Dropped/Bounced", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar" + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 6, + "y": 1, + "width": 3, + "height": 1 + } + }, + { + "id": 2423901784002468, + "definition": { + "title": "Delivered", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query2 / query1) * 100)" + } + ], + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 92, + "palette": "white_on_green" + }, + { + "comparator": "<", + "value": 50, + "palette": "white_on_red" + }, + { + "comparator": ">=", + "value": 50, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 1, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 0, + "y": 2, + "width": 2, + "height": 2 + } + }, + { + "id": 2030625126344917, + "definition": { + "title": "Clicked", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query2 / query1) * 100)" + } + ], + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 65, + "palette": "white_on_green" + }, + { + "comparator": "<", + "value": 30, + "palette": "white_on_red" + }, + { + "comparator": ">=", + "value": 30, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 1, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 2, + "y": 2, + "width": 2, + "height": 2 + } + }, + { + "id": 3529713767121673, + "definition": { + "title": "Unsubscribed", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query2 / query1) * 100)" + } + ], + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:contact.updated @data.unsubscribed:1 $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count", + "metric": "@data.email" + }, + "storage": "hot" + }, + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 5, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 2, + "palette": "white_on_yellow" + }, + { + "comparator": "<=", + "value": 2, + "palette": "white_on_green" + } + ] + } + ], + "autoscale": true, + "precision": 1, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 4, + "y": 2, + "width": 2, + "height": 2 + } + }, + { + "id": 3723469971147644, + "definition": { + "title": "Failed/Bounced", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query2 / query1) * 100)" + } + ], + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:(email.failed OR email.bounced) $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": "<", + "value": 5, + "palette": "white_on_green" + }, + { + "comparator": "<", + "value": 10, + "palette": "white_on_yellow" + }, + { + "comparator": ">=", + "value": 10, + "palette": "white_on_red" + } + ] + } + ], + "autoscale": true, + "precision": 1, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 6, + "y": 2, + "width": 3, + "height": 2 + } + }, + { + "id": 7952409078053929, + "definition": { + "title": "Monitor Status", + "type": "manage_status", + "display_format": "list", + "color_preference": "text", + "hide_zero_counts": true, + "show_status": true, + "last_triggered_format": "relative", + "query": "tag:(source:resend) $template_id", + "sort": "status,asc", + "count": 50, + "start": 0, + "summary_type": "monitors", + "show_priority": false, + "show_last_triggered": false + }, + "layout": { + "x": 0, + "y": 4, + "width": 9, + "height": 3 + } + }, + { + "id": 5777119894390674, + "definition": { + "title": "Unsubscribe Activity to Email Delivery", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "alias": "Delivered", + "formula": "query1" + }, + { + "alias": "Unsubscribed", + "style": { + "palette": "orange", + "palette_index": 6 + }, + "formula": "query2" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered $template_id $domain $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:contact.updated @data.unsubscribed:1 $priority $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "timeseries", + "style": { + "palette": "green", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + } + ], + "yaxis": { + "include_zero": true, + "scale": "linear", + "min": "auto", + "max": "auto" + } + }, + "layout": { + "x": 0, + "y": 7, + "width": 9, + "height": 3 + } + } + ] + }, + "layout": { + "x": 3, + "y": 0, + "width": 9, + "height": 11 + } + }, + { + "id": 8917290706883810, + "definition": { + "type": "note", + "content": "Gain better visibility into your broadcast and transactional email performance by monitoring events with this dashboard.\n\nBeyond email events such as Bounced Email, Clicked Email, etc., this dashboard displays domain and contact updates which can alert you to unexpected changes.\n\nDefine Resend tags when submitting transactional email and surface these tags in this Dashboard to filter the display. For example, a `priority` tag with values in _high_, _normal_, and _low_. See the [api documentation](https://resend.com/docs/api-reference/emails/send-email).\n\nUse the `domain`, `broadcast_id` , `template_id`, and `priority` template variables to restrict data to a subset of broadcasts or email.", + "background_color": "blue", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": false, + "tick_pos": "50%", + "tick_edge": "top", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 1, + "width": 3, + "height": 10 + } + }, + { + "id": 7150718728972441, + "definition": { + "title": "Broadcast Email", + "background_color": "vivid_blue", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [ + { + "id": 3109671020016291, + "definition": { + "type": "note", + "content": "Email events describe states and final disposition of the broadcast as well as click activity within the opened email. See the [description of email deliverability](https://resend.com/docs/dashboard/emails/introduction#understand-email-events).", + "background_color": "blue", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": true, + "tick_pos": "50%", + "tick_edge": "bottom", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 0, + "width": 12, + "height": 1 + } + }, + { + "id": 8329971943698914, + "definition": { + "title": "Email Broadcast Performance Summary", + "title_size": "16", + "title_align": "left", + "type": "query_table", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query3", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query4", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query5", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Permanent $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query6", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Undetermined $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query7", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Transient $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query8", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.failed @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query9", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "sort": { + "count": 90, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + }, + "formulas": [ + { + "cell_display_mode": "number", + "alias": "Sent", + "formula": "query1" + }, + { + "cell_display_mode": "number", + "alias": "Delivered", + "formula": "query2" + }, + { + "cell_display_mode": "number", + "alias": "Opened", + "formula": "query3" + }, + { + "cell_display_mode": "number", + "alias": "Clicked", + "formula": "query4" + }, + { + "cell_display_mode": "number", + "alias": "Hard Bounce", + "formula": "query5" + }, + { + "cell_display_mode": "number", + "alias": "Undetermined Bounce", + "formula": "query6" + }, + { + "cell_display_mode": "number", + "alias": "Soft Bounce", + "formula": "query7" + }, + { + "cell_display_mode": "number", + "alias": "Failed", + "formula": "query8" + }, + { + "cell_display_mode": "number", + "alias": "Complained", + "formula": "query9" + } + ] + } + ], + "has_search_bar": "auto" + }, + "layout": { + "x": 0, + "y": 1, + "width": 12, + "height": 3 + } + }, + { + "id": 1601260360695293, + "definition": { + "title": "Opened Email Percentage", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": "<", + "value": 10, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 0, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 8108409578166421, + "definition": { + "type": "note", + "content": "Opened and Clicked Email percentages are calculated by comparing the volume of Opened and Clicked Email compared to Delivered Email **within the same time span of the dashboard view**.\n\nResend [cautions on using open rates](https://resend.com/docs/knowledge-base/why-are-my-open-rates-not-accurate) as a measure and advises focusing on click rate metrics.", + "background_color": "blue", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": false, + "tick_pos": "50%", + "tick_edge": "right", + "has_padding": true + }, + "layout": { + "x": 4, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 3381654448226522, + "definition": { + "title": "Clicked Email Percentage", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": "<", + "value": 10, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 8, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 763900043629789, + "definition": { + "title": "Clicked Email Locations", + "title_size": "16", + "title_align": "left", + "time": {}, + "type": "geomap", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@network.client.geoip.subdivision.iso_code", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "formulas": [ + { + "formula": "query1" + } + ], + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "palette": "yellow_to_green", + "palette_flip": false + }, + "view": { + "focus": "US" + } + }, + "layout": { + "x": 0, + "y": 7, + "width": 12, + "height": 6 + } + }, + { + "id": 6836248737505238, + "definition": { + "title": "Most Clicked URLs", + "title_size": "16", + "title_align": "left", + "type": "query_table", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.click.link", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + }, + "formulas": [ + { + "cell_display_mode": "number", + "alias": "count", + "formula": "query1" + } + ] + } + ], + "has_search_bar": "auto" + }, + "layout": { + "x": 0, + "y": 13, + "width": 6, + "height": 3 + } + }, + { + "id": 2798246755564723, + "definition": { + "title": "Most Clicked Domains", + "title_size": "16", + "title_align": "left", + "time": {}, + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + } + } + }, + "layout": { + "x": 6, + "y": 13, + "width": 6, + "height": 3 + } + }, + { + "id": 897131023425208, + "definition": { + "title": "Email Open and Clicked Activity ", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + }, + { + "formula": "query2" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "timeseries", + "style": { + "palette": "green", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "bars" + } + ], + "yaxis": { + "include_zero": true, + "scale": "linear", + "min": "auto", + "max": "auto" + } + }, + "layout": { + "x": 0, + "y": 16, + "width": 6, + "height": 3 + } + }, + { + "id": 2556161432574455, + "definition": { + "title": "Email Event Breakdown", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.* @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@type", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "style": { + "palette": "datadog16" + }, + "formulas": [ + { + "formula": "query2" + } + ], + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "type": "sunburst", + "legend": { + "type": "automatic" + } + }, + "layout": { + "x": 6, + "y": 16, + "width": 6, + "height": 3 + } + }, + { + "id": 6584282377664387, + "definition": { + "type": "note", + "content": "Bounces are often categorized as _hard_ and _soft_, where _hard_ bounces signify a later delivery attempt will not work and _soft_ implies a retry should be performed later.\n\nSee the [description of bounce types and subtypes](https://resend.com/docs/dashboard/emails/email-bounces#bounce-types-and-subtypes).", + "background_color": "blue", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": false, + "tick_pos": "50%", + "tick_edge": "right", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 19, + "width": 12, + "height": 2 + } + }, + { + "id": 1554629846571348, + "definition": { + "title": "Email Event Trends: Spam, Bounces, and Failures", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "horizontal", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "style": { + "palette": "warm", + "palette_index": 3 + }, + "alias": "Hard Bounced", + "formula": "query1" + }, + { + "style": { + "palette": "orange", + "palette_index": 4 + }, + "alias": "Soft Bounced", + "formula": "query2" + }, + { + "style": { + "palette": "warm", + "palette_index": 0 + }, + "alias": "Marked as Spam", + "formula": "query3" + }, + { + "style": { + "palette": "warm", + "palette_index": 4 + }, + "alias": "Failed", + "formula": "query4" + }, + { + "style": { + "palette": "warm", + "palette_index": 4 + }, + "alias": "Undetermined", + "formula": "query5" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Permanent $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Transient $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query3", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query4", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.Failed @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query5", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Undetermined $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "timeseries", + "style": { + "palette": "dog_classic", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "area" + } + ] + }, + "layout": { + "x": 0, + "y": 21, + "width": 12, + "height": 3 + } + }, + { + "id": 4523940487974232, + "definition": { + "title": "Bounce Types and Reasons", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_pattern_stream", + "query_string": "source:resend service:events @type:email.bounced @data.broadcast_id:* $template_id $domain $broadcast_id", + "indexes": [], + "clustering_pattern_field_path": "@data.bounce.subType", + "group_by": [ + { + "facet": "@data.bounce.message" + } + ], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "matches", + "width": "auto" + }, + { + "field": "volume", + "width": "auto" + }, + { + "field": "@data.bounce.subType", + "width": "auto" + }, + { + "field": "@data.bounce.message", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 24, + "width": 12, + "height": 3 + } + }, + { + "id": 6281401150190870, + "definition": { + "title": "Top Broadcasts for Soft Bounced Email Events", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:Transient $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "formula": "min(100, (query1 / query2) * 100)", + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + } + } + ], + "sort": { + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ], + "count": 20 + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + }, + "scaling": "absolute" + } + }, + "layout": { + "x": 0, + "y": 27, + "width": 6, + "height": 3 + } + }, + { + "id": 5154411203269646, + "definition": { + "title": "Most Clicked Broadcasts", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "formulas": [ + { + "formula": "min(100, (query1 / query2) * 100)", + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + } + } + ], + "sort": { + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ], + "count": 20 + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + } + } + }, + "layout": { + "x": 6, + "y": 27, + "width": 6, + "height": 3 + } + }, + { + "id": 8845020192633430, + "definition": { + "title": "Top Broadcasts for Hard Bounced Email Events", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced @data.broadcast_id:* @data.bounce.type:(Permanent OR Undetermined) $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + }, + "scaling": "absolute" + } + }, + "layout": { + "x": 0, + "y": 30, + "width": 6, + "height": 3 + } + }, + { + "id": 3047207702675200, + "definition": { + "title": "Most Complained Broadcasts", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered @data.broadcast_id:* $template_id $domain $broadcast_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.broadcast_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + } + } + }, + "layout": { + "x": 6, + "y": 30, + "width": 6, + "height": 3 + } + }, + { + "id": 2565857120848986, + "definition": { + "title": "Broadcast Subjects", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_pattern_stream", + "query_string": "source:resend service:events @type:email.sent @data.broadcast_id:* $template_id $domain $broadcast_id", + "indexes": [], + "clustering_pattern_field_path": "@data.subject", + "group_by": [ + { + "facet": "@data.broadcast_id" + } + ], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "@data.broadcast_id", + "width": "auto" + }, + { + "field": "@data.subject", + "width": "auto" + }, + { + "field": "matches", + "width": "auto" + }, + { + "field": "volume", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 33, + "width": 12, + "height": 3 + } + }, + { + "id": 3818383290217704, + "definition": { + "title": "Broadcast Events List", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_stream", + "query_string": "source:resend service:events @type:email* @data.broadcast_id:* $template_id $domain $broadcast_id", + "indexes": [], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "timestamp", + "width": "auto" + }, + { + "field": "@type", + "width": "auto" + }, + { + "field": "@data.from", + "width": "auto" + }, + { + "field": "@data.subject", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 36, + "width": 12, + "height": 5 + } + } + ] + }, + "layout": { + "x": 0, + "y": 11, + "width": 12, + "height": 42 + } + }, + { + "id": 6646970637621948, + "definition": { + "title": "Transactional Email", + "background_color": "vivid_green", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [ + { + "id": 1021217632790067, + "definition": { + "type": "note", + "content": "Email events describe states and final disposition of each email as well as click activity within the opened email. See the [description of email deliverability](https://resend.com/docs/dashboard/emails/introduction#understand-email-events).", + "background_color": "green", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": true, + "tick_pos": "50%", + "tick_edge": "bottom", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 0, + "width": 12, + "height": 1 + } + }, + { + "id": 2782162662925086, + "definition": { + "title": "Email Performance Summary", + "title_size": "16", + "title_align": "left", + "type": "query_table", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query3", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query4", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query5", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Permanent $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query6", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Undetermined $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query7", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Transient $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query8", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.failed -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query9", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "sort": { + "count": 90, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + }, + "formulas": [ + { + "cell_display_mode": "number", + "alias": "Sent", + "formula": "query1" + }, + { + "cell_display_mode": "number", + "alias": "Delivered", + "formula": "query2" + }, + { + "cell_display_mode": "number", + "alias": "Opened", + "formula": "query3" + }, + { + "cell_display_mode": "number", + "alias": "Clicked", + "formula": "query4" + }, + { + "cell_display_mode": "number", + "alias": "Hard Bounce", + "formula": "query5" + }, + { + "cell_display_mode": "number", + "alias": "Undetermined Bounce", + "formula": "query6" + }, + { + "cell_display_mode": "number", + "alias": "Soft Bounce", + "formula": "query7" + }, + { + "cell_display_mode": "number", + "alias": "Failed", + "formula": "query8" + }, + { + "cell_display_mode": "number", + "alias": "Complained", + "formula": "query9" + } + ] + } + ], + "has_search_bar": "auto" + }, + "layout": { + "x": 0, + "y": 1, + "width": 12, + "height": 3 + } + }, + { + "id": 4717108640827071, + "definition": { + "title": "Opened Email Percentage", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": "<", + "value": 10, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 0, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 2661506585196623, + "definition": { + "type": "note", + "content": "Opened and Clicked Email percentages are calculated by comparing the volume of Opened and Clicked Email compared to Delivered Email **within the same time span of the dashboard view**.\n\nResend [cautions on using open rates](https://resend.com/docs/knowledge-base/why-are-my-open-rates-not-accurate) as a measure and advises focusing on click rate metrics.", + "background_color": "green", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": false, + "tick_pos": "50%", + "tick_edge": "right", + "has_padding": true + }, + "layout": { + "x": 4, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 4896587204686090, + "definition": { + "title": "Clicked Email Percentage", + "title_size": "16", + "title_align": "left", + "type": "query_value", + "requests": [ + { + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": "<", + "value": 10, + "palette": "white_on_yellow" + } + ] + } + ], + "autoscale": true, + "precision": 2, + "timeseries_background": { + "type": "area" + } + }, + "layout": { + "x": 8, + "y": 4, + "width": 4, + "height": 3 + } + }, + { + "id": 4317980403052386, + "definition": { + "title": "Clicked Email Locations", + "title_size": "16", + "title_align": "left", + "time": {}, + "type": "geomap", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@network.client.geoip.subdivision.iso_code", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "formulas": [ + { + "formula": "query1" + } + ], + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "palette": "yellow_to_green", + "palette_flip": false + }, + "view": { + "focus": "US" + } + }, + "layout": { + "x": 0, + "y": 7, + "width": 12, + "height": 6 + } + }, + { + "id": 1503360864795850, + "definition": { + "title": "Most Clicked URLs", + "title_size": "16", + "title_align": "left", + "type": "query_table", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@data.click.link", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + }, + "formulas": [ + { + "cell_display_mode": "number", + "alias": "count", + "formula": "query1" + } + ] + } + ], + "has_search_bar": "auto" + }, + "layout": { + "x": 0, + "y": 13, + "width": 6, + "height": 3 + } + }, + { + "id": 8343940607455926, + "definition": { + "title": "Most Clicked Domains", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + } + } + }, + "layout": { + "x": 6, + "y": 13, + "width": 6, + "height": 3 + } + }, + { + "id": 2476569856642485, + "definition": { + "title": "Email Open and Clicked Activity ", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "formula": "query1" + }, + { + "formula": "query2" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.opened -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.clicked -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "timeseries", + "style": { + "palette": "green", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "bars" + } + ], + "yaxis": { + "include_zero": true, + "scale": "linear", + "min": "auto", + "max": "auto" + } + }, + "layout": { + "x": 0, + "y": 16, + "width": 6, + "height": 3 + } + }, + { + "id": 6063417669844463, + "definition": { + "title": "Email Event Breakdown", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.* -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@type", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "style": { + "palette": "datadog16" + }, + "formulas": [ + { + "formula": "query2" + } + ], + "sort": { + "count": 10, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "type": "sunburst", + "legend": { + "type": "automatic" + } + }, + "layout": { + "x": 6, + "y": 16, + "width": 6, + "height": 3 + } + }, + { + "id": 5709499497416300, + "definition": { + "type": "note", + "content": "Bounces are often categorized as _hard_ and _soft_, where _hard_ bounces signify a later delivery attempt will not work and _soft_ implies a retry should be performed later.\n\nSee the [description of bounce types and subtypes](https://resend.com/docs/dashboard/emails/email-bounces#bounce-types-and-subtypes).", + "background_color": "green", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": false, + "tick_pos": "50%", + "tick_edge": "right", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 19, + "width": 12, + "height": 2 + } + }, + { + "id": 519572749077279, + "definition": { + "title": "Email Event Trends: Spam, Bounces, and Failures", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "horizontal", + "legend_columns": [ + "avg", + "min", + "max", + "value", + "sum" + ], + "type": "timeseries", + "requests": [ + { + "formulas": [ + { + "style": { + "palette": "warm", + "palette_index": 3 + }, + "alias": "Hard Bounced", + "formula": "query1" + }, + { + "style": { + "palette": "orange", + "palette_index": 4 + }, + "alias": "Soft Bounced", + "formula": "query2" + }, + { + "style": { + "palette": "warm", + "palette_index": 0 + }, + "alias": "Marked as Spam", + "formula": "query3" + }, + { + "style": { + "palette": "warm", + "palette_index": 4 + }, + "alias": "Failed", + "formula": "query4" + }, + { + "style": { + "palette": "warm", + "palette_index": 4 + }, + "alias": "Undetermined", + "formula": "query5" + } + ], + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Permanent $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Transient $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query3", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query4", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.Failed -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query5", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Undetermined $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "timeseries", + "style": { + "palette": "dog_classic", + "order_by": "values", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "area" + } + ] + }, + "layout": { + "x": 0, + "y": 21, + "width": 6, + "height": 3 + } + }, + { + "id": 6345616638709925, + "definition": { + "title": "Most Complained Domains", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.complained -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.delivered -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + } + } + }, + "layout": { + "x": 6, + "y": 21, + "width": 6, + "height": 3 + } + }, + { + "id": 7009600542734727, + "definition": { + "title": "Top Domains for Soft Bounced Email Events", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:Transient $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + }, + "scaling": "absolute" + } + }, + "layout": { + "x": 0, + "y": 24, + "width": 6, + "height": 3 + } + }, + { + "id": 7953938100940184, + "definition": { + "title": "Top Domains for Hard Bounced Email Events", + "title_size": "16", + "title_align": "left", + "type": "toplist", + "requests": [ + { + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.bounced -@data.broadcast_id:* @data.bounce.type:(Permanent OR Undetermined) $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + } + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + }, + { + "name": "query2", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:email.sent -@data.broadcast_id:* $domain $priority $template_id" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@resend.domain", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "response_format": "scalar", + "conditional_formats": [ + { + "comparator": ">", + "value": 10, + "palette": "white_on_red" + }, + { + "comparator": ">", + "value": 5, + "palette": "white_on_yellow" + } + ], + "formulas": [ + { + "number_format": { + "unit": { + "type": "canonical_unit", + "unit_name": "percent" + } + }, + "formula": "min(100, (query1 / query2) * 100)" + } + ], + "sort": { + "count": 20, + "order_by": [ + { + "type": "formula", + "index": 0, + "order": "desc" + } + ] + } + } + ], + "style": { + "display": { + "type": "stacked", + "legend": "automatic" + }, + "scaling": "absolute" + } + }, + "layout": { + "x": 6, + "y": 24, + "width": 6, + "height": 3 + } + }, + { + "id": 3725343105146853, + "definition": { + "title": "Email Events List", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_stream", + "query_string": "source:resend service:events @type:email* -@data.broadcast_id:* $domain $priority $template_id", + "indexes": [], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "timestamp", + "width": "auto" + }, + { + "field": "@type", + "width": "auto" + }, + { + "field": "@data.from", + "width": "auto" + }, + { + "field": "@data.subject", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 27, + "width": 12, + "height": 5 + } + } + ] + }, + "layout": { + "x": 0, + "y": 0, + "width": 12, + "height": 33, + "is_column_break": true + } + }, + { + "id": 3657744283017699, + "definition": { + "title": "Contact and Domain Activity", + "background_color": "vivid_purple", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [ + { + "id": 1101349622865755, + "definition": { + "type": "note", + "content": "Shown here are events associated with creation, update, and deletion of contacts and domains. An update of a contact can imply an unsubscribe event.", + "background_color": "pink", + "font_size": "14", + "text_align": "left", + "vertical_align": "center", + "show_tick": true, + "tick_pos": "50%", + "tick_edge": "bottom", + "has_padding": true + }, + "layout": { + "x": 0, + "y": 0, + "width": 12, + "height": 2 + } + }, + { + "id": 3279270655394946, + "definition": { + "title": "Contact Event Types and Audiences", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "vertical", + "legend_columns": [ + "sum" + ], + "type": "timeseries", + "requests": [ + { + "response_format": "timeseries", + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:contact*" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@type", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + }, + { + "facet": "@data.audience_id", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "formulas": [ + { + "formula": "query1" + } + ], + "style": { + "palette": "dog_classic", + "order_by": "values", + "order_reverse": false, + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "bars" + } + ], + "markers": [ + { + "value": "y = 0", + "display_type": "error dashed" + } + ] + }, + "layout": { + "x": 0, + "y": 2, + "width": 12, + "height": 5 + } + }, + { + "id": 1305627879238495, + "definition": { + "title": "Contact Event Log", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_stream", + "query_string": "source:resend service:events @type:contact.*", + "indexes": [], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "timestamp", + "width": "auto" + }, + { + "field": "@type", + "width": "auto" + }, + { + "field": "@data.audience_id", + "width": "auto" + }, + { + "field": "@data.email", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 7, + "width": 12, + "height": 3 + } + }, + { + "id": 2663004809225100, + "definition": { + "title": "Domain Events", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "vertical", + "legend_columns": [ + "sum" + ], + "type": "timeseries", + "requests": [ + { + "response_format": "timeseries", + "queries": [ + { + "name": "query1", + "data_source": "logs", + "search": { + "query": "source:resend service:events @type:domain*" + }, + "indexes": [ + "*" + ], + "group_by": [ + { + "facet": "@type", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + }, + { + "facet": "@data.name", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc", + "metric": "count" + }, + "should_exclude_missing": true + } + ], + "compute": { + "aggregation": "count" + }, + "storage": "hot" + } + ], + "formulas": [ + { + "formula": "query1" + } + ], + "style": { + "palette": "dog_classic", + "order_by": "values", + "order_reverse": false, + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "bars" + } + ], + "markers": [ + { + "value": "y = 0", + "display_type": "error dashed" + } + ] + }, + "layout": { + "x": 0, + "y": 10, + "width": 12, + "height": 4 + } + }, + { + "id": 1895571519265825, + "definition": { + "title": "Domain Event Log", + "title_size": "16", + "title_align": "left", + "requests": [ + { + "response_format": "event_list", + "query": { + "data_source": "logs_stream", + "query_string": "source:resend service:events @type:domain.* $domain", + "indexes": [], + "storage": "hot" + }, + "columns": [ + { + "field": "status_line", + "width": "auto" + }, + { + "field": "timestamp", + "width": "auto" + }, + { + "field": "@type", + "width": "auto" + }, + { + "field": "@data.name", + "width": "auto" + } + ] + } + ], + "type": "list_stream" + }, + "layout": { + "x": 0, + "y": 14, + "width": 12, + "height": 3 + } + } + ] + }, + "layout": { + "x": 0, + "y": 33, + "width": 12, + "height": 18 + } + } + ], + "template_variables": [ + { + "name": "domain", + "prefix": "@resend.domain", + "available_values": [], + "default": "*" + }, + { + "name": "broadcast_id", + "prefix": "@data.broadcast_id", + "available_values": [], + "default": "*" + }, + { + "name": "template_id", + "prefix": "@data.template_id", + "available_values": [], + "default": "*" + }, + { + "name": "priority", + "prefix": "@data.tags.priority", + "available_values": [], + "default": "*" + } + ], + "layout_type": "ordered", + "notify_list": [], + "reflow_type": "fixed" +} diff --git a/resend/assets/logs/resend.yaml b/resend/assets/logs/resend.yaml new file mode 100644 index 0000000000000..a4bc64a522071 --- /dev/null +++ b/resend/assets/logs/resend.yaml @@ -0,0 +1,136 @@ +id: resend +metric_id: resend +backend_only: false +facets: + - description: "" + facetType: list + groups: + - Resend + name: Resend Broadcast Id + path: data.broadcast_id + source: log + type: string + - description: "" + facetType: list + groups: + - Resend + name: Resend Domain + path: resend.domain + source: log + type: string + - description: "" + facetType: list + groups: + - Resend + name: Resend Template Id + path: data.template_id + source: log + type: string + - groups: + - Geoip + name: City Name + path: network.client.geoip.city.name + source: log + - groups: + - Geoip + name: Continent Code + path: network.client.geoip.continent.code + source: log + - groups: + - Geoip + name: Continent Name + path: network.client.geoip.continent.name + source: log + - groups: + - Geoip + name: Country ISO Code + path: network.client.geoip.country.iso_code + source: log + - groups: + - Geoip + name: Country Name + path: network.client.geoip.country.name + source: log + - groups: + - Geoip + name: Subdivision ISO Code + path: network.client.geoip.subdivision.iso_code + source: log + - groups: + - Geoip + name: Subdivision Name + path: network.client.geoip.subdivision.name + source: log +pipeline: + type: pipeline + name: Resend + enabled: true + filter: + query: source:resend + processors: + - type: date-remapper + name: Define `created_at` as the official date of the log + enabled: true + sources: + - created_at + - type: pipeline + name: Email Events + enabled: true + filter: + query: "@type:email*" + processors: + - type: grok-parser + name: Parse `resend.domain` from `data.from` + enabled: true + source: data.from + samples: + - '{"data":{"email_id":"1054f755-fd92-4be2-a073-ece6b19be6bd","headers":[{"name":"Precedence","value":"bulk"},{"name":"X-Entity-Ref-ID","value":"a654fa0b-b6b7-4d9a-a95c-ff58d9086ec1"},{"name":"List-Unsubscribe","value":""},{"name":"List-Unsubscribe-Post","value":"List-Unsubscribe=One-Click"}],"subject":"Your + Productivity Boost Awaits: New Features + Inside","broadcast_id":"db7bce7c-012a-4c66-9a30-c3257ce96e5c","created_at":"2025-09-16T16:48:20.612877+00:00","from":"HeloWorld + ","to":["stephanie.sanderson@example.com"]},"service":"events","created_at":"2025-09-11T21:58:59.303Z","type":"email.delivered"}' + grok: + supportRules: "" + matchRules: domain_from + %{regex(".+@")}%{regex("([^\">]+)"):resend.domain}%{regex(">?")} + - type: array-processor + name: Store recipient count in `resend.recipient_count` + enabled: true + operation: + source: data.to + target: resend.recipient_count + type: length + - type: string-builder-processor + name: Combine recipients into comma-separated `resend.recipients` + enabled: true + template: "%{data.to}" + target: resend.recipients + replaceMissing: false + - type: pipeline + name: Email Clicked + enabled: true + filter: + query: "@type:email.clicked" + processors: + - type: geo-ip-parser + name: GeoIP Parser + enabled: true + sources: + - data.click.ipAddress + target: network.client.geoip + ip_processing_behavior: do-nothing + - type: pipeline + name: Domain Events + enabled: true + filter: + query: "@type:domain*" + processors: + - type: attribute-remapper + name: Map `data.name` to `resend.domain` + enabled: true + sources: + - data.name + sourceType: attribute + target: resend.domain + targetType: attribute + preserveSource: true + overrideOnConflict: false diff --git a/resend/assets/logs/resend_tests.yaml b/resend/assets/logs/resend_tests.yaml new file mode 100644 index 0000000000000..6afe632fc0f31 --- /dev/null +++ b/resend/assets/logs/resend_tests.yaml @@ -0,0 +1,330 @@ +id: resend +tests: + - + sample: |- + { + "data": { + "email_id": "50cd6bf1-577e-4001-9cef-5f55484111f0", + "headers": [ + { + "name": "X-Example-ID", + "value": "12312312-1234-1234-1234-123412341234" + } + ], + "subject": "Subscription Renewal Notice", + "created_at": "2025-11-11T14:38:43.814135+00:00", + "from": "do-not-reply@future.example.com", + "template_id": "f6g7h8i9-j0k1-52l3-m4n5-o6p7q8r9s0t1", + "to": [ + "gyvonne.hough@example.com" + ], + "click": { + "ipAddress": "2620:1ec:bdf::40", + "link": "https://example.com/products", + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0", + "timestamp": "2025-11-11T14:38:43.814112+00:00" + }, + "tags": { + "priority": "high", + "type": "renewal" + } + }, + "service": "events", + "created_at": "2025-11-11T14:38:44.303203+00:00", + "type": "email.clicked" + } + result: + custom: + created_at: "2025-11-11T14:38:44.303203+00:00" + data: + click: + ipAddress: "2620:1ec:bdf::40" + link: "https://example.com/products" + timestamp: "2025-11-11T14:38:43.814112+00:00" + userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0" + created_at: "2025-11-11T14:38:43.814135+00:00" + email_id: "50cd6bf1-577e-4001-9cef-5f55484111f0" + from: "do-not-reply@future.example.com" + headers: + - + name: "X-Example-ID" + value: "12312312-1234-1234-1234-123412341234" + subject: "Subscription Renewal Notice" + tags: + priority: "high" + type: "renewal" + template_id: "f6g7h8i9-j0k1-52l3-m4n5-o6p7q8r9s0t1" + to: + - "gyvonne.hough@example.com" + network: + client: + geoip: {} + resend: + domain: "future.example.com" + recipient_count: 1 + recipients: "gyvonne.hough@example.com" + service: "events" + type: "email.clicked" + message: |- + { + "data" : { + "email_id" : "50cd6bf1-577e-4001-9cef-5f55484111f0", + "headers" : [ { + "name" : "X-Example-ID", + "value" : "12312312-1234-1234-1234-123412341234" + } ], + "subject" : "Subscription Renewal Notice", + "created_at" : "2025-11-11T14:38:43.814135+00:00", + "from" : "do-not-reply@future.example.com", + "template_id" : "f6g7h8i9-j0k1-52l3-m4n5-o6p7q8r9s0t1", + "to" : [ "gyvonne.hough@example.com" ], + "click" : { + "ipAddress" : "2620:1ec:bdf::40", + "link" : "https://example.com/products", + "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0", + "timestamp" : "2025-11-11T14:38:43.814112+00:00" + }, + "tags" : { + "priority" : "high", + "type" : "renewal" + } + }, + "service" : "events", + "created_at" : "2025-11-11T14:38:44.303203+00:00", + "type" : "email.clicked" + } + tags: + - "source:LOGS_SOURCE" + timestamp: 1762871924303 + - + sample: |- + { + "data" : { + "unsubscribed" : 0, + "updated_at" : "2025-09-18T17:56:37.669Z", + "created_at" : "2025-09-18T17:56:37.657Z", + "audience_id" : "2f54e077-a7c4-47b1-9577-b9bceb103c8b", + "id" : "90d9ad0d-2c47-4715-b208-53ddd8b2e485", + "email" : "brian+lawrence@mayalane.com" + }, + "created_at" : "2025-09-18T17:56:37.693Z", + "type" : "contact.created" + } + result: + custom: + created_at: "2025-09-18T17:56:37.693Z" + data: + audience_id: "2f54e077-a7c4-47b1-9577-b9bceb103c8b" + created_at: "2025-09-18T17:56:37.657Z" + email: "brian+lawrence@mayalane.com" + id: "90d9ad0d-2c47-4715-b208-53ddd8b2e485" + unsubscribed: 0 + updated_at: "2025-09-18T17:56:37.669Z" + type: "contact.created" + message: |- + { + "data" : { + "unsubscribed" : 0, + "updated_at" : "2025-09-18T17:56:37.669Z", + "created_at" : "2025-09-18T17:56:37.657Z", + "audience_id" : "2f54e077-a7c4-47b1-9577-b9bceb103c8b", + "id" : "90d9ad0d-2c47-4715-b208-53ddd8b2e485", + "email" : "brian+lawrence@mayalane.com" + }, + "created_at" : "2025-09-18T17:56:37.693Z", + "type" : "contact.created" + } + tags: + - "source:LOGS_SOURCE" + timestamp: 1758218197693 + - + sample: |- + { + "data" : { + "records" : [ { + "record" : "SPF", + "name" : "send.updates", + "type" : "MX", + "ttl" : "Auto", + "value" : "10 feedback-smtp.us-east-1.amazonses.com", + "status" : "verified" + }, { + "record" : "SPF", + "name" : "send.updates", + "type" : "TXT", + "ttl" : "Auto", + "value" : "v=spf1 include:amazonses.com ~all", + "status" : "verified" + }, { + "record" : "DKIM", + "name" : "resend._domainkey.updates", + "type" : "TXT", + "ttl" : "Auto", + "value" : "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsc3nkSAQP+cvX+J3rCJc8Xt3wZI36a2JYFI1/dTErAKm/t8HbdvLjr40sIVLGDe4BvNp63Uv6qbKw8IT3Ix80BPPTF3m/3hylHgB5EM3cgsH4fnjZQlqCsTFV/CRfAuwAWC1V8Xz522+7T2zkTYHiv9aGvTLMkWiV+afr0QKzfwIDAQAB", + "status" : "verified" + } ], + "name" : "updates.helodali.com", + "created_at" : "2025-09-18T17:16:34.071Z", + "id" : "a551dcad-81f1-4dcc-bf0c-351227eaea58", + "region" : "us-east-1", + "status" : "verified" + }, + "created_at" : "2025-09-18T17:48:30.788Z", + "type" : "domain.deleted" + } + result: + custom: + created_at: "2025-09-18T17:48:30.788Z" + data: + created_at: "2025-09-18T17:16:34.071Z" + id: "a551dcad-81f1-4dcc-bf0c-351227eaea58" + name: "updates.helodali.com" + records: + - + record: "SPF" + name: "send.updates" + type: "MX" + ttl: "Auto" + value: "10 feedback-smtp.us-east-1.amazonses.com" + status: "verified" + - + record: "SPF" + name: "send.updates" + type: "TXT" + ttl: "Auto" + value: "v=spf1 include:amazonses.com ~all" + status: "verified" + - + record: "DKIM" + name: "resend._domainkey.updates" + type: "TXT" + ttl: "Auto" + value: "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsc3nkSAQP+cvX+J3rCJc8Xt3wZI36a2JYFI1/dTErAKm/t8HbdvLjr40sIVLGDe4BvNp63Uv6qbKw8IT3Ix80BPPTF3m/3hylHgB5EM3cgsH4fnjZQlqCsTFV/CRfAuwAWC1V8Xz522+7T2zkTYHiv9aGvTLMkWiV+afr0QKzfwIDAQAB" + status: "verified" + region: "us-east-1" + status: "verified" + resend: + domain: "updates.helodali.com" + type: "domain.deleted" + message: |- + { + "data" : { + "records" : [ { + "record" : "SPF", + "name" : "send.updates", + "type" : "MX", + "ttl" : "Auto", + "value" : "10 feedback-smtp.us-east-1.amazonses.com", + "status" : "verified" + }, { + "record" : "SPF", + "name" : "send.updates", + "type" : "TXT", + "ttl" : "Auto", + "value" : "v=spf1 include:amazonses.com ~all", + "status" : "verified" + }, { + "record" : "DKIM", + "name" : "resend._domainkey.updates", + "type" : "TXT", + "ttl" : "Auto", + "value" : "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsc3nkSAQP+cvX+J3rCJc8Xt3wZI36a2JYFI1/dTErAKm/t8HbdvLjr40sIVLGDe4BvNp63Uv6qbKw8IT3Ix80BPPTF3m/3hylHgB5EM3cgsH4fnjZQlqCsTFV/CRfAuwAWC1V8Xz522+7T2zkTYHiv9aGvTLMkWiV+afr0QKzfwIDAQAB", + "status" : "verified" + } ], + "name" : "updates.helodali.com", + "created_at" : "2025-09-18T17:16:34.071Z", + "id" : "a551dcad-81f1-4dcc-bf0c-351227eaea58", + "region" : "us-east-1", + "status" : "verified" + }, + "created_at" : "2025-09-18T17:48:30.788Z", + "type" : "domain.deleted" + } + tags: + - "source:LOGS_SOURCE" + timestamp: 1758217710788 + - + sample: |- + { + "data" : { + "email_id" : "d2c6c8bd-6391-4510-be05-06361007ff0a", + "headers" : [ { + "name" : "Precedence", + "value" : "bulk" + }, { + "name" : "X-Entity-Ref-ID", + "value" : "a654fa0b-b6b7-4d9a-a95c-ff58d9086ec1" + }, { + "name" : "List-Unsubscribe", + "value" : "" + }, { + "name" : "List-Unsubscribe-Post", + "value" : "List-Unsubscribe=One-Click" + } ], + "subject" : "Time to join the fun", + "broadcast_id" : "2c30ac8d-262b-4785-84ac-4c498f747aaa", + "created_at" : "2025-09-11 21:58:53.475066+00", + "from" : "Helodali ", + "to" : [ "brian+clarkson@mayalane.com" ] + }, + "created_at" : "2025-09-11T21:58:59.303Z", + "type" : "email.delivered" + } + result: + custom: + created_at: "2025-09-11T21:58:59.303Z" + data: + broadcast_id: "2c30ac8d-262b-4785-84ac-4c498f747aaa" + created_at: "2025-09-11 21:58:53.475066+00" + email_id: "d2c6c8bd-6391-4510-be05-06361007ff0a" + from: "Helodali " + headers: + - + name: "Precedence" + value: "bulk" + - + name: "X-Entity-Ref-ID" + value: "a654fa0b-b6b7-4d9a-a95c-ff58d9086ec1" + - + name: "List-Unsubscribe" + value: "" + - + name: "List-Unsubscribe-Post" + value: "List-Unsubscribe=One-Click" + subject: "Time to join the fun" + to: + - "brian+clarkson@mayalane.com" + resend: + domain: "resend.helodali.com" + recipient_count: 1 + recipients: "brian+clarkson@mayalane.com" + type: "email.delivered" + message: |- + { + "data" : { + "email_id" : "d2c6c8bd-6391-4510-be05-06361007ff0a", + "headers" : [ { + "name" : "Precedence", + "value" : "bulk" + }, { + "name" : "X-Entity-Ref-ID", + "value" : "a654fa0b-b6b7-4d9a-a95c-ff58d9086ec1" + }, { + "name" : "List-Unsubscribe", + "value" : "" + }, { + "name" : "List-Unsubscribe-Post", + "value" : "List-Unsubscribe=One-Click" + } ], + "subject" : "Time to join the fun", + "broadcast_id" : "2c30ac8d-262b-4785-84ac-4c498f747aaa", + "created_at" : "2025-09-11 21:58:53.475066+00", + "from" : "Helodali ", + "to" : [ "brian+clarkson@mayalane.com" ] + }, + "created_at" : "2025-09-11T21:58:59.303Z", + "type" : "email.delivered" + } + tags: + - "source:LOGS_SOURCE" + timestamp: 1757627939303 diff --git a/resend/assets/monitors/high_broadcast_email_delivery_delayed.json b/resend/assets/monitors/high_broadcast_email_delivery_delayed.json new file mode 100644 index 0000000000000..cfe14d62f9cda --- /dev/null +++ b/resend/assets/monitors/high_broadcast_email_delivery_delayed.json @@ -0,0 +1,31 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "High broadcast email delivery delayed rate for domain", + "description": "Alert when a high number of broadcast email experience delayed delivery.", + "definition": { + "id": 236192075, + "name": "[Resend] High broadcast email delivery delayed rate for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.delivery_delayed @data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"1h\") > 50", + "message": "The number of recent delayed delivery from broadcast email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 50 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60 + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/high_broadcast_email_delivery_failure.json b/resend/assets/monitors/high_broadcast_email_delivery_failure.json new file mode 100644 index 0000000000000..86a91ec19a41a --- /dev/null +++ b/resend/assets/monitors/high_broadcast_email_delivery_failure.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "High broadcast email delivery failure rate for domain", + "description": "Alert when a high number of broadcast email experience delivery failure.", + "definition": { + "id": 236296522, + "name": "[Resend] High broadcast email delivery failure rate for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.failed @data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"4h\") > 50", + "message": "The number of recent delivery failures from broadcast email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 50 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/high_transactional_email_delivery_delayed.json b/resend/assets/monitors/high_transactional_email_delivery_delayed.json new file mode 100644 index 0000000000000..df2468944c7df --- /dev/null +++ b/resend/assets/monitors/high_transactional_email_delivery_delayed.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "High transactional email delivery delayed rate for domain", + "description": "Alert when a high number of transactional email experience delayed delivery.", + "definition": { + "id": 236300827, + "name": "[Resend] High transactional email delivery delayed rate for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.delivery_delayed -@data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"1h\") > 10", + "message": "The number of recent delayed delivery from transactional email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 10 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/high_transactional_email_delivery_failure.json b/resend/assets/monitors/high_transactional_email_delivery_failure.json new file mode 100644 index 0000000000000..c55694914f640 --- /dev/null +++ b/resend/assets/monitors/high_transactional_email_delivery_failure.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "High transactional email delivery failure rate for domain", + "description": "Alert when a high number of transactional email experience delivery failure.", + "definition": { + "id": 236301073, + "name": "[Resend] High transactional email delivery failure rate for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.failed -@data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"4h\") > 10", + "message": "The number of recent delivery failures from transactional email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 10 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/spike_in_broadcast_email_bounces.json b/resend/assets/monitors/spike_in_broadcast_email_bounces.json new file mode 100644 index 0000000000000..3b24147e768a9 --- /dev/null +++ b/resend/assets/monitors/spike_in_broadcast_email_bounces.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "Spike in broadcast email bounces for domain", + "description": "Alert when a spike of broadcast email bounces occurs.", + "definition": { + "id": 236194272, + "name": "[Resend] Spike in broadcast email bounces for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.bounced @data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"4h\") > 50", + "message": "The number of recent broadcast email bounces for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 50 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/spike_in_broadcast_email_complaints.json b/resend/assets/monitors/spike_in_broadcast_email_complaints.json new file mode 100644 index 0000000000000..34cce0880e87f --- /dev/null +++ b/resend/assets/monitors/spike_in_broadcast_email_complaints.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "Spike in broadcast email complaints for domain", + "description": "Alert when a spike of broadcast email complaints occurs.", + "definition": { + "id": 236189782, + "name": "[Resend] Spike in broadcast email complaints for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.complained @data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"1d\") > 50", + "message": "The number of complaints from broadcast email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 50 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/spike_in_transactional_email_bounces.json b/resend/assets/monitors/spike_in_transactional_email_bounces.json new file mode 100644 index 0000000000000..38e6ee8da9de9 --- /dev/null +++ b/resend/assets/monitors/spike_in_transactional_email_bounces.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "Spike in transactional email bounces for domain", + "description": "Alert when a spike of transactional email bounces occurs.", + "definition": { + "id": 236301253, + "name": "[Resend] Spike in transactional email bounces for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.bounced -@data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"4h\") > 10", + "message": "The number of recent transactional email bounces for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 10 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/monitors/spike_in_transactional_email_complaints.json b/resend/assets/monitors/spike_in_transactional_email_complaints.json new file mode 100644 index 0000000000000..d0510deb84f1b --- /dev/null +++ b/resend/assets/monitors/spike_in_transactional_email_complaints.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "created_at": "2025-09-24", + "last_updated_at": "2025-09-24", + "title": "Spike in transactional email complaints for domain", + "description": "Alert when a spike of transactional email complaints occurs.", + "definition": { + "id": 236301420, + "name": "[Resend] Spike in transactional email complaints for domain", + "type": "log alert", + "query": "logs(\"source:resend service:events @type:email.complained -@data.broadcast_id:*\").index(\"*\").rollup(\"count\").by(\"@resend.domain\").last(\"1d\") > 10", + "message": "The number of complaints from transactional email for {{[resend.domain].name}} is {{#is_alert}}high{{/is_alert}}{{#is_alert_recovery}}back below threshold{{/is_alert_recovery}}. @example@example.com", + "tags": [ + "source:resend" + ], + "options": { + "thresholds": { + "critical": 10 + }, + "enable_logs_sample": true, + "notify_audit": false, + "on_missing_data": "default", + "include_tags": true, + "new_group_delay": 60, + "groupby_simple_monitor": false + }, + "priority": null + }, + "tags": [ + "integration:resend" + ] +} diff --git a/resend/assets/service_checks.json b/resend/assets/service_checks.json new file mode 100644 index 0000000000000..fe51488c7066f --- /dev/null +++ b/resend/assets/service_checks.json @@ -0,0 +1 @@ +[] diff --git a/resend/images/resend_overview_dark_page1.png b/resend/images/resend_overview_dark_page1.png new file mode 100644 index 0000000000000..115378299ac2a Binary files /dev/null and b/resend/images/resend_overview_dark_page1.png differ diff --git a/resend/images/resend_overview_dark_page2.png b/resend/images/resend_overview_dark_page2.png new file mode 100644 index 0000000000000..f26d49a50f8c5 Binary files /dev/null and b/resend/images/resend_overview_dark_page2.png differ diff --git a/resend/images/resend_overview_dark_page3.png b/resend/images/resend_overview_dark_page3.png new file mode 100644 index 0000000000000..a90141ab29ae6 Binary files /dev/null and b/resend/images/resend_overview_dark_page3.png differ diff --git a/resend/images/resend_overview_dark_page4.png b/resend/images/resend_overview_dark_page4.png new file mode 100644 index 0000000000000..de489385d6ebd Binary files /dev/null and b/resend/images/resend_overview_dark_page4.png differ diff --git a/resend/images/resend_overview_light_page1.png b/resend/images/resend_overview_light_page1.png new file mode 100644 index 0000000000000..f5d2339ea782c Binary files /dev/null and b/resend/images/resend_overview_light_page1.png differ diff --git a/resend/images/resend_overview_light_page2.png b/resend/images/resend_overview_light_page2.png new file mode 100644 index 0000000000000..ea6e60b9ae4e0 Binary files /dev/null and b/resend/images/resend_overview_light_page2.png differ diff --git a/resend/images/resend_overview_light_page3.png b/resend/images/resend_overview_light_page3.png new file mode 100644 index 0000000000000..696417f8227e1 Binary files /dev/null and b/resend/images/resend_overview_light_page3.png differ diff --git a/resend/images/resend_overview_light_page4.png b/resend/images/resend_overview_light_page4.png new file mode 100644 index 0000000000000..20734b227f0f3 Binary files /dev/null and b/resend/images/resend_overview_light_page4.png differ diff --git a/resend/manifest.json b/resend/manifest.json new file mode 100644 index 0000000000000..974a2bbb79c52 --- /dev/null +++ b/resend/manifest.json @@ -0,0 +1,82 @@ +{ + "manifest_version": "2.0.0", + "app_uuid": "eeb832db-844d-4c6e-b3ec-e277461e5281", + "app_id": "resend", + "display_on_public_website": false, + "tile": { + "overview": "README.md#Overview", + "configuration": "README.md#Setup", + "support": "README.md#Support", + "changelog": "CHANGELOG.md", + "description": "Gain insights into your Resend transactional and broadcast email delivery.", + "title": "Resend", + "media": [ + { + "caption": "Resend Overview", + "image_url": "images/resend_overview_light_page1.png", + "media_type": "image" + }, + { + "caption": "Resend Overview (Page 2)", + "image_url": "images/resend_overview_light_page2.png", + "media_type": "image" + }, + { + "caption": "Resend Overview (Page 3)", + "image_url": "images/resend_overview_light_page3.png", + "media_type": "image" + }, + { + "caption": "Resend Overview (Page 4)", + "image_url": "images/resend_overview_light_page4.png", + "media_type": "image" + } + ], + "classifier_tags": [ + "Submitted Data Type::Logs", + "Offering::Integration", + "Category::Log Collection", + "Category::Metrics" + ] + }, + "assets": { + "integration": { + "auto_install": false, + "source_type_id": 58929769, + "source_type_name": "Resend", + "events": { + "creates_events": false + }, + "metrics": { + "prefix": "resend.", + "check": [], + "metadata_path": "metadata.csv" + }, + "service_checks": { + "metadata_path": "assets/service_checks.json" + } + }, + "logs": { + "source": "resend" + }, + "dashboards": { + "Resend Overview": "assets/dashboards/resend_overview.json" + }, + "monitors": { + "High broadcast email delivery delayed rate for domain": "assets/monitors/high_broadcast_email_delivery_delayed.json", + "High broadcast email delivery failure rate for domain": "assets/monitors/high_broadcast_email_delivery_failure.json", + "High transactional email delivery delayed rate for domain": "assets/monitors/high_transactional_email_delivery_delayed.json", + "High transactional email delivery failure rate for domain": "assets/monitors/high_transactional_email_delivery_failure.json", + "Spike in broadcast email bounces for domain": "assets/monitors/spike_in_broadcast_email_bounces.json", + "Spike in broadcast email complaints for domain": "assets/monitors/spike_in_broadcast_email_complaints.json", + "Spike in transactional email bounces for domain": "assets/monitors/spike_in_transactional_email_bounces.json", + "Spike in transactional email complaints for domain": "assets/monitors/spike_in_transactional_email_complaints.json" + } + }, + "author": { + "support_email": "help@datadoghq.com", + "name": "Datadog", + "homepage": "https://www.datadoghq.com", + "sales_email": "info@datadoghq.com" + } +} diff --git a/resend/metadata.csv b/resend/metadata.csv new file mode 100644 index 0000000000000..02cde5e98381e --- /dev/null +++ b/resend/metadata.csv @@ -0,0 +1 @@ +metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name,curated_metric,sample_tags