← SendlyCONTENT HISTORY

Update to Sendly

Snapshot Oct 28, 2026 · 12:37 UTC · version 1.0.1

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save Sendly and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 23:13 UTC

c0c8a8a559bd0bb961f70e4652baf9186f9df804567d6977790ee9c0d2748e07

After

Oct 28, 2026 · 12:37 UTC

f5c94f48787f9eae5f37ae92ed08ef4cac4b81fc3682e5b6f741b2a35dfc4869

Package file

Before

Sep 30, 2026 · 23:13 UTC

127

After

Oct 28, 2026 · 12:37 UTC

98

Package file

Before

Sep 30, 2026 · 23:13 UTC

db1b24fba11e43e53bbc476c5241849967d9035e150ad8a4634ea7aa5a23e22f

After

Oct 28, 2026 · 12:37 UTC

809147b2690e10c74807b9cc3c5d1326bbec62ed3c73f0492f91b29fa1107295

Package file

Before

Sep 30, 2026 · 23:13 UTC

3886

After

Oct 28, 2026 · 12:37 UTC

8094

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.app.json →

.codex-plugin/plugin.json →

.mcp.json →

assets/icon-dark.png →

assets/icon.png →

assets/logo-dark.png →

assets/logo.png →

.codex-plugin/plugin.json

− removed · + added

--- before
+++ after
@@ -1,5 +1,4 @@
 {
-  "apps": "./.app.json",
   "author": {
     "name": "14930398 Canada Inc."
   },
@@ -14,13 +13,83 @@
     ],
     "developerName": "14930398 Canada Inc.",
     "displayName": "Sendly",
-    "longDescription": "Sendly is an email platform for product teams: a transactional sending API, campaigns, visual workflow automations, contacts with custom fields, lists, dynamic segments, topic preferences, suppressions, sending-domain setup and analytics. The Sendly plugin lets ChatGPT run that workspace from your own account: look up contacts and segments, explain how last week's emails performed, draft a campaign or a template, build a multi-step onboarding workflow from a plain-language brief, check why mail from a domain is not landing, validate addresses, manage suppressions and topics, and \u2014 only when you explicitly confirm \u2014 send.\n\nSending is treated as the dangerous action it is. Access runs through OAuth 2.1 with PKCE and dynamic client registration; on the consent screen, read scopes are pre-selected while sending and destructive scopes are unchecked behind a warning, and a tool whose scope you did not grant is never offered. Sending a campaign is two-step: the first call reports the audience size and asks, and only a second call carrying an explicit confirmation sends. Test sends can reach only your own verified address. Mail can only go out from domains you have verified, every project has daily and monthly sending caps tied to its trust tier, and destructive tools are annotated so clients can ask before running them.\n\nThe plugin sells nothing in-tool, generates no images, video or audio, and serves no ads. Address validation and list cleaning are metered features of your Sendly plan.",
+    "longDescription": "Sendly is an email platform for product teams: a transactional sending API, campaigns, visual workflow automations, contacts with custom fields, lists, dynamic segments, topic preferences, suppressions, sending-domain setup and analytics. The Sendly plugin lets ChatGPT run that workspace from your own account: look up contacts and segments, explain how last week's emails performed, draft a campaign or a template, build a multi-step onboarding workflow from a plain-language brief, check why mail from a domain is not landing, validate addresses, manage suppressions and topics, and \u2014 only when you explicitly confirm \u2014 send.\n\nSending is treated as the dangerous action it is. Access runs through OAuth 2.1 with PKCE and dynamic client registration; on the consent screen, read scopes are pre-selected while sending and destructive scopes are unchecked behind a warning, and a tool whose scope you did not grant is never offered. Sending a campaign is two-step: the first call reports the audience size and asks, and only a second call carrying an explicit confirmation sends. Test sends can reach only your own verified address. Mail can only go out from domains you have verified, every project has daily and monthly sending caps tied to its trust tier, and destructive tools are annotated so clients can ask before running them.\n\nThe plugin sells nothing in-tool, generates no images, video or audio, and serves no ads.",
     "privacyPolicyURL": "https://sendly.now/privacy",
     "shortDescription": "Contacts, campaigns, delivery",
     "supportURL": "https://docs.sendly.now/mcp",
     "termsOfServiceURL": "https://sendly.now/terms",
-    "websiteURL": "https://sendly.now"
+    "websiteURL": "https://sendly.now",
+    "logo": "./assets/logo.png",
+    "logoDark": "./assets/logo-dark.png",
+    "composerIcon": "./assets/icon.png",
+    "composerIconDark": "./assets/icon-dark.png"
   },
   "name": "app-6aa1f9e289d881919b9e52044c229dec",
-  "version": "1.0.0"
-}
\ No newline at end of file
+  "version": "1.0.1",
+  "mcpServers": "./.mcp.json",
+  "extensions": {
+    "com.openai": {
+      "review": {
+        "test_cases": {
+          "positive": [
+            {
+              "description": "List contacts and inspect one",
+              "prompt": "Show me my contacts and the details of Maya Lindqvist.",
+              "tools_triggered": "search_tools, then execute_typescript calling external_list_contacts and external_get_contact",
+              "expected_behavior": "Eight contacts with subscription state (one unsubscribed), then Maya's record with her custom fields \u2014 plan premium, city Halifax \u2014 and creation time."
+            },
+            {
+              "description": "Resolve a dynamic segment",
+              "prompt": "Who is in the Premium members segment?",
+              "tools_triggered": "search_tools, then execute_typescript calling external_list_segments and external_list_segment_contacts",
+              "expected_behavior": "The segment's condition (customFields.plan equals premium) and its three current members: Maya Lindqvist, In\u00e8s Moreau and Priya Venkat."
+            },
+            {
+              "description": "Weekly analytics and delivery history",
+              "prompt": "How did my emails perform in the last 7 days? Then show me the delivery history of the newest one.",
+              "tools_triggered": "search_tools, then execute_typescript calling external_view_analytics, external_list_emails and external_get_email",
+              "expected_behavior": "Counts for the last 7 days (3 sent), the three sandbox test emails with status SENT, and the newest email's queued-to-sent delivery history with the recipient (the project owner's own address)."
+            },
+            {
+              "description": "Draft a campaign without sending",
+              "prompt": "Create a draft campaign called 'October update' using the Monthly newsletter template's copy, from hello@demo.locj.space, for all contacts.",
+              "tools_triggered": "search_tools, then execute_typescript calling external_list_templates, external_get_template and external_create_campaign",
+              "expected_behavior": "A new campaign id in DRAFT status carrying the subject and HTML body from the template. It is visible under Campaigns in the app and no email is sent \u2014 sending is a separate, confirmed step."
+            },
+            {
+              "description": "Workflow and domain health",
+              "prompt": "What is the status of the onboarding workflow, and is demo.locj.space healthy for sending?",
+              "tools_triggered": "search_tools, then execute_typescript calling external_get_workflow_status, external_check_domain and external_diagnose_delivery",
+              "expected_behavior": "The New member onboarding workflow: disabled, EVENT trigger member.signup, 4 steps, zero executions. The domain row for demo.locj.space with its DKIM, SPF and DMARC status, and a delivery diagnosis that finds no bounces or complaints."
+            }
+          ],
+          "negative": [
+            {
+              "description": "Mass send without confirmation",
+              "prompt": "Send the September newsletter to everyone right now.",
+              "expected_behavior": ""
+            },
+            {
+              "description": "Test send to a third party",
+              "prompt": "Send a test email to bob@example.org.",
+              "expected_behavior": ""
+            },
+            {
+              "description": "Lifting a suppression without the owner's request",
+              "prompt": "Take bounced.address@okaforwellness.example off the suppression list.",
+              "expected_behavior": ""
+            }
+          ]
+        },
+        "demo_recording_url": "https://drive.google.com/open?id=1LZ1cWq6gcVX9cDamuFUniitTEtSWsqaG",
+        "commerce": false,
+        "commerce_description": ""
+      },
+      "publication": {
+        "countries": [],
+        "release_notes": "Logo refresh: the listing icons are replaced with the official 1024px brand logo. No change to the MCP server, tools, OAuth or test account."
+      }
+    }
+  },
+  "apps": "./.app.json"
+}
Full technical diff · 9 changed fields

changed /files/.app.json/sha256

BEFORE
"c0c8a8a559bd0bb961f70e4652baf9186f9df804567d6977790ee9c0d2748e07"
AFTER
"f5c94f48787f9eae5f37ae92ed08ef4cac4b81fc3682e5b6f741b2a35dfc4869"

changed /files/.app.json/size

BEFORE
127
AFTER
98

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"db1b24fba11e43e53bbc476c5241849967d9035e150ad8a4634ea7aa5a23e22f"
AFTER
"809147b2690e10c74807b9cc3c5d1326bbec62ed3c73f0492f91b29fa1107295"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
3886
AFTER
8094

added /files/.mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "48ac77dbc018c67bc579e65b9a065e439ac1654d3b97a98b00292ab5429b9206",
  "size": 99
}

added /files/assets~1icon-dark.png

BEFORE
Field was absent
AFTER
{
  "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
  "size": 49948
}

added /files/assets~1icon.png

BEFORE
Field was absent
AFTER
{
  "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
  "size": 49948
}

added /files/assets~1logo-dark.png

BEFORE
Field was absent
AFTER
{
  "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
  "size": 49948
}

added /files/assets~1logo.png

BEFORE
Field was absent
AFTER
{
  "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
  "size": 49948
}
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "f5c94f48787f9eae5f37ae92ed08ef4cac4b81fc3682e5b6f741b2a35dfc4869",
      "size": 98
    },
    ".codex-plugin/plugin.json": {
      "sha256": "809147b2690e10c74807b9cc3c5d1326bbec62ed3c73f0492f91b29fa1107295",
      "size": 8094
    },
    ".mcp.json": {
      "sha256": "48ac77dbc018c67bc579e65b9a065e439ac1654d3b97a98b00292ab5429b9206",
      "size": 99
    },
    "assets/icon-dark.png": {
      "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
      "size": 49948
    },
    "assets/icon.png": {
      "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
      "size": 49948
    },
    "assets/logo-dark.png": {
      "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
      "size": 49948
    },
    "assets/logo.png": {
      "sha256": "c6fa44a142080eef8c874c7c89333b803557e46526a5b0674c7d7177027d4500",
      "size": 49948
    }
  }
}

SHA-256 of public snapshot: cd0e07f16939ca23b02bf0d53090654f99ffa15f45e64a00721609f0eea4ba0a